From b7e4daae4edd6afdb793f5930097463d3de25b8a Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:39:15 +0000 Subject: [PATCH 001/191] Setting up GitHub Classroom Feedback From eecfb01f4430a50b7f02748ee73b5f8342ccb061 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:39:18 +0000 Subject: [PATCH 002/191] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 259f7bba2e..5ddee1cbf1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/bzPrOe11) # CS3219 Project (PeerPrep) - AY2425S1 ## Group: Gxx From 62d665163f2774cf34b48b656585c20efd098ba1 Mon Sep 17 00:00:00 2001 From: Brendan Tan Date: Fri, 20 Sep 2024 17:07:40 +0800 Subject: [PATCH 003/191] Initialize Next.js app --- frontend/.eslintrc.json | 3 + frontend/.gitignore | 36 + frontend/README.md | 36 + frontend/app/favicon.ico | Bin 0 -> 25931 bytes .../app/fonts/MatterTRIALVF-Uprights.woff2 | Bin 0 -> 33332 bytes .../fonts/RecklessNeueTRIALVF-Uprights.woff2 | Bin 0 -> 44120 bytes frontend/app/globals.css | 92 + frontend/app/layout.tsx | 44 + frontend/app/page.tsx | 128 + frontend/components.json | 20 + frontend/components/ui/avatar.tsx | 50 + frontend/components/ui/badge.tsx | 36 + frontend/components/ui/button.tsx | 56 + frontend/components/ui/card.tsx | 79 + frontend/components/ui/command.tsx | 155 + frontend/components/ui/dialog.tsx | 122 + frontend/components/ui/dropdown-menu.tsx | 200 + frontend/components/ui/navigation-menu.tsx | 128 + frontend/components/ui/popover.tsx | 31 + frontend/lib/utils.ts | 6 + frontend/next.config.mjs | 4 + frontend/package-lock.json | 6537 +++++++++++++++++ frontend/package.json | 38 + frontend/postcss.config.mjs | 8 + frontend/tailwind.config.ts | 70 + frontend/tsconfig.json | 26 + 26 files changed, 7905 insertions(+) create mode 100644 frontend/.eslintrc.json create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/app/favicon.ico create mode 100644 frontend/app/fonts/MatterTRIALVF-Uprights.woff2 create mode 100644 frontend/app/fonts/RecklessNeueTRIALVF-Uprights.woff2 create mode 100644 frontend/app/globals.css create mode 100644 frontend/app/layout.tsx create mode 100644 frontend/app/page.tsx create mode 100644 frontend/components.json create mode 100644 frontend/components/ui/avatar.tsx create mode 100644 frontend/components/ui/badge.tsx create mode 100644 frontend/components/ui/button.tsx create mode 100644 frontend/components/ui/card.tsx create mode 100644 frontend/components/ui/command.tsx create mode 100644 frontend/components/ui/dialog.tsx create mode 100644 frontend/components/ui/dropdown-menu.tsx create mode 100644 frontend/components/ui/navigation-menu.tsx create mode 100644 frontend/components/ui/popover.tsx create mode 100644 frontend/lib/utils.ts create mode 100644 frontend/next.config.mjs create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.mjs create mode 100644 frontend/tailwind.config.ts create mode 100644 frontend/tsconfig.json diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json new file mode 100644 index 0000000000..3722418549 --- /dev/null +++ b/frontend/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"] +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000000..fd3dbb571a --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000000..e215bc4ccf --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/frontend/app/favicon.ico b/frontend/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/frontend/app/fonts/MatterTRIALVF-Uprights.woff2 b/frontend/app/fonts/MatterTRIALVF-Uprights.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..efcdd8022426b00faeac9397e2c747a9705b37d3 GIT binary patch literal 33332 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 UF~p}2?X=^6Z^F#=fn|&U07H>h7XSbN literal 0 HcmV?d00001 diff --git a/frontend/app/fonts/RecklessNeueTRIALVF-Uprights.woff2 b/frontend/app/fonts/RecklessNeueTRIALVF-Uprights.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6a9ab2252c339fec15320ff08bd0495ed9bb7fcc GIT binary patch literal 44120 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 literal 0 HcmV?d00001 diff --git a/frontend/app/globals.css b/frontend/app/globals.css new file mode 100644 index 0000000000..78e9501cdc --- /dev/null +++ b/frontend/app/globals.css @@ -0,0 +1,92 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx new file mode 100644 index 0000000000..ac06dbbca1 --- /dev/null +++ b/frontend/app/layout.tsx @@ -0,0 +1,44 @@ +import type { Metadata } from "next"; +import { Syne } from 'next/font/google' +import localFont from "next/font/local"; +import "./globals.css"; + +const brandingFont = Syne({ + subsets: ['latin'], + weight: ["400", "500", "600", "700", "800"], + display: "swap", + variable: "--font-branding", +}); +const matterFont = localFont({ + src: "./fonts/MatterTRIALVF-Uprights.woff2", + display: "swap", + variable: "--font-matter", + weight: "100 900", +}); +const recklessNeueFont = localFont({ + src: "./fonts/RecklessNeueTRIALVF-Uprights.woff2", + display: "swap", + variable: "--font-reckless-neue", + weight: "100 900", +}); + +export const metadata: Metadata = { + title: "PeerPrep", + description: "so preppy", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx new file mode 100644 index 0000000000..1ce88fd2eb --- /dev/null +++ b/frontend/app/page.tsx @@ -0,0 +1,128 @@ +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import Image from "next/image"; +import Link from "next/link"; + +export default function Home() { + return ( + //
+ + ); +} diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000000..481633df99 --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/frontend/components/ui/avatar.tsx b/frontend/components/ui/avatar.tsx new file mode 100644 index 0000000000..51e507ba9d --- /dev/null +++ b/frontend/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/frontend/components/ui/badge.tsx b/frontend/components/ui/badge.tsx new file mode 100644 index 0000000000..f000e3ef51 --- /dev/null +++ b/frontend/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/frontend/components/ui/button.tsx b/frontend/components/ui/button.tsx new file mode 100644 index 0000000000..0ba4277355 --- /dev/null +++ b/frontend/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/frontend/components/ui/card.tsx b/frontend/components/ui/card.tsx new file mode 100644 index 0000000000..afa13ecfa3 --- /dev/null +++ b/frontend/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/frontend/components/ui/command.tsx b/frontend/components/ui/command.tsx new file mode 100644 index 0000000000..1a37e67d65 --- /dev/null +++ b/frontend/components/ui/command.tsx @@ -0,0 +1,155 @@ +"use client" + +import * as React from "react" +import { type DialogProps } from "@radix-ui/react-dialog" +import { Command as CommandPrimitive } from "cmdk" +import { Search } from "lucide-react" + +import { cn } from "@/lib/utils" +import { Dialog, DialogContent } from "@/components/ui/dialog" + +const Command = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Command.displayName = CommandPrimitive.displayName + +interface CommandDialogProps extends DialogProps {} + +const CommandDialog = ({ children, ...props }: CommandDialogProps) => { + return ( + + + + {children} + + + + ) +} + +const CommandInput = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ + +
+)) + +CommandInput.displayName = CommandPrimitive.Input.displayName + +const CommandList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandList.displayName = CommandPrimitive.List.displayName + +const CommandEmpty = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>((props, ref) => ( + +)) + +CommandEmpty.displayName = CommandPrimitive.Empty.displayName + +const CommandGroup = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandGroup.displayName = CommandPrimitive.Group.displayName + +const CommandSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +CommandSeparator.displayName = CommandPrimitive.Separator.displayName + +const CommandItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +CommandItem.displayName = CommandPrimitive.Item.displayName + +const CommandShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +CommandShortcut.displayName = "CommandShortcut" + +export { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, + CommandSeparator, +} diff --git a/frontend/components/ui/dialog.tsx b/frontend/components/ui/dialog.tsx new file mode 100644 index 0000000000..01ff19c7e4 --- /dev/null +++ b/frontend/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/frontend/components/ui/dropdown-menu.tsx b/frontend/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000000..f69a0d64ca --- /dev/null +++ b/frontend/components/ui/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/frontend/components/ui/navigation-menu.tsx b/frontend/components/ui/navigation-menu.tsx new file mode 100644 index 0000000000..1419f56695 --- /dev/null +++ b/frontend/components/ui/navigation-menu.tsx @@ -0,0 +1,128 @@ +import * as React from "react" +import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" +import { cva } from "class-variance-authority" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const NavigationMenu = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + +)) +NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName + +const NavigationMenuList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName + +const NavigationMenuItem = NavigationMenuPrimitive.Item + +const navigationMenuTriggerStyle = cva( + "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" +) + +const NavigationMenuTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children}{" "} + +)) +NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName + +const NavigationMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName + +const NavigationMenuLink = NavigationMenuPrimitive.Link + +const NavigationMenuViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
+ +
+)) +NavigationMenuViewport.displayName = + NavigationMenuPrimitive.Viewport.displayName + +const NavigationMenuIndicator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +
+ +)) +NavigationMenuIndicator.displayName = + NavigationMenuPrimitive.Indicator.displayName + +export { + navigationMenuTriggerStyle, + NavigationMenu, + NavigationMenuList, + NavigationMenuItem, + NavigationMenuContent, + NavigationMenuTrigger, + NavigationMenuLink, + NavigationMenuIndicator, + NavigationMenuViewport, +} diff --git a/frontend/components/ui/popover.tsx b/frontend/components/ui/popover.tsx new file mode 100644 index 0000000000..a0ec48beee --- /dev/null +++ b/frontend/components/ui/popover.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts new file mode 100644 index 0000000000..bd0c391ddd --- /dev/null +++ b/frontend/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs new file mode 100644 index 0000000000..4678774e6d --- /dev/null +++ b/frontend/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000000..06de2ed285 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,6537 @@ +{ + "name": "frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.1.0", + "dependencies": { + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-navigation-menu": "^1.2.0", + "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-slot": "^1.1.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "lucide-react": "^0.441.0", + "next": "14.2.13", + "react": "^18", + "react-dom": "^18", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.13", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.13.tgz", + "integrity": "sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.13.tgz", + "integrity": "sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz", + "integrity": "sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz", + "integrity": "sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz", + "integrity": "sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz", + "integrity": "sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz", + "integrity": "sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz", + "integrity": "sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz", + "integrity": "sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz", + "integrity": "sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz", + "integrity": "sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", + "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz", + "integrity": "sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.8.tgz", + "integrity": "sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.6.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", + "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.13.tgz", + "integrity": "sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.2.13", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.36.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", + "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/lucide-react": { + "version": "0.441.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.441.0.tgz", + "integrity": "sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "14.2.13", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.13.tgz", + "integrity": "sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.13", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.13", + "@next/swc-darwin-x64": "14.2.13", + "@next/swc-linux-arm64-gnu": "14.2.13", + "@next/swc-linux-arm64-musl": "14.2.13", + "@next/swc-linux-x64-gnu": "14.2.13", + "@next/swc-linux-x64-musl": "14.2.13", + "@next/swc-win32-arm64-msvc": "14.2.13", + "@next/swc-win32-ia32-msvc": "14.2.13", + "@next/swc-win32-x64-msvc": "14.2.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", + "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", + "integrity": "sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000000..93ccca66ee --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,38 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-navigation-menu": "^1.2.0", + "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-slot": "^1.1.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "^1.0.0", + "lucide-react": "^0.441.0", + "next": "14.2.13", + "react": "^18", + "react-dom": "^18", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.13", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs new file mode 100644 index 0000000000..1a69fd2a45 --- /dev/null +++ b/frontend/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts new file mode 100644 index 0000000000..6cf8632b35 --- /dev/null +++ b/frontend/tailwind.config.ts @@ -0,0 +1,70 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + darkMode: ["class"], + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))' + } + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)' + }, + fontFamily: { + branding: ['var(--font-branding)'], + sans: ['var(--font-matter)'], + serif: ['var(--font-reckless-neue)'], + inter: ['var(--font-inter)'] + }, + + } + }, + plugins: [require("tailwindcss-animate")], +}; +export default config; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000000..e7ff90fd27 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From a843284092129ad063b68c244c97f21f3b0615d7 Mon Sep 17 00:00:00 2001 From: Brendan Tan Date: Fri, 20 Sep 2024 22:52:33 +0800 Subject: [PATCH 004/191] Add multi-select component --- frontend/components/ui/badge.tsx | 6 +- frontend/components/ui/multi-select.tsx | 431 ++++++++++++++++++++++++ frontend/components/ui/separator.tsx | 31 ++ frontend/package-lock.json | 74 ++++ frontend/package.json | 2 + frontend/tailwind.config.ts | 38 ++- 6 files changed, 575 insertions(+), 7 deletions(-) create mode 100644 frontend/components/ui/multi-select.tsx create mode 100644 frontend/components/ui/separator.tsx diff --git a/frontend/components/ui/badge.tsx b/frontend/components/ui/badge.tsx index f000e3ef51..b6eccbc188 100644 --- a/frontend/components/ui/badge.tsx +++ b/frontend/components/ui/badge.tsx @@ -9,11 +9,11 @@ const badgeVariants = cva( variants: { variant: { default: - "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + "border-transparent bg-primary text-primary-foreground", secondary: - "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + "border-transparent bg-secondary text-secondary-foreground", destructive: - "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + "border-transparent bg-destructive text-destructive-foreground", outline: "text-foreground", }, }, diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx new file mode 100644 index 0000000000..8c7f032767 --- /dev/null +++ b/frontend/components/ui/multi-select.tsx @@ -0,0 +1,431 @@ +/** + * Credits to https://github.com/sersavan/shadcn-multi-select-component + * Modified version of shadcn-multi-select-component + */ + +import * as React from "react"; +import { cva, type VariantProps } from "class-variance-authority"; +import { + CheckIcon, + XCircle, + ChevronDown, + XIcon, + WandSparkles, +} from "lucide-react"; + +import { cn } from "@/lib/utils"; +import { Separator } from "@/components/ui/separator"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, + CommandSeparator, +} from "@/components/ui/command"; + +/** + * Variants for the multi-select component to handle different styles. + * Uses class-variance-authority (cva) to define different styles based on "variant" prop. + */ +const multiSelectVariants = cva( + "m-1 transition ease-in-out delay-150 hover:-translate-y-1 hover:scale-110 duration-300", + { + variants: { + variant: { + default: + "border-foreground/10 text-foreground bg-card hover:bg-card/80", + secondary: + "border-foreground/10 bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + inverted: "inverted", + }, + }, + defaultVariants: { + variant: "default", + }, + } +); + +/** + * Props for MultiSelect component + */ +interface MultiSelectProps + extends React.ButtonHTMLAttributes, + VariantProps { + /** + * An array of option objects to be displayed in the multi-select component. + * Each option object has a label, value, an optional icon, and optional class names. + */ + options: { + /** The text to display for the option. */ + label: string; + /** The unique value associated with the option. */ + value: string; + /** Optional icon component to display alongside the option. */ + icon?: React.ComponentType<{ className?: string }>; + /** Optional classes to add to the option badge */ + className?: string; + }[]; + + /** + * Callback function triggered when the selected values change. + * Receives an array of the new selected values. + */ + onValueChange: (value: string[]) => void; + + /** The default selected values when the component mounts. */ + defaultValue?: string[]; + + /** + * Placeholder text to be displayed when no values are selected. + * Optional, defaults to "Select options". + */ + placeholder?: string; + + /** + * Animation duration in seconds for the visual effects (e.g., bouncing badges). + * Optional, defaults to 0 (no animation). + */ + animation?: number; + + /** + * Maximum number of items to display. Extra selected items will be summarized. + * Optional, defaults to 3. + */ + maxCount?: number; + + /** + * The modality of the popover. When set to true, interaction with outside elements + * will be disabled and only popover content will be visible to screen readers. + * Optional, defaults to false. + */ + modalPopover?: boolean; + + /** + * If true, renders the multi-select component as a child of another component. + * Optional, defaults to false. + */ + asChild?: boolean; + + /** + * Additional class names to apply custom styles to the multi-select component and all options. + * Optional, can be used to add custom styles. + */ + className?: string; + + /** + * Optional icon component to display alongside the multi-select component. + */ + selectIcon?: React.ComponentType<{ className?: string }>; + + /** + * If true, the multi-select component will be searchable. + */ + search?: boolean; +} + +export const MultiSelect = React.forwardRef< + HTMLButtonElement, + MultiSelectProps +>( + ( + { + options, + onValueChange, + variant, + defaultValue = [], + placeholder = "Select options", + animation = 0, + maxCount = 3, + modalPopover = false, + asChild = false, + className, + selectIcon: SelectIcon, + search, + ...props + }, + ref + ) => { + const [selectedValues, setSelectedValues] = + React.useState(defaultValue); + const [isPopoverOpen, setIsPopoverOpen] = React.useState(false); + const [isAnimating, setIsAnimating] = React.useState(false); + const [isOverflowing, setIsOverflowing] = React.useState(false); + + const containerRef = React.useRef(null); + const itemsRef = React.useRef(null); + + React.useEffect(() => { + const checkOverflow = () => { + if (containerRef.current && itemsRef.current) { + setIsOverflowing(itemsRef.current.scrollWidth > containerRef.current.clientWidth); + } + }; + + checkOverflow(); + window.addEventListener('resize', checkOverflow); + + return () => { + window.removeEventListener('resize', checkOverflow); + }; + }, [selectedValues]); + + const handleInputKeyDown = ( + event: React.KeyboardEvent + ) => { + if (event.key === "Enter") { + setIsPopoverOpen(true); + } else if (event.key === "Backspace" && !event.currentTarget.value) { + const newSelectedValues = [...selectedValues]; + newSelectedValues.pop(); + setSelectedValues(newSelectedValues); + // onValueChange(newSelectedValues); + } + }; + + const toggleOption = (option: string) => { + const newSelectedValues = selectedValues.includes(option) + ? selectedValues.filter((value) => value !== option) + : [...selectedValues, option]; + setSelectedValues(newSelectedValues); + onValueChange(newSelectedValues); + }; + + const handleClear = () => { + setSelectedValues([]); + onValueChange([]); + }; + + const handleTogglePopover = () => { + setIsPopoverOpen((prev) => !prev); + }; + + const clearExtraOptions = () => { + const newSelectedValues = selectedValues.slice(0, maxCount); + setSelectedValues(newSelectedValues); + onValueChange(newSelectedValues); + }; + + const toggleAll = () => { + if (selectedValues.length === options.length) { + handleClear(); + } else { + const allValues = options.map((option) => option.value); + setSelectedValues(allValues); + onValueChange(allValues); + } + }; + + return ( + + + + + setIsPopoverOpen(false)} + > + + { + search && ( + + ) + } + + No results found. + + +
+ +
+ Select all +
+ + {options.map((option) => { + const isSelected = selectedValues.includes(option.value); + return ( + toggleOption(option.value)} + className="cursor-pointer" + > +
+ +
+ {option.icon && ( + + )} + {option.label} +
+ ); + })} +
+ {/* + +
+ {selectedValues.length > 0 && ( + <> + + Clear + + + + )} + setIsPopoverOpen(false)} + className="flex-1 justify-center cursor-pointer max-w-full" + > + Close + +
+
*/} +
+
+
+ {/* {animation > 0 && selectedValues.length > 0 && ( + setIsAnimating(!isAnimating)} + /> + )} */} +
+ ); + } +); + +MultiSelect.displayName = "MultiSelect"; diff --git a/frontend/components/ui/separator.tsx b/frontend/components/ui/separator.tsx new file mode 100644 index 0000000000..12d81c4a85 --- /dev/null +++ b/frontend/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 06de2ed285..fceb38ba43 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,6 +13,8 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", @@ -502,6 +504,12 @@ "node": ">=14" } }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, "node_modules/@radix-ui/primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", @@ -1025,6 +1033,72 @@ } } }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 93ccca66ee..39add0b0d8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,8 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index 6cf8632b35..a792cede64 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -8,7 +8,7 @@ const config: Config = { "./app/**/*.{js,ts,jsx,tsx,mdx}", ], theme: { - extend: { + extend: { colors: { background: 'hsl(var(--background))', foreground: 'hsl(var(--foreground))', @@ -49,13 +49,43 @@ const config: Config = { '3': 'hsl(var(--chart-3))', '4': 'hsl(var(--chart-4))', '5': 'hsl(var(--chart-5))' - } }, - borderRadius: { + brand: { + 50: '#F9F5FF', + 100: '#F4EBFF', + 200: '#E9D7FE', + 300: '#D6BBFB', + 400: '#B692F6', + 500: '#9E77ED', + 600: '#7F56D9', + 700: '#6941C6', + 800: '#53389E' + }, + icon: 'var(--icon)', + diff: { + 'hard': { + text: 'var(--diff-hard-text)', + bg: 'var(--diff-hard-bg)' + }, + 'medium': { + text: 'var(--diff-medium-text)', + bg: 'var(--diff-medium-bg)' + }, + 'easy': { + text: 'var(--diff-easy-text)', + bg: 'var(--diff-easy-bg)' + } + }, + topic: { + text: 'var(--topic-text)', + bg: 'var(--topic-bg)', + } + }, + borderRadius: { lg: 'var(--radius)', md: 'calc(var(--radius) - 2px)', sm: 'calc(var(--radius) - 4px)' - }, + }, fontFamily: { branding: ['var(--font-branding)'], sans: ['var(--font-matter)'], From c6002f0f74ab635671c969be640d853835375c2e Mon Sep 17 00:00:00 2001 From: Brendan Tan Date: Fri, 20 Sep 2024 22:53:17 +0800 Subject: [PATCH 005/191] Add basic SPA layout --- frontend/app/globals.css | 20 ++++ frontend/app/page.tsx | 154 +++++++++++++++++++--------- frontend/components/ui/select.tsx | 160 ++++++++++++++++++++++++++++++ 3 files changed, 286 insertions(+), 48 deletions(-) create mode 100644 frontend/components/ui/select.tsx diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 78e9501cdc..c334fa254d 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -53,6 +53,16 @@ body { --chart-4: 43 74% 66%; --chart-5: 27 87% 67%; --radius: 0.5rem; + + --icon: #667085; + --diff-hard-bg: #FFF1F3; + --diff-hard-text: #C01048; + --diff-medium-bg: #FFF6ED; + --diff-medium-text: #EC4A0A; + --diff-easy-bg: #EFF8FF; + --diff-easy-text: #1570EF; + --topic-bg: #EAECF5; + --topic-text: #363F72; } .dark { --background: 0 0% 3.9%; @@ -79,6 +89,16 @@ body { --chart-3: 30 80% 55%; --chart-4: 280 65% 60%; --chart-5: 340 75% 55%; + + --icon: #667085; + --diff-hard-bg: #FFF1F3; + --diff-hard-text: #C01048; + --diff-medium-bg: #FFF6ED; + --diff-medium-text: #EC4A0A; + --diff-easy-bg: #EFF8FF; + --diff-easy-text: #1570EF; + --topic-bg: #EAECF5; + --topic-text: #363F72; } } diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 1ce88fd2eb..7ebbdd9319 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,16 +1,41 @@ +"use client" + import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import Image from "next/image"; +import { MultiSelect } from "@/components/ui/multi-select"; +import { Flag, MessageSquareText } from "lucide-react"; import Link from "next/link"; +import React, { useState } from "react"; + +const difficultyList = [ + { value: "easy", label: "Easy", className: "bg-diff-easy-bg text-diff-easy-text" }, + { value: "medium", label: "Medium", className: "bg-diff-medium-bg text-diff-medium-text" }, + { value: "hard", label: "Hard", className: "bg-diff-hard-bg text-diff-hard-text" }, +]; + +const topicList = [ + { value: "algorithms", label: "Algorithms", className: "bg-topic-bg text-topic-text" }, + { value: "arrays", label: "Arrays", className: "bg-topic-bg text-topic-text" }, + { value: "bitmanipulation", label: "Bit Manipulation", className: "bg-topic-bg text-topic-text" }, + { value: "brainteaser", label: "Brain Teaser", className: "bg-topic-bg text-topic-text" }, + { value: "databases", label: "Databases", className: "bg-topic-bg text-topic-text" }, + { value: "datastructures", label: "Data Structures", className: "bg-topic-bg text-topic-text" }, + { value: "recursion", label: "Recursion", className: "bg-topic-bg text-topic-text" }, + { value: "strings", label: "Strings", className: "bg-topic-bg text-topic-text" }, +]; export default function Home() { + const [selectedDifficuties, setSelectedDifficuties] = useState(["easy", "medium", "hard"]); + const [selectedTopics, setSelectedTopics] = useState(["arrays", "strings"]); + return ( //
{/* */} - PeerPrep + PeerPrep
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - app/page.tsx - - . -
  2. -
  3. Save and see your changes instantly.
  4. -
- -
- - Vercel logomark - Deploy now - - - Read our docs - +
+
+
+
+ + +
+ +
+ +
+
+

Question 2 with a long title which might take 2 lines or more

+
+
+ + + Hard + +
+
+ + + Arrays + + + Algorithms + +
+
+

Long description of question 2

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, + vehicula eget ipsum. Fusce pharetra venenatis urna eget aliquet. Etiam vel mi sapien. Morbi elementum semper + mauris, eget venenatis nibh dictum sit amet. Quisque sodales magna id turpis commodo volutpat. Donec congue + erat erat, gravida scelerisque justo pharetra eu. Morbi lacinia viverra scelerisque. Maecenas augue nisl, + tristique ut ultricies quis, bibendum dictum quam. Nam iaculis mauris et efficitur imperdiet. Quisque + pretium blandit varius. Suspendisse non sapien fringilla, pellentesque sapien sit amet, porttitor felis. Sed + commodo, ante a vehicula ullamcorper, felis lacus pulvinar velit, et auctor ipsum metus et enim. Etiam + efficitur consectetur egestas. +

+ Quisque id eros at ante efficitur pharetra. Aliquam maximus, orci et vulputate rhoncus, est nisl malesuada + turpis, nec ullamcorper turpis est sit amet libero. Nunc sed enim elementum, lobortis tortor in, ultrices + lacus. Nam leo eros, ullamcorper vitae gravida nec, sagittis sed metus. Praesent diam ante, blandit id odio + sit amet, viverra posuere eros. Praesent tempor bibendum vestibulum. Duis at lacinia felis, vel interdum + odio. Etiam ullamcorper sagittis purus vitae tristique. Proin posuere elit sed augue aliquam eleifend. In + vitae ante id augue posuere finibus eget at magna. Praesent sit amet magna at purus pretium egestas. Mauris + cursus tincidunt interdum. +

+ Duis sapien nunc, tristique et ligula ut, lacinia lacinia velit. Nulla vel varius nulla. Pellentesque eget + odio sapien. Nullam vitae ex diam. In at cursus ex, vel placerat sem. Aliquam augue odio, tincidunt quis + congue eget, consequat eu turpis. Integer volutpat, orci eget gravida efficitur, mi est bibendum nisl, non + bibendum velit nisi et purus. Maecenas in purus vel metus ullamcorper sodales. Integer scelerisque, nunc ac + volutpat tincidunt, tortor urna bibendum orci, eget auctor nisi orci ut risus. Donec a mi euismod, pulvinar + erat at, tincidunt arcu. Nam sit amet odio ut ante tincidunt rutrum. Suspendisse potenti. Cras suscipit, + eros id lacinia tincidunt, velit justo suscipit lorem, at mollis quam mi ut velit. +

); diff --git a/frontend/components/ui/select.tsx b/frontend/components/ui/select.tsx new file mode 100644 index 0000000000..cbe5a36b69 --- /dev/null +++ b/frontend/components/ui/select.tsx @@ -0,0 +1,160 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} From 4646a049a4046086d39a5c73c62984f87b8c44f5 Mon Sep 17 00:00:00 2001 From: Brendan Tan Date: Sat, 21 Sep 2024 01:45:56 +0800 Subject: [PATCH 006/191] Add Docker and Docker Compose files --- README.md | 19 ++++++++++++++++- docker-compose.dev.yml | 14 +++++++++++++ docker-compose.yml | 9 ++++++++ frontend/.eslintrc.json | 6 +++++- frontend/Dockerfile.dev | 13 ++++++++++++ frontend/Dockerfile.prod | 28 +++++++++++++++++++++++++ frontend/README.md | 27 ++++++++++-------------- frontend/app/page.tsx | 3 ++- frontend/components/ui/badge.tsx | 1 + frontend/components/ui/multi-select.tsx | 2 +- frontend/next.config.mjs | 4 +++- 11 files changed, 105 insertions(+), 21 deletions(-) create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.yml create mode 100644 frontend/Dockerfile.dev create mode 100644 frontend/Dockerfile.prod diff --git a/README.md b/README.md index 5ddee1cbf1..ab78171eb6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,23 @@ [![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/bzPrOe11) # CS3219 Project (PeerPrep) - AY2425S1 -## Group: Gxx +## Group: G44 + +### Running PeerPrep +In the root directory, run +```sh +docker compose up -d +``` +and access PeerPrep at [localhost:3000](localhost:3000) + +### Developing PeerPrep +If you are developing PeerPrep, you can use `docker-compose.dev.yml` to enable [Next.js Fast Refresh](https://nextjs.org/docs/architecture/fast-refresh): +```sh +docker compose -f docker-compose.dev.yml up --watch --build +``` +Due to how Docker Compose handles multiple Compose files, if you wish to run the prod version after running the dev version, you need to specify the Compose file: +```sh +docker compose -f docker-compose.yml up --build +``` ### Note: - You can choose to develop individual microservices within separate folders within this repository **OR** use individual repositories (all public) for each microservice. diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000000..9c45c5bb06 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,14 @@ +services: + frontend: + build: + context: ./frontend + dockerfile: Dockerfile.dev + # depends_on: + # - + ports: + - "3000:3000" + develop: + watch: + - action: sync + path: ./frontend + target: /app \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..1d4a247591 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +services: + frontend: + build: + context: ./frontend + dockerfile: Dockerfile.prod + # depends_on: + # - + ports: + - "3000:3000" \ No newline at end of file diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index 3722418549..05521f394d 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -1,3 +1,7 @@ { - "extends": ["next/core-web-vitals", "next/typescript"] + "extends": ["next/core-web-vitals", "next/typescript"], + "rules": { + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-empty-object-type": "off" + } } diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev new file mode 100644 index 0000000000..9ca431a6ac --- /dev/null +++ b/frontend/Dockerfile.dev @@ -0,0 +1,13 @@ +FROM node:22-alpine3.19 AS builder +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci +COPY . . + +ENV HOSTNAME="0.0.0.0" +ENV PORT=3000 + +EXPOSE 3000 + +CMD ["npm", "run", "dev"] \ No newline at end of file diff --git a/frontend/Dockerfile.prod b/frontend/Dockerfile.prod new file mode 100644 index 0000000000..211619e4b6 --- /dev/null +++ b/frontend/Dockerfile.prod @@ -0,0 +1,28 @@ +FROM node:22-alpine3.19 AS builder +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci +COPY . . +ENV NEXT_TELEMETRY_DISABLED=1 +RUN npm run build + + +FROM node:22-alpine3.19 AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +# COPY --from=builder /app/public ./public + +RUN mkdir .next +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static + +ENV HOSTNAME="0.0.0.0" +ENV PORT=3000 + +EXPOSE 3000 + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md index e215bc4ccf..06eebd56ee 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -2,7 +2,12 @@ This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next- ## Getting Started -First, run the development server: +The preferred way is to use Docker Compose from the PeerPrep root directory: +```sh +docker compose -f docker-compose.dev.yml up --watch +``` + +Otherwise, run the development server: ```bash npm run dev @@ -18,19 +23,9 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +## Stack -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +- [React](https://react.dev) +- [Next.js](https://nextjs.org) +- [shadcn/ui](https://ui.shadcn.com/) +- [Tailwind CSS](https://tailwindcss.com) diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 7ebbdd9319..e07902f48f 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -36,6 +36,7 @@ export default function Home() {
{/* */} PeerPrep + {process.env.NODE_ENV == "development" && (DEV)}
- +
diff --git a/frontend/components/ui/badge.tsx b/frontend/components/ui/badge.tsx index b6eccbc188..26aa568cba 100644 --- a/frontend/components/ui/badge.tsx +++ b/frontend/components/ui/badge.tsx @@ -15,6 +15,7 @@ const badgeVariants = cva( destructive: "border-transparent bg-destructive text-destructive-foreground", outline: "text-foreground", + dev: "border-transparent bg-[#83ff27] text-secondary-foreground px-2" }, }, defaultVariants: { diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx index 8c7f032767..037a9d919e 100644 --- a/frontend/components/ui/multi-select.tsx +++ b/frontend/components/ui/multi-select.tsx @@ -314,7 +314,7 @@ export const MultiSelect = React.forwardRef<
{SelectIcon && ( - + )} {placeholder} diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index 4678774e6d..13928e00a7 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + output: "standalone" +}; export default nextConfig; From 708f553b10c38195c2ac6d67734cd67bf46ca1e5 Mon Sep 17 00:00:00 2001 From: Brendan Tan Date: Sat, 21 Sep 2024 17:16:37 +0800 Subject: [PATCH 007/191] Add sample questions --- frontend/app/page.tsx | 136 +++++++++++++++++++++--- frontend/components/ui/badge.tsx | 6 +- frontend/components/ui/multi-select.tsx | 5 +- 3 files changed, 130 insertions(+), 17 deletions(-) diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index e07902f48f..6490428bb2 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,28 +1,112 @@ "use client" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Badge } from "@/components/ui/badge"; +import { Badge, BadgeProps } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; import { MultiSelect } from "@/components/ui/multi-select"; import { Flag, MessageSquareText } from "lucide-react"; import Link from "next/link"; import React, { useState } from "react"; -const difficultyList = [ - { value: "easy", label: "Easy", className: "bg-diff-easy-bg text-diff-easy-text" }, - { value: "medium", label: "Medium", className: "bg-diff-medium-bg text-diff-medium-text" }, - { value: "hard", label: "Hard", className: "bg-diff-hard-bg text-diff-hard-text" }, +const difficultyList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ + { value: "easy", label: "Easy", badgeVariant: "diffEasy" }, + { value: "medium", label: "Medium", badgeVariant: "diffMedium" }, + { value: "hard", label: "Hard", badgeVariant: "diffHard" }, ]; -const topicList = [ - { value: "algorithms", label: "Algorithms", className: "bg-topic-bg text-topic-text" }, - { value: "arrays", label: "Arrays", className: "bg-topic-bg text-topic-text" }, - { value: "bitmanipulation", label: "Bit Manipulation", className: "bg-topic-bg text-topic-text" }, - { value: "brainteaser", label: "Brain Teaser", className: "bg-topic-bg text-topic-text" }, - { value: "databases", label: "Databases", className: "bg-topic-bg text-topic-text" }, - { value: "datastructures", label: "Data Structures", className: "bg-topic-bg text-topic-text" }, - { value: "recursion", label: "Recursion", className: "bg-topic-bg text-topic-text" }, - { value: "strings", label: "Strings", className: "bg-topic-bg text-topic-text" }, +const topicList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ + { value: "algorithms", label: "Algorithms", badgeVariant: "topic" }, + { value: "arrays", label: "Arrays", badgeVariant: "topic" }, + { value: "bitmanipulation", label: "Bit Manipulation", badgeVariant: "topic" }, + { value: "brainteaser", label: "Brain Teaser", badgeVariant: "topic" }, + { value: "databases", label: "Databases", badgeVariant: "topic" }, + { value: "datastructures", label: "Data Structures", badgeVariant: "topic" }, + { value: "recursion", label: "Recursion", badgeVariant: "topic" }, + { value: "strings", label: "Strings", badgeVariant: "topic" }, +]; + +const questionList = [ + { + id: 1, + title: "Question 1", + difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + topics: [topicList.find(topic => topic.value === "algorithms")?.label], + summary: "Short summary of question 1", + selected: false, + }, + { + id: 2, + title: "Question 2 with a long title which might take 2 lines or more", + difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "algorithms")?.label], + summary: "Short summary of question 2", + selected: true, + }, + { + id: 3, + title: "Question 3", + difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + topics: [topicList.find(topic => topic.value === "brainteaser")?.label], + summary: "Slightly longer but still short summary of question 3", + selected: true, + }, + { + id: 4, + title: "Question 4", + difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + topics: [topicList.find(topic => topic.value === "datastructures")?.label], + summary: "Short summary of question 4", + selected: false, + }, + { + id: 5, + title: "Question 5", + difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + topics: [topicList.find(topic => topic.value === "databases")?.label], + summary: "Short summary of question 5", + selected: false, + }, + { + id: 6, + title: "Question 6", + difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "algorithms")?.label], + summary: "Short summary of question 6", + selected: false, + }, + { + id: 7, + title: "Question 7", + difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "datastructures")?.label], + summary: "Short summary of question 7", + selected: true, + }, + { + id: 8, + title: "Question 8", + difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + topics: [topicList.find(topic => topic.value === "algorithms")?.label], + summary: "Short summary of question 8", + selected: false, + }, + { + id: 9, + title: "Question 9", + difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "recursion")?.label], + summary: "Short summary of question 9", + selected: false, + }, + { + id: 10, + title: "Question 10", + difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + topics: [topicList.find(topic => topic.value === "arrays")?.label], + summary: "Short summary of question 10", + selected: true, + }, ]; export default function Home() { @@ -85,7 +169,29 @@ export default function Home() {
- +
+ {questionList.map((question) => ( +
+ +
+

{question.title}

+
+ {question.difficulty} + {question.topics.map((topic, index) => ( + + {topic} + + ))} +
+

{question.summary}

+
+ +
+
+ ))} +

Question 2 with a long title which might take 2 lines or more

diff --git a/frontend/components/ui/badge.tsx b/frontend/components/ui/badge.tsx index 26aa568cba..3437d916e3 100644 --- a/frontend/components/ui/badge.tsx +++ b/frontend/components/ui/badge.tsx @@ -15,7 +15,11 @@ const badgeVariants = cva( destructive: "border-transparent bg-destructive text-destructive-foreground", outline: "text-foreground", - dev: "border-transparent bg-[#83ff27] text-secondary-foreground px-2" + dev: "border-transparent bg-[#83ff27] text-secondary-foreground px-2", + topic: "bg-topic-bg text-topic-text uppercase", + diffEasy: "bg-diff-easy-bg text-diff-easy-text uppercase", + diffMedium: "bg-diff-medium-bg text-diff-medium-text uppercase", + diffHard: "bg-diff-hard-bg text-diff-hard-text uppercase", }, }, defaultVariants: { diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx index 037a9d919e..19aca73547 100644 --- a/frontend/components/ui/multi-select.tsx +++ b/frontend/components/ui/multi-select.tsx @@ -16,7 +16,7 @@ import { import { cn } from "@/lib/utils"; import { Separator } from "@/components/ui/separator"; import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; +import { Badge, BadgeProps } from "@/components/ui/badge"; import { Popover, PopoverContent, @@ -75,6 +75,8 @@ interface MultiSelectProps icon?: React.ComponentType<{ className?: string }>; /** Optional classes to add to the option badge */ className?: string; + /** Optional variant to apply to the option badge */ + badgeVariant?: BadgeProps["variant"]; }[]; /** @@ -253,6 +255,7 @@ export const MultiSelect = React.forwardRef< const IconComponent = option?.icon; return ( Date: Sat, 21 Sep 2024 22:25:09 +0800 Subject: [PATCH 008/191] Add question details change on click --- frontend/app/page.tsx | 207 ++++++++++++------------ frontend/components/ui/badge.tsx | 8 +- frontend/components/ui/multi-select.tsx | 2 +- frontend/components/ui/scroll-area.tsx | 51 ++++++ frontend/package-lock.json | 32 ++++ frontend/package.json | 1 + frontend/tailwind.config.ts | 5 + 7 files changed, 200 insertions(+), 106 deletions(-) create mode 100644 frontend/components/ui/scroll-area.tsx diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 6490428bb2..51b23180c3 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -5,14 +5,15 @@ import { Badge, BadgeProps } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { MultiSelect } from "@/components/ui/multi-select"; +import { ScrollArea } from "@/components/ui/scroll-area"; import { Flag, MessageSquareText } from "lucide-react"; import Link from "next/link"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; const difficultyList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ - { value: "easy", label: "Easy", badgeVariant: "diffEasy" }, - { value: "medium", label: "Medium", badgeVariant: "diffMedium" }, - { value: "hard", label: "Hard", badgeVariant: "diffHard" }, + { value: "easy", label: "Easy", badgeVariant: "easy" }, + { value: "medium", label: "Medium", badgeVariant: "medium" }, + { value: "hard", label: "Hard", badgeVariant: "hard" }, ]; const topicList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ @@ -30,88 +31,107 @@ const questionList = [ { id: 1, title: "Question 1", - difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + difficulty: difficultyList.find(diff => diff.value === "easy")?.value, topics: [topicList.find(topic => topic.value === "algorithms")?.label], summary: "Short summary of question 1", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 2, title: "Question 2 with a long title which might take 2 lines or more", - difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + difficulty: difficultyList.find(diff => diff.value === "hard")?.value, topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "algorithms")?.label], summary: "Short summary of question 2", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum. Fusce pharetra venenatis urna eget aliquet. Etiam vel mi sapien. Morbi elementum sempermauris, eget venenatis nibh dictum sit amet. Quisque sodales magna id turpis commodo volutpat. Donec congueerat erat, gravida scelerisque justo pharetra eu. Morbi lacinia viverra scelerisque. Maecenas augue nisl,tristique ut ultricies quis, bibendum dictum quam. Nam iaculis mauris et efficitur imperdiet. Quisquepretium blandit varius. Suspendisse non sapien fringilla, pellentesque sapien sit amet, porttitor felis. Sedcommodo, ante a vehicula ullamcorper, felis lacus pulvinar velit, et auctor ipsum metus et enim. Etiamefficitur consectetur egestas.Quisque id eros at ante efficitur pharetra. Aliquam maximus, orci et vulputate rhoncus, est nisl malesuadaturpis, nec ullamcorper turpis est sit amet libero. Nunc sed enim elementum, lobortis tortor in, ultriceslacus. Nam leo eros, ullamcorper vitae gravida nec, sagittis sed metus. Praesent diam ante, blandit id odiosit amet, viverra posuere eros. Praesent tempor bibendum vestibulum. Duis at lacinia felis, vel interdumodio. Etiam ullamcorper sagittis purus vitae tristique. Proin posuere elit sed augue aliquam eleifend. Invitae ante id augue posuere finibus eget at magna. Praesent sit amet magna at purus pretium egestas. Mauriscursus tincidunt interdum.Duis sapien nunc, tristique et ligula ut, lacinia lacinia velit. Nulla vel varius nulla. Pellentesque egetodio sapien. Nullam vitae ex diam. In at cursus ex, vel placerat sem. Aliquam augue odio, tincidunt quiscongue eget, consequat eu turpis. Integer volutpat, orci eget gravida efficitur, mi est bibendum nisl, nonbibendum velit nisi et purus. Maecenas in purus vel metus ullamcorper sodales. Integer scelerisque, nunc acvolutpat tincidunt, tortor urna bibendum orci, eget auctor nisi orci ut risus. Donec a mi euismod, pulvinarerat at, tincidunt arcu. Nam sit amet odio ut ante tincidunt rutrum. Suspendisse potenti. Cras suscipit, eros id lacinia tincidunt, velit justo suscipit lorem, at mollis quam mi ut velit.", selected: true, }, { id: 3, title: "Question 3", - difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + difficulty: difficultyList.find(diff => diff.value === "medium")?.value, topics: [topicList.find(topic => topic.value === "brainteaser")?.label], summary: "Slightly longer but still short summary of question 3", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: true, }, { id: 4, title: "Question 4", - difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + difficulty: difficultyList.find(diff => diff.value === "easy")?.value, topics: [topicList.find(topic => topic.value === "datastructures")?.label], summary: "Short summary of question 4", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 5, title: "Question 5", - difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + difficulty: difficultyList.find(diff => diff.value === "hard")?.value, topics: [topicList.find(topic => topic.value === "databases")?.label], summary: "Short summary of question 5", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 6, title: "Question 6", - difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + difficulty: difficultyList.find(diff => diff.value === "easy")?.value, topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "algorithms")?.label], summary: "Short summary of question 6", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 7, title: "Question 7", - difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + difficulty: difficultyList.find(diff => diff.value === "medium")?.value, topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "datastructures")?.label], summary: "Short summary of question 7", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: true, }, { id: 8, title: "Question 8", - difficulty: difficultyList.find(diff => diff.value === "hard")?.label, + difficulty: difficultyList.find(diff => diff.value === "hard")?.value, topics: [topicList.find(topic => topic.value === "algorithms")?.label], summary: "Short summary of question 8", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 9, title: "Question 9", - difficulty: difficultyList.find(diff => diff.value === "easy")?.label, + difficulty: difficultyList.find(diff => diff.value === "easy")?.value, topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "recursion")?.label], summary: "Short summary of question 9", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: false, }, { id: 10, title: "Question 10", - difficulty: difficultyList.find(diff => diff.value === "medium")?.label, + difficulty: difficultyList.find(diff => diff.value === "medium")?.value, topics: [topicList.find(topic => topic.value === "arrays")?.label], summary: "Short summary of question 10", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", selected: true, }, ]; export default function Home() { - const [selectedDifficuties, setSelectedDifficuties] = useState(["easy", "medium", "hard"]); - const [selectedTopics, setSelectedTopics] = useState(["arrays", "strings"]); + const [selectedDifficuties, setSelectedDifficuties] = useState(difficultyList.map(diff => diff.value)); + const [selectedTopics, setSelectedTopics] = useState(topicList.map(topic => topic.value)); + const [filtersHeight, setFiltersHeight] = useState(0); + const [selectedViewQuestion, setSelectedViewQuestion] = useState(questionList[0]); + + useEffect(() => { + const filtersElement = document.getElementById('filters'); + if (filtersElement) { + setFiltersHeight(filtersElement.offsetHeight); + } + }, []); return ( //
@@ -122,7 +142,7 @@ export default function Home() { PeerPrep {process.env.NODE_ENV == "development" && (DEV)}
-
+
-
-
-
-
- - +
+
+ +
+
+
+ + +
+
- -
-
- {questionList.map((question) => ( -
- -
-

{question.title}

-
- {question.difficulty} - {question.topics.map((topic, index) => ( - - {topic} - - ))} -
-

{question.summary}

+ + +
+
+ {questionList.map((question) => ( +
+ setSelectedViewQuestion(question)} + > +
+

{question.title}

+
+ {question.difficulty} + {question.topics.map((topic, index) => ( + + {topic} + + ))} +
+

{question.summary}

+
+ +
- - + ))}
- ))} +
-
-

Question 2 with a long title which might take 2 lines or more

+
+

{selectedViewQuestion.title}

- - Hard + + {selectedViewQuestion.difficulty}
- - Arrays - - - Algorithms - + {selectedViewQuestion.topics.map((topic) => ( + + {topic} + + ))}
-

Long description of question 2

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, - vehicula eget ipsum. Fusce pharetra venenatis urna eget aliquet. Etiam vel mi sapien. Morbi elementum semper - mauris, eget venenatis nibh dictum sit amet. Quisque sodales magna id turpis commodo volutpat. Donec congue - erat erat, gravida scelerisque justo pharetra eu. Morbi lacinia viverra scelerisque. Maecenas augue nisl, - tristique ut ultricies quis, bibendum dictum quam. Nam iaculis mauris et efficitur imperdiet. Quisque - pretium blandit varius. Suspendisse non sapien fringilla, pellentesque sapien sit amet, porttitor felis. Sed - commodo, ante a vehicula ullamcorper, felis lacus pulvinar velit, et auctor ipsum metus et enim. Etiam - efficitur consectetur egestas. -

- Quisque id eros at ante efficitur pharetra. Aliquam maximus, orci et vulputate rhoncus, est nisl malesuada - turpis, nec ullamcorper turpis est sit amet libero. Nunc sed enim elementum, lobortis tortor in, ultrices - lacus. Nam leo eros, ullamcorper vitae gravida nec, sagittis sed metus. Praesent diam ante, blandit id odio - sit amet, viverra posuere eros. Praesent tempor bibendum vestibulum. Duis at lacinia felis, vel interdum - odio. Etiam ullamcorper sagittis purus vitae tristique. Proin posuere elit sed augue aliquam eleifend. In - vitae ante id augue posuere finibus eget at magna. Praesent sit amet magna at purus pretium egestas. Mauris - cursus tincidunt interdum. -

- Duis sapien nunc, tristique et ligula ut, lacinia lacinia velit. Nulla vel varius nulla. Pellentesque eget - odio sapien. Nullam vitae ex diam. In at cursus ex, vel placerat sem. Aliquam augue odio, tincidunt quis - congue eget, consequat eu turpis. Integer volutpat, orci eget gravida efficitur, mi est bibendum nisl, non - bibendum velit nisi et purus. Maecenas in purus vel metus ullamcorper sodales. Integer scelerisque, nunc ac - volutpat tincidunt, tortor urna bibendum orci, eget auctor nisi orci ut risus. Donec a mi euismod, pulvinar - erat at, tincidunt arcu. Nam sit amet odio ut ante tincidunt rutrum. Suspendisse potenti. Cras suscipit, - eros id lacinia tincidunt, velit justo suscipit lorem, at mollis quam mi ut velit. +

+ {selectedViewQuestion.description}

diff --git a/frontend/components/ui/badge.tsx b/frontend/components/ui/badge.tsx index 3437d916e3..65f9b697f5 100644 --- a/frontend/components/ui/badge.tsx +++ b/frontend/components/ui/badge.tsx @@ -16,10 +16,10 @@ const badgeVariants = cva( "border-transparent bg-destructive text-destructive-foreground", outline: "text-foreground", dev: "border-transparent bg-[#83ff27] text-secondary-foreground px-2", - topic: "bg-topic-bg text-topic-text uppercase", - diffEasy: "bg-diff-easy-bg text-diff-easy-text uppercase", - diffMedium: "bg-diff-medium-bg text-diff-medium-text uppercase", - diffHard: "bg-diff-hard-bg text-diff-hard-text uppercase", + topic: "border-transparent bg-topic-bg text-topic-text uppercase", + easy: "border-transparent bg-diff-easy-bg text-diff-easy-text uppercase", + medium: "border-transparent bg-diff-medium-bg text-diff-medium-text uppercase", + hard: "border-transparent bg-diff-hard-bg text-diff-hard-text uppercase", }, }, defaultVariants: { diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx index 19aca73547..2e623e4551 100644 --- a/frontend/components/ui/multi-select.tsx +++ b/frontend/components/ui/multi-select.tsx @@ -240,7 +240,7 @@ export const MultiSelect = React.forwardRef< {...props} onClick={handleTogglePopover} className={cn( - "flex p-1 rounded-md border min-h-10 h-auto items-center justify-between bg-inherit hover:bg-inherit", + "flex p-1 rounded-3xl border min-h-10 h-auto items-center justify-between bg-inherit hover:bg-inherit", className )} > diff --git a/frontend/components/ui/scroll-area.tsx b/frontend/components/ui/scroll-area.tsx new file mode 100644 index 0000000000..cd2026ce17 --- /dev/null +++ b/frontend/components/ui/scroll-area.tsx @@ -0,0 +1,51 @@ +"use client" + +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { barOffset?: number } +>(({ className, children, barOffset, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { barOffset?: number } +>(({ className, orientation = "vertical", barOffset, ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fceb38ba43..5b1f7f558d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,6 +13,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", @@ -1033,6 +1034,37 @@ } } }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", + "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-select": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 39add0b0d8..d7b390571b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", + "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts index a792cede64..a7cb98c2a7 100644 --- a/frontend/tailwind.config.ts +++ b/frontend/tailwind.config.ts @@ -93,6 +93,11 @@ const config: Config = { inter: ['var(--font-inter)'] }, + }, + screens: { + 'tablet': '640px', + 'laptop': '1024px', + 'desktop': '1280px', } }, plugins: [require("tailwindcss-animate")], From 636d4cc8def6e3865293c2e77ea564ad9a8c8b04 Mon Sep 17 00:00:00 2001 From: LimJiaYan Date: Mon, 23 Sep 2024 16:48:37 +0800 Subject: [PATCH 009/191] Implement filter logic to display questions based on selected difficulty and topics. --- frontend/app/page.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 51b23180c3..aa8dd3cd86 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -126,6 +126,21 @@ export default function Home() { const [filtersHeight, setFiltersHeight] = useState(0); const [selectedViewQuestion, setSelectedViewQuestion] = useState(questionList[0]); + const filteredQuestions = questionList.filter((question) => { + // convert the selectedTopics (which are values) into their corresponding labels from topicList + const selectedTopicLabels = selectedTopics.map( + (topicValue) => topicList.find((topic) => topic.value === topicValue)?.label + ); + + const matchesDifficulty = + selectedDifficuties.length === 0 || (question.difficulty && selectedDifficuties.includes(question.difficulty)); + + const matchesTopics = + selectedTopicLabels.length === 0 || selectedTopicLabels.some((topic) => question.topics.includes(topic)); + + return matchesDifficulty && matchesTopics; + }); + useEffect(() => { const filtersElement = document.getElementById('filters'); if (filtersElement) { @@ -195,7 +210,7 @@ export default function Home() {
- {questionList.map((question) => ( + {filteredQuestions.map((question) => (
Date: Mon, 23 Sep 2024 21:49:52 +0800 Subject: [PATCH 010/191] Fetched questions from API --- data/question.json | 216 +++++++++++++++++++++++++++++++++ frontend/app/page.tsx | 271 ++++++++++++++++++++++-------------------- 2 files changed, 359 insertions(+), 128 deletions(-) create mode 100644 data/question.json diff --git a/data/question.json b/data/question.json new file mode 100644 index 0000000000..0c630a5921 --- /dev/null +++ b/data/question.json @@ -0,0 +1,216 @@ +{ + "questions": [ + { + "id": 1, + "title": "Reverse a String", + "description": "Write a function that reverses a string. The input string is given as an array of characters s. You must do this by modifying the input array in-place with O(1) extra memory.", + "category": [ + "Strings", + "Algorithms" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/reverse-string/" + }, + { + "id": 2, + "title": "Linked List Cycle Detection", + "description": "Implement a function to detect if a linked list contains a cycle.", + "category": [ + "Data Structures", + "Algorithms" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/linked-list-cycle/" + }, + { + "id": 3, + "title": "Roman to Integer", + "description": "Given a roman numeral, convert it to an integer.", + "category": [ + "Algorithms" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/roman-to-integer/" + }, + { + "id": 4, + "title": "Add Binary", + "description": "Given two binary strings a and b, return their sum as a binary string.", + "category": [ + "Bit Manipulation", + "Algorithms" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/add-binary/" + }, + { + "id": 5, + "title": "Fibonacci Number", + "description": "The Fibonacci numbers form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones. Given n, calculate F(n).", + "category": [ + "Recursion", + "Algorithms" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/fibonacci-number/" + }, + { + "id": 6, + "title": "Implement Stack using Queues", + "description": "Implement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (push, top, pop, and empty).", + "category": [ + "Data Structures" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/implement-stack-using-queues/" + }, + { + "id": 7, + "title": "Combine Two Tables", + "description": "Write a solution to report the first name, last name, city, and state of each person in the Person table. If the address of a personId is not present in the Address table, report null instead.", + "category": [ + "Databases" + ], + "complexity": "Easy", + "link": "https://leetcode.com/problems/combine-two-tables/" + }, + { + "id": 8, + "title": "Repeated DNA Sequences", + "description": "Given a string s that represents a DNA sequence, return all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.", + "category": [ + "Algorithms", + "Bit Manipulation" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/repeated-dna-sequences/" + }, + { + "id": 9, + "title": "Course Schedule", + "description": "Return true if you can finish all courses. Otherwise, return false.", + "category": [ + "Data Structures", + "Algorithms" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/course-schedule/" + }, + { + "id": 10, + "title": "LRU Cache Design", + "description": "Design and implement an LRU (Least Recently Used) cache.", + "category": [ + "Data Structures" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/lru-cache/" + }, + { + "id": 11, + "title": "Longest Common Subsequence", + "description": "Given two strings, return the length of their longest common subsequence.", + "category": [ + "Strings", + "Algorithms" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/longest-common-subsequence/" + }, + { + "id": 12, + "title": "Rotate Image", + "description": "Given an n x n 2D matrix representing an image, rotate the image by 90 degrees clockwise.", + "category": [ + "Arrays", + "Algorithms" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/rotate-image/" + }, + { + "id": 13, + "title": "Airplane Seat Assignment Probability", + "description": "Return the probability that the nth person gets their own seat.", + "category": [ + "Brainteaser" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/airplane-seat-assignment-probability/" + }, + { + "id": 14, + "title": "Validate Binary Search Tree", + "description": "Given the root of a binary tree, determine if it is a valid binary search tree (BST).", + "category": [ + "Data Structures", + "Algorithms" + ], + "complexity": "Medium", + "link": "https://leetcode.com/problems/validate-binary-search-tree/" + }, + { + "id": 15, + "title": "Sliding Window Maximum", + "description": "Return the max sliding window for an array of integers.", + "category": [ + "Arrays", + "Algorithms" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/sliding-window-maximum/" + }, + { + "id": 16, + "title": "N-Queen Problem", + "description": "Given an integer n, return all distinct solutions to the n-queens puzzle.", + "category": [ + "Algorithms" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/n-queens/" + }, + { + "id": 17, + "title": "Serialize and Deserialize a Binary Tree", + "description": "Design an algorithm to serialize and deserialize a binary tree.", + "category": [ + "Data Structures", + "Algorithms" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/serialize-and-deserialize-binary-tree/" + }, + { + "id": 18, + "title": "Wildcard Matching", + "description": "Implement wildcard pattern matching with support for '?' and '*'.", + "category": [ + "Strings", + "Algorithms" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/wildcard-matching/" + }, + { + "id": 19, + "title": "Chalkboard XOR Game", + "description": "Alice and Bob take turns erasing exactly one number from the chalkboard. Return true if and only if Alice wins the game, assuming both players play optimally.", + "category": [ + "Brainteaser" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/chalkboard-xor-game/" + }, + { + "id": 20, + "title": "Trips and Users", + "description": "Write a solution to find the cancellation rate of requests with unbanned users each day.", + "category": [ + "Databases" + ], + "complexity": "Hard", + "link": "https://leetcode.com/problems/trips-and-users/" + } + ] +} \ No newline at end of file diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index aa8dd3cd86..87a028c01c 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,4 +1,4 @@ -"use client" +"use client"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge, BadgeProps } from "@/components/ui/badge"; @@ -10,16 +10,38 @@ import { Flag, MessageSquareText } from "lucide-react"; import Link from "next/link"; import React, { useEffect, useState } from "react"; -const difficultyList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ +type Question = { + id: number; + title: string; + difficulty: string | undefined; + topics: (string | undefined)[]; + summary: (string | null); + description: string; + selected: boolean; +}; + +const difficultyList: Array<{ + value: string; + label: string; + badgeVariant: BadgeProps["variant"]; +}> = [ { value: "easy", label: "Easy", badgeVariant: "easy" }, { value: "medium", label: "Medium", badgeVariant: "medium" }, { value: "hard", label: "Hard", badgeVariant: "hard" }, ]; -const topicList: Array<{ value: string; label: string; badgeVariant: BadgeProps["variant"] }> = [ +const topicList: Array<{ + value: string; + label: string; + badgeVariant: BadgeProps["variant"]; +}> = [ { value: "algorithms", label: "Algorithms", badgeVariant: "topic" }, { value: "arrays", label: "Arrays", badgeVariant: "topic" }, - { value: "bitmanipulation", label: "Bit Manipulation", badgeVariant: "topic" }, + { + value: "bitmanipulation", + label: "Bit Manipulation", + badgeVariant: "topic", + }, { value: "brainteaser", label: "Brain Teaser", badgeVariant: "topic" }, { value: "databases", label: "Databases", badgeVariant: "topic" }, { value: "datastructures", label: "Data Structures", badgeVariant: "topic" }, @@ -27,142 +49,99 @@ const topicList: Array<{ value: string; label: string; badgeVariant: BadgeProps[ { value: "strings", label: "Strings", badgeVariant: "topic" }, ]; -const questionList = [ - { - id: 1, - title: "Question 1", - difficulty: difficultyList.find(diff => diff.value === "easy")?.value, - topics: [topicList.find(topic => topic.value === "algorithms")?.label], - summary: "Short summary of question 1", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 2, - title: "Question 2 with a long title which might take 2 lines or more", - difficulty: difficultyList.find(diff => diff.value === "hard")?.value, - topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "algorithms")?.label], - summary: "Short summary of question 2", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum. Fusce pharetra venenatis urna eget aliquet. Etiam vel mi sapien. Morbi elementum sempermauris, eget venenatis nibh dictum sit amet. Quisque sodales magna id turpis commodo volutpat. Donec congueerat erat, gravida scelerisque justo pharetra eu. Morbi lacinia viverra scelerisque. Maecenas augue nisl,tristique ut ultricies quis, bibendum dictum quam. Nam iaculis mauris et efficitur imperdiet. Quisquepretium blandit varius. Suspendisse non sapien fringilla, pellentesque sapien sit amet, porttitor felis. Sedcommodo, ante a vehicula ullamcorper, felis lacus pulvinar velit, et auctor ipsum metus et enim. Etiamefficitur consectetur egestas.Quisque id eros at ante efficitur pharetra. Aliquam maximus, orci et vulputate rhoncus, est nisl malesuadaturpis, nec ullamcorper turpis est sit amet libero. Nunc sed enim elementum, lobortis tortor in, ultriceslacus. Nam leo eros, ullamcorper vitae gravida nec, sagittis sed metus. Praesent diam ante, blandit id odiosit amet, viverra posuere eros. Praesent tempor bibendum vestibulum. Duis at lacinia felis, vel interdumodio. Etiam ullamcorper sagittis purus vitae tristique. Proin posuere elit sed augue aliquam eleifend. Invitae ante id augue posuere finibus eget at magna. Praesent sit amet magna at purus pretium egestas. Mauriscursus tincidunt interdum.Duis sapien nunc, tristique et ligula ut, lacinia lacinia velit. Nulla vel varius nulla. Pellentesque egetodio sapien. Nullam vitae ex diam. In at cursus ex, vel placerat sem. Aliquam augue odio, tincidunt quiscongue eget, consequat eu turpis. Integer volutpat, orci eget gravida efficitur, mi est bibendum nisl, nonbibendum velit nisi et purus. Maecenas in purus vel metus ullamcorper sodales. Integer scelerisque, nunc acvolutpat tincidunt, tortor urna bibendum orci, eget auctor nisi orci ut risus. Donec a mi euismod, pulvinarerat at, tincidunt arcu. Nam sit amet odio ut ante tincidunt rutrum. Suspendisse potenti. Cras suscipit, eros id lacinia tincidunt, velit justo suscipit lorem, at mollis quam mi ut velit.", - selected: true, - }, - { - id: 3, - title: "Question 3", - difficulty: difficultyList.find(diff => diff.value === "medium")?.value, - topics: [topicList.find(topic => topic.value === "brainteaser")?.label], - summary: "Slightly longer but still short summary of question 3", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: true, - }, - { - id: 4, - title: "Question 4", - difficulty: difficultyList.find(diff => diff.value === "easy")?.value, - topics: [topicList.find(topic => topic.value === "datastructures")?.label], - summary: "Short summary of question 4", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 5, - title: "Question 5", - difficulty: difficultyList.find(diff => diff.value === "hard")?.value, - topics: [topicList.find(topic => topic.value === "databases")?.label], - summary: "Short summary of question 5", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 6, - title: "Question 6", - difficulty: difficultyList.find(diff => diff.value === "easy")?.value, - topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "algorithms")?.label], - summary: "Short summary of question 6", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 7, - title: "Question 7", - difficulty: difficultyList.find(diff => diff.value === "medium")?.value, - topics: [topicList.find(topic => topic.value === "arrays")?.label, topicList.find(topic => topic.value === "datastructures")?.label], - summary: "Short summary of question 7", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: true, - }, - { - id: 8, - title: "Question 8", - difficulty: difficultyList.find(diff => diff.value === "hard")?.value, - topics: [topicList.find(topic => topic.value === "algorithms")?.label], - summary: "Short summary of question 8", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 9, - title: "Question 9", - difficulty: difficultyList.find(diff => diff.value === "easy")?.value, - topics: [topicList.find(topic => topic.value === "strings")?.label, topicList.find(topic => topic.value === "recursion")?.label], - summary: "Short summary of question 9", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: false, - }, - { - id: 10, - title: "Question 10", - difficulty: difficultyList.find(diff => diff.value === "medium")?.value, - topics: [topicList.find(topic => topic.value === "arrays")?.label], - summary: "Short summary of question 10", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque enim est, fermentum sit amet varius a, vehicula eget ipsum.", - selected: true, - }, -]; - export default function Home() { - const [selectedDifficuties, setSelectedDifficuties] = useState(difficultyList.map(diff => diff.value)); - const [selectedTopics, setSelectedTopics] = useState(topicList.map(topic => topic.value)); + const [selectedDifficuties, setSelectedDifficuties] = useState( + difficultyList.map((diff) => diff.value) + ); + const [selectedTopics, setSelectedTopics] = useState( + topicList.map((topic) => topic.value) + ); const [filtersHeight, setFiltersHeight] = useState(0); - const [selectedViewQuestion, setSelectedViewQuestion] = useState(questionList[0]); + const [questionList, setQuestionList] = useState([]); + const [selectedViewQuestion, setSelectedViewQuestion] = useState(null); + console.log("here"); + // Fetch questions from the backend API + useEffect(() => { + async function fetchQuestions() { + try { + const response = await fetch("http://localhost:5000/questions", { cache: "no-store" }); + const data = await response.json(); + + // Map backend data to match the frontend Question type + const mappedQuestions: Question[] = data.questions.map((q: any) => ({ + id: q.id, + title: q.title, + difficulty: difficultyList.find(diff => diff.value === q.complexity.toLowerCase())?.value, + topics: q.category, + summary: q.summary, + description: q.description, + selected: false, // Set selected to false initially + })); + + setQuestionList(mappedQuestions); // Set the fetched data to state + setSelectedViewQuestion(mappedQuestions[0]); // Default to the first question if available + } catch (error) { + console.error("Error fetching questions:", error); + } + } + + fetchQuestions(); + }, []); + + useEffect(() => { + const filtersElement = document.getElementById("filters"); + if (filtersElement) { + setFiltersHeight(filtersElement.offsetHeight); + } + }, []); + // Handle filtered questions based on user-selected difficulties and topics const filteredQuestions = questionList.filter((question) => { - // convert the selectedTopics (which are values) into their corresponding labels from topicList const selectedTopicLabels = selectedTopics.map( (topicValue) => topicList.find((topic) => topic.value === topicValue)?.label ); const matchesDifficulty = - selectedDifficuties.length === 0 || (question.difficulty && selectedDifficuties.includes(question.difficulty)); + selectedDifficuties.length === 0 || + (question.difficulty && + selectedDifficuties.includes(question.difficulty)); const matchesTopics = - selectedTopicLabels.length === 0 || selectedTopicLabels.some((topic) => question.topics.includes(topic)); - + selectedTopics.length === 0 || + selectedTopicLabels.some((topic) => question.topics.includes(topic)); + return matchesDifficulty && matchesTopics; }); - useEffect(() => { - const filtersElement = document.getElementById('filters'); - if (filtersElement) { - setFiltersHeight(filtersElement.offsetHeight); - } - }, []); - return ( //
{/* */} - PeerPrep - {process.env.NODE_ENV == "development" && (DEV)} + + PeerPrep + + {process.env.NODE_ENV == "development" && ( + + DEV + + )}
- +
-
+
{filteredQuestions.map((question) => (
- setSelectedViewQuestion(question)} >
-

{question.title}

+

+ {question.title} +

- {question.difficulty} + + {question.difficulty} + {question.topics.map((topic, index) => ( {topic} ))}
-

{question.summary}

+

+ {question.summary} +

-
@@ -239,18 +242,30 @@ export default function Home() {
-

{selectedViewQuestion.title}

+ {selectedViewQuestion && + <> +

+ {selectedViewQuestion.title} +

- + {selectedViewQuestion.difficulty}
{selectedViewQuestion.topics.map((topic) => ( - + {topic} ))} @@ -258,7 +273,7 @@ export default function Home() {

{selectedViewQuestion.description} -

+

}
From 19bee8b5b11bf3b8423ed74c6fd4e42ec99ad58c Mon Sep 17 00:00:00 2001 From: LimJiaYan Date: Tue, 24 Sep 2024 00:06:19 +0800 Subject: [PATCH 011/191] Add dynamic "Select" button behavior - Updated "Select" button for individual questions to toggle between "Select" and "Selected." - Implemented "Select All" button to toggle between "Select All" and "Deselect All." - Automatically switches "Select All" to "Deselect All" when all questions are selected, and reverts to "Select All" when all are manually deselected. --- frontend/app/page.tsx | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 87a028c01c..cfb0262665 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -42,7 +42,7 @@ const topicList: Array<{ label: "Bit Manipulation", badgeVariant: "topic", }, - { value: "brainteaser", label: "Brain Teaser", badgeVariant: "topic" }, + { value: "brainteaser", label: "Brainteaser", badgeVariant: "topic" }, { value: "databases", label: "Databases", badgeVariant: "topic" }, { value: "datastructures", label: "Data Structures", badgeVariant: "topic" }, { value: "recursion", label: "Recursion", badgeVariant: "topic" }, @@ -59,7 +59,8 @@ export default function Home() { const [filtersHeight, setFiltersHeight] = useState(0); const [questionList, setQuestionList] = useState([]); const [selectedViewQuestion, setSelectedViewQuestion] = useState(null); - console.log("here"); + const [isSelectAll, setIsSelectAll] = useState(false); + // Fetch questions from the backend API useEffect(() => { async function fetchQuestions() { @@ -113,6 +114,41 @@ export default function Home() { return matchesDifficulty && matchesTopics; }); + // Function to handle "Select All" button click + const handleSelectAll = () => { + const newIsSelectAll = !isSelectAll; + setIsSelectAll(newIsSelectAll); + + // Toggle selection of all questions + const updatedQuestions = questionList.map((question) => ({ + ...question, + selected: newIsSelectAll, // Select or unselect all questions + })); + setQuestionList(updatedQuestions); + }; + + // Function to handle individual question selection + const handleSelectQuestion = (id: number) => { + const updatedQuestions = questionList.map((question) => + question.id === id + ? { ...question, selected: !question.selected } + : question + ); + setQuestionList(updatedQuestions); + }; + + useEffect(() => { + const allSelected = questionList.length > 0 && questionList.every(q => q.selected); + const noneSelected = questionList.length > 0 && questionList.every(q => !q.selected); + + if (allSelected) { + setIsSelectAll(true); + } else if (noneSelected) { + setIsSelectAll(false); + } + console.log("trigger use effect", "is all selected: ", allSelected, "is all not selected: ",noneSelected) + }, [questionList]); + return ( //
@@ -185,8 +221,8 @@ export default function Home() { className={"font-sans"} />
-
@@ -228,9 +264,9 @@ export default function Home() { {question.summary}

- From e80001f3c5c2025be193eaed41bce7f7b40dc65d Mon Sep 17 00:00:00 2001 From: LimJiaYan Date: Tue, 24 Sep 2024 18:11:03 +0800 Subject: [PATCH 012/191] Update "Select All" button to select filtered questions only --- frontend/app/page.tsx | 131 +++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index cfb0262665..baea533eaa 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -15,7 +15,7 @@ type Question = { title: string; difficulty: string | undefined; topics: (string | undefined)[]; - summary: (string | null); + summary: string | null; description: string; selected: boolean; }; @@ -58,27 +58,32 @@ export default function Home() { ); const [filtersHeight, setFiltersHeight] = useState(0); const [questionList, setQuestionList] = useState([]); - const [selectedViewQuestion, setSelectedViewQuestion] = useState(null); - const [isSelectAll, setIsSelectAll] = useState(false); + const [selectedViewQuestion, setSelectedViewQuestion] = + useState(null); + const [isSelectAll, setIsSelectAll] = useState(false); // Fetch questions from the backend API useEffect(() => { async function fetchQuestions() { try { - const response = await fetch("http://localhost:5000/questions", { cache: "no-store" }); + const response = await fetch("http://localhost:5000/questions", { + cache: "no-store", + }); const data = await response.json(); // Map backend data to match the frontend Question type const mappedQuestions: Question[] = data.questions.map((q: any) => ({ id: q.id, title: q.title, - difficulty: difficultyList.find(diff => diff.value === q.complexity.toLowerCase())?.value, + difficulty: difficultyList.find( + (diff) => diff.value === q.complexity.toLowerCase() + )?.value, topics: q.category, summary: q.summary, description: q.description, selected: false, // Set selected to false initially })); - + setQuestionList(mappedQuestions); // Set the fetched data to state setSelectedViewQuestion(mappedQuestions[0]); // Default to the first question if available } catch (error) { @@ -99,7 +104,8 @@ export default function Home() { // Handle filtered questions based on user-selected difficulties and topics const filteredQuestions = questionList.filter((question) => { const selectedTopicLabels = selectedTopics.map( - (topicValue) => topicList.find((topic) => topic.value === topicValue)?.label + (topicValue) => + topicList.find((topic) => topic.value === topicValue)?.label ); const matchesDifficulty = @@ -120,33 +126,45 @@ export default function Home() { setIsSelectAll(newIsSelectAll); // Toggle selection of all questions - const updatedQuestions = questionList.map((question) => ({ - ...question, - selected: newIsSelectAll, // Select or unselect all questions - })); + const updatedQuestions = questionList.map((question) => + filteredQuestions.map((f_qns) => f_qns.id).includes(question.id) + ? { + ...question, + selected: newIsSelectAll, // Select or unselect all questions + } + : question + ); setQuestionList(updatedQuestions); }; // Function to handle individual question selection const handleSelectQuestion = (id: number) => { const updatedQuestions = questionList.map((question) => - question.id === id - ? { ...question, selected: !question.selected } - : question - ); + question.id === id + ? { ...question, selected: !question.selected } + : question + ); setQuestionList(updatedQuestions); }; useEffect(() => { - const allSelected = questionList.length > 0 && questionList.every(q => q.selected); - const noneSelected = questionList.length > 0 && questionList.every(q => !q.selected); + const allSelected = + questionList.length > 0 && questionList.every((q) => q.selected); + const noneSelected = + questionList.length > 0 && questionList.every((q) => !q.selected); if (allSelected) { setIsSelectAll(true); } else if (noneSelected) { setIsSelectAll(false); } - console.log("trigger use effect", "is all selected: ", allSelected, "is all not selected: ",noneSelected) + console.log( + "trigger use effect", + "is all selected: ", + allSelected, + "is all not selected: ", + noneSelected + ); }, [questionList]); return ( @@ -221,7 +239,11 @@ export default function Home() { className={"font-sans"} />
-
@@ -264,9 +286,10 @@ export default function Home() { {question.summary}

- @@ -278,38 +301,40 @@ export default function Home() {
- {selectedViewQuestion && - <> -

- {selectedViewQuestion.title} -

-
-
- - - {selectedViewQuestion.difficulty} - -
-
- - {selectedViewQuestion.topics.map((topic) => ( - - {topic} - - ))} -
-
-

- {selectedViewQuestion.description} -

} + {selectedViewQuestion && ( + <> +

+ {selectedViewQuestion.title} +

+
+
+ + + {selectedViewQuestion.difficulty} + +
+
+ + {selectedViewQuestion.topics.map((topic) => ( + + {topic} + + ))} +
+
+

+ {selectedViewQuestion.description} +

+ + )}
From c201d488f35b7b6a03d646bf08c0051737952108 Mon Sep 17 00:00:00 2001 From: LimJiaYan Date: Wed, 25 Sep 2024 02:00:47 +0800 Subject: [PATCH 013/191] Implement handling for "No Questions Found" after applying filters - Display "No Questions Found" message when no results are returned - Add "Reset Filters" button for quick reset - Show "No question selected" instead of the last selected question - Hide "Select All" button when no questions are available --- frontend/app/page.tsx | 140 ++++++++++++++---------- frontend/components/ui/multi-select.tsx | 21 +++- frontend/public/images/NoResult.png | Bin 0 -> 35353 bytes 3 files changed, 105 insertions(+), 56 deletions(-) create mode 100644 frontend/public/images/NoResult.png diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index baea533eaa..a8d5e96f9e 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -8,7 +8,7 @@ import { MultiSelect } from "@/components/ui/multi-select"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Flag, MessageSquareText } from "lucide-react"; import Link from "next/link"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; type Question = { id: number; @@ -57,12 +57,13 @@ export default function Home() { topicList.map((topic) => topic.value) ); const [filtersHeight, setFiltersHeight] = useState(0); - const [questionList, setQuestionList] = useState([]); + const [questionList, setQuestionList] = useState([]); // Complete list of questions const [selectedViewQuestion, setSelectedViewQuestion] = useState(null); const [isSelectAll, setIsSelectAll] = useState(false); + const [reset, setReset] = useState(false); - // Fetch questions from the backend API + // Fetch questions from backend API useEffect(() => { async function fetchQuestions() { try { @@ -85,7 +86,6 @@ export default function Home() { })); setQuestionList(mappedQuestions); // Set the fetched data to state - setSelectedViewQuestion(mappedQuestions[0]); // Default to the first question if available } catch (error) { console.error("Error fetching questions:", error); } @@ -120,6 +120,13 @@ export default function Home() { return matchesDifficulty && matchesTopics; }); + // Function to reset filters + const resetFilters = () => { + setSelectedDifficuties(difficultyList.map((diff) => diff.value)); + setSelectedTopics(topicList.map((topic) => topic.value)); + setReset(true); + }; + // Function to handle "Select All" button click const handleSelectAll = () => { const newIsSelectAll = !isSelectAll; @@ -158,15 +165,17 @@ export default function Home() { } else if (noneSelected) { setIsSelectAll(false); } - console.log( - "trigger use effect", - "is all selected: ", - allSelected, - "is all not selected: ", - noneSelected - ); }, [questionList]); + useEffect(() => { + filteredQuestions.length == 0 ? setSelectedViewQuestion(null) : null; + }, [filteredQuestions]); + + + useEffect(() => { + console.log("Selected difficulties:", selectedDifficuties); + }, [selectedDifficuties]); // This effect runs every time selectedDifficulties change + return ( //
@@ -215,6 +224,7 @@ export default function Home() { id="filters" className="absolute top-0 left-0 right-0 hidden tablet:flex gap-2 desktop:ml-8 desktop:mr-10 desktop:mt-2 p-2 desktop:rounded-3xl bg-opacity-90 backdrop-blur desktop:drop-shadow-xl bg-white z-10" > +
- + {filteredQuestions.length > 0 && ( + + )}
- {filteredQuestions.map((question) => ( -
- setSelectedViewQuestion(question)} - > -
-

- {question.title} -

-
- - {question.difficulty} - - {question.topics.map((topic, index) => ( - - {topic} + {filteredQuestions.length == 0 ? ( +
+ No questions found +

No Questions Found

+ +
+ ) : ( + filteredQuestions.map((question) => ( +
+ setSelectedViewQuestion(question)} + > +
+

+ {question.title} +

+
+ + {question.difficulty} - ))} + {question.topics.map((topic, index) => ( + + {topic} + + ))} +
+

+ {question.summary} +

-

- {question.summary} -

-
- - -
- ))} + + +
+ )) + )}

- {selectedViewQuestion && ( + {!selectedViewQuestion ? ( +

No question is selected.

+ ) : ( <>

{selectedViewQuestion.title} diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx index 2e623e4551..6bbfa8538f 100644 --- a/frontend/components/ui/multi-select.tsx +++ b/frontend/components/ui/multi-select.tsx @@ -134,10 +134,22 @@ interface MultiSelectProps * If true, the multi-select component will be searchable. */ search?: boolean; + + /** + * If true, the multi-select component will be reset to default value. + */ + reset?: boolean; + + /** + * Callback function triggered after reset selected value to default value + */ + onResetComplete?: (reset: boolean) => void; } +type MultiSelectRef = HTMLButtonElement & { reset: () => void } + export const MultiSelect = React.forwardRef< - HTMLButtonElement, + MultiSelectRef, MultiSelectProps >( ( @@ -154,6 +166,8 @@ export const MultiSelect = React.forwardRef< className, selectIcon: SelectIcon, search, + reset = false, + onResetComplete = (reset) => {}, ...props }, ref @@ -182,6 +196,11 @@ export const MultiSelect = React.forwardRef< }; }, [selectedValues]); + React.useEffect(() => { + setSelectedValues(defaultValue); + onResetComplete(false); + }, [reset]); + const handleInputKeyDown = ( event: React.KeyboardEvent ) => { diff --git a/frontend/public/images/NoResult.png b/frontend/public/images/NoResult.png new file mode 100644 index 0000000000000000000000000000000000000000..d2690e5ba666d940a1c6e65c8143f6c92918a147 GIT binary patch literal 35353 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 _q-w7-pz0098%wJRJ^C@5M){4^L{7DT0e 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 O^HNGtvP{A-`2PXF8B9z7 literal 0 HcmV?d00001 From 64f912b65c8a0873070cf1b7f24888d9fdfd510c Mon Sep 17 00:00:00 2001 From: Henry <> Date: Wed, 25 Sep 2024 02:37:12 +0800 Subject: [PATCH 014/191] add user-service folder --- user-service/.env.sample | 9 + user-service/GuideAssets/AddIPAddress.png | Bin 0 -> 138008 bytes user-service/GuideAssets/ConnectCluster.png | Bin 0 -> 54835 bytes user-service/GuideAssets/ConnectionString.png | Bin 0 -> 122214 bytes user-service/GuideAssets/Creation.png | Bin 0 -> 52188 bytes user-service/GuideAssets/DriverSelection.png | Bin 0 -> 106224 bytes user-service/GuideAssets/IPWhitelisting.png | Bin 0 -> 59576 bytes user-service/GuideAssets/Network.png | Bin 0 -> 411358 bytes user-service/GuideAssets/Security.png | Bin 0 -> 252188 bytes user-service/GuideAssets/Selection.png | Bin 0 -> 282069 bytes user-service/GuideAssets/Selection1.png | Bin 0 -> 107399 bytes user-service/GuideAssets/Selection2.png | Bin 0 -> 111062 bytes user-service/GuideAssets/Selection3.png | Bin 0 -> 75719 bytes user-service/GuideAssets/Selection4.png | Bin 0 -> 64364 bytes user-service/GuideAssets/SidePane.png | Bin 0 -> 45881 bytes user-service/MongoDBSetup.md | 60 + user-service/README.md | 272 +++ user-service/controller/auth-controller.js | 41 + user-service/controller/user-controller.js | 167 ++ user-service/index.js | 59 + .../middleware/basic-access-control.js | 48 + user-service/model/repository.js | 71 + user-service/model/user-model.js | 31 + user-service/package-lock.json | 1896 +++++++++++++++++ user-service/package.json | 26 + user-service/routes/auth-routes.js | 12 + user-service/routes/user-routes.js | 27 + user-service/server.js | 19 + 28 files changed, 2738 insertions(+) create mode 100644 user-service/.env.sample create mode 100644 user-service/GuideAssets/AddIPAddress.png create mode 100644 user-service/GuideAssets/ConnectCluster.png create mode 100644 user-service/GuideAssets/ConnectionString.png create mode 100644 user-service/GuideAssets/Creation.png create mode 100644 user-service/GuideAssets/DriverSelection.png create mode 100644 user-service/GuideAssets/IPWhitelisting.png create mode 100644 user-service/GuideAssets/Network.png create mode 100644 user-service/GuideAssets/Security.png create mode 100644 user-service/GuideAssets/Selection.png create mode 100644 user-service/GuideAssets/Selection1.png create mode 100644 user-service/GuideAssets/Selection2.png create mode 100644 user-service/GuideAssets/Selection3.png create mode 100644 user-service/GuideAssets/Selection4.png create mode 100644 user-service/GuideAssets/SidePane.png create mode 100644 user-service/MongoDBSetup.md create mode 100644 user-service/README.md create mode 100644 user-service/controller/auth-controller.js create mode 100644 user-service/controller/user-controller.js create mode 100644 user-service/index.js create mode 100644 user-service/middleware/basic-access-control.js create mode 100644 user-service/model/repository.js create mode 100644 user-service/model/user-model.js create mode 100644 user-service/package-lock.json create mode 100644 user-service/package.json create mode 100644 user-service/routes/auth-routes.js create mode 100644 user-service/routes/user-routes.js create mode 100644 user-service/server.js diff --git a/user-service/.env.sample b/user-service/.env.sample new file mode 100644 index 0000000000..b3518e0224 --- /dev/null +++ b/user-service/.env.sample @@ -0,0 +1,9 @@ +DB_CLOUD_URI= +DB_LOCAL_URI=mongodb://127.0.0.1:27017/peerprepUserServiceDB +PORT=3001 + +# Will use cloud MongoDB Atlas database +ENV=PROD + +# Secret for creating JWT signature +JWT_SECRET=you-can-replace-this-with-your-own-secret diff --git a/user-service/GuideAssets/AddIPAddress.png b/user-service/GuideAssets/AddIPAddress.png new file mode 100644 index 0000000000000000000000000000000000000000..9d79550ca40a036fef6c699db5abe41a604da000 GIT binary patch literal 138008 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

t!rLoj->p=`!I=jSNLuk@z(`^jNm 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 literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/ConnectionString.png b/user-service/GuideAssets/ConnectionString.png new file mode 100644 index 0000000000000000000000000000000000000000..073d3ed6a976a3bf3b0968a07342589fa22924f0 GIT binary patch literal 122214 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 literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Creation.png b/user-service/GuideAssets/Creation.png new file mode 100644 index 0000000000000000000000000000000000000000..055ed783af0c1091d786f4742346b6009932f252 GIT binary patch literal 52188 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 Z@77f(=Zg-+4lv*kB>X|BL_o*;zW|4wb(H`B literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/IPWhitelisting.png b/user-service/GuideAssets/IPWhitelisting.png new file mode 100644 index 0000000000000000000000000000000000000000..57182345538a84b813c73130b6559a6bf3d3158e GIT binary patch literal 59576 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 literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Network.png b/user-service/GuideAssets/Network.png new file mode 100644 index 0000000000000000000000000000000000000000..57bad4e6777adefbed07788df494e7b6f95696ae GIT binary patch literal 411358 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

b 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�)lzrb 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ϓXXw+<4)8TU^>%!sV#Z9Q8XYa99c5= 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

pnNkHL6J`f6q`o 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

# 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%0DLW0KId{Ifud3K=tU` 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 z z`w6%M3ZdTKOLelCSfMln8CA1FvMPYHb4iXB01?eg>G1i3IdqE)jpD=`HkwXO%&2(c zr0htax$id;P>btRnD^|aTAe3|0yWQcc!cZCC9dty&tbyFs~-$vb@Sr6K4vDDQ>)aX zKN?6$dBB~4ca0}<^#+l>D(S2obe|>2+e3N!wz0@<;r2F+UU>!_RA*gbNCmoV_ORhD zI&AOb#%)Oak88Pul1++vj#7T)VS?0$j#&;ti~?7ZiH%BeN96!k_$$wikdSW}bXLiO z$*R>k)Dt`bcFBYI5m!!MeM)bi!{JRuxOIF&~9C6zSf_RK{xodOto z3O1>1K8YZ^Dx4wozw_0`iUO7MRw*x#JNNfccs5U|w_hq{8#X^*3OX(Hn7PP~vHJBJ zhk?uH&fLNhdY4UN#Rr|b%njhmM<1DZ0X=ld$x${%k(?Xt|Dgztw4)Ba(?p%(zi2Xg zVqfetSt%{kr)Yfq)qo|_-X(Rnlt*8yx#v&s|Kw-(TP~nb&KOD*dK>zrbKL(nUh`pb zKdfiaEhE%|r}+r2DQ{NjWvP_k)$w-DW`?mh20Ho?LVHi`#O5l@YX9r)nbLhOyuYoo ze}+P-vWLJn^V8`*{=0foy@q4LxoVfxZ2z8q1uPzsm3LXU;)ay0yKc-Z36l?Qip@5!rR z7hYphp-tQ~Tv>1%2AR-?W!Ipg9DdC*-Or_`VbX5>5kE}qb9}GrXl_wND{7G+TSy-7O^&uFLGG?Ow|r2I5cco! z%>H588@Ik^r96TX%r^@xAW1nB5Cr=t7P~qdKX2pCkz2l6$s8rYul&k_`0FDIW$fy2rLiuQD7IR_Vb%(GGzW_Q}vHf^pPh1((hSKiZ?j*PmtYxG@K(=b6PXg?>&JpYi&Hy4lxhu zsPR)$qU`vj?kYd71Q*$a$0>ed%P7nNr^7^wbHXCRr*}Q4eiRR_=}p9(;@tqa%_w?m+S{kHeH|txm6fpsMh5 zF(y@bA5x*w!>WDPuyE$P>)%q1xM^Iz#n%SyGPZ?28TByk^`8poRqj3ywf)`b%2BfgKAkPl~wUvuMSRCA*>YL={=RWH2>p_3}s?XjVy-dyt~EIq-?4a|PJD zHA17aSWMZwaiXaIWF+|^_`9N}2Evt9+x~L^ygyNMy6BQbhKm^8vD(_!e z8uD?I;ki(7Yn^ITOqp=W^(Sr*44xZF9wq%q5whp=EyQ2DY~Hk}qUWP~I}4Kyll?~b z?e<)xutU{jN44~u;Y`Iu-lzsev`^vIV?o=m6#yG^qI_`2v)*i$@|klc?5;f)Q;7(t z@*FTU(;PL%@4Gr&?K!SJ*^*}OJLlz^9=*s6Q9eIKw~+Tfx86_z(-Y~IS0sCHEnaeK z6}@@)Xmp~5dIn>r0>Ay%T`vLx72~44=(KUL3Tujc90jtGRB=C;V*{LQ;t-G<78`=l zns&W$rU}iEuii(?9VkWjxNfB$w%tLBfqOw$=xi}G8*xluaU%v_J}S2lQXcN3Qxy)Q zxEM}vR{)?t4t>eCn+auC$;0Wqe}5zV)av|{~OfVa`pbi7-`Y3Wm`gFEg_)&;3#NSZz#{Zw$B-f{*DxFE=H&AIS-UeQfW#Q4Bo@~094 z!Z`zDI@ >b(pTC5HzEgt7^sUzDsnPToq7R`3=O-8&z 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 literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Selection.png b/user-service/GuideAssets/Selection.png new file mode 100644 index 0000000000000000000000000000000000000000..5029373ea18fdd0e2592cdc6c0259c91c8479b81 GIT binary patch literal 282069 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�HIJI3>WH$N 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⪚YIMmUP8oFu|Jo+q+~eBH(Igg71M;fu3!<@~w@ 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

*1xA$mRCF5kWU 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ˀ#f`Q`Y}O?6fi`wEF6ca(N^ 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

    H`G1`6StOTflP{xq)-| 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 z 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 V!$O<%4g&lqDJJ)&LR3HSKLDgdHYxxB literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Selection2.png b/user-service/GuideAssets/Selection2.png new file mode 100644 index 0000000000000000000000000000000000000000..17ff9288552c27703d06ff2e7b9e50895d2bef7d GIT binary patch literal 111062 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 G@_zsv8;A7( literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Selection3.png b/user-service/GuideAssets/Selection3.png new file mode 100644 index 0000000000000000000000000000000000000000..948ed1026dc0148f60c19b01b8a60c1c07748f2d GIT binary patch literal 75719 zcmeFZ^ETpzjb`|9-v zJimN-Wp~dx$s}hc$xJeN57EksQYeV{h!7AEC^FLGst^#+#SjpX*YNM&o-pgN3clSK z+lYxN%ZQ1QD!V#a+Spq_K+q<6B(ll%D`SN#*?uPtkBRbdj{3SaT|N*JqNXPvMqj6^ z+)No)HeH-RN$&U_pf^3JaJ0oTEdqyQ^+7~jJZHe*xPWRMSnBZMY}-Zf{T(qg&N=Ld zpO=9Uuyb{@Y6vbaHaf^1J&~*cGzsY$d+hXGtj0~f>FbJGo&Q!62e+U;KW0nRDPcd-W*8kB7!%MdT>w?&-f16^me8{RXFWf!(KBmQB zj812ZW-DrWlK@43xW>ka@BAdREi;qmq+lZyi<%87Nxh(Cj)-zv^L2c{mO}=sw-yqq zf;BNz?8?Oz_cDdl6rY+CnM`zij&k6>Drlqj^ut)sJ;AhUx!;kXb3Kat2C%aWnzR9y z(1?9dHISJ>{pohJbjO7ivO%!z6a<0x3$~mJ7{Jo*c$0WZ^2zNA)8)MxQx6z`@g{Oj z3vC%o1qBHDw`+I^$VeLqn71p)w-5f?=dE{=BOu`3e*Y>f{uS!KxzNR5q5pdgdHq*G z5j8OxnYUjxGgk`>M>lIH_vs&+nr~Gt+Nf*0Yb(eD%$yvUP0XE4EttI>oc|($;P(c+ zT{>8}n~-`t*gLubyamYrRRZvK{nuj_a?*blakmp7*H%y_6?1a6AmwIeWo9K8L?k68 z<##o=1gMHj{)hbSPJrCn-Q5|$!s6xS#q7nw?Br_2!p6(X%fiae!p_e0R)WdR$I;!y zo5|6Q;@_40w;pi|H#1ioXLlPXN7BFQH8FMaa2Fsa|Er<@`TO^KT6o+1Z%dAD|6%Km zL6*OASlF0ZS^lT)H&Xt;o&uC@ye;f?#BChj#PimMAQvku|G&!rBjUUGB=MNzP(=r8CZXd<%8 zlp4Y?BKSojZQ^L+MRLMz?YBW)I(sg6Cw>G8&Aq2QwcyisuhZ4cjksK=$xOFx{cax$ zVRBkn7#Qq0rKi=-iu}j3$y~liH!a82HZmJkfe#{5R&|uZP=6#c^pBoLVU)6o(p!VE z6+#!3@h`CiT0uhyPrY5*@dsEu1*n^hLhSfE{KV-ppJ1f_p86C?%Q^Lm5Y=M)%eqbg zfyodEiGNSxg24x0r^ppDbax#H9E8r+I|&|ke8e$GA^(=5c458_Rx^+RY;o2r@h3?Aodq;M1mRGTSdlLxk$^`0Qf(9*ovvxlGZ$4XW_e4n7B)rp!yq+Z!AY4LIpn#6Z5vLBYv($>P7gCr&M_Ib78ps0zE+M zCL_AfZ%P-xbn5Gjy-gAr?{^;-N?2k;K0U)(IBApNfb({ol_43Xkr>uSu(5^;zB5mJ z%$zp{8jErf)L4KEzC;80-RimZA3aQo_8ux&7ik#@!Bl-AHL%={nX%w*fUZd_Wvh|( zr>ZXtNki5i=Q0X-#kH1jhORHX%nw>WZjRdwk959OD`=|>EnL65Le>zrJZ7%tZas(| zG8kK<1(NRz*lVAg`ODwCJ5ku4)LALAEi2|s((4dP@B%vSd)8bF=v~Z=Fq37|24>+e zmU7j%0mBKHM&X$bDbF&XDnp$1+u~Ft)HtCRb#SNk*b2|YdR1t%!{MJsJY5HoVQMA) z*$6Tzgu^b=U}y7${{hRDlF+yI&uHPooy~+FYp^Ut++kz1opvR69;MNX?_duFcH=E8 zh6jA3<{)zIV$AhDJkX)IoF86%?IU4RqyHSz(mi~T47$1b+KaDuVTS@qM;Hac%j0`e zBa;?qQkNTPZ*?}AESB34*bLGQ@M5*EIZBjWwHF}NEpR(UWws>!S)VBcWJOsA50$dL zDc|KX3GmLEQdXrz8ngIg21jdX*a=p3J6eW|J4UsdH6T6L!a4KL3Z#2DAWQbx$A0oH zw1GrhOohN}Zg@$J+^XSp#vdh$pNX-wzwXXgbBHed%Ar6)ND%w`{1Aph4(zEGf%wy)0J;Kxg(BV)!XcU&g20} zC{4N6<)DrJq*N#?HPf(pwARjB22NvH3pyEy2b)D6h_ng1>#VRsrd zef@Pmqw&rdvvxH%-Yc`tD?jxHuG#Q1%y;$* zpfY_=a{GNj`==7wq=aCy^vG;CblZ#ly!$o@PUDcDh-uiDhs^%a_;0si(xj}c$?c9v zE;vF?pRr7ALH^y}L?}d;PM-ec`%Ne6Ln-$E4w%4h^@vI??Km1?I2tEtW!jzjruFcx=fbsAeW7T8n z@GUF9--VD!NJ9G{|0xbq$TJuy5BwsVuS=ZtmBr|`Y$(;WXH!flT@!q?j%0uI*xQ@q zLTP5h2EId4wQH6bPdZD-|JFB8{FD2qzb)Sd!WbRqpBLZH-PXABv=uD+5A2 z-_ec2t!GUAvz#<3A}H!b&P9SZr32+yZsYkg~vP0v3C8+8Ix5Xv3P zZi2s}B)FpVkI9QB{i!cS3+kWZO2LTYG{Gkt?^lt{f}{DP1A-$z39DN-zl~f}$RN#s zuq;iA2(O$W3F%Ip{EzqF6of>a12eY#W5!dW!NL@XXGn%mxnkAslKrWWHouXgE#NcB zh8>EzSZd4s$tP*BG?}moK3#?n+CQ=&onUC?JClC<{v+p~M8OA&n*)tk_0Pw@4-6F+ z6JVrCp%4gL+*NOl_|b!AC>@kH_fUhNiHlt^c( z(n9{i(maXm<00f4+aH|jp>X@rrS@YXPM?n^Nmo_cPb}7v zlOue_AyNg#35{f7^6lEkx>O&j=L6+zi-HV`H6Ml>nE{N1>I@?xLCwRnx&ootzM|59NfeBx#;@-)0 zVc~UZ;sKwTIxQVyaA>N{WwUf;g>u!{!+vKyn*iB)gRWva(wpO%$baqERaot|=gNI| zE@$-3#X@dc3mCj#8{3`URlB^nLV>+OQ0n{Cr`;LE|NXs>?Z~!of>;jni(R#Tx7(b# zAB`7^Ox{5qY5O>Ti%KA0lR^9u*QI@Z$c}sHA@ogtwOv+lgI%MG z;jW1j`McP4r{|@S5wHF!%qka=vVUN^S@7p4t0czKi)gwjyTKMR++dYg#~ z(^y4qWwPQ#Qr{k2>;=@Tg)c9I*>DUL#Wl6SPCq`(!+>+2r1afTe~&eu)~;jXyK$@mUMF{ZUG)U4J?7zuaeU21r+q9ip*Swv14%;|lxeYW)gwI)KP;q2xS`Mq zRO|Tz0^+qb^WuX=s>?J4kuS$DQdsz>l8^x2o=1-oGOyOMy}Su!bm8y$=f||gB@ce2 z^l`dQx!#{{4p$K*Nd89^&14CKxy(A+zOSpwjm65n!&f<4k9u2lrY(P4_j!r>%nUBp zcN9=zZpb0+?mqus6u=qI`RY*G6SB{g+Zrgdt}8I=zP_)1MxUZE*=S0^)!kUNUcgRni zGvNJloI7jyHBEr?IjPOqA@rXAS>Oc$@2tIhV!k_lmveq#N_QTiHDI+c6$c8x;M(EC z*L}U0(mcp*3y}$>ajwgkHWKrEU-mGnheyIXi|)K1F%_qvqaYK0Ue?W<%laC7?1cQ^ z0r5S2+pYN>oLv)&6feDN9}D|KThj~{p3k{XAgDeQ9Q454Nwl;Stg^i15Zep2LsfUz zE*ftv;~^3RBjU`GjCPvo)8i07%vtVQ;llSU;0Gt*3+eTx`rUN4*5zZ{lMl`>$GNGW zX0Ec=9~1mEeRsG1E5n#BRE{H%beU}R<<6giVvCh$O0CTul=XS3Ra{mu)xg%0mbTWN zyhmOd;ch|*;Cyv^G}BwZB$9u{Q!QOSFcRW`3W{MWxvP-4pz}Gsup0k__AdMwm2n4c z##!U%6lOFriso@qKtZQ2Hr{GU_Y4?N|l9ENP%l0pyn%=*(feGcO$)i{R2^JI3V&D}_`jOUk!)q+K2$`UkohHI@!npuQO)$GQ(V@Aw%P(FX{nl=)EPdUY+s?W+!s19uw3K5)^mMs z7{pr+AOAbgc!yxU0Ej`I_Zc#`)AclWb+EseI`YrC)FzKrDu?H|WIp%bA>Mw3$b9~7OLB=t7i zZ0B;svdwdK8B{D^QZmQ+e-SDbHD-tU7dY0I=c}niwtl-||A0`xmd@g7cw*DI<0o4y zneFzaxv5AxWqy2#sNjmbn|^6o&GSdK&SHH%s859huEBJ^nF6-a;p6#myJAWMzghd&)kgt`yA;SI4v z`m92XvAUk`WB!FQK3%yD%ez-2u6DI#_-SrEb&oexB<>K7d)W5FxkJ5{Ypa8wU!MF@ zv*!DX>C@wn)T8}9q@%0uw)y<{LUozYhFS(LG{-t*Ez~X>e3*OKQy*JInvNcV^z+FE z^GB&s*gt%^2Ym0NZn3mdOw+y9|7fXo!GZC%cvuhhzglEk>hNekUT!wJJr*KOpp+rc zWG_m;q>7cvDmi=oR=>Y9p}0m#N-BJ`P)hy^x{o(_o(?+Y^OjDl(IK(rtGAq_wUER5 z!cD|C65RhPyKI%0X0w5s-r`~thWde+<82=>fD3h?O@_|^SU=z|ztyrE) zUFW%yTqCeIc*+qS&V&m#*L>bzTMmI>2+tcQhi`+z8C62$eoy{0$HD}!57zC16?l^= zm0ZDP^~1m1F>1|2D5|NPzNwN`LO3-qNS=*IO1r7L!UEgPcxqjnPE6yes%%B7UdSa# z*c13*2GF{d+nz-hfv8qv zRFB(VXA$~gPa4VsiwkBQ7vLY%*9tI88yghjWex9|!B3?`Cg<|0l$q#(+nlVZVLQvd z0U_{?Mw4)1lzW0g(d_|xt6Hy ztYBryPfYVwcYE`D%Z(3x;ArUqqq1S~5ZDEQwS_K>Y68NuaKGH3d6GN%sXi9GiWIQm zeRZ4gPtXGs>j|`v+k$j&hq}HO?loS6Lp+}Pp;|-cyw3E{-08RK6~EstpJZe`#9p*R z-A|N3_V}GV&Mcd&k!j9V*9^DiL-w^j6g~um&Ko1Z{U|@)TfS2nH;}@+ol#9n0%of9fxh1{O<(?yU-R^$& zRh=pgYXXeL?iTm2=-ZeKT{J8fOcs?=XzLjp@3ce-Xn!6%pW(!#G%Jp;g$}}R!CnDb zoth43do2}de)ZJP7`q6WS?FmrH`kqigCDo>mlzvr>Lx&CD?rA^a6bn-C=`~)HXT&v!P0|3qO@{fR($C1Q8-Q~UhehFe{Hi~j98UybY3jK@}pNHKYz~pcZ2(xR6dmjrw zg7*Dmi2!1!br^e?P9)a`9un>-lH9W2g-{vqtJ{~G`cu?k$XK4ruv*{N5}ioyEH6>f z0i9SZ?S`3$Z!JGX5i?+BKGx0pshTKybf zL_%-ryGLXgIsTw?d%YmnW*3*Hp|FF&&R{UqolTaMDy|(vfw0#!_=zZ>>$w1!p@7TT zze%XJgC2FWSJfJuHfnd~;fcWbH38@BCF<~G#moG$25IN{v~%}oT#xeaBrjj_CdUmj z6unN9z(t1`!(eP;nPlyC>zQ%w6r-R+GF)UsfV16tUnTyNjw{fCVD6r2)0c@zfBYfAWwHh~eaTI6uOUA|6)~=ZiQZ z>`BBRr}Xn(Ls;%8yineb_j|bIqVRQ-cXTqeg3?mHyOx|RmrOAg7yy-oXJs%>wnlX2 zp^k@#L4@z3Ym&|5Ve5=@NSa%_4<~KDi;wCpB{7r=f%*NZ7fCy*i}o>Q%s192iFVG% zAcIKs-sAa}X{k!H_&cEGlV`67?wdCN_`Ir7?RM8|yB6l>rB_v=Fu_^Rw3oR2N!qis zL`l0|aL$e}tv+Nbg<#+_$Hb(-Y|Qo0%A@ zWNTF^&N$DY%C05sDwJP}dA-B3@}>4^n>P%MkoUeNh;&(0)+8W4OkL9ZOf3ag>!25K z4t)_1LIX;B=hFz4?S3%*;WVSAfaT_gy7|Dd)_(f=9DFcl9e@{D>MCkUOf z@Oi>b(q-KC!$*5fY4AkHs1|7|5M+}8-|PQN0cuM_oHd4hKy;It8F^(-Hl%_AYPM_# zs@5j84LW{_x1IPj=)96CCds&|E_~4Yefmqb#mVPz`I6~5x{74(Zn@)MC#fDpd-(-( zNU`H*G$%w+_=^-7ke8q zHPN$;ld>z*8lcpKSZk<*A@Xz|DAcsFhvsNtVwzjMKmHtMcN*5B(jB`O7=uk40%``@ zF%~Sw&7|ot1wgi23zFrbX~Ug0H;e$UR5${@kyZ~xwZ*{5ErA%Mer*}#A2>S+`Tg>L z6=SllmGuKCp|PdTBzA<2cb?~aC zq&)8DSa20CCTo!IL^`%0fL*--&xnPswURj6-{c91fvXu6tr31#4-55+oK{IoRzcn^5F-Yj#uDH=Mx z)ORc%O8_6DNrdv$nT#Ya_b2HTRvK|&9x@x9>l%D^C1hT_&*5W#xm=F7x?apunTb?t z?7sBdU&Ji9D({<6Yiez35p3jBb~y|w>NMHL5eoU}=6UmHrqDihWH#eTy-Mc@`YBqL ze!m?K3a-YZ4H}8zs#h{_NLnrrpDlh>%$s*z9L)=WyTL`E@>^tt($Xsdv0aWEw9Fr? zesh;;{qAO)US-I@`@`0)IqgObB zZKGSNZ#r9Ls=X{YDa-d)z1*Gr=H?j->PP}t+rg8=&Lqq?hzRuF#pyN42IRJ9bGcDh zT9W@|^dm!hhVV^rOd)Hg&asYvE=BDiK<~?vmzS25b{-roKcq}PcQEyM?a zDDJX?N;RJRAU;!OheHM0R`Of@0QTW~zsJ~C5_S>dNw8TRqnOPBpX8RG5)Hj_s2{nT zf)6pIRu57#XgB80pPx$HJM5)zl`@daMF^p>x^#Cv>Lw~)J0wP0e{U7Y2=|T`K{wuy z7#=qYZ(L;j@k;OK@;W|ij2f}8l=zARea7b)jotQ_le%tG7bgIVhwfYcw=i~Zt>%rk2A%d%PsM35D`>^EAy#nrSMK$yZgG7Z< zsz(S;bKWpHr)HlGP{H?Z5DqSPOEpXSi1OI*8Tn}D05`kIk)u&$GcS#W`%?QyiK+k{ z$ItlWY#yhqlLT93N++Akab8Jj?9qI!oIdxNOO1Nd6JHAJD%R)Il9Ap$*FFne(-y6C zRP_v7^#KGSINtf>)Cz+QBfniLigU{eBgRn4&q;Q`n)W6Wlc$u!;v9b7`plalr5x8( zFHxo*XOk|!yK2r#1BxhC6jf>5u5k?$M3YRx2@YnH7*{YVfrb88bkfn{{NiXV=0qjX zO;?e8-fHFg6L6#27mrQQ>6?xbsgfe18d7}zn|l@&7Si1?N5o6Cydlo?ap*8WRjlw9 zfC)&-pg979K1=-C~~HrX2f@(d6sqvl>mRt<^cU|Hhgx z_~ert1&BRpjiQY4sjKylNMY?p>($FafOMI@Akt+oC1736ME6GY2v1#@%pU0a7LB`e z0el$#!Vew8;b!%F^3B2Kqq2`^a|ttM%cRuH9aaxz2<7};TsRYTF%AX80w>r3?Gv1e z6OHEaL0wTiK+3bja4aJ|8h(+C3VG95us{f-(yU6$zwioGZFK)A;xy0rcSI?|i9b1_ z!}nH!ofci%-&v=qa*p146sI?yukV9nAj?5sj^(T<>p>_}ZUde6`(AG&OKB?oTu{kb zUz-;lfdHCqGR$WxWBXLT<<2vQ&vY`?t+UyJp8%bdo;|spwsGjQ!xm??gSS06EcI-5 zm!Wv6Hl|PXh^ZGp<7gyhkH$oFL#o&Q0p6NZGMrA;GVW>Rq|<9&7ylPqa8&qo=q|g` ziYg4x;)oLV0u1VkX0Q^PCs1Q#QAvef%fGv;^JPKK8b(iRx4I-e4tJ zwLc4vWG*n85$z#xd$gbz%8L(%+tKd{bY)g#AsmN(;wGaKmx@?`V;SBhv~xvijtCLcRl#!)y;RldDiPz`+Pw!S0-I;)ZnjvX&UWkp@HNF3z49q zOuHd99kig2-2qMVbHLO})MVJ|!4^RQgnLrF8>Dw4Xyb_JiO*!RYhyugZY896$gF)e zLC}JM5dReVJXPkTgJejHTk-jN$z(w8*zbTm<3Lt@H@0v{XfkfH7Q#uPy-0vs|2Wln zn@P}=S2cHU`w`0#&6J|=T+6{q+{b3`Mon=VFBMyT?}a!Zb(GppGz#6KuKZM9_t`BJ z&+@SR8_Gt-1kZcGT!!QeIqVhEs$KKR{ZQoq$maa&S<7fNLa0d^oZy#nu!4@2VL7E2p1r1t$Ne2fOG5zhD ze+Hk`2G24;N+PqtDb>e_4r*BVx;Kl}B3}`81_EH>a&e`J-obzl8GC+|NsfPy;1LnK z?ljbt{ot9gzl-J9l+*Ais3>kB;Wzeu#9=kAd!teP?P$l=u-9aNzj2l~&>E8*wJ_JC zA-C4__j5^xQ&iI@Sd0O2yA3`)vN=mAi6y7R!iuP}QPN%)|ltNh-%A5&3oe zyjINSV-M-)=CFqh_&%=fo_B8k1ju80FSV7CxHg^s8FbH$n~)%uYLopOg#_4x(eT$78}45A$UEqE8httM31#sTDnK`(N^cU{DqN@< zE`M(;o=#IPus?F2H$+snXwq@D(WRT>9$ViU9f9v{(+M0shp*YmtZhNBx}wUwOIi63Y)UTi#X-sSxpff5{xqhODpM~^}tK~3n*Y}1~? zE7oUZdJ)}1Z;q%)P<3O*@>Is@B7t4FO`1I3=c$j9pYKQj$7dkMflE?k6B+$(o7g(v zMZd->{%p2T^$KN8L*H+TiLKw(5k)(_PEh>e4O@LR3%Qa1#gxLKYD}8T6H?D z<;pkzb1zfRXeP1L*A2D8o-x^hTV8qK^xMUVvc5N6=oyQ zb4pfKb|2+%xNDD9$nF2cd6bE#J8{s=7ex0*NaKTH3Q2`pEcK^jM=(?f6_&SCJVw@Z zyqI5_&(c}zIE6V4t6dgN+3c*j4Jh}d>9~Z_RPJEFEFeOFLUu#hm?E%t5vxtdncsrE zlj|7$ImsJ(kXK$4PRrl<#RvHNjK%+u?a?v1q#jS?W-d>I*#t4Tu_=(mLxsp{JvUm* zm9$sDRXo#E&`bN-M{pW_h))$gpk*uq0ZI;i?+M?_ad$f>J?5^ndZxpv8lS3@3qbdX zZX6G6F+PXbp9I2CJO5zf0tH2IKwwrygvl|ym0Q^>UggKy8ep66i^jnCp4}W z0jAmu?2}m03n4god^8&NJ5u}{j5QAlL<*4)s8Y#c^TtpWrPSA+Ph>^gr0WHdv4_#U z%Q+7XyGpo<=`G6(H$rBES9`Oov;@IDk~Wl1+A)3y-~hIB7?T*RH1NDR@~+m~&J-89 z|0^c>X&)8g+2tU}$`{*L2A}DW#jASVg9sf+o|k=2+0(9F1$;MoQ#<>HxeB0O;*{G+ zkA>v#D4;9AAV1UXjW%n6b{_3=m&npdb4ea0N{NGl9!xl4;;_t^NK-=u~@% zR&9^1w;V~BjjB(O^?e2?0wi@8VT5cT#%ei!hQ+M?(#~-BCyq*0@;<8k% zamZ`*KZJk(ppqii7SyNyODv1-&0=z*PcgR4_{M01YQUTg`v``y;lehx_hz*d0^f-@ zWMe>IF%8$Y=}g|+kfR*z9r~yS7_w})eb&;DP~S?O`euX$B(*PxbYtl@djLyb2hJ2JuRyC$!uP!U?&PRYXiE=Y zrv$Q>qEsvIQj)0_N<9J1Zc{IzlJ=(axHJA<$L|S8n!v)PG%`8jg8mh`UAEt&pXyFn z9vl_`I(3erh?{Qg2K!dJCiwg7Af4K?vbnqG{ohSUUPj}oOgcr0*T*}x8McNgp*uER zmg2e;xm(0%+#ZOVdd*I6%d%1+1#yTpRm@l3nvcZ)0_ccaK{>ZyV=r+x_!gRFaDBe| zIz4k9*2Hymf}A z>9`+?T*%iRC3$)HpPa876ZPMFdsul;_jxMslrxY5hS?+DtUz)2b;l(z0Dt)kMx?wR z9*!%2kt5DBEri!?!1^&TZS1@<%6wd7pKHa__ zi?CtV$Qtm?l1r!FH4b4I+G|~F-B(GrY}k)k&a(BJV+jM$AqD!e9Fy`hvAgxkETbPd zl`TN`YEr3XG4SEWnNF=ELq3mdNISX?RZ=qPZL>_}0Py4sq2_`T+~&} z7cP=l3)6$>v~>E=PtVz(HP!hPdE!@zUCb)Ay+DeW94#dvL7UY0$%`)JzTh_4REglk8w8WufZA zARgz>$~CU1$0&CF$4ETl@2y*Z$;NR#BIcjVV>)m35jq&bRQ*6^21}A^!UzZFl+nrJxXAtl`ZrM!bPkPoR4r&Uu_#5_ESe_EiAcRCEsO1=+kB|8)uSxrP6Gb920e)6z3l%^M;QBMM>|S{kIhtMgVZnznl)3WV z(e__$HL(sG2Bax(ye%sWv<9^aYG6#O zSZ`#*2>w87_DLAuL?~RQv|STFpM@Q-1xe>kq!=1CYp>oE!*>{%?zY9%-))-6-2O6C z?NVpEdWTGC4(x(<-8<%$sdjR?H(S|A7Sej(>U@}-!mRmABT}!~apbd4?04O8_Di5p z`+UI1)R7-2XSvBw(L>)&Gck%+UlnswQb9rKARfoztq&CzbBjZ};rJRrJHwvc{sztV3jp5B4VRH*w$7r(W_?x(W=P51IQ?~g{J#m8KLw^O zP*9ltyAp#0;tt1+Qu4>7o$<5<#vnHLFqf-vuzgmEDuIgjcYPb5!|>%0AVuKgE*ipg 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 literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/Selection4.png b/user-service/GuideAssets/Selection4.png new file mode 100644 index 0000000000000000000000000000000000000000..abf60bbe218093c502b01ce722d2793ec713cca5 GIT binary patch literal 64364 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 IU$#O21Crn|g8%>k literal 0 HcmV?d00001 diff --git a/user-service/GuideAssets/SidePane.png b/user-service/GuideAssets/SidePane.png new file mode 100644 index 0000000000000000000000000000000000000000..95f7e2866fb7be4c48336d412595694f55b95e0d GIT binary patch literal 45881 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 z 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 Ensure to select M0 Sandbox, else you may be prompted to enter card details and may be charged! + +![alt text](./GuideAssets/Selection3.png) + +- Leave `Additional Settings` as it is + +- Provide a suitable name to the Cluster + +![alt text](./GuideAssets/Selection4.png) + +6. You will be prompted to set up Security for the database by providing `Username and Password`. Select that option and enter `Username` and `Password`. Please keep this safe as it will be used in User Service later on. + +![alt text](./GuideAssets/Security.png) + +7. Next, click on `Add my Current IP Address`. This will whiteliste your IP address and allow you to connect to the MongoDB Database. + +![alt text](./GuideAssets/Network.png) + +8. Click `Finish and Close` and the MongoDB Instance should be up and running. + +## Whitelisting All IP's + +1. Select `Network Access` from the left side pane on Dashboard. + +![alt text](./GuideAssets/SidePane.png) + +2. Click on the `Add IP Address` Button + +![alt text](./GuideAssets/AddIPAddress.png) + +3. Select the `ALLOW ACCESS FROM ANYWHERE` Button and Click `Confirm` + +![alt text](./GuideAssets/IPWhitelisting.png) + +Now, any IP Address can access this Database. diff --git a/user-service/README.md b/user-service/README.md new file mode 100644 index 0000000000..be27594dbc --- /dev/null +++ b/user-service/README.md @@ -0,0 +1,272 @@ +# User Service Guide + +## Setting-up + +> :notebook: If you are familiar to MongoDB and wish to use a local instance, please feel free to do so. This guide utilizes MongoDB Cloud Services. + +1. Set up a MongoDB Shared Cluster by following the steps in this [Guide](./MongoDBSetup.md). + +2. After setting up, go to the Database Deployment Page. You would see a list of the Databases you have set up. Select `Connect` on the cluster you just created earlier on for User Service. + + ![alt text](./GuideAssets/ConnectCluster.png) + +3. Select the `Drivers` option, as we have to link to a Node.js App (User Service). + + ![alt text](./GuideAssets/DriverSelection.png) + +4. Select `Node.js` in the `Driver` pull-down menu, and copy the connection string. + + Notice, you may see `` in this connection string. We will be replacing this with the admin account password that we created earlier on when setting up the Shared Cluster. + + ![alt text](./GuideAssets/ConnectionString.png) + +5. In the `user-service` directory, create a copy of the `.env.sample` file and name it `.env`. + +6. Update the `DB_CLOUD_URI` of the `.env` file, and paste the string we copied earlier in step 4. Also remember to replace the `` placeholder with the actual password. + +## Running User Service + +1. Open Command Line/Terminal and navigate into the `user-service` directory. + +2. Run the command: `npm install`. This will install all the necessary dependencies. + +3. Run the command `npm start` to start the User Service in production mode, or use `npm run dev` for development mode, which includes features like automatic server restart when you make code changes. + +4. Using applications like Postman, you can interact with the User Service on port 3001. If you wish to change this, please update the `.env` file. + +## User Service API Guide + +### Create User + +- This endpoint allows adding a new user to the database (i.e., user registration). + +- HTTP Method: `POST` + +- Endpoint: http://localhost:3001/users + +- Body + - Required: `username` (string), `email` (string), `password` (string) + + ```json + { + "username": "SampleUserName", + "email": "sample@gmail.com", + "password": "SecurePassword" + } + ``` + +- Responses: + + | Response Code | Explanation | + |-----------------------------|-------------------------------------------------------| + | 201 (Created) | User created successfully, created user data returned | + | 400 (Bad Request) | Missing fields | + | 409 (Conflict) | Duplicate username or email encountered | + | 500 (Internal Server Error) | Database or server error | + +### Get User + +- This endpoint allows retrieval of a single user's data from the database using the user's ID. + + > :bulb: The user ID refers to the MongoDB Object ID, a unique identifier automatically generated by MongoDB for each document in a collection. + +- HTTP Method: `GET` + +- Endpoint: http://localhost:3001/users/{userId} + +- Parameters + - Required: `userId` path parameter + - Example: `http://localhost:3001/users/60c72b2f9b1d4c3a2e5f8b4c` + +- Headers + + - Required: `Authorization: Bearer ` + + - Explanation: This endpoint requires the client to include a JWT (JSON Web Token) in the HTTP request header for authentication and authorization. This token is generated during the authentication process (i.e., login) and contains information about the user's identity. The server verifies this token to ensure that the client is authorized to access the data. + + - Auth Rules: + + - Admin users: Can retrieve any user's data. The server verifies the user associated with the JWT token is an admin user and allows access to the requested user's data. + + - Non-admin users: Can only retrieve their own data. The server checks if the user ID in the request URL matches the ID of the user associated with the JWT token. If it matches, the server returns the user's own data. + +- Responses: + + | Response Code | Explanation | + |-----------------------------|----------------------------------------------------------| + | 200 (OK) | Success, user data returned | + | 401 (Unauthorized) | Access denied due to missing/invalid/expired JWT | + | 403 (Forbidden) | Access denied for non-admin users accessing others' data | + | 404 (Not Found) | User with the specified ID not found | + | 500 (Internal Server Error) | Database or server error | + +### Get All Users + +- This endpoint allows retrieval of all users' data from the database. +- HTTP Method: `GET` +- Endpoint: http://localhost:3001/users +- Headers + - Required: `Authorization: Bearer ` + - Auth Rules: + + - Admin users: Can retrieve all users' data. The server verifies the user associated with the JWT token is an admin user and allows access to all users' data. + + - Non-admin users: Not allowed access. + +- Responses: + + | Response Code | Explanation | + |-----------------------------|--------------------------------------------------| + | 200 (OK) | Success, all user data returned | + | 401 (Unauthorized) | Access denied due to missing/invalid/expired JWT | + | 403 (Forbidden) | Access denied for non-admin users | + | 500 (Internal Server Error) | Database or server error | + +### Update User + +- This endpoint allows updating a user and their related data in the database using the user's ID. + +- HTTP Method: `PATCH` + +- Endpoint: http://localhost:3001/users/{userId} + +- Parameters + - Required: `userId` path parameter + +- Body + - At least one of the following fields is required: `username` (string), `email` (string), `password` (string) + + ```json + { + "username": "SampleUserName", + "email": "sample@gmail.com", + "password": "SecurePassword" + } + ``` + +- Headers + - Required: `Authorization: Bearer ` + - Auth Rules: + + - Admin users: Can update any user's data. The server verifies the user associated with the JWT token is an admin user and allows the update of requested user's data. + + - Non-admin users: Can only update their own data. The server checks if the user ID in the request URL matches the ID of the user associated with the JWT token. If it matches, the server updates the user's own data. + +- Responses: + + | Response Code | Explanation | + |-----------------------------|---------------------------------------------------------| + | 200 (OK) | User updated successfully, updated user data returned | + | 400 (Bad Request) | Missing fields | + | 401 (Unauthorized) | Access denied due to missing/invalid/expired JWT | + | 403 (Forbidden) | Access denied for non-admin users updating others' data | + | 404 (Not Found) | User with the specified ID not found | + | 409 (Conflict) | Duplicate username or email encountered | + | 500 (Internal Server Error) | Database or server error | + +### Update User Privilege + +- This endpoint allows updating a user’s privilege, i.e., promoting or demoting them from admin status. + +- HTTP Method: `PATCH` + +- Endpoint: http://localhost:3001/users/{userId} + +- Parameters + - Required: `userId` path parameter + +- Body + - Required: `isAdmin` (boolean) + + ```json + { + "isAdmin": true + } + ``` + +- Headers + - Required: `Authorization: Bearer ` + - Auth Rules: + + - Admin users: Can update any user's privilege. The server verifies the user associated with the JWT token is an admin user and allows the privilege update. + - Non-admin users: Not allowed access. + +> :bulb: You may need to manually assign admin status to the first user by directly editing the database document before using this endpoint. + +- Responses: + + | Response Code | Explanation | + |-----------------------------|-----------------------------------------------------------------| + | 200 (OK) | User privilege updated successfully, updated user data returned | + | 400 (Bad Request) | Missing fields | + | 401 (Unauthorized) | Access denied due to missing/invalid/expired JWT | + | 403 (Forbidden) | Access denied for non-admin users | + | 404 (Not Found) | User with the specified ID not found | + | 500 (Internal Server Error) | Database or server error | + +### Delete User + +- This endpoint allows deletion of a user and their related data from the database using the user's ID. +- HTTP Method: `DELETE` +- Endpoint: http://localhost:3001/users/{userId} +- Parameters + + - Required: `userId` path parameter +- Headers + + - Required: `Authorization: Bearer ` + + - Auth Rules: + + - Admin users: Can delete any user's data. The server verifies the user associated with the JWT token is an admin user and allows the deletion of requested user's data. + + - Non-admin users: Can only delete their own data. The server checks if the user ID in the request URL matches the ID of the user associated with the JWT token. If it matches, the server deletes the user's own data. +- Responses: + + | Response Code | Explanation | + |-----------------------------|---------------------------------------------------------| + | 200 (OK) | User deleted successfully | + | 401 (Unauthorized) | Access denied due to missing/invalid/expired JWT | + | 403 (Forbidden) | Access denied for non-admin users deleting others' data | + | 404 (Not Found) | User with the specified ID not found | + | 500 (Internal Server Error) | Database or server error | + +### Login + +- This endpoint allows a user to authenticate with an email and password and returns a JWT access token. The token is valid for 1 day and can be used subsequently to access protected resources. For example usage, refer to the [Authorization header section in the Get User endpoint](#auth-header). +- HTTP Method: `POST` +- Endpoint: http://localhost:3001/auth/login +- Body + - Required: `email` (string), `password` (string) + + ```json + { + "email": "sample@gmail.com", + "password": "SecurePassword" + } + ``` + +- Responses: + + | Response Code | Explanation | + |-----------------------------|----------------------------------------------------| + | 200 (OK) | Login successful, JWT token and user data returned | + | 400 (Bad Request) | Missing fields | + | 401 (Unauthorized) | Incorrect email or password | + | 500 (Internal Server Error) | Database or server error | + +### Verify Token + +- This endpoint allows one to verify a JWT access token to authenticate and retrieve the user's data associated with the token. +- HTTP Method: `GET` +- Endpoint: http://localhost:3001/auth/verify-token +- Headers + - Required: `Authorization: Bearer ` + +- Responses: + + | Response Code | Explanation | + |-----------------------------|----------------------------------------------------| + | 200 (OK) | Token verified, authenticated user's data returned | + | 401 (Unauthorized) | Missing/invalid/expired JWT | + | 500 (Internal Server Error) | Database or server error | \ No newline at end of file diff --git a/user-service/controller/auth-controller.js b/user-service/controller/auth-controller.js new file mode 100644 index 0000000000..d49517bf70 --- /dev/null +++ b/user-service/controller/auth-controller.js @@ -0,0 +1,41 @@ +import bcrypt from "bcrypt"; +import jwt from "jsonwebtoken"; +import { findUserByEmail as _findUserByEmail } from "../model/repository.js"; +import { formatUserResponse } from "./user-controller.js"; + +export async function handleLogin(req, res) { + const { email, password } = req.body; + if (email && password) { + try { + const user = await _findUserByEmail(email); + if (!user) { + return res.status(401).json({ message: "Wrong email and/or password" }); + } + + const match = await bcrypt.compare(password, user.password); + if (!match) { + return res.status(401).json({ message: "Wrong email and/or password" }); + } + + const accessToken = jwt.sign({ + id: user.id, + }, process.env.JWT_SECRET, { + expiresIn: "1d", + }); + return res.status(200).json({ message: "User logged in", data: { accessToken, ...formatUserResponse(user) } }); + } catch (err) { + return res.status(500).json({ message: err.message }); + } + } else { + return res.status(400).json({ message: "Missing email and/or password" }); + } +} + +export async function handleVerifyToken(req, res) { + try { + const verifiedUser = req.user; + return res.status(200).json({ message: "Token verified", data: verifiedUser }); + } catch (err) { + return res.status(500).json({ message: err.message }); + } +} diff --git a/user-service/controller/user-controller.js b/user-service/controller/user-controller.js new file mode 100644 index 0000000000..985a83384f --- /dev/null +++ b/user-service/controller/user-controller.js @@ -0,0 +1,167 @@ +import bcrypt from "bcrypt"; +import { isValidObjectId } from "mongoose"; +import { + createUser as _createUser, + deleteUserById as _deleteUserById, + findAllUsers as _findAllUsers, + findUserByEmail as _findUserByEmail, + findUserById as _findUserById, + findUserByUsername as _findUserByUsername, + findUserByUsernameOrEmail as _findUserByUsernameOrEmail, + updateUserById as _updateUserById, + updateUserPrivilegeById as _updateUserPrivilegeById, +} from "../model/repository.js"; + +export async function createUser(req, res) { + try { + const { username, email, password } = req.body; + if (username && email && password) { + const existingUser = await _findUserByUsernameOrEmail(username, email); + if (existingUser) { + return res.status(409).json({ message: "username or email already exists" }); + } + + const salt = bcrypt.genSaltSync(10); + const hashedPassword = bcrypt.hashSync(password, salt); + const createdUser = await _createUser(username, email, hashedPassword); + return res.status(201).json({ + message: `Created new user ${username} successfully`, + data: formatUserResponse(createdUser), + }); + } else { + return res.status(400).json({ message: "username and/or email and/or password are missing" }); + } + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when creating new user!" }); + } +} + +export async function getUser(req, res) { + try { + const userId = req.params.id; + if (!isValidObjectId(userId)) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + + const user = await _findUserById(userId); + if (!user) { + return res.status(404).json({ message: `User ${userId} not found` }); + } else { + return res.status(200).json({ message: `Found user`, data: formatUserResponse(user) }); + } + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when getting user!" }); + } +} + +export async function getAllUsers(req, res) { + try { + const users = await _findAllUsers(); + + return res.status(200).json({ message: `Found users`, data: users.map(formatUserResponse) }); + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when getting all users!" }); + } +} + +export async function updateUser(req, res) { + try { + const { username, email, password } = req.body; + if (username || email || password) { + const userId = req.params.id; + if (!isValidObjectId(userId)) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + const user = await _findUserById(userId); + if (!user) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + if (username || email) { + let existingUser = await _findUserByUsername(username); + if (existingUser && existingUser.id !== userId) { + return res.status(409).json({ message: "username already exists" }); + } + existingUser = await _findUserByEmail(email); + if (existingUser && existingUser.id !== userId) { + return res.status(409).json({ message: "email already exists" }); + } + } + + let hashedPassword; + if (password) { + const salt = bcrypt.genSaltSync(10); + hashedPassword = bcrypt.hashSync(password, salt); + } + const updatedUser = await _updateUserById(userId, username, email, hashedPassword); + return res.status(200).json({ + message: `Updated data for user ${userId}`, + data: formatUserResponse(updatedUser), + }); + } else { + return res.status(400).json({ message: "No field to update: username and email and password are all missing!" }); + } + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when updating user!" }); + } +} + +export async function updateUserPrivilege(req, res) { + try { + const { isAdmin } = req.body; + + if (isAdmin !== undefined) { // isAdmin can have boolean value true or false + const userId = req.params.id; + if (!isValidObjectId(userId)) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + const user = await _findUserById(userId); + if (!user) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + + const updatedUser = await _updateUserPrivilegeById(userId, isAdmin === true); + return res.status(200).json({ + message: `Updated privilege for user ${userId}`, + data: formatUserResponse(updatedUser), + }); + } else { + return res.status(400).json({ message: "isAdmin is missing!" }); + } + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when updating user privilege!" }); + } +} + +export async function deleteUser(req, res) { + try { + const userId = req.params.id; + if (!isValidObjectId(userId)) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + const user = await _findUserById(userId); + if (!user) { + return res.status(404).json({ message: `User ${userId} not found` }); + } + + await _deleteUserById(userId); + return res.status(200).json({ message: `Deleted user ${userId} successfully` }); + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Unknown error when deleting user!" }); + } +} + +export function formatUserResponse(user) { + return { + id: user.id, + username: user.username, + email: user.email, + isAdmin: user.isAdmin, + createdAt: user.createdAt, + }; +} diff --git a/user-service/index.js b/user-service/index.js new file mode 100644 index 0000000000..24a5835874 --- /dev/null +++ b/user-service/index.js @@ -0,0 +1,59 @@ +import express from "express"; +import cors from "cors"; + +import userRoutes from "./routes/user-routes.js"; +import authRoutes from "./routes/auth-routes.js"; + +const app = express(); + +app.use(express.urlencoded({ extended: true })); +app.use(express.json()); +app.use(cors()); // config cors so that front-end can use +app.options("*", cors()); + +// To handle CORS Errors +app.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", "*"); // "*" -> Allow all links to access + + res.header( + "Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept, Authorization", + ); + + // Browsers usually send this before PUT or POST Requests + if (req.method === "OPTIONS") { + res.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH"); + return res.status(200).json({}); + } + + // Continue Route Processing + next(); +}); + +app.use("/users", userRoutes); +app.use("/auth", authRoutes); + +app.get("/", (req, res, next) => { + console.log("Sending Greetings!"); + res.json({ + message: "Hello World from user-service", + }); +}); + +// Handle When No Route Match Is Found +app.use((req, res, next) => { + const error = new Error("Route Not Found"); + error.status = 404; + next(error); +}); + +app.use((error, req, res, next) => { + res.status(error.status || 500); + res.json({ + error: { + message: error.message, + }, + }); +}); + +export default app; diff --git a/user-service/middleware/basic-access-control.js b/user-service/middleware/basic-access-control.js new file mode 100644 index 0000000000..bb92665710 --- /dev/null +++ b/user-service/middleware/basic-access-control.js @@ -0,0 +1,48 @@ +import jwt from "jsonwebtoken"; +import { findUserById as _findUserById } from "../model/repository.js"; + +export function verifyAccessToken(req, res, next) { + const authHeader = req.headers["authorization"]; + if (!authHeader) { + return res.status(401).json({ message: "Authentication failed" }); + } + + // request auth header: `Authorization: Bearer + ` + const token = authHeader.split(" ")[1]; + jwt.verify(token, process.env.JWT_SECRET, async (err, user) => { + if (err) { + return res.status(401).json({ message: "Authentication failed" }); + } + + // load latest user info from DB + const dbUser = await _findUserById(user.id); + if (!dbUser) { + return res.status(401).json({ message: "Authentication failed" }); + } + + req.user = { id: dbUser.id, username: dbUser.username, email: dbUser.email, isAdmin: dbUser.isAdmin }; + next(); + }); +} + +export function verifyIsAdmin(req, res, next) { + if (req.user.isAdmin) { + next(); + } else { + return res.status(403).json({ message: "Not authorized to access this resource" }); + } +} + +export function verifyIsOwnerOrAdmin(req, res, next) { + if (req.user.isAdmin) { + return next(); + } + + const userIdFromReqParams = req.params.id; + const userIdFromToken = req.user.id; + if (userIdFromReqParams === userIdFromToken) { + return next(); + } + + return res.status(403).json({ message: "Not authorized to access this resource" }); +} diff --git a/user-service/model/repository.js b/user-service/model/repository.js new file mode 100644 index 0000000000..5d56b91e71 --- /dev/null +++ b/user-service/model/repository.js @@ -0,0 +1,71 @@ +import UserModel from "./user-model.js"; +import "dotenv/config"; +import { connect } from "mongoose"; + +export async function connectToDB() { + let mongoDBUri = + process.env.ENV === "PROD" + ? process.env.DB_CLOUD_URI + : process.env.DB_LOCAL_URI; + + await connect(mongoDBUri); +} + +export async function createUser(username, email, password) { + return new UserModel({ username, email, password }).save(); +} + +export async function findUserByEmail(email) { + return UserModel.findOne({ email }); +} + +export async function findUserById(userId) { + return UserModel.findById(userId); +} + +export async function findUserByUsername(username) { + return UserModel.findOne({ username }); +} + +export async function findUserByUsernameOrEmail(username, email) { + return UserModel.findOne({ + $or: [ + { username }, + { email }, + ], + }); +} + +export async function findAllUsers() { + return UserModel.find(); +} + +export async function updateUserById(userId, username, email, password) { + return UserModel.findByIdAndUpdate( + userId, + { + $set: { + username, + email, + password, + }, + }, + { new: true }, // return the updated user + ); +} + +export async function updateUserPrivilegeById(userId, isAdmin) { + return UserModel.findByIdAndUpdate( + userId, + { + $set: { + isAdmin, + }, + }, + { new: true }, // return the updated user + ); +} + +export async function deleteUserById(userId) { + return UserModel.findByIdAndDelete(userId); +} diff --git a/user-service/model/user-model.js b/user-service/model/user-model.js new file mode 100644 index 0000000000..df37491d09 --- /dev/null +++ b/user-service/model/user-model.js @@ -0,0 +1,31 @@ +import mongoose from "mongoose"; + +const Schema = mongoose.Schema; + +const UserModelSchema = new Schema({ + username: { + type: String, + required: true, + unique: true, + }, + email: { + type: String, + required: true, + unique: true, + }, + password: { + type: String, + required: true, + }, + createdAt: { + type: Date, + default: Date.now, // Setting default to the current date/time + }, + isAdmin: { + type: Boolean, + required: true, + default: false, + }, +}); + +export default mongoose.model("UserModel", UserModelSchema); diff --git a/user-service/package-lock.json b/user-service/package-lock.json new file mode 100644 index 0000000000..8841b5347e --- /dev/null +++ b/user-service/package-lock.json @@ -0,0 +1,1896 @@ +{ + "name": "user-service", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "user-service", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.5.4" + }, + "devDependencies": { + "nodemon": "^3.1.4" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz", + "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz", + "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.4.tgz", + "integrity": "sha512-nG3eehhWf9l1q80WuHvp5DV+4xDNFpDWLE5ZgcFD5tslUV2USJ56ogun8gaZ62MKAocJnoStjAdno08b8U57hg==", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "6.7.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/user-service/package.json b/user-service/package.json new file mode 100644 index 0000000000..b3ac4db247 --- /dev/null +++ b/user-service/package.json @@ -0,0 +1,26 @@ +{ + "name": "user-service", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "dev": "nodemon server.js", + "start": "node server.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "nodemon": "^3.1.4" + }, + "dependencies": { + "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", + "mongoose": "^8.5.4" + } +} diff --git a/user-service/routes/auth-routes.js b/user-service/routes/auth-routes.js new file mode 100644 index 0000000000..8690cbe1f6 --- /dev/null +++ b/user-service/routes/auth-routes.js @@ -0,0 +1,12 @@ +import express from "express"; + +import { handleLogin, handleVerifyToken } from "../controller/auth-controller.js"; +import { verifyAccessToken } from "../middleware/basic-access-control.js"; + +const router = express.Router(); + +router.post("/login", handleLogin); + +router.get("/verify-token", verifyAccessToken, handleVerifyToken); + +export default router; diff --git a/user-service/routes/user-routes.js b/user-service/routes/user-routes.js new file mode 100644 index 0000000000..51c2fb64a8 --- /dev/null +++ b/user-service/routes/user-routes.js @@ -0,0 +1,27 @@ +import express from "express"; + +import { + createUser, + deleteUser, + getAllUsers, + getUser, + updateUser, + updateUserPrivilege, +} from "../controller/user-controller.js"; +import { verifyAccessToken, verifyIsAdmin, verifyIsOwnerOrAdmin } from "../middleware/basic-access-control.js"; + +const router = express.Router(); + +router.get("/", verifyAccessToken, verifyIsAdmin, getAllUsers); + +router.patch("/:id/privilege", verifyAccessToken, verifyIsAdmin, updateUserPrivilege); + +router.post("/", createUser); + +router.get("/:id", verifyAccessToken, verifyIsOwnerOrAdmin, getUser); + +router.patch("/:id", verifyAccessToken, verifyIsOwnerOrAdmin, updateUser); + +router.delete("/:id", verifyAccessToken, verifyIsOwnerOrAdmin, deleteUser); + +export default router; diff --git a/user-service/server.js b/user-service/server.js new file mode 100644 index 0000000000..f59ed938ac --- /dev/null +++ b/user-service/server.js @@ -0,0 +1,19 @@ +import http from "http"; +import index from "./index.js"; +import "dotenv/config"; +import { connectToDB } from "./model/repository.js"; + +const port = process.env.PORT || 3001; + +const server = http.createServer(index); + +await connectToDB().then(() => { + console.log("MongoDB Connected!"); + + server.listen(port); + console.log("User service server listening on http://localhost:" + port); +}).catch((err) => { + console.error("Failed to connect to DB"); + console.error(err); +}); + From ef127dc7b45744d8e6d28d98843aa2421d28d400 Mon Sep 17 00:00:00 2001 From: Henry <> Date: Wed, 25 Sep 2024 02:41:46 +0800 Subject: [PATCH 015/191] install project dependencies --- user-service/.env | 9 + user-service/node_modules/.bin/color-support | 1 + user-service/node_modules/.bin/mime | 1 + user-service/node_modules/.bin/mkdirp | 1 + user-service/node_modules/.bin/node-pre-gyp | 1 + user-service/node_modules/.bin/nodemon | 1 + user-service/node_modules/.bin/nodetouch | 1 + user-service/node_modules/.bin/nopt | 1 + user-service/node_modules/.bin/rimraf | 1 + user-service/node_modules/.bin/semver | 1 + user-service/node_modules/.package-lock.json | 1880 ++++ .../node-pre-gyp/.github/workflows/codeql.yml | 74 + .../@mapbox/node-pre-gyp/CHANGELOG.md | 510 + .../node_modules/@mapbox/node-pre-gyp/LICENSE | 27 + .../@mapbox/node-pre-gyp/README.md | 742 ++ .../@mapbox/node-pre-gyp/bin/node-pre-gyp | 4 + .../@mapbox/node-pre-gyp/bin/node-pre-gyp.cmd | 2 + .../@mapbox/node-pre-gyp/contributing.md | 10 + .../@mapbox/node-pre-gyp/lib/build.js | 51 + .../@mapbox/node-pre-gyp/lib/clean.js | 31 + .../@mapbox/node-pre-gyp/lib/configure.js | 52 + .../@mapbox/node-pre-gyp/lib/info.js | 38 + .../@mapbox/node-pre-gyp/lib/install.js | 235 + .../@mapbox/node-pre-gyp/lib/main.js | 125 + .../@mapbox/node-pre-gyp/lib/node-pre-gyp.js | 309 + .../@mapbox/node-pre-gyp/lib/package.js | 73 + .../@mapbox/node-pre-gyp/lib/pre-binding.js | 34 + .../@mapbox/node-pre-gyp/lib/publish.js | 81 + .../@mapbox/node-pre-gyp/lib/rebuild.js | 20 + .../@mapbox/node-pre-gyp/lib/reinstall.js | 19 + .../@mapbox/node-pre-gyp/lib/reveal.js | 32 + .../@mapbox/node-pre-gyp/lib/testbinary.js | 79 + .../@mapbox/node-pre-gyp/lib/testpackage.js | 53 + .../@mapbox/node-pre-gyp/lib/unpublish.js | 41 + .../node-pre-gyp/lib/util/abi_crosswalk.json | 2602 +++++ .../@mapbox/node-pre-gyp/lib/util/compile.js | 93 + .../node-pre-gyp/lib/util/handle_gyp_opts.js | 102 + .../@mapbox/node-pre-gyp/lib/util/napi.js | 205 + .../lib/util/nw-pre-gyp/index.html | 26 + .../lib/util/nw-pre-gyp/package.json | 9 + .../@mapbox/node-pre-gyp/lib/util/s3_setup.js | 163 + .../node-pre-gyp/lib/util/versioning.js | 335 + .../@mapbox/node-pre-gyp/package.json | 62 + .../node_modules/@mongodb-js/saslprep/LICENSE | 22 + .../saslprep/dist/.esm-wrapper.mjs | 4 + .../@mongodb-js/saslprep/dist/browser.d.ts | 5 + .../saslprep/dist/browser.d.ts.map | 1 + .../@mongodb-js/saslprep/dist/browser.js | 12 + .../@mongodb-js/saslprep/dist/browser.js.map | 1 + .../dist/code-points-data-browser.d.ts | 4 + .../dist/code-points-data-browser.d.ts.map | 1 + .../saslprep/dist/code-points-data-browser.js | 5 + .../dist/code-points-data-browser.js.map | 1 + .../saslprep/dist/code-points-data.d.ts | 4 + .../saslprep/dist/code-points-data.d.ts.map | 1 + .../saslprep/dist/code-points-data.js | 5 + .../saslprep/dist/code-points-data.js.map | 1 + .../saslprep/dist/code-points-src.d.ts | 7 + .../saslprep/dist/code-points-src.d.ts.map | 1 + .../saslprep/dist/code-points-src.js | 881 ++ .../saslprep/dist/code-points-src.js.map | 1 + .../saslprep/dist/generate-code-points.d.ts | 2 + .../dist/generate-code-points.d.ts.map | 1 + .../saslprep/dist/generate-code-points.js | 73 + .../saslprep/dist/generate-code-points.js.map | 1 + .../@mongodb-js/saslprep/dist/index.d.ts | 11 + .../@mongodb-js/saslprep/dist/index.d.ts.map | 1 + .../@mongodb-js/saslprep/dist/index.js | 65 + .../@mongodb-js/saslprep/dist/index.js.map | 1 + .../saslprep/dist/memory-code-points.d.ts | 11 + .../saslprep/dist/memory-code-points.d.ts.map | 1 + .../saslprep/dist/memory-code-points.js | 33 + .../saslprep/dist/memory-code-points.js.map | 1 + .../@mongodb-js/saslprep/dist/node.d.ts | 10 + .../@mongodb-js/saslprep/dist/node.d.ts.map | 1 + .../@mongodb-js/saslprep/dist/node.js | 15 + .../@mongodb-js/saslprep/dist/node.js.map | 1 + .../@mongodb-js/saslprep/dist/util.d.ts | 2 + .../@mongodb-js/saslprep/dist/util.d.ts.map | 1 + .../@mongodb-js/saslprep/dist/util.js | 12 + .../@mongodb-js/saslprep/dist/util.js.map | 1 + .../@mongodb-js/saslprep/package.json | 87 + .../@mongodb-js/saslprep/readme.md | 29 + .../@types/webidl-conversions/LICENSE | 21 + .../@types/webidl-conversions/README.md | 15 + .../@types/webidl-conversions/index.d.ts | 91 + .../@types/webidl-conversions/package.json | 30 + .../node_modules/@types/whatwg-url/LICENSE | 21 + .../node_modules/@types/whatwg-url/README.md | 15 + .../node_modules/@types/whatwg-url/index.d.ts | 169 + .../@types/whatwg-url/lib/URL-impl.d.ts | 22 + .../@types/whatwg-url/lib/URL.d.ts | 66 + .../whatwg-url/lib/URLSearchParams-impl.d.ts | 20 + .../whatwg-url/lib/URLSearchParams.d.ts | 92 + .../@types/whatwg-url/package.json | 37 + .../@types/whatwg-url/webidl2js-wrapper.d.ts | 4 + user-service/node_modules/abbrev/LICENSE | 46 + user-service/node_modules/abbrev/README.md | 23 + user-service/node_modules/abbrev/abbrev.js | 61 + user-service/node_modules/abbrev/package.json | 21 + user-service/node_modules/accepts/HISTORY.md | 243 + user-service/node_modules/accepts/LICENSE | 23 + user-service/node_modules/accepts/README.md | 140 + user-service/node_modules/accepts/index.js | 238 + .../node_modules/accepts/package.json | 47 + .../node_modules/agent-base/README.md | 145 + .../agent-base/dist/src/index.d.ts | 78 + .../node_modules/agent-base/dist/src/index.js | 203 + .../agent-base/dist/src/index.js.map | 1 + .../agent-base/dist/src/promisify.d.ts | 4 + .../agent-base/dist/src/promisify.js | 18 + .../agent-base/dist/src/promisify.js.map | 1 + .../agent-base/node_modules/debug/LICENSE | 20 + .../agent-base/node_modules/debug/README.md | 481 + .../node_modules/debug/package.json | 60 + .../node_modules/debug/src/browser.js | 271 + .../node_modules/debug/src/common.js | 274 + .../node_modules/debug/src/index.js | 10 + .../agent-base/node_modules/debug/src/node.js | 263 + .../agent-base/node_modules/ms/index.js | 162 + .../agent-base/node_modules/ms/license.md | 21 + .../agent-base/node_modules/ms/package.json | 37 + .../agent-base/node_modules/ms/readme.md | 60 + .../node_modules/agent-base/package.json | 64 + .../node_modules/agent-base/src/index.ts | 345 + .../node_modules/agent-base/src/promisify.ts | 33 + .../node_modules/ansi-regex/index.d.ts | 37 + user-service/node_modules/ansi-regex/index.js | 10 + user-service/node_modules/ansi-regex/license | 9 + .../node_modules/ansi-regex/package.json | 55 + .../node_modules/ansi-regex/readme.md | 78 + user-service/node_modules/anymatch/LICENSE | 15 + user-service/node_modules/anymatch/README.md | 87 + user-service/node_modules/anymatch/index.d.ts | 20 + user-service/node_modules/anymatch/index.js | 104 + .../node_modules/anymatch/package.json | 48 + user-service/node_modules/aproba/CHANGELOG.md | 4 + user-service/node_modules/aproba/LICENSE | 14 + user-service/node_modules/aproba/README.md | 94 + user-service/node_modules/aproba/index.js | 105 + user-service/node_modules/aproba/package.json | 35 + .../node_modules/are-we-there-yet/LICENSE.md | 18 + .../node_modules/are-we-there-yet/README.md | 208 + .../are-we-there-yet/lib/index.js | 4 + .../are-we-there-yet/lib/tracker-base.js | 11 + .../are-we-there-yet/lib/tracker-group.js | 116 + .../are-we-there-yet/lib/tracker-stream.js | 36 + .../are-we-there-yet/lib/tracker.js | 32 + .../are-we-there-yet/package.json | 53 + .../node_modules/array-flatten/LICENSE | 21 + .../node_modules/array-flatten/README.md | 43 + .../array-flatten/array-flatten.js | 64 + .../node_modules/array-flatten/package.json | 39 + .../balanced-match/.github/FUNDING.yml | 2 + .../node_modules/balanced-match/LICENSE.md | 21 + .../node_modules/balanced-match/README.md | 97 + .../node_modules/balanced-match/index.js | 62 + .../node_modules/balanced-match/package.json | 48 + .../node_modules/bcrypt/.editorconfig | 19 + .../bcrypt/.github/workflows/ci.yaml | 59 + user-service/node_modules/bcrypt/.travis.yml | 62 + user-service/node_modules/bcrypt/CHANGELOG.md | 178 + .../node_modules/bcrypt/ISSUE_TEMPLATE.md | 18 + user-service/node_modules/bcrypt/LICENSE | 19 + user-service/node_modules/bcrypt/Makefile | 19 + user-service/node_modules/bcrypt/README.md | 388 + user-service/node_modules/bcrypt/SECURITY.md | 15 + user-service/node_modules/bcrypt/appveyor.yml | 39 + user-service/node_modules/bcrypt/bcrypt.js | 236 + user-service/node_modules/bcrypt/binding.gyp | 61 + .../bcrypt/examples/async_compare.js | 28 + .../bcrypt/examples/forever_gen_salt.js | 8 + .../lib/binding/napi-v3/bcrypt_lib.node | Bin 0 -> 92560 bytes user-service/node_modules/bcrypt/package.json | 67 + user-service/node_modules/bcrypt/promises.js | 42 + .../node_modules/bcrypt/src/bcrypt.cc | 315 + .../node_modules/bcrypt/src/bcrypt_node.cc | 288 + .../node_modules/bcrypt/src/blowfish.cc | 679 ++ .../node_modules/bcrypt/src/node_blf.h | 132 + .../node_modules/bcrypt/test-docker.sh | 15 + .../node_modules/bcrypt/test/async.test.js | 209 + .../bcrypt/test/implementation.test.js | 48 + .../node_modules/bcrypt/test/promise.test.js | 168 + .../bcrypt/test/repetitions.test.js | 46 + .../node_modules/bcrypt/test/sync.test.js | 125 + .../binary-extensions/binary-extensions.json | 263 + .../binary-extensions.json.d.ts | 3 + .../node_modules/binary-extensions/index.d.ts | 14 + .../node_modules/binary-extensions/index.js | 1 + .../node_modules/binary-extensions/license | 10 + .../binary-extensions/package.json | 40 + .../node_modules/binary-extensions/readme.md | 25 + .../node_modules/body-parser/HISTORY.md | 665 ++ user-service/node_modules/body-parser/LICENSE | 23 + .../node_modules/body-parser/README.md | 465 + .../node_modules/body-parser/SECURITY.md | 25 + .../node_modules/body-parser/index.js | 156 + .../node_modules/body-parser/lib/read.js | 205 + .../body-parser/lib/types/json.js | 247 + .../node_modules/body-parser/lib/types/raw.js | 101 + .../body-parser/lib/types/text.js | 121 + .../body-parser/lib/types/urlencoded.js | 284 + .../node_modules/body-parser/package.json | 56 + .../node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 129 + .../node_modules/brace-expansion/index.js | 201 + .../node_modules/brace-expansion/package.json | 47 + user-service/node_modules/braces/LICENSE | 21 + user-service/node_modules/braces/README.md | 586 ++ user-service/node_modules/braces/index.js | 170 + .../node_modules/braces/lib/compile.js | 60 + .../node_modules/braces/lib/constants.js | 57 + .../node_modules/braces/lib/expand.js | 113 + user-service/node_modules/braces/lib/parse.js | 331 + .../node_modules/braces/lib/stringify.js | 32 + user-service/node_modules/braces/lib/utils.js | 122 + user-service/node_modules/braces/package.json | 77 + user-service/node_modules/bson/LICENSE.md | 201 + user-service/node_modules/bson/README.md | 280 + user-service/node_modules/bson/bson.d.ts | 1606 ++++ user-service/node_modules/bson/etc/prepare.js | 19 + .../node_modules/bson/lib/bson.bundle.js | 4422 +++++++++ .../node_modules/bson/lib/bson.bundle.js.map | 1 + user-service/node_modules/bson/lib/bson.cjs | 4417 +++++++++ .../node_modules/bson/lib/bson.cjs.map | 1 + user-service/node_modules/bson/lib/bson.mjs | 4387 +++++++++ .../node_modules/bson/lib/bson.mjs.map | 1 + .../node_modules/bson/lib/bson.rn.cjs | 4434 +++++++++ .../node_modules/bson/lib/bson.rn.cjs.map | 1 + user-service/node_modules/bson/package.json | 119 + user-service/node_modules/bson/src/binary.ts | 472 + user-service/node_modules/bson/src/bson.ts | 248 + .../node_modules/bson/src/bson_value.ts | 31 + user-service/node_modules/bson/src/code.ts | 69 + .../node_modules/bson/src/constants.ts | 144 + user-service/node_modules/bson/src/db_ref.ts | 128 + .../node_modules/bson/src/decimal128.ts | 855 ++ user-service/node_modules/bson/src/double.ts | 115 + user-service/node_modules/bson/src/error.ts | 105 + .../node_modules/bson/src/extended_json.ts | 515 + user-service/node_modules/bson/src/index.ts | 19 + user-service/node_modules/bson/src/int_32.ts | 101 + user-service/node_modules/bson/src/long.ts | 1246 +++ user-service/node_modules/bson/src/max_key.ts | 31 + user-service/node_modules/bson/src/min_key.ts | 31 + .../node_modules/bson/src/objectid.ts | 361 + .../node_modules/bson/src/parse_utf8.ts | 35 + .../bson/src/parser/calculate_size.ts | 211 + .../bson/src/parser/deserializer.ts | 655 ++ .../bson/src/parser/on_demand/index.ts | 32 + .../src/parser/on_demand/parse_to_elements.ts | 188 + .../bson/src/parser/serializer.ts | 942 ++ .../node_modules/bson/src/parser/utils.ts | 56 + user-service/node_modules/bson/src/regexp.ts | 114 + user-service/node_modules/bson/src/symbol.ts | 55 + .../node_modules/bson/src/timestamp.ts | 151 + .../node_modules/bson/src/utils/byte_utils.ts | 61 + .../node_modules/bson/src/utils/latin.ts | 104 + .../bson/src/utils/node_byte_utils.ts | 163 + .../bson/src/utils/number_utils.ts | 200 + .../bson/src/utils/string_utils.ts | 44 + .../bson/src/utils/web_byte_utils.ts | 197 + .../bson/vendor/base64/LICENSE-MIT.txt | 20 + .../node_modules/bson/vendor/base64/README.md | 112 + .../node_modules/bson/vendor/base64/base64.js | 157 + .../bson/vendor/base64/package.json | 43 + .../bson/vendor/text-encoding/LICENSE.md | 237 + .../bson/vendor/text-encoding/README.md | 111 + .../bson/vendor/text-encoding/index.js | 9 + .../text-encoding/lib/encoding-indexes.js | 47 + .../bson/vendor/text-encoding/lib/encoding.js | 3301 +++++++ .../bson/vendor/text-encoding/package.json | 37 + .../buffer-equal-constant-time/.npmignore | 2 + .../buffer-equal-constant-time/.travis.yml | 4 + .../buffer-equal-constant-time/LICENSE.txt | 12 + .../buffer-equal-constant-time/README.md | 50 + .../buffer-equal-constant-time/index.js | 41 + .../buffer-equal-constant-time/package.json | 21 + .../buffer-equal-constant-time/test.js | 42 + user-service/node_modules/bytes/History.md | 97 + user-service/node_modules/bytes/LICENSE | 23 + user-service/node_modules/bytes/Readme.md | 152 + user-service/node_modules/bytes/index.js | 170 + user-service/node_modules/bytes/package.json | 42 + .../node_modules/call-bind/.eslintignore | 1 + user-service/node_modules/call-bind/.eslintrc | 16 + .../call-bind/.github/FUNDING.yml | 12 + user-service/node_modules/call-bind/.nycrc | 9 + .../node_modules/call-bind/CHANGELOG.md | 93 + user-service/node_modules/call-bind/LICENSE | 21 + user-service/node_modules/call-bind/README.md | 64 + .../node_modules/call-bind/callBound.js | 15 + user-service/node_modules/call-bind/index.js | 35 + .../node_modules/call-bind/package.json | 95 + .../node_modules/call-bind/test/callBound.js | 54 + .../node_modules/call-bind/test/index.js | 80 + user-service/node_modules/chokidar/LICENSE | 21 + user-service/node_modules/chokidar/README.md | 308 + user-service/node_modules/chokidar/index.js | 973 ++ .../node_modules/chokidar/lib/constants.js | 66 + .../chokidar/lib/fsevents-handler.js | 526 + .../chokidar/lib/nodefs-handler.js | 654 ++ .../node_modules/chokidar/package.json | 70 + .../node_modules/chokidar/types/index.d.ts | 192 + user-service/node_modules/chownr/LICENSE | 15 + user-service/node_modules/chownr/README.md | 3 + user-service/node_modules/chownr/chownr.js | 167 + user-service/node_modules/chownr/package.json | 32 + .../node_modules/color-support/LICENSE | 15 + .../node_modules/color-support/README.md | 129 + .../node_modules/color-support/bin.js | 3 + .../node_modules/color-support/browser.js | 14 + .../node_modules/color-support/index.js | 134 + .../node_modules/color-support/package.json | 36 + .../node_modules/concat-map/.travis.yml | 4 + user-service/node_modules/concat-map/LICENSE | 18 + .../node_modules/concat-map/README.markdown | 62 + .../node_modules/concat-map/example/map.js | 6 + user-service/node_modules/concat-map/index.js | 13 + .../node_modules/concat-map/package.json | 43 + .../node_modules/concat-map/test/map.js | 39 + .../console-control-strings/LICENSE | 13 + .../console-control-strings/README.md | 145 + .../console-control-strings/index.js | 125 + .../console-control-strings/package.json | 27 + .../content-disposition/HISTORY.md | 60 + .../node_modules/content-disposition/LICENSE | 22 + .../content-disposition/README.md | 142 + .../node_modules/content-disposition/index.js | 458 + .../content-disposition/package.json | 44 + .../node_modules/content-type/HISTORY.md | 29 + .../node_modules/content-type/LICENSE | 22 + .../node_modules/content-type/README.md | 94 + .../node_modules/content-type/index.js | 225 + .../node_modules/content-type/package.json | 42 + .../node_modules/cookie-signature/.npmignore | 4 + .../node_modules/cookie-signature/History.md | 38 + .../node_modules/cookie-signature/Readme.md | 42 + .../node_modules/cookie-signature/index.js | 51 + .../cookie-signature/package.json | 18 + user-service/node_modules/cookie/HISTORY.md | 147 + user-service/node_modules/cookie/LICENSE | 24 + user-service/node_modules/cookie/README.md | 317 + user-service/node_modules/cookie/SECURITY.md | 25 + user-service/node_modules/cookie/index.js | 274 + user-service/node_modules/cookie/package.json | 44 + .../node_modules/cors/CONTRIBUTING.md | 33 + user-service/node_modules/cors/HISTORY.md | 58 + user-service/node_modules/cors/LICENSE | 22 + user-service/node_modules/cors/README.md | 243 + user-service/node_modules/cors/lib/index.js | 238 + user-service/node_modules/cors/package.json | 41 + .../node_modules/debug/.coveralls.yml | 1 + user-service/node_modules/debug/.eslintrc | 11 + user-service/node_modules/debug/.npmignore | 9 + user-service/node_modules/debug/.travis.yml | 14 + user-service/node_modules/debug/CHANGELOG.md | 362 + user-service/node_modules/debug/LICENSE | 19 + user-service/node_modules/debug/Makefile | 50 + user-service/node_modules/debug/README.md | 312 + .../node_modules/debug/component.json | 19 + user-service/node_modules/debug/karma.conf.js | 70 + user-service/node_modules/debug/node.js | 1 + user-service/node_modules/debug/package.json | 49 + .../node_modules/debug/src/browser.js | 185 + user-service/node_modules/debug/src/debug.js | 202 + user-service/node_modules/debug/src/index.js | 10 + .../node_modules/debug/src/inspector-log.js | 15 + user-service/node_modules/debug/src/node.js | 248 + .../define-data-property/.eslintrc | 24 + .../define-data-property/.github/FUNDING.yml | 12 + .../node_modules/define-data-property/.nycrc | 13 + .../define-data-property/CHANGELOG.md | 70 + .../node_modules/define-data-property/LICENSE | 21 + .../define-data-property/README.md | 67 + .../define-data-property/index.d.ts | 12 + .../define-data-property/index.js | 56 + .../define-data-property/package.json | 106 + .../define-data-property/test/index.js | 392 + .../define-data-property/tsconfig.json | 59 + .../node_modules/delegates/.npmignore | 1 + .../node_modules/delegates/History.md | 22 + user-service/node_modules/delegates/License | 20 + user-service/node_modules/delegates/Makefile | 8 + user-service/node_modules/delegates/Readme.md | 94 + user-service/node_modules/delegates/index.js | 121 + .../node_modules/delegates/package.json | 13 + .../node_modules/delegates/test/index.js | 94 + user-service/node_modules/depd/History.md | 103 + user-service/node_modules/depd/LICENSE | 22 + user-service/node_modules/depd/Readme.md | 280 + user-service/node_modules/depd/index.js | 538 ++ .../node_modules/depd/lib/browser/index.js | 77 + user-service/node_modules/depd/package.json | 45 + user-service/node_modules/destroy/LICENSE | 23 + user-service/node_modules/destroy/README.md | 63 + user-service/node_modules/destroy/index.js | 209 + .../node_modules/destroy/package.json | 48 + user-service/node_modules/detect-libc/LICENSE | 201 + .../node_modules/detect-libc/README.md | 163 + .../node_modules/detect-libc/index.d.ts | 14 + .../detect-libc/lib/detect-libc.js | 267 + .../detect-libc/lib/filesystem.js | 41 + .../node_modules/detect-libc/lib/process.js | 24 + .../node_modules/detect-libc/package.json | 40 + user-service/node_modules/dotenv/CHANGELOG.md | 475 + user-service/node_modules/dotenv/LICENSE | 23 + user-service/node_modules/dotenv/README-es.md | 448 + user-service/node_modules/dotenv/README.md | 728 ++ user-service/node_modules/dotenv/config.d.ts | 1 + user-service/node_modules/dotenv/config.js | 9 + .../node_modules/dotenv/lib/cli-options.js | 11 + .../node_modules/dotenv/lib/env-options.js | 24 + .../node_modules/dotenv/lib/main.d.ts | 153 + user-service/node_modules/dotenv/lib/main.js | 361 + user-service/node_modules/dotenv/package.json | 65 + .../ecdsa-sig-formatter/CODEOWNERS | 1 + .../node_modules/ecdsa-sig-formatter/LICENSE | 201 + .../ecdsa-sig-formatter/README.md | 65 + .../ecdsa-sig-formatter/package.json | 46 + .../src/ecdsa-sig-formatter.d.ts | 17 + .../src/ecdsa-sig-formatter.js | 187 + .../src/param-bytes-for-alg.js | 23 + user-service/node_modules/ee-first/LICENSE | 22 + user-service/node_modules/ee-first/README.md | 80 + user-service/node_modules/ee-first/index.js | 95 + .../node_modules/ee-first/package.json | 29 + .../node_modules/emoji-regex/LICENSE-MIT.txt | 20 + .../node_modules/emoji-regex/README.md | 73 + .../node_modules/emoji-regex/es2015/index.js | 6 + .../node_modules/emoji-regex/es2015/text.js | 6 + .../node_modules/emoji-regex/index.d.ts | 23 + .../node_modules/emoji-regex/index.js | 6 + .../node_modules/emoji-regex/package.json | 50 + user-service/node_modules/emoji-regex/text.js | 6 + .../node_modules/encodeurl/HISTORY.md | 14 + user-service/node_modules/encodeurl/LICENSE | 22 + user-service/node_modules/encodeurl/README.md | 128 + user-service/node_modules/encodeurl/index.js | 60 + .../node_modules/encodeurl/package.json | 40 + .../node_modules/es-define-property/.eslintrc | 13 + .../es-define-property/.github/FUNDING.yml | 12 + .../node_modules/es-define-property/.nycrc | 9 + .../es-define-property/CHANGELOG.md | 15 + .../node_modules/es-define-property/LICENSE | 21 + .../node_modules/es-define-property/README.md | 49 + .../es-define-property/index.d.ts | 3 + .../node_modules/es-define-property/index.js | 16 + .../es-define-property/package.json | 81 + .../es-define-property/test/index.js | 55 + .../es-define-property/tsconfig.json | 50 + user-service/node_modules/es-errors/.eslintrc | 5 + .../es-errors/.github/FUNDING.yml | 12 + .../node_modules/es-errors/CHANGELOG.md | 40 + user-service/node_modules/es-errors/LICENSE | 21 + user-service/node_modules/es-errors/README.md | 55 + user-service/node_modules/es-errors/eval.d.ts | 3 + user-service/node_modules/es-errors/eval.js | 4 + .../node_modules/es-errors/index.d.ts | 3 + user-service/node_modules/es-errors/index.js | 4 + .../node_modules/es-errors/package.json | 80 + .../node_modules/es-errors/range.d.ts | 3 + user-service/node_modules/es-errors/range.js | 4 + user-service/node_modules/es-errors/ref.d.ts | 3 + user-service/node_modules/es-errors/ref.js | 4 + .../node_modules/es-errors/syntax.d.ts | 3 + user-service/node_modules/es-errors/syntax.js | 4 + .../node_modules/es-errors/test/index.js | 19 + .../node_modules/es-errors/tsconfig.json | 49 + user-service/node_modules/es-errors/type.d.ts | 3 + user-service/node_modules/es-errors/type.js | 4 + user-service/node_modules/es-errors/uri.d.ts | 3 + user-service/node_modules/es-errors/uri.js | 4 + user-service/node_modules/escape-html/LICENSE | 24 + .../node_modules/escape-html/Readme.md | 43 + .../node_modules/escape-html/index.js | 78 + .../node_modules/escape-html/package.json | 24 + user-service/node_modules/etag/HISTORY.md | 83 + user-service/node_modules/etag/LICENSE | 22 + user-service/node_modules/etag/README.md | 159 + user-service/node_modules/etag/index.js | 131 + user-service/node_modules/etag/package.json | 47 + user-service/node_modules/express/History.md | 3615 +++++++ user-service/node_modules/express/LICENSE | 24 + user-service/node_modules/express/Readme.md | 166 + user-service/node_modules/express/index.js | 11 + .../node_modules/express/lib/application.js | 661 ++ .../node_modules/express/lib/express.js | 116 + .../express/lib/middleware/init.js | 43 + .../express/lib/middleware/query.js | 47 + .../node_modules/express/lib/request.js | 525 + .../node_modules/express/lib/response.js | 1178 +++ .../node_modules/express/lib/router/index.js | 673 ++ .../node_modules/express/lib/router/layer.js | 181 + .../node_modules/express/lib/router/route.js | 230 + .../node_modules/express/lib/utils.js | 303 + user-service/node_modules/express/lib/view.js | 182 + .../node_modules/express/package.json | 98 + user-service/node_modules/fill-range/LICENSE | 21 + .../node_modules/fill-range/README.md | 237 + user-service/node_modules/fill-range/index.js | 248 + .../node_modules/fill-range/package.json | 74 + .../node_modules/finalhandler/HISTORY.md | 195 + .../node_modules/finalhandler/LICENSE | 22 + .../node_modules/finalhandler/README.md | 147 + .../node_modules/finalhandler/SECURITY.md | 25 + .../node_modules/finalhandler/index.js | 336 + .../node_modules/finalhandler/package.json | 46 + .../node_modules/forwarded/HISTORY.md | 21 + user-service/node_modules/forwarded/LICENSE | 22 + user-service/node_modules/forwarded/README.md | 57 + user-service/node_modules/forwarded/index.js | 90 + .../node_modules/forwarded/package.json | 45 + user-service/node_modules/fresh/HISTORY.md | 70 + user-service/node_modules/fresh/LICENSE | 23 + user-service/node_modules/fresh/README.md | 119 + user-service/node_modules/fresh/index.js | 137 + user-service/node_modules/fresh/package.json | 46 + user-service/node_modules/fs-minipass/LICENSE | 15 + .../node_modules/fs-minipass/README.md | 70 + .../node_modules/fs-minipass/index.js | 422 + .../fs-minipass/node_modules/minipass/LICENSE | 15 + .../node_modules/minipass/README.md | 728 ++ .../node_modules/minipass/index.d.ts | 155 + .../node_modules/minipass/index.js | 649 ++ .../node_modules/minipass/package.json | 56 + .../node_modules/fs-minipass/package.json | 39 + user-service/node_modules/fs.realpath/LICENSE | 43 + .../node_modules/fs.realpath/README.md | 33 + .../node_modules/fs.realpath/index.js | 66 + user-service/node_modules/fs.realpath/old.js | 303 + .../node_modules/fs.realpath/package.json | 26 + user-service/node_modules/fsevents/LICENSE | 22 + user-service/node_modules/fsevents/README.md | 89 + .../node_modules/fsevents/fsevents.d.ts | 46 + .../node_modules/fsevents/fsevents.js | 83 + .../node_modules/fsevents/fsevents.node | Bin 0 -> 163626 bytes .../node_modules/fsevents/package.json | 62 + .../node_modules/function-bind/.eslintrc | 21 + .../function-bind/.github/FUNDING.yml | 12 + .../function-bind/.github/SECURITY.md | 3 + .../node_modules/function-bind/.nycrc | 13 + .../node_modules/function-bind/CHANGELOG.md | 136 + .../node_modules/function-bind/LICENSE | 20 + .../node_modules/function-bind/README.md | 46 + .../function-bind/implementation.js | 84 + .../node_modules/function-bind/index.js | 5 + .../node_modules/function-bind/package.json | 87 + .../node_modules/function-bind/test/.eslintrc | 9 + .../node_modules/function-bind/test/index.js | 252 + user-service/node_modules/gauge/CHANGELOG.md | 163 + user-service/node_modules/gauge/LICENSE | 13 + user-service/node_modules/gauge/README.md | 402 + user-service/node_modules/gauge/base-theme.js | 14 + user-service/node_modules/gauge/error.js | 24 + user-service/node_modules/gauge/has-color.js | 4 + user-service/node_modules/gauge/index.js | 233 + user-service/node_modules/gauge/package.json | 66 + user-service/node_modules/gauge/plumbing.js | 48 + user-service/node_modules/gauge/process.js | 3 + .../node_modules/gauge/progress-bar.js | 35 + .../node_modules/gauge/render-template.js | 178 + .../node_modules/gauge/set-immediate.js | 7 + .../node_modules/gauge/set-interval.js | 3 + user-service/node_modules/gauge/spin.js | 5 + .../node_modules/gauge/template-item.js | 72 + user-service/node_modules/gauge/theme-set.js | 114 + user-service/node_modules/gauge/themes.js | 56 + .../node_modules/gauge/wide-truncate.js | 25 + .../node_modules/get-intrinsic/.eslintrc | 38 + .../get-intrinsic/.github/FUNDING.yml | 12 + .../node_modules/get-intrinsic/.nycrc | 9 + .../node_modules/get-intrinsic/CHANGELOG.md | 143 + .../node_modules/get-intrinsic/LICENSE | 21 + .../node_modules/get-intrinsic/README.md | 71 + .../node_modules/get-intrinsic/index.js | 359 + .../node_modules/get-intrinsic/package.json | 93 + .../get-intrinsic/test/GetIntrinsic.js | 274 + .../node_modules/glob-parent/CHANGELOG.md | 110 + user-service/node_modules/glob-parent/LICENSE | 15 + .../node_modules/glob-parent/README.md | 137 + .../node_modules/glob-parent/index.js | 42 + .../node_modules/glob-parent/package.json | 48 + user-service/node_modules/glob/LICENSE | 21 + user-service/node_modules/glob/README.md | 378 + user-service/node_modules/glob/common.js | 238 + user-service/node_modules/glob/glob.js | 790 ++ user-service/node_modules/glob/package.json | 55 + user-service/node_modules/glob/sync.js | 486 + user-service/node_modules/gopd/.eslintrc | 16 + .../node_modules/gopd/.github/FUNDING.yml | 12 + user-service/node_modules/gopd/CHANGELOG.md | 25 + user-service/node_modules/gopd/LICENSE | 21 + user-service/node_modules/gopd/README.md | 40 + user-service/node_modules/gopd/index.js | 16 + user-service/node_modules/gopd/package.json | 71 + user-service/node_modules/gopd/test/index.js | 35 + user-service/node_modules/has-flag/index.js | 8 + user-service/node_modules/has-flag/license | 9 + .../node_modules/has-flag/package.json | 44 + user-service/node_modules/has-flag/readme.md | 70 + .../has-property-descriptors/.eslintrc | 13 + .../.github/FUNDING.yml | 12 + .../has-property-descriptors/.nycrc | 9 + .../has-property-descriptors/CHANGELOG.md | 35 + .../has-property-descriptors/LICENSE | 21 + .../has-property-descriptors/README.md | 43 + .../has-property-descriptors/index.js | 22 + .../has-property-descriptors/package.json | 77 + .../has-property-descriptors/test/index.js | 57 + user-service/node_modules/has-proto/.eslintrc | 5 + .../has-proto/.github/FUNDING.yml | 12 + .../node_modules/has-proto/CHANGELOG.md | 38 + user-service/node_modules/has-proto/LICENSE | 21 + user-service/node_modules/has-proto/README.md | 38 + .../node_modules/has-proto/index.d.ts | 3 + user-service/node_modules/has-proto/index.js | 15 + .../node_modules/has-proto/package.json | 78 + .../node_modules/has-proto/test/index.js | 19 + .../node_modules/has-proto/tsconfig.json | 49 + .../node_modules/has-symbols/.eslintrc | 11 + .../has-symbols/.github/FUNDING.yml | 12 + user-service/node_modules/has-symbols/.nycrc | 9 + .../node_modules/has-symbols/CHANGELOG.md | 75 + user-service/node_modules/has-symbols/LICENSE | 21 + .../node_modules/has-symbols/README.md | 46 + .../node_modules/has-symbols/index.js | 13 + .../node_modules/has-symbols/package.json | 101 + .../node_modules/has-symbols/shams.js | 42 + .../node_modules/has-symbols/test/index.js | 22 + .../has-symbols/test/shams/core-js.js | 28 + .../test/shams/get-own-property-symbols.js | 28 + .../node_modules/has-symbols/test/tests.js | 56 + user-service/node_modules/has-unicode/LICENSE | 14 + .../node_modules/has-unicode/README.md | 43 + .../node_modules/has-unicode/index.js | 16 + .../node_modules/has-unicode/package.json | 30 + user-service/node_modules/hasown/.eslintrc | 5 + .../node_modules/hasown/.github/FUNDING.yml | 12 + user-service/node_modules/hasown/.nycrc | 13 + user-service/node_modules/hasown/CHANGELOG.md | 40 + user-service/node_modules/hasown/LICENSE | 21 + user-service/node_modules/hasown/README.md | 40 + user-service/node_modules/hasown/index.d.ts | 3 + user-service/node_modules/hasown/index.js | 8 + user-service/node_modules/hasown/package.json | 92 + .../node_modules/hasown/tsconfig.json | 6 + .../node_modules/http-errors/HISTORY.md | 180 + user-service/node_modules/http-errors/LICENSE | 23 + .../node_modules/http-errors/README.md | 169 + .../node_modules/http-errors/index.js | 289 + .../node_modules/http-errors/package.json | 50 + .../node_modules/https-proxy-agent/README.md | 137 + .../https-proxy-agent/dist/agent.d.ts | 30 + .../https-proxy-agent/dist/agent.js | 177 + .../https-proxy-agent/dist/agent.js.map | 1 + .../https-proxy-agent/dist/index.d.ts | 23 + .../https-proxy-agent/dist/index.js | 14 + .../https-proxy-agent/dist/index.js.map | 1 + .../dist/parse-proxy-response.d.ts | 7 + .../dist/parse-proxy-response.js | 66 + .../dist/parse-proxy-response.js.map | 1 + .../node_modules/debug/LICENSE | 20 + .../node_modules/debug/README.md | 481 + .../node_modules/debug/package.json | 60 + .../node_modules/debug/src/browser.js | 271 + .../node_modules/debug/src/common.js | 274 + .../node_modules/debug/src/index.js | 10 + .../node_modules/debug/src/node.js | 263 + .../node_modules/ms/index.js | 162 + .../node_modules/ms/license.md | 21 + .../node_modules/ms/package.json | 37 + .../node_modules/ms/readme.md | 60 + .../https-proxy-agent/package.json | 56 + .../node_modules/iconv-lite/Changelog.md | 162 + user-service/node_modules/iconv-lite/LICENSE | 21 + .../node_modules/iconv-lite/README.md | 156 + .../iconv-lite/encodings/dbcs-codec.js | 555 ++ .../iconv-lite/encodings/dbcs-data.js | 176 + .../iconv-lite/encodings/index.js | 22 + .../iconv-lite/encodings/internal.js | 188 + .../iconv-lite/encodings/sbcs-codec.js | 72 + .../encodings/sbcs-data-generated.js | 451 + .../iconv-lite/encodings/sbcs-data.js | 174 + .../encodings/tables/big5-added.json | 122 + .../iconv-lite/encodings/tables/cp936.json | 264 + .../iconv-lite/encodings/tables/cp949.json | 273 + .../iconv-lite/encodings/tables/cp950.json | 177 + .../iconv-lite/encodings/tables/eucjp.json | 182 + .../encodings/tables/gb18030-ranges.json | 1 + .../encodings/tables/gbk-added.json | 55 + .../iconv-lite/encodings/tables/shiftjis.json | 125 + .../iconv-lite/encodings/utf16.js | 177 + .../node_modules/iconv-lite/encodings/utf7.js | 290 + .../iconv-lite/lib/bom-handling.js | 52 + .../iconv-lite/lib/extend-node.js | 217 + .../node_modules/iconv-lite/lib/index.d.ts | 24 + .../node_modules/iconv-lite/lib/index.js | 153 + .../node_modules/iconv-lite/lib/streams.js | 121 + .../node_modules/iconv-lite/package.json | 46 + .../node_modules/ignore-by-default/LICENSE | 14 + .../node_modules/ignore-by-default/README.md | 26 + .../node_modules/ignore-by-default/index.js | 12 + .../ignore-by-default/package.json | 34 + user-service/node_modules/inflight/LICENSE | 15 + user-service/node_modules/inflight/README.md | 37 + .../node_modules/inflight/inflight.js | 54 + .../node_modules/inflight/package.json | 29 + user-service/node_modules/inherits/LICENSE | 16 + user-service/node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 9 + .../node_modules/inherits/inherits_browser.js | 27 + .../node_modules/inherits/package.json | 29 + user-service/node_modules/ipaddr.js/LICENSE | 19 + user-service/node_modules/ipaddr.js/README.md | 233 + .../node_modules/ipaddr.js/ipaddr.min.js | 1 + .../node_modules/ipaddr.js/lib/ipaddr.js | 673 ++ .../node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 + .../node_modules/ipaddr.js/package.json | 35 + .../node_modules/is-binary-path/index.d.ts | 17 + .../node_modules/is-binary-path/index.js | 7 + .../node_modules/is-binary-path/license | 9 + .../node_modules/is-binary-path/package.json | 40 + .../node_modules/is-binary-path/readme.md | 34 + user-service/node_modules/is-extglob/LICENSE | 21 + .../node_modules/is-extglob/README.md | 107 + user-service/node_modules/is-extglob/index.js | 20 + .../node_modules/is-extglob/package.json | 69 + .../is-fullwidth-code-point/index.d.ts | 17 + .../is-fullwidth-code-point/index.js | 50 + .../is-fullwidth-code-point/license | 9 + .../is-fullwidth-code-point/package.json | 42 + .../is-fullwidth-code-point/readme.md | 39 + user-service/node_modules/is-glob/LICENSE | 21 + user-service/node_modules/is-glob/README.md | 206 + user-service/node_modules/is-glob/index.js | 150 + .../node_modules/is-glob/package.json | 81 + user-service/node_modules/is-number/LICENSE | 21 + user-service/node_modules/is-number/README.md | 187 + user-service/node_modules/is-number/index.js | 18 + .../node_modules/is-number/package.json | 82 + .../node_modules/jsonwebtoken/LICENSE | 21 + .../node_modules/jsonwebtoken/README.md | 396 + .../node_modules/jsonwebtoken/decode.js | 30 + .../node_modules/jsonwebtoken/index.js | 8 + .../jsonwebtoken/lib/JsonWebTokenError.js | 14 + .../jsonwebtoken/lib/NotBeforeError.js | 13 + .../jsonwebtoken/lib/TokenExpiredError.js | 13 + .../lib/asymmetricKeyDetailsSupported.js | 3 + .../jsonwebtoken/lib/psSupported.js | 3 + .../lib/rsaPssKeyDetailsSupported.js | 3 + .../node_modules/jsonwebtoken/lib/timespan.js | 18 + .../jsonwebtoken/lib/validateAsymmetricKey.js | 66 + .../jsonwebtoken/node_modules/ms/index.js | 162 + .../jsonwebtoken/node_modules/ms/license.md | 21 + .../jsonwebtoken/node_modules/ms/package.json | 38 + .../jsonwebtoken/node_modules/ms/readme.md | 59 + .../node_modules/jsonwebtoken/package.json | 71 + .../node_modules/jsonwebtoken/sign.js | 253 + .../node_modules/jsonwebtoken/verify.js | 263 + user-service/node_modules/jwa/LICENSE | 17 + user-service/node_modules/jwa/README.md | 150 + user-service/node_modules/jwa/index.js | 252 + user-service/node_modules/jwa/package.json | 37 + user-service/node_modules/jws/CHANGELOG.md | 34 + user-service/node_modules/jws/LICENSE | 17 + user-service/node_modules/jws/index.js | 22 + .../node_modules/jws/lib/data-stream.js | 55 + .../node_modules/jws/lib/sign-stream.js | 78 + user-service/node_modules/jws/lib/tostring.js | 10 + .../node_modules/jws/lib/verify-stream.js | 120 + user-service/node_modules/jws/package.json | 34 + user-service/node_modules/jws/readme.md | 255 + user-service/node_modules/kareem/CHANGELOG.md | 823 ++ user-service/node_modules/kareem/LICENSE | 202 + user-service/node_modules/kareem/README.md | 419 + user-service/node_modules/kareem/SECURITY.md | 5 + user-service/node_modules/kareem/index.d.ts | 29 + user-service/node_modules/kareem/index.js | 668 ++ user-service/node_modules/kareem/package.json | 28 + .../node_modules/lodash.includes/LICENSE | 47 + .../node_modules/lodash.includes/README.md | 18 + .../node_modules/lodash.includes/index.js | 745 ++ .../node_modules/lodash.includes/package.json | 17 + .../node_modules/lodash.isboolean/LICENSE | 22 + .../node_modules/lodash.isboolean/README.md | 18 + .../node_modules/lodash.isboolean/index.js | 70 + .../lodash.isboolean/package.json | 17 + .../node_modules/lodash.isinteger/LICENSE | 47 + .../node_modules/lodash.isinteger/README.md | 18 + .../node_modules/lodash.isinteger/index.js | 265 + .../lodash.isinteger/package.json | 17 + .../node_modules/lodash.isnumber/LICENSE | 22 + .../node_modules/lodash.isnumber/README.md | 18 + .../node_modules/lodash.isnumber/index.js | 79 + .../node_modules/lodash.isnumber/package.json | 17 + .../node_modules/lodash.isplainobject/LICENSE | 47 + .../lodash.isplainobject/README.md | 18 + .../lodash.isplainobject/index.js | 139 + .../lodash.isplainobject/package.json | 17 + .../node_modules/lodash.isstring/LICENSE | 22 + .../node_modules/lodash.isstring/README.md | 18 + .../node_modules/lodash.isstring/index.js | 95 + .../node_modules/lodash.isstring/package.json | 17 + user-service/node_modules/lodash.once/LICENSE | 47 + .../node_modules/lodash.once/README.md | 18 + .../node_modules/lodash.once/index.js | 294 + .../node_modules/lodash.once/package.json | 17 + user-service/node_modules/make-dir/index.d.ts | 66 + user-service/node_modules/make-dir/index.js | 156 + user-service/node_modules/make-dir/license | 9 + .../make-dir/node_modules/.bin/semver | 1 + .../make-dir/node_modules/semver/LICENSE | 15 + .../make-dir/node_modules/semver/README.md | 443 + .../node_modules/semver/bin/semver.js | 174 + .../make-dir/node_modules/semver/package.json | 38 + .../make-dir/node_modules/semver/range.bnf | 16 + .../make-dir/node_modules/semver/semver.js | 1643 ++++ .../node_modules/make-dir/package.json | 59 + user-service/node_modules/make-dir/readme.md | 125 + .../node_modules/media-typer/HISTORY.md | 22 + user-service/node_modules/media-typer/LICENSE | 22 + .../node_modules/media-typer/README.md | 81 + .../node_modules/media-typer/index.js | 270 + .../node_modules/media-typer/package.json | 26 + .../node_modules/memory-pager/.travis.yml | 4 + .../node_modules/memory-pager/LICENSE | 21 + .../node_modules/memory-pager/README.md | 65 + .../node_modules/memory-pager/index.js | 160 + .../node_modules/memory-pager/package.json | 24 + .../node_modules/memory-pager/test.js | 80 + .../node_modules/merge-descriptors/HISTORY.md | 21 + .../node_modules/merge-descriptors/LICENSE | 23 + .../node_modules/merge-descriptors/README.md | 48 + .../node_modules/merge-descriptors/index.js | 60 + .../merge-descriptors/package.json | 32 + user-service/node_modules/methods/HISTORY.md | 29 + user-service/node_modules/methods/LICENSE | 24 + user-service/node_modules/methods/README.md | 51 + user-service/node_modules/methods/index.js | 69 + .../node_modules/methods/package.json | 36 + user-service/node_modules/mime-db/HISTORY.md | 507 + user-service/node_modules/mime-db/LICENSE | 23 + user-service/node_modules/mime-db/README.md | 100 + user-service/node_modules/mime-db/db.json | 8519 +++++++++++++++++ user-service/node_modules/mime-db/index.js | 12 + .../node_modules/mime-db/package.json | 60 + .../node_modules/mime-types/HISTORY.md | 397 + user-service/node_modules/mime-types/LICENSE | 23 + .../node_modules/mime-types/README.md | 113 + user-service/node_modules/mime-types/index.js | 188 + .../node_modules/mime-types/package.json | 44 + user-service/node_modules/mime/.npmignore | 0 user-service/node_modules/mime/CHANGELOG.md | 164 + user-service/node_modules/mime/LICENSE | 21 + user-service/node_modules/mime/README.md | 90 + user-service/node_modules/mime/cli.js | 8 + user-service/node_modules/mime/mime.js | 108 + user-service/node_modules/mime/package.json | 44 + user-service/node_modules/mime/src/build.js | 53 + user-service/node_modules/mime/src/test.js | 60 + user-service/node_modules/mime/types.json | 1 + user-service/node_modules/minimatch/LICENSE | 15 + user-service/node_modules/minimatch/README.md | 230 + .../node_modules/minimatch/minimatch.js | 947 ++ .../node_modules/minimatch/package.json | 33 + user-service/node_modules/minipass/LICENSE | 15 + user-service/node_modules/minipass/README.md | 769 ++ user-service/node_modules/minipass/index.d.ts | 152 + user-service/node_modules/minipass/index.js | 702 ++ user-service/node_modules/minipass/index.mjs | 702 ++ .../node_modules/minipass/package.json | 76 + user-service/node_modules/minizlib/LICENSE | 26 + user-service/node_modules/minizlib/README.md | 60 + .../node_modules/minizlib/constants.js | 115 + user-service/node_modules/minizlib/index.js | 348 + .../minizlib/node_modules/minipass/LICENSE | 15 + .../minizlib/node_modules/minipass/README.md | 728 ++ .../minizlib/node_modules/minipass/index.d.ts | 155 + .../minizlib/node_modules/minipass/index.js | 649 ++ .../node_modules/minipass/package.json | 56 + .../node_modules/minizlib/package.json | 42 + user-service/node_modules/mkdirp/CHANGELOG.md | 15 + user-service/node_modules/mkdirp/LICENSE | 21 + user-service/node_modules/mkdirp/bin/cmd.js | 68 + user-service/node_modules/mkdirp/index.js | 31 + .../node_modules/mkdirp/lib/find-made.js | 29 + .../node_modules/mkdirp/lib/mkdirp-manual.js | 64 + .../node_modules/mkdirp/lib/mkdirp-native.js | 39 + .../node_modules/mkdirp/lib/opts-arg.js | 23 + .../node_modules/mkdirp/lib/path-arg.js | 29 + .../node_modules/mkdirp/lib/use-native.js | 10 + user-service/node_modules/mkdirp/package.json | 44 + .../node_modules/mkdirp/readme.markdown | 266 + .../.esm-wrapper.mjs | 6 + .../mongodb-connection-string-url/LICENSE | 192 + .../mongodb-connection-string-url/README.md | 25 + .../lib/index.d.ts | 62 + .../lib/index.js | 213 + .../lib/index.js.map | 1 + .../lib/redact.d.ts | 7 + .../lib/redact.js | 86 + .../lib/redact.js.map | 1 + .../package.json | 62 + user-service/node_modules/mongodb/LICENSE.md | 201 + user-service/node_modules/mongodb/README.md | 323 + .../node_modules/mongodb/etc/prepare.js | 12 + .../node_modules/mongodb/lib/admin.js | 134 + .../node_modules/mongodb/lib/admin.js.map | 1 + user-service/node_modules/mongodb/lib/bson.js | 74 + .../node_modules/mongodb/lib/bson.js.map | 1 + .../node_modules/mongodb/lib/bulk/common.js | 868 ++ .../mongodb/lib/bulk/common.js.map | 1 + .../node_modules/mongodb/lib/bulk/ordered.js | 67 + .../mongodb/lib/bulk/ordered.js.map | 1 + .../mongodb/lib/bulk/unordered.js | 92 + .../mongodb/lib/bulk/unordered.js.map | 1 + .../node_modules/mongodb/lib/change_stream.js | 409 + .../mongodb/lib/change_stream.js.map | 1 + .../client-side-encryption/auto_encrypter.js | 307 + .../auto_encrypter.js.map | 1 + .../client_encryption.js | 555 ++ .../client_encryption.js.map | 1 + .../crypto_callbacks.js | 81 + .../crypto_callbacks.js.map | 1 + .../lib/client-side-encryption/errors.js | 136 + .../lib/client-side-encryption/errors.js.map | 1 + .../mongocryptd_manager.js | 81 + .../mongocryptd_manager.js.map | 1 + .../client-side-encryption/providers/aws.js | 24 + .../providers/aws.js.map | 1 + .../client-side-encryption/providers/azure.js | 132 + .../providers/azure.js.map | 1 + .../client-side-encryption/providers/gcp.js | 17 + .../providers/gcp.js.map | 1 + .../client-side-encryption/providers/index.js | 44 + .../providers/index.js.map | 1 + .../client-side-encryption/state_machine.js | 369 + .../state_machine.js.map | 1 + .../mongodb/lib/cmap/auth/auth_provider.js | 51 + .../lib/cmap/auth/auth_provider.js.map | 1 + .../cmap/auth/aws_temporary_credentials.js | 140 + .../auth/aws_temporary_credentials.js.map | 1 + .../mongodb/lib/cmap/auth/gssapi.js | 154 + .../mongodb/lib/cmap/auth/gssapi.js.map | 1 + .../lib/cmap/auth/mongo_credentials.js | 185 + .../lib/cmap/auth/mongo_credentials.js.map | 1 + .../mongodb/lib/cmap/auth/mongocr.js | 35 + .../mongodb/lib/cmap/auth/mongocr.js.map | 1 + .../mongodb/lib/cmap/auth/mongodb_aws.js | 137 + .../mongodb/lib/cmap/auth/mongodb_aws.js.map | 1 + .../mongodb/lib/cmap/auth/mongodb_oidc.js | 70 + .../mongodb/lib/cmap/auth/mongodb_oidc.js.map | 1 + .../automated_callback_workflow.js | 78 + .../automated_callback_workflow.js.map | 1 + .../mongodb_oidc/azure_machine_workflow.js | 74 + .../azure_machine_workflow.js.map | 1 + .../auth/mongodb_oidc/callback_workflow.js | 143 + .../mongodb_oidc/callback_workflow.js.map | 1 + .../auth/mongodb_oidc/command_builders.js | 45 + .../auth/mongodb_oidc/command_builders.js.map | 1 + .../auth/mongodb_oidc/gcp_machine_workflow.js | 46 + .../mongodb_oidc/gcp_machine_workflow.js.map | 1 + .../mongodb_oidc/human_callback_workflow.js | 122 + .../human_callback_workflow.js.map | 1 + .../auth/mongodb_oidc/machine_workflow.js | 107 + .../auth/mongodb_oidc/machine_workflow.js.map | 1 + .../lib/cmap/auth/mongodb_oidc/token_cache.js | 52 + .../cmap/auth/mongodb_oidc/token_cache.js.map | 1 + .../mongodb_oidc/token_machine_workflow.js | 34 + .../token_machine_workflow.js.map | 1 + .../mongodb/lib/cmap/auth/plain.js | 26 + .../mongodb/lib/cmap/auth/plain.js.map | 1 + .../mongodb/lib/cmap/auth/providers.js | 23 + .../mongodb/lib/cmap/auth/providers.js.map | 1 + .../mongodb/lib/cmap/auth/scram.js | 254 + .../mongodb/lib/cmap/auth/scram.js.map | 1 + .../mongodb/lib/cmap/auth/x509.js | 36 + .../mongodb/lib/cmap/auth/x509.js.map | 1 + .../lib/cmap/command_monitoring_events.js | 253 + .../lib/cmap/command_monitoring_events.js.map | 1 + .../node_modules/mongodb/lib/cmap/commands.js | 444 + .../mongodb/lib/cmap/commands.js.map | 1 + .../node_modules/mongodb/lib/cmap/connect.js | 364 + .../mongodb/lib/cmap/connect.js.map | 1 + .../mongodb/lib/cmap/connection.js | 482 + .../mongodb/lib/cmap/connection.js.map | 1 + .../mongodb/lib/cmap/connection_pool.js | 573 ++ .../mongodb/lib/cmap/connection_pool.js.map | 1 + .../lib/cmap/connection_pool_events.js | 186 + .../lib/cmap/connection_pool_events.js.map | 1 + .../node_modules/mongodb/lib/cmap/errors.js | 108 + .../mongodb/lib/cmap/errors.js.map | 1 + .../lib/cmap/handshake/client_metadata.js | 216 + .../lib/cmap/handshake/client_metadata.js.map | 1 + .../node_modules/mongodb/lib/cmap/metrics.js | 62 + .../mongodb/lib/cmap/metrics.js.map | 1 + .../mongodb/lib/cmap/stream_description.js | 70 + .../lib/cmap/stream_description.js.map | 1 + .../lib/cmap/wire_protocol/compression.js | 163 + .../lib/cmap/wire_protocol/compression.js.map | 1 + .../lib/cmap/wire_protocol/constants.js | 17 + .../lib/cmap/wire_protocol/constants.js.map | 1 + .../mongodb/lib/cmap/wire_protocol/on_data.js | 100 + .../lib/cmap/wire_protocol/on_data.js.map | 1 + .../cmap/wire_protocol/on_demand/document.js | 218 + .../wire_protocol/on_demand/document.js.map | 1 + .../lib/cmap/wire_protocol/responses.js | 184 + .../lib/cmap/wire_protocol/responses.js.map | 1 + .../mongodb/lib/cmap/wire_protocol/shared.js | 36 + .../lib/cmap/wire_protocol/shared.js.map | 1 + .../node_modules/mongodb/lib/collection.js | 634 ++ .../mongodb/lib/collection.js.map | 1 + .../mongodb/lib/connection_string.js | 1111 +++ .../mongodb/lib/connection_string.js.map | 1 + .../node_modules/mongodb/lib/constants.js | 162 + .../node_modules/mongodb/lib/constants.js.map | 1 + .../mongodb/lib/cursor/abstract_cursor.js | 738 ++ .../mongodb/lib/cursor/abstract_cursor.js.map | 1 + .../mongodb/lib/cursor/aggregation_cursor.js | 148 + .../lib/cursor/aggregation_cursor.js.map | 1 + .../lib/cursor/change_stream_cursor.js | 107 + .../lib/cursor/change_stream_cursor.js.map | 1 + .../mongodb/lib/cursor/find_cursor.js | 396 + .../mongodb/lib/cursor/find_cursor.js.map | 1 + .../lib/cursor/list_collections_cursor.js | 34 + .../lib/cursor/list_collections_cursor.js.map | 1 + .../mongodb/lib/cursor/list_indexes_cursor.js | 33 + .../lib/cursor/list_indexes_cursor.js.map | 1 + .../lib/cursor/list_search_indexes_cursor.js | 14 + .../cursor/list_search_indexes_cursor.js.map | 1 + .../mongodb/lib/cursor/run_command_cursor.js | 93 + .../lib/cursor/run_command_cursor.js.map | 1 + user-service/node_modules/mongodb/lib/db.js | 352 + .../node_modules/mongodb/lib/db.js.map | 1 + user-service/node_modules/mongodb/lib/deps.js | 117 + .../node_modules/mongodb/lib/deps.js.map | 1 + .../node_modules/mongodb/lib/encrypter.js | 114 + .../node_modules/mongodb/lib/encrypter.js.map | 1 + .../node_modules/mongodb/lib/error.js | 1244 +++ .../node_modules/mongodb/lib/error.js.map | 1 + .../node_modules/mongodb/lib/explain.js | 35 + .../node_modules/mongodb/lib/explain.js.map | 1 + .../mongodb/lib/gridfs/download.js | 280 + .../mongodb/lib/gridfs/download.js.map | 1 + .../node_modules/mongodb/lib/gridfs/index.js | 128 + .../mongodb/lib/gridfs/index.js.map | 1 + .../node_modules/mongodb/lib/gridfs/upload.js | 310 + .../mongodb/lib/gridfs/upload.js.map | 1 + .../node_modules/mongodb/lib/index.js | 182 + .../node_modules/mongodb/lib/index.js.map | 1 + .../node_modules/mongodb/lib/mongo_client.js | 362 + .../mongodb/lib/mongo_client.js.map | 1 + .../lib/mongo_client_auth_providers.js | 85 + .../lib/mongo_client_auth_providers.js.map | 1 + .../node_modules/mongodb/lib/mongo_logger.js | 551 ++ .../mongodb/lib/mongo_logger.js.map | 1 + .../node_modules/mongodb/lib/mongo_types.js | 48 + .../mongodb/lib/mongo_types.js.map | 1 + .../mongodb/lib/operations/aggregate.js | 96 + .../mongodb/lib/operations/aggregate.js.map | 1 + .../mongodb/lib/operations/bulk_write.js | 35 + .../mongodb/lib/operations/bulk_write.js.map | 1 + .../mongodb/lib/operations/collections.js | 33 + .../mongodb/lib/operations/collections.js.map | 1 + .../mongodb/lib/operations/command.js | 78 + .../mongodb/lib/operations/command.js.map | 1 + .../mongodb/lib/operations/count.js | 41 + .../mongodb/lib/operations/count.js.map | 1 + .../mongodb/lib/operations/count_documents.js | 31 + .../lib/operations/count_documents.js.map | 1 + .../lib/operations/create_collection.js | 102 + .../lib/operations/create_collection.js.map | 1 + .../mongodb/lib/operations/delete.js | 116 + .../mongodb/lib/operations/delete.js.map | 1 + .../mongodb/lib/operations/distinct.js | 60 + .../mongodb/lib/operations/distinct.js.map | 1 + .../mongodb/lib/operations/drop.js | 76 + .../mongodb/lib/operations/drop.js.map | 1 + .../operations/estimated_document_count.js | 36 + .../estimated_document_count.js.map | 1 + .../lib/operations/execute_operation.js | 206 + .../lib/operations/execute_operation.js.map | 1 + .../mongodb/lib/operations/find.js | 152 + .../mongodb/lib/operations/find.js.map | 1 + .../mongodb/lib/operations/find_and_modify.js | 152 + .../lib/operations/find_and_modify.js.map | 1 + .../mongodb/lib/operations/get_more.js | 62 + .../mongodb/lib/operations/get_more.js.map | 1 + .../mongodb/lib/operations/indexes.js | 175 + .../mongodb/lib/operations/indexes.js.map | 1 + .../mongodb/lib/operations/insert.js | 101 + .../mongodb/lib/operations/insert.js.map | 1 + .../mongodb/lib/operations/is_capped.js | 28 + .../mongodb/lib/operations/is_capped.js.map | 1 + .../mongodb/lib/operations/kill_cursors.js | 42 + .../lib/operations/kill_cursors.js.map | 1 + .../lib/operations/list_collections.js | 50 + .../lib/operations/list_collections.js.map | 1 + .../mongodb/lib/operations/list_databases.js | 38 + .../lib/operations/list_databases.js.map | 1 + .../mongodb/lib/operations/operation.js | 69 + .../mongodb/lib/operations/operation.js.map | 1 + .../lib/operations/options_operation.js | 28 + .../lib/operations/options_operation.js.map | 1 + .../mongodb/lib/operations/profiling_level.js | 33 + .../lib/operations/profiling_level.js.map | 1 + .../mongodb/lib/operations/remove_user.js | 23 + .../mongodb/lib/operations/remove_user.js.map | 1 + .../mongodb/lib/operations/rename.js | 36 + .../mongodb/lib/operations/rename.js.map | 1 + .../mongodb/lib/operations/run_command.js | 49 + .../mongodb/lib/operations/run_command.js.map | 1 + .../lib/operations/search_indexes/create.js | 27 + .../operations/search_indexes/create.js.map | 1 + .../lib/operations/search_indexes/drop.js | 36 + .../lib/operations/search_indexes/drop.js.map | 1 + .../lib/operations/search_indexes/update.js | 28 + .../operations/search_indexes/update.js.map | 1 + .../lib/operations/set_profiling_level.js | 49 + .../lib/operations/set_profiling_level.js.map | 1 + .../mongodb/lib/operations/stats.js | 25 + .../mongodb/lib/operations/stats.js.map | 1 + .../mongodb/lib/operations/update.js | 179 + .../mongodb/lib/operations/update.js.map | 1 + .../lib/operations/validate_collection.js | 38 + .../lib/operations/validate_collection.js.map | 1 + .../node_modules/mongodb/lib/read_concern.js | 73 + .../mongodb/lib/read_concern.js.map | 1 + .../mongodb/lib/read_preference.js | 195 + .../mongodb/lib/read_preference.js.map | 1 + .../node_modules/mongodb/lib/sdam/common.js | 56 + .../mongodb/lib/sdam/common.js.map | 1 + .../node_modules/mongodb/lib/sdam/events.js | 146 + .../mongodb/lib/sdam/events.js.map | 1 + .../node_modules/mongodb/lib/sdam/monitor.js | 553 ++ .../mongodb/lib/sdam/monitor.js.map | 1 + .../node_modules/mongodb/lib/sdam/server.js | 356 + .../mongodb/lib/sdam/server.js.map | 1 + .../mongodb/lib/sdam/server_description.js | 196 + .../lib/sdam/server_description.js.map | 1 + .../mongodb/lib/sdam/server_selection.js | 234 + .../mongodb/lib/sdam/server_selection.js.map | 1 + .../lib/sdam/server_selection_events.js | 85 + .../lib/sdam/server_selection_events.js.map | 1 + .../mongodb/lib/sdam/srv_polling.js | 104 + .../mongodb/lib/sdam/srv_polling.js.map | 1 + .../node_modules/mongodb/lib/sdam/topology.js | 660 ++ .../mongodb/lib/sdam/topology.js.map | 1 + .../mongodb/lib/sdam/topology_description.js | 370 + .../lib/sdam/topology_description.js.map | 1 + .../node_modules/mongodb/lib/sessions.js | 789 ++ .../node_modules/mongodb/lib/sessions.js.map | 1 + user-service/node_modules/mongodb/lib/sort.js | 97 + .../node_modules/mongodb/lib/sort.js.map | 1 + .../node_modules/mongodb/lib/timeout.js | 77 + .../node_modules/mongodb/lib/timeout.js.map | 1 + .../node_modules/mongodb/lib/transactions.js | 138 + .../mongodb/lib/transactions.js.map | 1 + .../node_modules/mongodb/lib/utils.js | 1099 +++ .../node_modules/mongodb/lib/utils.js.map | 1 + .../node_modules/mongodb/lib/write_concern.js | 86 + .../mongodb/lib/write_concern.js.map | 1 + .../node_modules/mongodb/mongodb.d.ts | 7810 +++++++++++++++ .../node_modules/mongodb/package.json | 179 + .../node_modules/mongodb/src/admin.ts | 168 + user-service/node_modules/mongodb/src/bson.ts | 134 + .../node_modules/mongodb/src/bulk/common.ts | 1301 +++ .../node_modules/mongodb/src/bulk/ordered.ts | 83 + .../mongodb/src/bulk/unordered.ts | 116 + .../node_modules/mongodb/src/change_stream.ts | 988 ++ .../client-side-encryption/auto_encrypter.ts | 570 ++ .../client_encryption.ts | 984 ++ .../crypto_callbacks.ts | 87 + .../src/client-side-encryption/errors.ts | 141 + .../mongocryptd_manager.ts | 96 + .../client-side-encryption/providers/aws.ts | 27 + .../client-side-encryption/providers/azure.ts | 181 + .../client-side-encryption/providers/gcp.ts | 16 + .../client-side-encryption/providers/index.ts | 168 + .../client-side-encryption/state_machine.ts | 531 + .../mongodb/src/cmap/auth/auth_provider.ts | 77 + .../cmap/auth/aws_temporary_credentials.ts | 169 + .../mongodb/src/cmap/auth/gssapi.ts | 202 + .../src/cmap/auth/mongo_credentials.ts | 285 + .../mongodb/src/cmap/auth/mongocr.ts | 38 + .../mongodb/src/cmap/auth/mongodb_aws.ts | 191 + .../mongodb/src/cmap/auth/mongodb_oidc.ts | 179 + .../automated_callback_workflow.ts | 82 + .../mongodb_oidc/azure_machine_workflow.ts | 85 + .../auth/mongodb_oidc/callback_workflow.ts | 188 + .../auth/mongodb_oidc/command_builders.ts | 54 + .../auth/mongodb_oidc/gcp_machine_workflow.ts | 53 + .../mongodb_oidc/human_callback_workflow.ts | 142 + .../auth/mongodb_oidc/machine_workflow.ts | 137 + .../src/cmap/auth/mongodb_oidc/token_cache.ts | 62 + .../mongodb_oidc/token_machine_workflow.ts | 34 + .../mongodb/src/cmap/auth/plain.ts | 25 + .../mongodb/src/cmap/auth/providers.ts | 23 + .../mongodb/src/cmap/auth/scram.ts | 344 + .../mongodb/src/cmap/auth/x509.ts | 43 + .../src/cmap/command_monitoring_events.ts | 343 + .../node_modules/mongodb/src/cmap/commands.ts | 662 ++ .../node_modules/mongodb/src/cmap/connect.ts | 480 + .../mongodb/src/cmap/connection.ts | 804 ++ .../mongodb/src/cmap/connection_pool.ts | 845 ++ .../src/cmap/connection_pool_events.ts | 268 + .../node_modules/mongodb/src/cmap/errors.ts | 119 + .../src/cmap/handshake/client_metadata.ts | 320 + .../node_modules/mongodb/src/cmap/metrics.ts | 58 + .../mongodb/src/cmap/stream_description.ts | 96 + .../src/cmap/wire_protocol/compression.ts | 196 + .../src/cmap/wire_protocol/constants.ts | 13 + .../mongodb/src/cmap/wire_protocol/on_data.ts | 118 + .../cmap/wire_protocol/on_demand/document.ts | 338 + .../src/cmap/wire_protocol/responses.ts | 237 + .../mongodb/src/cmap/wire_protocol/shared.ts | 49 + .../node_modules/mongodb/src/collection.ts | 1167 +++ .../mongodb/src/connection_string.ts | 1335 +++ .../node_modules/mongodb/src/constants.ts | 167 + .../mongodb/src/cursor/abstract_cursor.ts | 1011 ++ .../mongodb/src/cursor/aggregation_cursor.ts | 204 + .../src/cursor/change_stream_cursor.ts | 185 + .../mongodb/src/cursor/find_cursor.ts | 466 + .../src/cursor/list_collections_cursor.ts | 49 + .../mongodb/src/cursor/list_indexes_cursor.ts | 38 + .../src/cursor/list_search_indexes_cursor.ts | 20 + .../mongodb/src/cursor/run_command_cursor.ts | 134 + user-service/node_modules/mongodb/src/db.ts | 550 ++ user-service/node_modules/mongodb/src/deps.ts | 280 + .../node_modules/mongodb/src/encrypter.ts | 139 + .../node_modules/mongodb/src/error.ts | 1393 +++ .../node_modules/mongodb/src/explain.ts | 52 + .../mongodb/src/gridfs/download.ts | 424 + .../node_modules/mongodb/src/gridfs/index.ts | 215 + .../node_modules/mongodb/src/gridfs/upload.ts | 456 + .../node_modules/mongodb/src/index.ts | 569 ++ .../node_modules/mongodb/src/mongo_client.ts | 905 ++ .../src/mongo_client_auth_providers.ts | 92 + .../node_modules/mongodb/src/mongo_logger.ts | 928 ++ .../node_modules/mongodb/src/mongo_types.ts | 630 ++ .../mongodb/src/operations/aggregate.ts | 147 + .../mongodb/src/operations/bulk_write.ts | 58 + .../mongodb/src/operations/collections.ts | 47 + .../mongodb/src/operations/command.ts | 157 + .../mongodb/src/operations/count.ts | 67 + .../mongodb/src/operations/count_documents.ts | 46 + .../src/operations/create_collection.ts | 206 + .../mongodb/src/operations/delete.ts | 175 + .../mongodb/src/operations/distinct.ts | 81 + .../mongodb/src/operations/drop.ts | 106 + .../operations/estimated_document_count.ts | 56 + .../src/operations/execute_operation.ts | 289 + .../mongodb/src/operations/find.ts | 256 + .../mongodb/src/operations/find_and_modify.ts | 294 + .../mongodb/src/operations/get_more.ts | 111 + .../mongodb/src/operations/indexes.ts | 402 + .../mongodb/src/operations/insert.ts | 160 + .../mongodb/src/operations/is_capped.ts | 35 + .../mongodb/src/operations/kill_cursors.ts | 57 + .../src/operations/list_collections.ts | 98 + .../mongodb/src/operations/list_databases.ts | 70 + .../mongodb/src/operations/operation.ts | 128 + .../src/operations/options_operation.ts | 35 + .../mongodb/src/operations/profiling_level.ts | 35 + .../mongodb/src/operations/remove_user.ts | 31 + .../mongodb/src/operations/rename.ts | 50 + .../mongodb/src/operations/run_command.ts | 65 + .../src/operations/search_indexes/create.ts | 47 + .../src/operations/search_indexes/drop.ts | 40 + .../src/operations/search_indexes/update.ts | 33 + .../src/operations/set_profiling_level.ts | 70 + .../mongodb/src/operations/stats.ts | 37 + .../mongodb/src/operations/update.ts | 303 + .../src/operations/validate_collection.ts | 53 + .../node_modules/mongodb/src/read_concern.ts | 88 + .../mongodb/src/read_preference.ts | 262 + .../node_modules/mongodb/src/sdam/common.ts | 85 + .../node_modules/mongodb/src/sdam/events.ts | 219 + .../node_modules/mongodb/src/sdam/monitor.ts | 779 ++ .../node_modules/mongodb/src/sdam/server.ts | 542 ++ .../mongodb/src/sdam/server_description.ts | 276 + .../mongodb/src/sdam/server_selection.ts | 331 + .../src/sdam/server_selection_events.ts | 142 + .../mongodb/src/sdam/srv_polling.ts | 143 + .../node_modules/mongodb/src/sdam/topology.ts | 1123 +++ .../mongodb/src/sdam/topology_description.ts | 521 + .../node_modules/mongodb/src/sessions.ts | 1084 +++ user-service/node_modules/mongodb/src/sort.ts | 132 + .../node_modules/mongodb/src/timeout.ts | 96 + .../node_modules/mongodb/src/transactions.ts | 188 + .../node_modules/mongodb/src/utils.ts | 1368 +++ .../node_modules/mongodb/src/write_concern.ts | 161 + .../node_modules/mongodb/tsconfig.json | 46 + user-service/node_modules/mongoose/LICENSE.md | 22 + user-service/node_modules/mongoose/README.md | 375 + .../node_modules/mongoose/SECURITY.md | 1 + user-service/node_modules/mongoose/browser.js | 8 + .../node_modules/mongoose/dist/browser.umd.js | 2 + user-service/node_modules/mongoose/index.js | 63 + .../node_modules/mongoose/lib/aggregate.js | 1199 +++ .../node_modules/mongoose/lib/browser.js | 132 + .../mongoose/lib/browserDocument.js | 101 + .../node_modules/mongoose/lib/cast.js | 433 + .../node_modules/mongoose/lib/cast/bigint.js | 36 + .../node_modules/mongoose/lib/cast/boolean.js | 32 + .../node_modules/mongoose/lib/cast/date.js | 41 + .../mongoose/lib/cast/decimal128.js | 39 + .../node_modules/mongoose/lib/cast/number.js | 42 + .../mongoose/lib/cast/objectid.js | 29 + .../node_modules/mongoose/lib/cast/string.js | 37 + .../node_modules/mongoose/lib/collection.js | 327 + .../node_modules/mongoose/lib/connection.js | 1559 +++ .../mongoose/lib/connectionState.js | 26 + .../node_modules/mongoose/lib/constants.js | 36 + .../mongoose/lib/cursor/aggregationCursor.js | 397 + .../mongoose/lib/cursor/changeStream.js | 154 + .../mongoose/lib/cursor/queryCursor.js | 580 ++ .../node_modules/mongoose/lib/document.js | 5384 +++++++++++ .../mongoose/lib/documentProvider.js | 30 + .../node_modules/mongoose/lib/driver.js | 15 + .../node_modules/mongoose/lib/drivers/SPEC.md | 4 + .../mongoose/lib/drivers/browser/binary.js | 14 + .../lib/drivers/browser/decimal128.js | 7 + .../mongoose/lib/drivers/browser/index.js | 12 + .../mongoose/lib/drivers/browser/objectid.js | 29 + .../drivers/node-mongodb-native/collection.js | 468 + .../drivers/node-mongodb-native/connection.js | 433 + .../lib/drivers/node-mongodb-native/index.js | 8 + .../lib/error/browserMissingSchema.js | 28 + .../mongoose/lib/error/bulkWriteError.js | 41 + .../node_modules/mongoose/lib/error/cast.js | 158 + .../lib/error/createCollectionsError.js | 26 + .../mongoose/lib/error/divergentArray.js | 38 + .../mongoose/lib/error/eachAsyncMultiError.js | 41 + .../node_modules/mongoose/lib/error/index.js | 227 + .../mongoose/lib/error/invalidSchemaOption.js | 30 + .../mongoose/lib/error/messages.js | 47 + .../mongoose/lib/error/missingSchema.js | 31 + .../mongoose/lib/error/mongooseError.js | 13 + .../mongoose/lib/error/notFound.js | 45 + .../mongoose/lib/error/objectExpected.js | 30 + .../mongoose/lib/error/objectParameter.js | 30 + .../mongoose/lib/error/overwriteModel.js | 30 + .../mongoose/lib/error/parallelSave.js | 30 + .../mongoose/lib/error/parallelValidate.js | 31 + .../mongoose/lib/error/serverSelection.js | 61 + .../mongoose/lib/error/setOptionError.js | 101 + .../node_modules/mongoose/lib/error/strict.js | 33 + .../mongoose/lib/error/strictPopulate.js | 29 + .../mongoose/lib/error/syncIndexes.js | 30 + .../mongoose/lib/error/validation.js | 103 + .../mongoose/lib/error/validator.js | 99 + .../mongoose/lib/error/version.js | 36 + .../aggregate/prepareDiscriminatorPipeline.js | 39 + .../aggregate/stringifyFunctionOperators.js | 50 + .../mongoose/lib/helpers/arrayDepth.js | 33 + .../mongoose/lib/helpers/clone.js | 195 + .../mongoose/lib/helpers/common.js | 127 + .../mongoose/lib/helpers/cursor/eachAsync.js | 225 + .../applyEmbeddedDiscriminators.js | 36 + .../areDiscriminatorValuesEqual.js | 16 + ...checkEmbeddedDiscriminatorKeyProjection.js | 12 + .../helpers/discriminator/getConstructor.js | 29 + .../discriminator/getDiscriminatorByValue.js | 28 + .../getSchemaDiscriminatorByValue.js | 27 + .../discriminator/mergeDiscriminatorSchema.js | 81 + .../lib/helpers/document/applyDefaults.js | 129 + .../helpers/document/cleanModifiedSubpaths.js | 35 + .../mongoose/lib/helpers/document/compile.js | 238 + .../document/getDeepestSubdocumentForPath.js | 38 + .../document/getEmbeddedDiscriminatorPath.js | 53 + .../lib/helpers/document/handleSpreadDoc.js | 35 + .../node_modules/mongoose/lib/helpers/each.js | 25 + .../lib/helpers/error/combinePathErrors.js | 22 + .../mongoose/lib/helpers/firstKey.js | 8 + .../node_modules/mongoose/lib/helpers/get.js | 65 + .../lib/helpers/getConstructorName.js | 16 + .../lib/helpers/getDefaultBulkwriteResult.js | 27 + .../mongoose/lib/helpers/getFunctionName.js | 10 + .../mongoose/lib/helpers/immediate.js | 16 + .../helpers/indexes/applySchemaCollation.js | 13 + .../decorateDiscriminatorIndexOptions.js | 14 + .../lib/helpers/indexes/getRelatedIndexes.js | 63 + .../lib/helpers/indexes/isDefaultIdIndex.js | 18 + .../lib/helpers/indexes/isIndexEqual.js | 96 + .../lib/helpers/indexes/isTextIndex.js | 16 + .../mongoose/lib/helpers/isAsyncFunction.js | 9 + .../mongoose/lib/helpers/isBsonType.js | 16 + .../mongoose/lib/helpers/isMongooseObject.js | 22 + .../mongoose/lib/helpers/isObject.js | 16 + .../mongoose/lib/helpers/isPOJO.js | 12 + .../mongoose/lib/helpers/isPromise.js | 6 + .../mongoose/lib/helpers/isSimpleValidator.js | 22 + .../mongoose/lib/helpers/minimize.js | 41 + .../lib/helpers/model/applyDefaultsToPOJO.js | 52 + .../mongoose/lib/helpers/model/applyHooks.js | 150 + .../lib/helpers/model/applyMethods.js | 70 + .../lib/helpers/model/applyStaticHooks.js | 71 + .../lib/helpers/model/applyStatics.js | 13 + .../lib/helpers/model/castBulkWrite.js | 296 + .../lib/helpers/model/discriminator.js | 213 + .../lib/helpers/model/pushNestedArrayPaths.js | 15 + .../mongoose/lib/helpers/omitUndefined.js | 20 + .../node_modules/mongoose/lib/helpers/once.js | 12 + .../mongoose/lib/helpers/parallelLimit.js | 55 + .../mongoose/lib/helpers/path/parentPaths.js | 18 + .../lib/helpers/path/setDottedPath.js | 33 + .../mongoose/lib/helpers/pluralize.js | 95 + .../populate/assignRawDocsToIdStructure.js | 129 + .../lib/helpers/populate/assignVals.js | 347 + .../populate/createPopulateQueryFilter.js | 97 + .../populate/getModelsMapForPopulate.js | 721 ++ .../lib/helpers/populate/getSchemaTypes.js | 229 + .../lib/helpers/populate/getVirtual.js | 72 + .../lib/helpers/populate/leanPopulateMap.js | 7 + .../lib/helpers/populate/lookupLocalFields.js | 40 + .../populate/markArraySubdocsPopulated.js | 49 + .../helpers/populate/modelNamesFromRefPath.js | 68 + .../populate/removeDeselectedForeignField.js | 31 + .../populate/setPopulatedVirtualValue.js | 33 + .../lib/helpers/populate/skipPopulateValue.js | 10 + .../lib/helpers/populate/validateRef.js | 19 + .../mongoose/lib/helpers/printJestWarning.js | 21 + .../lib/helpers/processConnectionOptions.js | 65 + .../lib/helpers/projection/applyProjection.js | 83 + .../helpers/projection/hasIncludedChildren.js | 41 + .../projection/isDefiningProjection.js | 18 + .../lib/helpers/projection/isExclusive.js | 34 + .../lib/helpers/projection/isInclusive.js | 38 + .../helpers/projection/isNestedProjection.js | 8 + .../lib/helpers/projection/isPathExcluded.js | 40 + .../projection/isPathSelectedInclusive.js | 28 + .../lib/helpers/projection/isSubpath.js | 14 + .../lib/helpers/projection/parseProjection.js | 33 + .../mongoose/lib/helpers/promiseOrCallback.js | 54 + .../lib/helpers/query/applyGlobalOption.js | 29 + .../mongoose/lib/helpers/query/cast$expr.js | 286 + .../lib/helpers/query/castFilterPath.js | 54 + .../mongoose/lib/helpers/query/castUpdate.js | 587 ++ .../query/getEmbeddedDiscriminatorPath.js | 94 + .../lib/helpers/query/handleImmutable.js | 28 + .../query/handleReadPreferenceAliases.js | 23 + .../lib/helpers/query/hasDollarKeys.js | 23 + .../mongoose/lib/helpers/query/isOperator.js | 14 + .../lib/helpers/query/sanitizeFilter.js | 38 + .../lib/helpers/query/sanitizeProjection.js | 14 + .../helpers/query/selectPopulatedFields.js | 62 + .../mongoose/lib/helpers/query/trusted.js | 13 + .../mongoose/lib/helpers/query/validOps.js | 3 + .../mongoose/lib/helpers/schema/addAutoId.js | 7 + .../lib/helpers/schema/applyBuiltinPlugins.js | 12 + .../lib/helpers/schema/applyPlugins.js | 55 + .../lib/helpers/schema/applyReadConcern.js | 22 + .../lib/helpers/schema/applyWriteConcern.js | 39 + .../schema/cleanPositionalOperators.js | 12 + .../mongoose/lib/helpers/schema/getIndexes.js | 172 + .../helpers/schema/getKeysInSchemaOrder.js | 28 + .../mongoose/lib/helpers/schema/getPath.js | 37 + .../schema/getSubdocumentStrictValue.js | 32 + .../lib/helpers/schema/handleIdOption.js | 20 + .../helpers/schema/handleTimestampOption.js | 24 + .../mongoose/lib/helpers/schema/idGetter.js | 34 + .../mongoose/lib/helpers/schema/merge.js | 36 + .../lib/helpers/schematype/handleImmutable.js | 50 + .../lib/helpers/setDefaultsOnInsert.js | 132 + .../mongoose/lib/helpers/specialProperties.js | 3 + .../mongoose/lib/helpers/symbols.js | 20 + .../mongoose/lib/helpers/timers.js | 3 + .../timestamps/setDocumentTimestamps.js | 26 + .../lib/helpers/timestamps/setupTimestamps.js | 110 + .../lib/helpers/topology/allServersUnknown.js | 12 + .../mongoose/lib/helpers/topology/isAtlas.js | 31 + .../lib/helpers/topology/isSSLError.js | 16 + .../update/applyTimestampsToChildren.js | 193 + .../helpers/update/applyTimestampsToUpdate.js | 117 + .../lib/helpers/update/castArrayFilters.js | 109 + .../update/decorateUpdateWithVersionKey.js | 26 + .../lib/helpers/update/modifiedPaths.js | 33 + .../helpers/update/moveImmutableProperties.js | 53 + .../update/removeUnusedArrayFilters.js | 32 + .../update/updatedPathsByArrayFilter.js | 27 + .../mongoose/lib/helpers/updateValidators.js | 249 + .../node_modules/mongoose/lib/index.js | 17 + .../node_modules/mongoose/lib/internal.js | 46 + .../node_modules/mongoose/lib/model.js | 4841 ++++++++++ .../mongoose/lib/modifiedPathsSnapshot.js | 9 + .../node_modules/mongoose/lib/mongoose.js | 1358 +++ .../node_modules/mongoose/lib/options.js | 16 + .../mongoose/lib/options/populateOptions.js | 36 + .../mongoose/lib/options/propertyOptions.js | 8 + .../mongoose/lib/options/saveOptions.js | 14 + .../lib/options/schemaArrayOptions.js | 78 + .../lib/options/schemaBufferOptions.js | 38 + .../mongoose/lib/options/schemaDateOptions.js | 71 + .../lib/options/schemaDocumentArrayOptions.js | 68 + .../mongoose/lib/options/schemaMapOptions.js | 43 + .../lib/options/schemaNumberOptions.js | 101 + .../lib/options/schemaObjectIdOptions.js | 64 + .../lib/options/schemaStringOptions.js | 138 + .../lib/options/schemaSubdocumentOptions.js | 42 + .../mongoose/lib/options/schemaTypeOptions.js | 244 + .../mongoose/lib/options/virtualOptions.js | 164 + .../mongoose/lib/plugins/index.js | 6 + .../mongoose/lib/plugins/saveSubdocs.js | 98 + .../mongoose/lib/plugins/sharding.js | 83 + .../mongoose/lib/plugins/trackTransaction.js | 92 + .../lib/plugins/validateBeforeSave.js | 51 + .../node_modules/mongoose/lib/query.js | 5488 +++++++++++ .../node_modules/mongoose/lib/queryHelpers.js | 409 + .../node_modules/mongoose/lib/schema.js | 2856 ++++++ .../node_modules/mongoose/lib/schema/array.js | 669 ++ .../mongoose/lib/schema/bigint.js | 247 + .../mongoose/lib/schema/boolean.js | 297 + .../mongoose/lib/schema/buffer.js | 299 + .../node_modules/mongoose/lib/schema/date.js | 433 + .../mongoose/lib/schema/decimal128.js | 228 + .../mongoose/lib/schema/documentArray.js | 657 ++ .../lib/schema/documentArrayElement.js | 100 + .../node_modules/mongoose/lib/schema/index.js | 28 + .../node_modules/mongoose/lib/schema/map.js | 84 + .../node_modules/mongoose/lib/schema/mixed.js | 131 + .../mongoose/lib/schema/number.js | 449 + .../mongoose/lib/schema/objectId.js | 297 + .../mongoose/lib/schema/operators/bitwise.js | 38 + .../mongoose/lib/schema/operators/exists.js | 12 + .../lib/schema/operators/geospatial.js | 107 + .../mongoose/lib/schema/operators/helpers.js | 32 + .../mongoose/lib/schema/operators/text.js | 39 + .../mongoose/lib/schema/operators/type.js | 20 + .../mongoose/lib/schema/string.js | 705 ++ .../mongoose/lib/schema/subdocument.js | 397 + .../mongoose/lib/schema/symbols.js | 5 + .../node_modules/mongoose/lib/schema/uuid.js | 363 + .../node_modules/mongoose/lib/schemaType.js | 1735 ++++ .../node_modules/mongoose/lib/stateMachine.js | 232 + .../mongoose/lib/types/array/index.js | 119 + .../lib/types/array/isMongooseArray.js | 5 + .../mongoose/lib/types/array/methods/index.js | 1032 ++ .../mongoose/lib/types/arraySubdocument.js | 197 + .../node_modules/mongoose/lib/types/buffer.js | 277 + .../mongoose/lib/types/decimal128.js | 13 + .../mongoose/lib/types/documentArray/index.js | 113 + .../documentArray/isMongooseDocumentArray.js | 5 + .../lib/types/documentArray/methods/index.js | 394 + .../node_modules/mongoose/lib/types/index.js | 22 + .../node_modules/mongoose/lib/types/map.js | 361 + .../mongoose/lib/types/objectid.js | 41 + .../mongoose/lib/types/subdocument.js | 435 + .../node_modules/mongoose/lib/types/uuid.js | 13 + .../node_modules/mongoose/lib/utils.js | 1024 ++ .../node_modules/mongoose/lib/validOptions.js | 40 + .../node_modules/mongoose/lib/virtualType.js | 204 + .../mongoose/node_modules/ms/index.js | 162 + .../mongoose/node_modules/ms/license.md | 21 + .../mongoose/node_modules/ms/package.json | 38 + .../mongoose/node_modules/ms/readme.md | 59 + .../node_modules/mongoose/package.json | 147 + .../mongoose/types/aggregate.d.ts | 180 + .../mongoose/types/augmentations.d.ts | 9 + .../node_modules/mongoose/types/callback.d.ts | 8 + .../mongoose/types/collection.d.ts | 44 + .../mongoose/types/connection.d.ts | 253 + .../node_modules/mongoose/types/cursor.d.ts | 58 + .../node_modules/mongoose/types/document.d.ts | 285 + .../node_modules/mongoose/types/error.d.ts | 133 + .../mongoose/types/expressions.d.ts | 2936 ++++++ .../node_modules/mongoose/types/helpers.d.ts | 32 + .../node_modules/mongoose/types/index.d.ts | 732 ++ .../node_modules/mongoose/types/indexes.d.ts | 91 + .../mongoose/types/inferrawdoctype.d.ts | 116 + .../mongoose/types/inferschematype.d.ts | 309 + .../mongoose/types/middlewares.d.ts | 50 + .../node_modules/mongoose/types/models.d.ts | 897 ++ .../mongoose/types/mongooseoptions.d.ts | 219 + .../mongoose/types/pipelinestage.d.ts | 332 + .../node_modules/mongoose/types/populate.d.ts | 45 + .../node_modules/mongoose/types/query.d.ts | 858 ++ .../mongoose/types/schemaoptions.d.ts | 270 + .../mongoose/types/schematypes.d.ts | 501 + .../node_modules/mongoose/types/session.d.ts | 32 + .../node_modules/mongoose/types/types.d.ts | 106 + .../node_modules/mongoose/types/utility.d.ts | 96 + .../mongoose/types/validation.d.ts | 30 + .../node_modules/mongoose/types/virtuals.d.ts | 14 + user-service/node_modules/mpath/.travis.yml | 9 + user-service/node_modules/mpath/History.md | 88 + user-service/node_modules/mpath/LICENSE | 22 + user-service/node_modules/mpath/README.md | 278 + user-service/node_modules/mpath/SECURITY.md | 5 + user-service/node_modules/mpath/index.js | 3 + user-service/node_modules/mpath/lib/index.js | 336 + .../node_modules/mpath/lib/stringToParts.js | 48 + user-service/node_modules/mpath/package.json | 144 + .../node_modules/mpath/test/.eslintrc.yml | 4 + user-service/node_modules/mpath/test/index.js | 1879 ++++ .../node_modules/mpath/test/stringToParts.js | 30 + .../mquery/.github/ISSUE_TEMPLATE.md | 11 + .../mquery/.github/PULL_REQUEST_TEMPLATE.md | 9 + user-service/node_modules/mquery/History.md | 384 + user-service/node_modules/mquery/LICENSE | 22 + user-service/node_modules/mquery/README.md | 1247 +++ user-service/node_modules/mquery/SECURITY.md | 1 + .../mquery/lib/collection/collection.js | 45 + .../mquery/lib/collection/index.js | 13 + .../mquery/lib/collection/node.js | 114 + user-service/node_modules/mquery/lib/env.js | 22 + .../node_modules/mquery/lib/mquery.js | 2705 ++++++ .../node_modules/mquery/lib/permissions.js | 78 + user-service/node_modules/mquery/lib/utils.js | 297 + .../mquery/node_modules/debug/LICENSE | 20 + .../mquery/node_modules/debug/README.md | 481 + .../mquery/node_modules/debug/package.json | 60 + .../mquery/node_modules/debug/src/browser.js | 271 + .../mquery/node_modules/debug/src/common.js | 274 + .../mquery/node_modules/debug/src/index.js | 10 + .../mquery/node_modules/debug/src/node.js | 263 + .../mquery/node_modules/ms/index.js | 162 + .../mquery/node_modules/ms/license.md | 21 + .../mquery/node_modules/ms/package.json | 37 + .../mquery/node_modules/ms/readme.md | 60 + user-service/node_modules/mquery/package.json | 38 + user-service/node_modules/ms/index.js | 152 + user-service/node_modules/ms/license.md | 21 + user-service/node_modules/ms/package.json | 37 + user-service/node_modules/ms/readme.md | 51 + .../node_modules/negotiator/HISTORY.md | 108 + user-service/node_modules/negotiator/LICENSE | 24 + .../node_modules/negotiator/README.md | 203 + user-service/node_modules/negotiator/index.js | 82 + .../node_modules/negotiator/lib/charset.js | 169 + .../node_modules/negotiator/lib/encoding.js | 184 + .../node_modules/negotiator/lib/language.js | 179 + .../node_modules/negotiator/lib/mediaType.js | 294 + .../node_modules/negotiator/package.json | 42 + .../node_modules/node-addon-api/LICENSE.md | 13 + .../node_modules/node-addon-api/README.md | 317 + .../node_modules/node-addon-api/common.gypi | 21 + .../node_modules/node-addon-api/except.gypi | 25 + .../node_modules/node-addon-api/index.js | 11 + .../node-addon-api/napi-inl.deprecated.h | 186 + .../node_modules/node-addon-api/napi-inl.h | 6303 ++++++++++++ .../node_modules/node-addon-api/napi.h | 3114 ++++++ .../node_modules/node-addon-api/node_api.gyp | 9 + .../node_modules/node-addon-api/noexcept.gypi | 26 + .../node_modules/node-addon-api/nothing.c | 0 .../node-addon-api/package-support.json | 21 + .../node_modules/node-addon-api/package.json | 456 + .../node-addon-api/tools/README.md | 73 + .../node-addon-api/tools/check-napi.js | 99 + .../node-addon-api/tools/clang-format.js | 71 + .../node-addon-api/tools/conversion.js | 301 + .../node-addon-api/tools/eslint-format.js | 79 + .../node_modules/node-fetch/LICENSE.md | 22 + .../node_modules/node-fetch/README.md | 634 ++ .../node_modules/node-fetch/browser.js | 25 + .../node_modules/node-fetch/lib/index.es.js | 1777 ++++ .../node_modules/node-fetch/lib/index.js | 1787 ++++ .../node_modules/node-fetch/lib/index.mjs | 1775 ++++ .../node-fetch/node_modules/tr46/.npmignore | 4 + .../node-fetch/node_modules/tr46/index.js | 193 + .../node-fetch/node_modules/tr46/lib/.gitkeep | 0 .../node_modules/tr46/lib/mappingTable.json | 1 + .../node-fetch/node_modules/tr46/package.json | 31 + .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 53 + .../webidl-conversions/lib/index.js | 189 + .../webidl-conversions/package.json | 23 + .../node_modules/whatwg-url/LICENSE.txt | 21 + .../node_modules/whatwg-url/README.md | 67 + .../node_modules/whatwg-url/lib/URL-impl.js | 200 + .../node_modules/whatwg-url/lib/URL.js | 196 + .../node_modules/whatwg-url/lib/public-api.js | 11 + .../whatwg-url/lib/url-state-machine.js | 1297 +++ .../node_modules/whatwg-url/lib/utils.js | 20 + .../node_modules/whatwg-url/package.json | 32 + .../node_modules/node-fetch/package.json | 89 + .../node_modules/nodemon/.prettierrc.json | 3 + user-service/node_modules/nodemon/LICENSE | 21 + user-service/node_modules/nodemon/README.md | 452 + .../node_modules/nodemon/bin/nodemon.js | 16 + .../node_modules/nodemon/bin/windows-kill.exe | Bin 0 -> 80384 bytes .../node_modules/nodemon/doc/cli/authors.txt | 8 + .../node_modules/nodemon/doc/cli/config.txt | 44 + .../node_modules/nodemon/doc/cli/help.txt | 29 + .../node_modules/nodemon/doc/cli/logo.txt | 20 + .../node_modules/nodemon/doc/cli/options.txt | 36 + .../node_modules/nodemon/doc/cli/topics.txt | 8 + .../node_modules/nodemon/doc/cli/usage.txt | 3 + .../node_modules/nodemon/doc/cli/whoami.txt | 9 + user-service/node_modules/nodemon/index.d.ts | 141 + .../node_modules/nodemon/jsconfig.json | 7 + .../node_modules/nodemon/lib/cli/index.js | 49 + .../node_modules/nodemon/lib/cli/parse.js | 230 + .../nodemon/lib/config/command.js | 43 + .../nodemon/lib/config/defaults.js | 34 + .../node_modules/nodemon/lib/config/exec.js | 234 + .../node_modules/nodemon/lib/config/index.js | 93 + .../node_modules/nodemon/lib/config/load.js | 223 + .../node_modules/nodemon/lib/help/index.js | 27 + .../node_modules/nodemon/lib/index.js | 1 + .../node_modules/nodemon/lib/monitor/index.js | 4 + .../node_modules/nodemon/lib/monitor/match.js | 276 + .../node_modules/nodemon/lib/monitor/run.js | 555 ++ .../nodemon/lib/monitor/signals.js | 34 + .../node_modules/nodemon/lib/monitor/watch.js | 244 + .../node_modules/nodemon/lib/nodemon.js | 315 + .../node_modules/nodemon/lib/rules/add.js | 89 + .../node_modules/nodemon/lib/rules/index.js | 53 + .../node_modules/nodemon/lib/rules/parse.js | 43 + .../node_modules/nodemon/lib/spawn.js | 74 + .../node_modules/nodemon/lib/utils/bus.js | 44 + .../node_modules/nodemon/lib/utils/clone.js | 40 + .../node_modules/nodemon/lib/utils/colour.js | 26 + .../node_modules/nodemon/lib/utils/index.js | 103 + .../node_modules/nodemon/lib/utils/log.js | 82 + .../node_modules/nodemon/lib/utils/merge.js | 47 + .../node_modules/nodemon/lib/version.js | 100 + .../nodemon/node_modules/debug/LICENSE | 20 + .../nodemon/node_modules/debug/README.md | 481 + .../nodemon/node_modules/debug/package.json | 60 + .../nodemon/node_modules/debug/src/browser.js | 271 + .../nodemon/node_modules/debug/src/common.js | 274 + .../nodemon/node_modules/debug/src/index.js | 10 + .../nodemon/node_modules/debug/src/node.js | 263 + .../nodemon/node_modules/ms/index.js | 162 + .../nodemon/node_modules/ms/license.md | 21 + .../nodemon/node_modules/ms/package.json | 37 + .../nodemon/node_modules/ms/readme.md | 60 + .../node_modules/nodemon/package.json | 75 + user-service/node_modules/nopt/CHANGELOG.md | 58 + user-service/node_modules/nopt/LICENSE | 15 + user-service/node_modules/nopt/README.md | 213 + user-service/node_modules/nopt/bin/nopt.js | 54 + user-service/node_modules/nopt/lib/nopt.js | 441 + user-service/node_modules/nopt/package.json | 34 + .../node_modules/normalize-path/LICENSE | 21 + .../node_modules/normalize-path/README.md | 127 + .../node_modules/normalize-path/index.js | 35 + .../node_modules/normalize-path/package.json | 77 + user-service/node_modules/npmlog/LICENSE | 15 + user-service/node_modules/npmlog/README.md | 216 + user-service/node_modules/npmlog/log.js | 403 + user-service/node_modules/npmlog/package.json | 33 + .../node_modules/object-assign/index.js | 90 + .../node_modules/object-assign/license | 21 + .../node_modules/object-assign/package.json | 42 + .../node_modules/object-assign/readme.md | 61 + .../node_modules/object-inspect/.eslintrc | 53 + .../object-inspect/.github/FUNDING.yml | 12 + .../node_modules/object-inspect/.nycrc | 13 + .../node_modules/object-inspect/CHANGELOG.md | 404 + .../node_modules/object-inspect/LICENSE | 21 + .../object-inspect/example/all.js | 23 + .../object-inspect/example/circular.js | 6 + .../node_modules/object-inspect/example/fn.js | 5 + .../object-inspect/example/inspect.js | 10 + .../node_modules/object-inspect/index.js | 527 + .../object-inspect/package-support.json | 20 + .../node_modules/object-inspect/package.json | 104 + .../object-inspect/readme.markdown | 84 + .../object-inspect/test-core-js.js | 26 + .../object-inspect/test/bigint.js | 58 + .../object-inspect/test/browser/dom.js | 15 + .../object-inspect/test/circular.js | 16 + .../node_modules/object-inspect/test/deep.js | 12 + .../object-inspect/test/element.js | 53 + .../node_modules/object-inspect/test/err.js | 48 + .../node_modules/object-inspect/test/fakes.js | 29 + .../node_modules/object-inspect/test/fn.js | 76 + .../object-inspect/test/global.js | 17 + .../node_modules/object-inspect/test/has.js | 15 + .../node_modules/object-inspect/test/holes.js | 15 + .../object-inspect/test/indent-option.js | 271 + .../object-inspect/test/inspect.js | 139 + .../object-inspect/test/lowbyte.js | 12 + .../object-inspect/test/number.js | 58 + .../object-inspect/test/quoteStyle.js | 17 + .../object-inspect/test/toStringTag.js | 40 + .../node_modules/object-inspect/test/undef.js | 12 + .../object-inspect/test/values.js | 211 + .../object-inspect/util.inspect.js | 1 + .../node_modules/on-finished/HISTORY.md | 98 + user-service/node_modules/on-finished/LICENSE | 23 + .../node_modules/on-finished/README.md | 162 + .../node_modules/on-finished/index.js | 234 + .../node_modules/on-finished/package.json | 39 + user-service/node_modules/once/LICENSE | 15 + user-service/node_modules/once/README.md | 79 + user-service/node_modules/once/once.js | 42 + user-service/node_modules/once/package.json | 33 + user-service/node_modules/parseurl/HISTORY.md | 58 + user-service/node_modules/parseurl/LICENSE | 24 + user-service/node_modules/parseurl/README.md | 133 + user-service/node_modules/parseurl/index.js | 158 + .../node_modules/parseurl/package.json | 40 + .../node_modules/path-is-absolute/index.js | 20 + .../node_modules/path-is-absolute/license | 21 + .../path-is-absolute/package.json | 43 + .../node_modules/path-is-absolute/readme.md | 59 + .../node_modules/path-to-regexp/History.md | 36 + .../node_modules/path-to-regexp/LICENSE | 21 + .../node_modules/path-to-regexp/Readme.md | 35 + .../node_modules/path-to-regexp/index.js | 129 + .../node_modules/path-to-regexp/package.json | 30 + .../node_modules/picomatch/CHANGELOG.md | 136 + user-service/node_modules/picomatch/LICENSE | 21 + user-service/node_modules/picomatch/README.md | 708 ++ user-service/node_modules/picomatch/index.js | 3 + .../node_modules/picomatch/lib/constants.js | 179 + .../node_modules/picomatch/lib/parse.js | 1091 +++ .../node_modules/picomatch/lib/picomatch.js | 342 + .../node_modules/picomatch/lib/scan.js | 391 + .../node_modules/picomatch/lib/utils.js | 64 + .../node_modules/picomatch/package.json | 81 + .../node_modules/proxy-addr/HISTORY.md | 161 + user-service/node_modules/proxy-addr/LICENSE | 22 + .../node_modules/proxy-addr/README.md | 139 + user-service/node_modules/proxy-addr/index.js | 327 + .../node_modules/proxy-addr/package.json | 47 + .../node_modules/pstree.remy/.travis.yml | 8 + user-service/node_modules/pstree.remy/LICENSE | 7 + .../node_modules/pstree.remy/README.md | 26 + .../node_modules/pstree.remy/lib/index.js | 37 + .../node_modules/pstree.remy/lib/tree.js | 37 + .../node_modules/pstree.remy/lib/utils.js | 53 + .../node_modules/pstree.remy/package.json | 33 + .../pstree.remy/tests/fixtures/index.js | 13 + .../pstree.remy/tests/fixtures/out1 | 10 + .../pstree.remy/tests/fixtures/out2 | 29 + .../pstree.remy/tests/index.test.js | 51 + .../node_modules/punycode/LICENSE-MIT.txt | 20 + user-service/node_modules/punycode/README.md | 148 + .../node_modules/punycode/package.json | 58 + .../node_modules/punycode/punycode.es6.js | 444 + .../node_modules/punycode/punycode.js | 443 + user-service/node_modules/qs/.editorconfig | 43 + user-service/node_modules/qs/.eslintrc | 38 + .../node_modules/qs/.github/FUNDING.yml | 12 + user-service/node_modules/qs/.nycrc | 13 + user-service/node_modules/qs/CHANGELOG.md | 546 ++ user-service/node_modules/qs/LICENSE.md | 29 + user-service/node_modules/qs/README.md | 625 ++ user-service/node_modules/qs/dist/qs.js | 2054 ++++ user-service/node_modules/qs/lib/formats.js | 23 + user-service/node_modules/qs/lib/index.js | 11 + user-service/node_modules/qs/lib/parse.js | 263 + user-service/node_modules/qs/lib/stringify.js | 326 + user-service/node_modules/qs/lib/utils.js | 252 + user-service/node_modules/qs/package.json | 77 + user-service/node_modules/qs/test/parse.js | 855 ++ .../node_modules/qs/test/stringify.js | 909 ++ user-service/node_modules/qs/test/utils.js | 136 + .../node_modules/range-parser/HISTORY.md | 56 + .../node_modules/range-parser/LICENSE | 23 + .../node_modules/range-parser/README.md | 84 + .../node_modules/range-parser/index.js | 162 + .../node_modules/range-parser/package.json | 44 + user-service/node_modules/raw-body/HISTORY.md | 308 + user-service/node_modules/raw-body/LICENSE | 22 + user-service/node_modules/raw-body/README.md | 223 + .../node_modules/raw-body/SECURITY.md | 24 + user-service/node_modules/raw-body/index.d.ts | 87 + user-service/node_modules/raw-body/index.js | 336 + .../node_modules/raw-body/package.json | 49 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 106 + .../readable-stream/errors-browser.js | 127 + .../node_modules/readable-stream/errors.js | 116 + .../readable-stream/experimentalWarning.js | 17 + .../readable-stream/lib/_stream_duplex.js | 126 + .../lib/_stream_passthrough.js | 37 + .../readable-stream/lib/_stream_readable.js | 1027 ++ .../readable-stream/lib/_stream_transform.js | 190 + .../readable-stream/lib/_stream_writable.js | 641 ++ .../lib/internal/streams/async_iterator.js | 180 + .../lib/internal/streams/buffer_list.js | 183 + .../lib/internal/streams/destroy.js | 96 + .../lib/internal/streams/end-of-stream.js | 86 + .../lib/internal/streams/from-browser.js | 3 + .../lib/internal/streams/from.js | 52 + .../lib/internal/streams/pipeline.js | 86 + .../lib/internal/streams/state.js | 22 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 68 + .../readable-stream/readable-browser.js | 9 + .../node_modules/readable-stream/readable.js | 16 + user-service/node_modules/readdirp/LICENSE | 21 + user-service/node_modules/readdirp/README.md | 122 + user-service/node_modules/readdirp/index.d.ts | 43 + user-service/node_modules/readdirp/index.js | 287 + .../node_modules/readdirp/package.json | 122 + user-service/node_modules/rimraf/CHANGELOG.md | 65 + user-service/node_modules/rimraf/LICENSE | 15 + user-service/node_modules/rimraf/README.md | 101 + user-service/node_modules/rimraf/bin.js | 68 + user-service/node_modules/rimraf/package.json | 32 + user-service/node_modules/rimraf/rimraf.js | 360 + user-service/node_modules/safe-buffer/LICENSE | 21 + .../node_modules/safe-buffer/README.md | 584 ++ .../node_modules/safe-buffer/index.d.ts | 187 + .../node_modules/safe-buffer/index.js | 65 + .../node_modules/safe-buffer/package.json | 51 + .../node_modules/safer-buffer/LICENSE | 21 + .../safer-buffer/Porting-Buffer.md | 268 + .../node_modules/safer-buffer/Readme.md | 156 + .../node_modules/safer-buffer/dangerous.js | 58 + .../node_modules/safer-buffer/package.json | 34 + .../node_modules/safer-buffer/safer.js | 77 + .../node_modules/safer-buffer/tests.js | 406 + user-service/node_modules/semver/LICENSE | 15 + user-service/node_modules/semver/README.md | 654 ++ .../node_modules/semver/bin/semver.js | 188 + .../node_modules/semver/classes/comparator.js | 141 + .../node_modules/semver/classes/index.js | 5 + .../node_modules/semver/classes/range.js | 554 ++ .../node_modules/semver/classes/semver.js | 302 + .../node_modules/semver/functions/clean.js | 6 + .../node_modules/semver/functions/cmp.js | 52 + .../node_modules/semver/functions/coerce.js | 60 + .../semver/functions/compare-build.js | 7 + .../semver/functions/compare-loose.js | 3 + .../node_modules/semver/functions/compare.js | 5 + .../node_modules/semver/functions/diff.js | 65 + .../node_modules/semver/functions/eq.js | 3 + .../node_modules/semver/functions/gt.js | 3 + .../node_modules/semver/functions/gte.js | 3 + .../node_modules/semver/functions/inc.js | 19 + .../node_modules/semver/functions/lt.js | 3 + .../node_modules/semver/functions/lte.js | 3 + .../node_modules/semver/functions/major.js | 3 + .../node_modules/semver/functions/minor.js | 3 + .../node_modules/semver/functions/neq.js | 3 + .../node_modules/semver/functions/parse.js | 16 + .../node_modules/semver/functions/patch.js | 3 + .../semver/functions/prerelease.js | 6 + .../node_modules/semver/functions/rcompare.js | 3 + .../node_modules/semver/functions/rsort.js | 3 + .../semver/functions/satisfies.js | 10 + .../node_modules/semver/functions/sort.js | 3 + .../node_modules/semver/functions/valid.js | 6 + user-service/node_modules/semver/index.js | 89 + .../node_modules/semver/internal/constants.js | 35 + .../node_modules/semver/internal/debug.js | 9 + .../semver/internal/identifiers.js | 23 + .../node_modules/semver/internal/lrucache.js | 40 + .../semver/internal/parse-options.js | 15 + .../node_modules/semver/internal/re.js | 217 + user-service/node_modules/semver/package.json | 77 + user-service/node_modules/semver/preload.js | 2 + user-service/node_modules/semver/range.bnf | 16 + .../node_modules/semver/ranges/gtr.js | 4 + .../node_modules/semver/ranges/intersects.js | 7 + .../node_modules/semver/ranges/ltr.js | 4 + .../semver/ranges/max-satisfying.js | 25 + .../semver/ranges/min-satisfying.js | 24 + .../node_modules/semver/ranges/min-version.js | 61 + .../node_modules/semver/ranges/outside.js | 80 + .../node_modules/semver/ranges/simplify.js | 47 + .../node_modules/semver/ranges/subset.js | 247 + .../semver/ranges/to-comparators.js | 8 + .../node_modules/semver/ranges/valid.js | 11 + user-service/node_modules/send/HISTORY.md | 521 + user-service/node_modules/send/LICENSE | 23 + user-service/node_modules/send/README.md | 327 + user-service/node_modules/send/SECURITY.md | 24 + user-service/node_modules/send/index.js | 1143 +++ .../send/node_modules/ms/index.js | 162 + .../send/node_modules/ms/license.md | 21 + .../send/node_modules/ms/package.json | 38 + .../send/node_modules/ms/readme.md | 59 + user-service/node_modules/send/package.json | 62 + .../node_modules/serve-static/HISTORY.md | 471 + .../node_modules/serve-static/LICENSE | 25 + .../node_modules/serve-static/README.md | 257 + .../node_modules/serve-static/index.js | 210 + .../node_modules/serve-static/package.json | 42 + .../node_modules/set-blocking/CHANGELOG.md | 26 + .../node_modules/set-blocking/LICENSE.txt | 14 + .../node_modules/set-blocking/README.md | 31 + .../node_modules/set-blocking/index.js | 7 + .../node_modules/set-blocking/package.json | 42 + .../set-function-length/.eslintrc | 27 + .../set-function-length/.github/FUNDING.yml | 12 + .../node_modules/set-function-length/.nycrc | 13 + .../set-function-length/CHANGELOG.md | 70 + .../node_modules/set-function-length/LICENSE | 21 + .../set-function-length/README.md | 56 + .../node_modules/set-function-length/env.d.ts | 9 + .../node_modules/set-function-length/env.js | 25 + .../set-function-length/index.d.ts | 7 + .../node_modules/set-function-length/index.js | 42 + .../set-function-length/package.json | 102 + .../set-function-length/tsconfig.json | 9 + .../node_modules/setprototypeof/LICENSE | 13 + .../node_modules/setprototypeof/README.md | 31 + .../node_modules/setprototypeof/index.d.ts | 2 + .../node_modules/setprototypeof/index.js | 17 + .../node_modules/setprototypeof/package.json | 38 + .../node_modules/setprototypeof/test/index.js | 24 + .../node_modules/side-channel/.editorconfig | 9 + .../node_modules/side-channel/.eslintrc | 11 + .../side-channel/.github/FUNDING.yml | 12 + user-service/node_modules/side-channel/.nycrc | 13 + .../node_modules/side-channel/CHANGELOG.md | 95 + .../node_modules/side-channel/LICENSE | 21 + .../node_modules/side-channel/README.md | 2 + .../node_modules/side-channel/index.d.ts | 27 + .../node_modules/side-channel/index.js | 129 + .../node_modules/side-channel/package.json | 84 + .../node_modules/side-channel/test/index.js | 83 + .../node_modules/side-channel/tsconfig.json | 50 + .../node_modules/sift/MIT-LICENSE.txt | 20 + user-service/node_modules/sift/README.md | 465 + user-service/node_modules/sift/es/index.js | 632 ++ .../node_modules/sift/es/index.js.map | 1 + user-service/node_modules/sift/es5m/index.js | 743 ++ .../node_modules/sift/es5m/index.js.map | 1 + user-service/node_modules/sift/index.d.ts | 4 + user-service/node_modules/sift/index.js | 4 + user-service/node_modules/sift/lib/core.d.ts | 116 + user-service/node_modules/sift/lib/index.d.ts | 6 + user-service/node_modules/sift/lib/index.js | 781 ++ .../node_modules/sift/lib/index.js.map | 1 + .../node_modules/sift/lib/operations.d.ts | 88 + user-service/node_modules/sift/lib/utils.d.ts | 11 + user-service/node_modules/sift/package.json | 61 + .../node_modules/sift/sift.csp.min.js | 778 ++ .../node_modules/sift/sift.csp.min.js.map | 1 + user-service/node_modules/sift/sift.min.js | 2 + .../node_modules/sift/sift.min.js.map | 1 + user-service/node_modules/sift/src/core.ts | 494 + user-service/node_modules/sift/src/index.ts | 54 + .../node_modules/sift/src/operations.ts | 422 + user-service/node_modules/sift/src/utils.ts | 74 + .../node_modules/signal-exit/LICENSE.txt | 16 + .../node_modules/signal-exit/README.md | 39 + .../node_modules/signal-exit/index.js | 202 + .../node_modules/signal-exit/package.json | 38 + .../node_modules/signal-exit/signals.js | 53 + .../simple-update-notifier/LICENSE | 21 + .../simple-update-notifier/README.md | 82 + .../simple-update-notifier/build/index.d.ts | 13 + .../simple-update-notifier/build/index.js | 210 + .../simple-update-notifier/package.json | 100 + .../src/borderedText.ts | 12 + .../simple-update-notifier/src/cache.spec.ts | 17 + .../simple-update-notifier/src/cache.ts | 44 + .../src/getDistVersion.spec.ts | 35 + .../src/getDistVersion.ts | 29 + .../src/hasNewVersion.spec.ts | 82 + .../src/hasNewVersion.ts | 40 + .../simple-update-notifier/src/index.spec.ts | 27 + .../simple-update-notifier/src/index.ts | 34 + .../simple-update-notifier/src/isNpmOrYarn.ts | 12 + .../simple-update-notifier/src/types.ts | 8 + .../node_modules/sparse-bitfield/.npmignore | 1 + .../node_modules/sparse-bitfield/.travis.yml | 6 + .../node_modules/sparse-bitfield/LICENSE | 21 + .../node_modules/sparse-bitfield/README.md | 62 + .../node_modules/sparse-bitfield/index.js | 95 + .../node_modules/sparse-bitfield/package.json | 27 + .../node_modules/sparse-bitfield/test.js | 79 + user-service/node_modules/statuses/HISTORY.md | 82 + user-service/node_modules/statuses/LICENSE | 23 + user-service/node_modules/statuses/README.md | 136 + user-service/node_modules/statuses/codes.json | 65 + user-service/node_modules/statuses/index.js | 146 + .../node_modules/statuses/package.json | 49 + .../node_modules/string-width/index.d.ts | 29 + .../node_modules/string-width/index.js | 47 + .../node_modules/string-width/license | 9 + .../node_modules/string-width/package.json | 56 + .../node_modules/string-width/readme.md | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 + .../node_modules/string_decoder/package.json | 34 + .../node_modules/strip-ansi/index.d.ts | 17 + user-service/node_modules/strip-ansi/index.js | 4 + user-service/node_modules/strip-ansi/license | 9 + .../node_modules/strip-ansi/package.json | 54 + .../node_modules/strip-ansi/readme.md | 46 + .../node_modules/supports-color/browser.js | 5 + .../node_modules/supports-color/index.js | 131 + .../node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../node_modules/supports-color/readme.md | 66 + user-service/node_modules/tar/LICENSE | 15 + user-service/node_modules/tar/README.md | 1080 +++ user-service/node_modules/tar/index.js | 18 + user-service/node_modules/tar/lib/create.js | 111 + user-service/node_modules/tar/lib/extract.js | 113 + .../node_modules/tar/lib/get-write-flag.js | 20 + user-service/node_modules/tar/lib/header.js | 304 + .../node_modules/tar/lib/high-level-opt.js | 29 + .../node_modules/tar/lib/large-numbers.js | 104 + user-service/node_modules/tar/lib/list.js | 139 + user-service/node_modules/tar/lib/mkdir.js | 229 + user-service/node_modules/tar/lib/mode-fix.js | 27 + .../node_modules/tar/lib/normalize-unicode.js | 12 + .../tar/lib/normalize-windows-path.js | 8 + user-service/node_modules/tar/lib/pack.js | 432 + user-service/node_modules/tar/lib/parse.js | 552 ++ .../node_modules/tar/lib/path-reservations.js | 156 + user-service/node_modules/tar/lib/pax.js | 150 + .../node_modules/tar/lib/read-entry.js | 107 + user-service/node_modules/tar/lib/replace.js | 246 + .../tar/lib/strip-absolute-path.js | 24 + .../tar/lib/strip-trailing-slashes.js | 13 + user-service/node_modules/tar/lib/types.js | 44 + user-service/node_modules/tar/lib/unpack.js | 923 ++ user-service/node_modules/tar/lib/update.js | 40 + .../node_modules/tar/lib/warn-mixin.js | 24 + user-service/node_modules/tar/lib/winchars.js | 23 + .../node_modules/tar/lib/write-entry.js | 546 ++ user-service/node_modules/tar/package.json | 70 + .../node_modules/to-regex-range/LICENSE | 21 + .../node_modules/to-regex-range/README.md | 305 + .../node_modules/to-regex-range/index.js | 288 + .../node_modules/to-regex-range/package.json | 88 + .../node_modules/toidentifier/HISTORY.md | 9 + .../node_modules/toidentifier/LICENSE | 21 + .../node_modules/toidentifier/README.md | 61 + .../node_modules/toidentifier/index.js | 32 + .../node_modules/toidentifier/package.json | 38 + user-service/node_modules/touch/LICENSE | 15 + user-service/node_modules/touch/README.md | 52 + .../node_modules/touch/bin/nodetouch.js | 112 + user-service/node_modules/touch/index.js | 224 + user-service/node_modules/touch/package.json | 25 + user-service/node_modules/tr46/LICENSE.md | 21 + user-service/node_modules/tr46/README.md | 68 + user-service/node_modules/tr46/index.js | 300 + .../node_modules/tr46/lib/mappingTable.json | 1 + user-service/node_modules/tr46/lib/regexes.js | 29 + .../node_modules/tr46/lib/statusMapping.js | 11 + user-service/node_modules/tr46/package.json | 45 + user-service/node_modules/type-is/HISTORY.md | 259 + user-service/node_modules/type-is/LICENSE | 23 + user-service/node_modules/type-is/README.md | 170 + user-service/node_modules/type-is/index.js | 266 + .../node_modules/type-is/package.json | 45 + .../undefsafe/.github/workflows/release.yml | 25 + user-service/node_modules/undefsafe/.jscsrc | 13 + user-service/node_modules/undefsafe/.jshintrc | 16 + .../node_modules/undefsafe/.travis.yml | 18 + user-service/node_modules/undefsafe/LICENSE | 22 + user-service/node_modules/undefsafe/README.md | 63 + .../node_modules/undefsafe/example.js | 14 + .../node_modules/undefsafe/lib/undefsafe.js | 125 + .../node_modules/undefsafe/package.json | 34 + user-service/node_modules/unpipe/HISTORY.md | 4 + user-service/node_modules/unpipe/LICENSE | 22 + user-service/node_modules/unpipe/README.md | 43 + user-service/node_modules/unpipe/index.js | 69 + user-service/node_modules/unpipe/package.json | 27 + .../node_modules/util-deprecate/History.md | 16 + .../node_modules/util-deprecate/LICENSE | 24 + .../node_modules/util-deprecate/README.md | 53 + .../node_modules/util-deprecate/browser.js | 67 + .../node_modules/util-deprecate/node.js | 6 + .../node_modules/util-deprecate/package.json | 27 + .../node_modules/utils-merge/.npmignore | 9 + user-service/node_modules/utils-merge/LICENSE | 20 + .../node_modules/utils-merge/README.md | 34 + .../node_modules/utils-merge/index.js | 23 + .../node_modules/utils-merge/package.json | 40 + user-service/node_modules/vary/HISTORY.md | 39 + user-service/node_modules/vary/LICENSE | 22 + user-service/node_modules/vary/README.md | 101 + user-service/node_modules/vary/index.js | 149 + user-service/node_modules/vary/package.json | 43 + .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 99 + .../webidl-conversions/lib/index.js | 450 + .../webidl-conversions/package.json | 35 + .../node_modules/whatwg-url/LICENSE.txt | 21 + .../node_modules/whatwg-url/README.md | 106 + user-service/node_modules/whatwg-url/index.js | 27 + .../node_modules/whatwg-url/lib/Function.js | 42 + .../node_modules/whatwg-url/lib/URL-impl.js | 246 + .../node_modules/whatwg-url/lib/URL.js | 471 + .../whatwg-url/lib/URLSearchParams-impl.js | 139 + .../whatwg-url/lib/URLSearchParams.js | 505 + .../whatwg-url/lib/VoidFunction.js | 26 + .../node_modules/whatwg-url/lib/encoding.js | 16 + .../node_modules/whatwg-url/lib/infra.js | 26 + .../whatwg-url/lib/percent-encoding.js | 142 + .../whatwg-url/lib/url-state-machine.js | 1247 +++ .../node_modules/whatwg-url/lib/urlencoded.js | 106 + .../node_modules/whatwg-url/lib/utils.js | 190 + .../node_modules/whatwg-url/package.json | 58 + .../whatwg-url/webidl2js-wrapper.js | 7 + user-service/node_modules/wide-align/LICENSE | 14 + .../node_modules/wide-align/README.md | 47 + user-service/node_modules/wide-align/align.js | 65 + .../node_modules/wide-align/package.json | 33 + user-service/node_modules/wrappy/LICENSE | 15 + user-service/node_modules/wrappy/README.md | 36 + user-service/node_modules/wrappy/package.json | 29 + user-service/node_modules/wrappy/wrappy.js | 33 + user-service/node_modules/yallist/LICENSE | 15 + user-service/node_modules/yallist/README.md | 204 + user-service/node_modules/yallist/iterator.js | 8 + .../node_modules/yallist/package.json | 29 + user-service/node_modules/yallist/yallist.js | 426 + 2210 files changed, 348997 insertions(+) create mode 100644 user-service/.env create mode 120000 user-service/node_modules/.bin/color-support create mode 120000 user-service/node_modules/.bin/mime create mode 120000 user-service/node_modules/.bin/mkdirp create mode 120000 user-service/node_modules/.bin/node-pre-gyp create mode 120000 user-service/node_modules/.bin/nodemon create mode 120000 user-service/node_modules/.bin/nodetouch create mode 120000 user-service/node_modules/.bin/nopt create mode 120000 user-service/node_modules/.bin/rimraf create mode 120000 user-service/node_modules/.bin/semver create mode 100644 user-service/node_modules/.package-lock.json create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/.github/workflows/codeql.yml create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/CHANGELOG.md create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/LICENSE create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/README.md create mode 100755 user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp.cmd create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/contributing.md create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/build.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/clean.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/configure.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/info.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/install.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/main.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/package.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/pre-binding.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/publish.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/rebuild.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/reinstall.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/reveal.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/testbinary.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/testpackage.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/unpublish.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/abi_crosswalk.json create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/compile.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/handle_gyp_opts.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/napi.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/index.html create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/package.json create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/lib/util/versioning.js create mode 100644 user-service/node_modules/@mapbox/node-pre-gyp/package.json create mode 100644 user-service/node_modules/@mongodb-js/saslprep/LICENSE create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/.esm-wrapper.mjs create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/browser.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/browser.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/index.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/index.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/node.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/node.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/util.js create mode 100644 user-service/node_modules/@mongodb-js/saslprep/dist/util.js.map create mode 100644 user-service/node_modules/@mongodb-js/saslprep/package.json create mode 100644 user-service/node_modules/@mongodb-js/saslprep/readme.md create mode 100644 user-service/node_modules/@types/webidl-conversions/LICENSE create mode 100644 user-service/node_modules/@types/webidl-conversions/README.md create mode 100644 user-service/node_modules/@types/webidl-conversions/index.d.ts create mode 100644 user-service/node_modules/@types/webidl-conversions/package.json create mode 100644 user-service/node_modules/@types/whatwg-url/LICENSE create mode 100644 user-service/node_modules/@types/whatwg-url/README.md create mode 100644 user-service/node_modules/@types/whatwg-url/index.d.ts create mode 100644 user-service/node_modules/@types/whatwg-url/lib/URL-impl.d.ts create mode 100644 user-service/node_modules/@types/whatwg-url/lib/URL.d.ts create mode 100644 user-service/node_modules/@types/whatwg-url/lib/URLSearchParams-impl.d.ts create mode 100644 user-service/node_modules/@types/whatwg-url/lib/URLSearchParams.d.ts create mode 100644 user-service/node_modules/@types/whatwg-url/package.json create mode 100644 user-service/node_modules/@types/whatwg-url/webidl2js-wrapper.d.ts create mode 100644 user-service/node_modules/abbrev/LICENSE create mode 100644 user-service/node_modules/abbrev/README.md create mode 100644 user-service/node_modules/abbrev/abbrev.js create mode 100644 user-service/node_modules/abbrev/package.json create mode 100644 user-service/node_modules/accepts/HISTORY.md create mode 100644 user-service/node_modules/accepts/LICENSE create mode 100644 user-service/node_modules/accepts/README.md create mode 100644 user-service/node_modules/accepts/index.js create mode 100644 user-service/node_modules/accepts/package.json create mode 100644 user-service/node_modules/agent-base/README.md create mode 100644 user-service/node_modules/agent-base/dist/src/index.d.ts create mode 100644 user-service/node_modules/agent-base/dist/src/index.js create mode 100644 user-service/node_modules/agent-base/dist/src/index.js.map create mode 100644 user-service/node_modules/agent-base/dist/src/promisify.d.ts create mode 100644 user-service/node_modules/agent-base/dist/src/promisify.js create mode 100644 user-service/node_modules/agent-base/dist/src/promisify.js.map create mode 100644 user-service/node_modules/agent-base/node_modules/debug/LICENSE create mode 100644 user-service/node_modules/agent-base/node_modules/debug/README.md create mode 100644 user-service/node_modules/agent-base/node_modules/debug/package.json create mode 100644 user-service/node_modules/agent-base/node_modules/debug/src/browser.js create mode 100644 user-service/node_modules/agent-base/node_modules/debug/src/common.js create mode 100644 user-service/node_modules/agent-base/node_modules/debug/src/index.js create mode 100644 user-service/node_modules/agent-base/node_modules/debug/src/node.js create mode 100644 user-service/node_modules/agent-base/node_modules/ms/index.js create mode 100644 user-service/node_modules/agent-base/node_modules/ms/license.md create mode 100644 user-service/node_modules/agent-base/node_modules/ms/package.json create mode 100644 user-service/node_modules/agent-base/node_modules/ms/readme.md create mode 100644 user-service/node_modules/agent-base/package.json create mode 100644 user-service/node_modules/agent-base/src/index.ts create mode 100644 user-service/node_modules/agent-base/src/promisify.ts create mode 100644 user-service/node_modules/ansi-regex/index.d.ts create mode 100644 user-service/node_modules/ansi-regex/index.js create mode 100644 user-service/node_modules/ansi-regex/license create mode 100644 user-service/node_modules/ansi-regex/package.json create mode 100644 user-service/node_modules/ansi-regex/readme.md create mode 100644 user-service/node_modules/anymatch/LICENSE create mode 100644 user-service/node_modules/anymatch/README.md create mode 100644 user-service/node_modules/anymatch/index.d.ts create mode 100644 user-service/node_modules/anymatch/index.js create mode 100644 user-service/node_modules/anymatch/package.json create mode 100644 user-service/node_modules/aproba/CHANGELOG.md create mode 100644 user-service/node_modules/aproba/LICENSE create mode 100644 user-service/node_modules/aproba/README.md create mode 100644 user-service/node_modules/aproba/index.js create mode 100644 user-service/node_modules/aproba/package.json create mode 100644 user-service/node_modules/are-we-there-yet/LICENSE.md create mode 100644 user-service/node_modules/are-we-there-yet/README.md create mode 100644 user-service/node_modules/are-we-there-yet/lib/index.js create mode 100644 user-service/node_modules/are-we-there-yet/lib/tracker-base.js create mode 100644 user-service/node_modules/are-we-there-yet/lib/tracker-group.js create mode 100644 user-service/node_modules/are-we-there-yet/lib/tracker-stream.js create mode 100644 user-service/node_modules/are-we-there-yet/lib/tracker.js create mode 100644 user-service/node_modules/are-we-there-yet/package.json create mode 100644 user-service/node_modules/array-flatten/LICENSE create mode 100644 user-service/node_modules/array-flatten/README.md create mode 100644 user-service/node_modules/array-flatten/array-flatten.js create mode 100644 user-service/node_modules/array-flatten/package.json create mode 100644 user-service/node_modules/balanced-match/.github/FUNDING.yml create mode 100644 user-service/node_modules/balanced-match/LICENSE.md create mode 100644 user-service/node_modules/balanced-match/README.md create mode 100644 user-service/node_modules/balanced-match/index.js create mode 100644 user-service/node_modules/balanced-match/package.json create mode 100644 user-service/node_modules/bcrypt/.editorconfig create mode 100644 user-service/node_modules/bcrypt/.github/workflows/ci.yaml create mode 100644 user-service/node_modules/bcrypt/.travis.yml create mode 100644 user-service/node_modules/bcrypt/CHANGELOG.md create mode 100644 user-service/node_modules/bcrypt/ISSUE_TEMPLATE.md create mode 100644 user-service/node_modules/bcrypt/LICENSE create mode 100644 user-service/node_modules/bcrypt/Makefile create mode 100644 user-service/node_modules/bcrypt/README.md create mode 100644 user-service/node_modules/bcrypt/SECURITY.md create mode 100644 user-service/node_modules/bcrypt/appveyor.yml create mode 100644 user-service/node_modules/bcrypt/bcrypt.js create mode 100644 user-service/node_modules/bcrypt/binding.gyp create mode 100644 user-service/node_modules/bcrypt/examples/async_compare.js create mode 100644 user-service/node_modules/bcrypt/examples/forever_gen_salt.js create mode 100755 user-service/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node create mode 100644 user-service/node_modules/bcrypt/package.json create mode 100644 user-service/node_modules/bcrypt/promises.js create mode 100644 user-service/node_modules/bcrypt/src/bcrypt.cc create mode 100644 user-service/node_modules/bcrypt/src/bcrypt_node.cc create mode 100644 user-service/node_modules/bcrypt/src/blowfish.cc create mode 100644 user-service/node_modules/bcrypt/src/node_blf.h create mode 100755 user-service/node_modules/bcrypt/test-docker.sh create mode 100644 user-service/node_modules/bcrypt/test/async.test.js create mode 100644 user-service/node_modules/bcrypt/test/implementation.test.js create mode 100644 user-service/node_modules/bcrypt/test/promise.test.js create mode 100644 user-service/node_modules/bcrypt/test/repetitions.test.js create mode 100644 user-service/node_modules/bcrypt/test/sync.test.js create mode 100644 user-service/node_modules/binary-extensions/binary-extensions.json create mode 100644 user-service/node_modules/binary-extensions/binary-extensions.json.d.ts create mode 100644 user-service/node_modules/binary-extensions/index.d.ts create mode 100644 user-service/node_modules/binary-extensions/index.js create mode 100644 user-service/node_modules/binary-extensions/license create mode 100644 user-service/node_modules/binary-extensions/package.json create mode 100644 user-service/node_modules/binary-extensions/readme.md create mode 100644 user-service/node_modules/body-parser/HISTORY.md create mode 100644 user-service/node_modules/body-parser/LICENSE create mode 100644 user-service/node_modules/body-parser/README.md create mode 100644 user-service/node_modules/body-parser/SECURITY.md create mode 100644 user-service/node_modules/body-parser/index.js create mode 100644 user-service/node_modules/body-parser/lib/read.js create mode 100644 user-service/node_modules/body-parser/lib/types/json.js create mode 100644 user-service/node_modules/body-parser/lib/types/raw.js create mode 100644 user-service/node_modules/body-parser/lib/types/text.js create mode 100644 user-service/node_modules/body-parser/lib/types/urlencoded.js create mode 100644 user-service/node_modules/body-parser/package.json create mode 100644 user-service/node_modules/brace-expansion/LICENSE create mode 100644 user-service/node_modules/brace-expansion/README.md create mode 100644 user-service/node_modules/brace-expansion/index.js create mode 100644 user-service/node_modules/brace-expansion/package.json create mode 100644 user-service/node_modules/braces/LICENSE create mode 100644 user-service/node_modules/braces/README.md create mode 100644 user-service/node_modules/braces/index.js create mode 100644 user-service/node_modules/braces/lib/compile.js create mode 100644 user-service/node_modules/braces/lib/constants.js create mode 100644 user-service/node_modules/braces/lib/expand.js create mode 100644 user-service/node_modules/braces/lib/parse.js create mode 100644 user-service/node_modules/braces/lib/stringify.js create mode 100644 user-service/node_modules/braces/lib/utils.js create mode 100644 user-service/node_modules/braces/package.json create mode 100644 user-service/node_modules/bson/LICENSE.md create mode 100644 user-service/node_modules/bson/README.md create mode 100644 user-service/node_modules/bson/bson.d.ts create mode 100755 user-service/node_modules/bson/etc/prepare.js create mode 100644 user-service/node_modules/bson/lib/bson.bundle.js create mode 100644 user-service/node_modules/bson/lib/bson.bundle.js.map create mode 100644 user-service/node_modules/bson/lib/bson.cjs create mode 100644 user-service/node_modules/bson/lib/bson.cjs.map create mode 100644 user-service/node_modules/bson/lib/bson.mjs create mode 100644 user-service/node_modules/bson/lib/bson.mjs.map create mode 100644 user-service/node_modules/bson/lib/bson.rn.cjs create mode 100644 user-service/node_modules/bson/lib/bson.rn.cjs.map create mode 100644 user-service/node_modules/bson/package.json create mode 100644 user-service/node_modules/bson/src/binary.ts create mode 100644 user-service/node_modules/bson/src/bson.ts create mode 100644 user-service/node_modules/bson/src/bson_value.ts create mode 100644 user-service/node_modules/bson/src/code.ts create mode 100644 user-service/node_modules/bson/src/constants.ts create mode 100644 user-service/node_modules/bson/src/db_ref.ts create mode 100644 user-service/node_modules/bson/src/decimal128.ts create mode 100644 user-service/node_modules/bson/src/double.ts create mode 100644 user-service/node_modules/bson/src/error.ts create mode 100644 user-service/node_modules/bson/src/extended_json.ts create mode 100644 user-service/node_modules/bson/src/index.ts create mode 100644 user-service/node_modules/bson/src/int_32.ts create mode 100644 user-service/node_modules/bson/src/long.ts create mode 100644 user-service/node_modules/bson/src/max_key.ts create mode 100644 user-service/node_modules/bson/src/min_key.ts create mode 100644 user-service/node_modules/bson/src/objectid.ts create mode 100644 user-service/node_modules/bson/src/parse_utf8.ts create mode 100644 user-service/node_modules/bson/src/parser/calculate_size.ts create mode 100644 user-service/node_modules/bson/src/parser/deserializer.ts create mode 100644 user-service/node_modules/bson/src/parser/on_demand/index.ts create mode 100644 user-service/node_modules/bson/src/parser/on_demand/parse_to_elements.ts create mode 100644 user-service/node_modules/bson/src/parser/serializer.ts create mode 100644 user-service/node_modules/bson/src/parser/utils.ts create mode 100644 user-service/node_modules/bson/src/regexp.ts create mode 100644 user-service/node_modules/bson/src/symbol.ts create mode 100644 user-service/node_modules/bson/src/timestamp.ts create mode 100644 user-service/node_modules/bson/src/utils/byte_utils.ts create mode 100644 user-service/node_modules/bson/src/utils/latin.ts create mode 100644 user-service/node_modules/bson/src/utils/node_byte_utils.ts create mode 100644 user-service/node_modules/bson/src/utils/number_utils.ts create mode 100644 user-service/node_modules/bson/src/utils/string_utils.ts create mode 100644 user-service/node_modules/bson/src/utils/web_byte_utils.ts create mode 100644 user-service/node_modules/bson/vendor/base64/LICENSE-MIT.txt create mode 100644 user-service/node_modules/bson/vendor/base64/README.md create mode 100644 user-service/node_modules/bson/vendor/base64/base64.js create mode 100644 user-service/node_modules/bson/vendor/base64/package.json create mode 100644 user-service/node_modules/bson/vendor/text-encoding/LICENSE.md create mode 100644 user-service/node_modules/bson/vendor/text-encoding/README.md create mode 100644 user-service/node_modules/bson/vendor/text-encoding/index.js create mode 100644 user-service/node_modules/bson/vendor/text-encoding/lib/encoding-indexes.js create mode 100644 user-service/node_modules/bson/vendor/text-encoding/lib/encoding.js create mode 100644 user-service/node_modules/bson/vendor/text-encoding/package.json create mode 100644 user-service/node_modules/buffer-equal-constant-time/.npmignore create mode 100644 user-service/node_modules/buffer-equal-constant-time/.travis.yml create mode 100644 user-service/node_modules/buffer-equal-constant-time/LICENSE.txt create mode 100644 user-service/node_modules/buffer-equal-constant-time/README.md create mode 100644 user-service/node_modules/buffer-equal-constant-time/index.js create mode 100644 user-service/node_modules/buffer-equal-constant-time/package.json create mode 100644 user-service/node_modules/buffer-equal-constant-time/test.js create mode 100644 user-service/node_modules/bytes/History.md create mode 100644 user-service/node_modules/bytes/LICENSE create mode 100644 user-service/node_modules/bytes/Readme.md create mode 100644 user-service/node_modules/bytes/index.js create mode 100644 user-service/node_modules/bytes/package.json create mode 100644 user-service/node_modules/call-bind/.eslintignore create mode 100644 user-service/node_modules/call-bind/.eslintrc create mode 100644 user-service/node_modules/call-bind/.github/FUNDING.yml create mode 100644 user-service/node_modules/call-bind/.nycrc create mode 100644 user-service/node_modules/call-bind/CHANGELOG.md create mode 100644 user-service/node_modules/call-bind/LICENSE create mode 100644 user-service/node_modules/call-bind/README.md create mode 100644 user-service/node_modules/call-bind/callBound.js create mode 100644 user-service/node_modules/call-bind/index.js create mode 100644 user-service/node_modules/call-bind/package.json create mode 100644 user-service/node_modules/call-bind/test/callBound.js create mode 100644 user-service/node_modules/call-bind/test/index.js create mode 100644 user-service/node_modules/chokidar/LICENSE create mode 100644 user-service/node_modules/chokidar/README.md create mode 100644 user-service/node_modules/chokidar/index.js create mode 100644 user-service/node_modules/chokidar/lib/constants.js create mode 100644 user-service/node_modules/chokidar/lib/fsevents-handler.js create mode 100644 user-service/node_modules/chokidar/lib/nodefs-handler.js create mode 100644 user-service/node_modules/chokidar/package.json create mode 100644 user-service/node_modules/chokidar/types/index.d.ts create mode 100644 user-service/node_modules/chownr/LICENSE create mode 100644 user-service/node_modules/chownr/README.md create mode 100644 user-service/node_modules/chownr/chownr.js create mode 100644 user-service/node_modules/chownr/package.json create mode 100644 user-service/node_modules/color-support/LICENSE create mode 100644 user-service/node_modules/color-support/README.md create mode 100755 user-service/node_modules/color-support/bin.js create mode 100644 user-service/node_modules/color-support/browser.js create mode 100644 user-service/node_modules/color-support/index.js create mode 100644 user-service/node_modules/color-support/package.json create mode 100644 user-service/node_modules/concat-map/.travis.yml create mode 100644 user-service/node_modules/concat-map/LICENSE create mode 100644 user-service/node_modules/concat-map/README.markdown create mode 100644 user-service/node_modules/concat-map/example/map.js create mode 100644 user-service/node_modules/concat-map/index.js create mode 100644 user-service/node_modules/concat-map/package.json create mode 100644 user-service/node_modules/concat-map/test/map.js create mode 100644 user-service/node_modules/console-control-strings/LICENSE create mode 100644 user-service/node_modules/console-control-strings/README.md create mode 100644 user-service/node_modules/console-control-strings/index.js create mode 100644 user-service/node_modules/console-control-strings/package.json create mode 100644 user-service/node_modules/content-disposition/HISTORY.md create mode 100644 user-service/node_modules/content-disposition/LICENSE create mode 100644 user-service/node_modules/content-disposition/README.md create mode 100644 user-service/node_modules/content-disposition/index.js create mode 100644 user-service/node_modules/content-disposition/package.json create mode 100644 user-service/node_modules/content-type/HISTORY.md create mode 100644 user-service/node_modules/content-type/LICENSE create mode 100644 user-service/node_modules/content-type/README.md create mode 100644 user-service/node_modules/content-type/index.js create mode 100644 user-service/node_modules/content-type/package.json create mode 100644 user-service/node_modules/cookie-signature/.npmignore create mode 100644 user-service/node_modules/cookie-signature/History.md create mode 100644 user-service/node_modules/cookie-signature/Readme.md create mode 100644 user-service/node_modules/cookie-signature/index.js create mode 100644 user-service/node_modules/cookie-signature/package.json create mode 100644 user-service/node_modules/cookie/HISTORY.md create mode 100644 user-service/node_modules/cookie/LICENSE create mode 100644 user-service/node_modules/cookie/README.md create mode 100644 user-service/node_modules/cookie/SECURITY.md create mode 100644 user-service/node_modules/cookie/index.js create mode 100644 user-service/node_modules/cookie/package.json create mode 100644 user-service/node_modules/cors/CONTRIBUTING.md create mode 100644 user-service/node_modules/cors/HISTORY.md create mode 100644 user-service/node_modules/cors/LICENSE create mode 100644 user-service/node_modules/cors/README.md create mode 100644 user-service/node_modules/cors/lib/index.js create mode 100644 user-service/node_modules/cors/package.json create mode 100644 user-service/node_modules/debug/.coveralls.yml create mode 100644 user-service/node_modules/debug/.eslintrc create mode 100644 user-service/node_modules/debug/.npmignore create mode 100644 user-service/node_modules/debug/.travis.yml create mode 100644 user-service/node_modules/debug/CHANGELOG.md create mode 100644 user-service/node_modules/debug/LICENSE create mode 100644 user-service/node_modules/debug/Makefile create mode 100644 user-service/node_modules/debug/README.md create mode 100644 user-service/node_modules/debug/component.json create mode 100644 user-service/node_modules/debug/karma.conf.js create mode 100644 user-service/node_modules/debug/node.js create mode 100644 user-service/node_modules/debug/package.json create mode 100644 user-service/node_modules/debug/src/browser.js create mode 100644 user-service/node_modules/debug/src/debug.js create mode 100644 user-service/node_modules/debug/src/index.js create mode 100644 user-service/node_modules/debug/src/inspector-log.js create mode 100644 user-service/node_modules/debug/src/node.js create mode 100644 user-service/node_modules/define-data-property/.eslintrc create mode 100644 user-service/node_modules/define-data-property/.github/FUNDING.yml create mode 100644 user-service/node_modules/define-data-property/.nycrc create mode 100644 user-service/node_modules/define-data-property/CHANGELOG.md create mode 100644 user-service/node_modules/define-data-property/LICENSE create mode 100644 user-service/node_modules/define-data-property/README.md create mode 100644 user-service/node_modules/define-data-property/index.d.ts create mode 100644 user-service/node_modules/define-data-property/index.js create mode 100644 user-service/node_modules/define-data-property/package.json create mode 100644 user-service/node_modules/define-data-property/test/index.js create mode 100644 user-service/node_modules/define-data-property/tsconfig.json create mode 100644 user-service/node_modules/delegates/.npmignore create mode 100644 user-service/node_modules/delegates/History.md create mode 100644 user-service/node_modules/delegates/License create mode 100644 user-service/node_modules/delegates/Makefile create mode 100644 user-service/node_modules/delegates/Readme.md create mode 100644 user-service/node_modules/delegates/index.js create mode 100644 user-service/node_modules/delegates/package.json create mode 100644 user-service/node_modules/delegates/test/index.js create mode 100644 user-service/node_modules/depd/History.md create mode 100644 user-service/node_modules/depd/LICENSE create mode 100644 user-service/node_modules/depd/Readme.md create mode 100644 user-service/node_modules/depd/index.js create mode 100644 user-service/node_modules/depd/lib/browser/index.js create mode 100644 user-service/node_modules/depd/package.json create mode 100644 user-service/node_modules/destroy/LICENSE create mode 100644 user-service/node_modules/destroy/README.md create mode 100644 user-service/node_modules/destroy/index.js create mode 100644 user-service/node_modules/destroy/package.json create mode 100644 user-service/node_modules/detect-libc/LICENSE create mode 100644 user-service/node_modules/detect-libc/README.md create mode 100644 user-service/node_modules/detect-libc/index.d.ts create mode 100644 user-service/node_modules/detect-libc/lib/detect-libc.js create mode 100644 user-service/node_modules/detect-libc/lib/filesystem.js create mode 100644 user-service/node_modules/detect-libc/lib/process.js create mode 100644 user-service/node_modules/detect-libc/package.json create mode 100644 user-service/node_modules/dotenv/CHANGELOG.md create mode 100644 user-service/node_modules/dotenv/LICENSE create mode 100644 user-service/node_modules/dotenv/README-es.md create mode 100644 user-service/node_modules/dotenv/README.md create mode 100644 user-service/node_modules/dotenv/config.d.ts create mode 100644 user-service/node_modules/dotenv/config.js create mode 100644 user-service/node_modules/dotenv/lib/cli-options.js create mode 100644 user-service/node_modules/dotenv/lib/env-options.js create mode 100644 user-service/node_modules/dotenv/lib/main.d.ts create mode 100644 user-service/node_modules/dotenv/lib/main.js create mode 100644 user-service/node_modules/dotenv/package.json create mode 100644 user-service/node_modules/ecdsa-sig-formatter/CODEOWNERS create mode 100644 user-service/node_modules/ecdsa-sig-formatter/LICENSE create mode 100644 user-service/node_modules/ecdsa-sig-formatter/README.md create mode 100644 user-service/node_modules/ecdsa-sig-formatter/package.json create mode 100644 user-service/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.d.ts create mode 100644 user-service/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js create mode 100644 user-service/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js create mode 100644 user-service/node_modules/ee-first/LICENSE create mode 100644 user-service/node_modules/ee-first/README.md create mode 100644 user-service/node_modules/ee-first/index.js create mode 100644 user-service/node_modules/ee-first/package.json create mode 100644 user-service/node_modules/emoji-regex/LICENSE-MIT.txt create mode 100644 user-service/node_modules/emoji-regex/README.md create mode 100644 user-service/node_modules/emoji-regex/es2015/index.js create mode 100644 user-service/node_modules/emoji-regex/es2015/text.js create mode 100644 user-service/node_modules/emoji-regex/index.d.ts create mode 100644 user-service/node_modules/emoji-regex/index.js create mode 100644 user-service/node_modules/emoji-regex/package.json create mode 100644 user-service/node_modules/emoji-regex/text.js create mode 100644 user-service/node_modules/encodeurl/HISTORY.md create mode 100644 user-service/node_modules/encodeurl/LICENSE create mode 100644 user-service/node_modules/encodeurl/README.md create mode 100644 user-service/node_modules/encodeurl/index.js create mode 100644 user-service/node_modules/encodeurl/package.json create mode 100644 user-service/node_modules/es-define-property/.eslintrc create mode 100644 user-service/node_modules/es-define-property/.github/FUNDING.yml create mode 100644 user-service/node_modules/es-define-property/.nycrc create mode 100644 user-service/node_modules/es-define-property/CHANGELOG.md create mode 100644 user-service/node_modules/es-define-property/LICENSE create mode 100644 user-service/node_modules/es-define-property/README.md create mode 100644 user-service/node_modules/es-define-property/index.d.ts create mode 100644 user-service/node_modules/es-define-property/index.js create mode 100644 user-service/node_modules/es-define-property/package.json create mode 100644 user-service/node_modules/es-define-property/test/index.js create mode 100644 user-service/node_modules/es-define-property/tsconfig.json create mode 100644 user-service/node_modules/es-errors/.eslintrc create mode 100644 user-service/node_modules/es-errors/.github/FUNDING.yml create mode 100644 user-service/node_modules/es-errors/CHANGELOG.md create mode 100644 user-service/node_modules/es-errors/LICENSE create mode 100644 user-service/node_modules/es-errors/README.md create mode 100644 user-service/node_modules/es-errors/eval.d.ts create mode 100644 user-service/node_modules/es-errors/eval.js create mode 100644 user-service/node_modules/es-errors/index.d.ts create mode 100644 user-service/node_modules/es-errors/index.js create mode 100644 user-service/node_modules/es-errors/package.json create mode 100644 user-service/node_modules/es-errors/range.d.ts create mode 100644 user-service/node_modules/es-errors/range.js create mode 100644 user-service/node_modules/es-errors/ref.d.ts create mode 100644 user-service/node_modules/es-errors/ref.js create mode 100644 user-service/node_modules/es-errors/syntax.d.ts create mode 100644 user-service/node_modules/es-errors/syntax.js create mode 100644 user-service/node_modules/es-errors/test/index.js create mode 100644 user-service/node_modules/es-errors/tsconfig.json create mode 100644 user-service/node_modules/es-errors/type.d.ts create mode 100644 user-service/node_modules/es-errors/type.js create mode 100644 user-service/node_modules/es-errors/uri.d.ts create mode 100644 user-service/node_modules/es-errors/uri.js create mode 100644 user-service/node_modules/escape-html/LICENSE create mode 100644 user-service/node_modules/escape-html/Readme.md create mode 100644 user-service/node_modules/escape-html/index.js create mode 100644 user-service/node_modules/escape-html/package.json create mode 100644 user-service/node_modules/etag/HISTORY.md create mode 100644 user-service/node_modules/etag/LICENSE create mode 100644 user-service/node_modules/etag/README.md create mode 100644 user-service/node_modules/etag/index.js create mode 100644 user-service/node_modules/etag/package.json create mode 100644 user-service/node_modules/express/History.md create mode 100644 user-service/node_modules/express/LICENSE create mode 100644 user-service/node_modules/express/Readme.md create mode 100644 user-service/node_modules/express/index.js create mode 100644 user-service/node_modules/express/lib/application.js create mode 100644 user-service/node_modules/express/lib/express.js create mode 100644 user-service/node_modules/express/lib/middleware/init.js create mode 100644 user-service/node_modules/express/lib/middleware/query.js create mode 100644 user-service/node_modules/express/lib/request.js create mode 100644 user-service/node_modules/express/lib/response.js create mode 100644 user-service/node_modules/express/lib/router/index.js create mode 100644 user-service/node_modules/express/lib/router/layer.js create mode 100644 user-service/node_modules/express/lib/router/route.js create mode 100644 user-service/node_modules/express/lib/utils.js create mode 100644 user-service/node_modules/express/lib/view.js create mode 100644 user-service/node_modules/express/package.json create mode 100644 user-service/node_modules/fill-range/LICENSE create mode 100644 user-service/node_modules/fill-range/README.md create mode 100644 user-service/node_modules/fill-range/index.js create mode 100644 user-service/node_modules/fill-range/package.json create mode 100644 user-service/node_modules/finalhandler/HISTORY.md create mode 100644 user-service/node_modules/finalhandler/LICENSE create mode 100644 user-service/node_modules/finalhandler/README.md create mode 100644 user-service/node_modules/finalhandler/SECURITY.md create mode 100644 user-service/node_modules/finalhandler/index.js create mode 100644 user-service/node_modules/finalhandler/package.json create mode 100644 user-service/node_modules/forwarded/HISTORY.md create mode 100644 user-service/node_modules/forwarded/LICENSE create mode 100644 user-service/node_modules/forwarded/README.md create mode 100644 user-service/node_modules/forwarded/index.js create mode 100644 user-service/node_modules/forwarded/package.json create mode 100644 user-service/node_modules/fresh/HISTORY.md create mode 100644 user-service/node_modules/fresh/LICENSE create mode 100644 user-service/node_modules/fresh/README.md create mode 100644 user-service/node_modules/fresh/index.js create mode 100644 user-service/node_modules/fresh/package.json create mode 100644 user-service/node_modules/fs-minipass/LICENSE create mode 100644 user-service/node_modules/fs-minipass/README.md create mode 100644 user-service/node_modules/fs-minipass/index.js create mode 100644 user-service/node_modules/fs-minipass/node_modules/minipass/LICENSE create mode 100644 user-service/node_modules/fs-minipass/node_modules/minipass/README.md create mode 100644 user-service/node_modules/fs-minipass/node_modules/minipass/index.d.ts create mode 100644 user-service/node_modules/fs-minipass/node_modules/minipass/index.js create mode 100644 user-service/node_modules/fs-minipass/node_modules/minipass/package.json create mode 100644 user-service/node_modules/fs-minipass/package.json create mode 100644 user-service/node_modules/fs.realpath/LICENSE create mode 100644 user-service/node_modules/fs.realpath/README.md create mode 100644 user-service/node_modules/fs.realpath/index.js create mode 100644 user-service/node_modules/fs.realpath/old.js create mode 100644 user-service/node_modules/fs.realpath/package.json create mode 100644 user-service/node_modules/fsevents/LICENSE create mode 100644 user-service/node_modules/fsevents/README.md create mode 100644 user-service/node_modules/fsevents/fsevents.d.ts create mode 100644 user-service/node_modules/fsevents/fsevents.js create mode 100755 user-service/node_modules/fsevents/fsevents.node create mode 100644 user-service/node_modules/fsevents/package.json create mode 100644 user-service/node_modules/function-bind/.eslintrc create mode 100644 user-service/node_modules/function-bind/.github/FUNDING.yml create mode 100644 user-service/node_modules/function-bind/.github/SECURITY.md create mode 100644 user-service/node_modules/function-bind/.nycrc create mode 100644 user-service/node_modules/function-bind/CHANGELOG.md create mode 100644 user-service/node_modules/function-bind/LICENSE create mode 100644 user-service/node_modules/function-bind/README.md create mode 100644 user-service/node_modules/function-bind/implementation.js create mode 100644 user-service/node_modules/function-bind/index.js create mode 100644 user-service/node_modules/function-bind/package.json create mode 100644 user-service/node_modules/function-bind/test/.eslintrc create mode 100644 user-service/node_modules/function-bind/test/index.js create mode 100644 user-service/node_modules/gauge/CHANGELOG.md create mode 100644 user-service/node_modules/gauge/LICENSE create mode 100644 user-service/node_modules/gauge/README.md create mode 100644 user-service/node_modules/gauge/base-theme.js create mode 100644 user-service/node_modules/gauge/error.js create mode 100644 user-service/node_modules/gauge/has-color.js create mode 100644 user-service/node_modules/gauge/index.js create mode 100644 user-service/node_modules/gauge/package.json create mode 100644 user-service/node_modules/gauge/plumbing.js create mode 100644 user-service/node_modules/gauge/process.js create mode 100644 user-service/node_modules/gauge/progress-bar.js create mode 100644 user-service/node_modules/gauge/render-template.js create mode 100644 user-service/node_modules/gauge/set-immediate.js create mode 100644 user-service/node_modules/gauge/set-interval.js create mode 100644 user-service/node_modules/gauge/spin.js create mode 100644 user-service/node_modules/gauge/template-item.js create mode 100644 user-service/node_modules/gauge/theme-set.js create mode 100644 user-service/node_modules/gauge/themes.js create mode 100644 user-service/node_modules/gauge/wide-truncate.js create mode 100644 user-service/node_modules/get-intrinsic/.eslintrc create mode 100644 user-service/node_modules/get-intrinsic/.github/FUNDING.yml create mode 100644 user-service/node_modules/get-intrinsic/.nycrc create mode 100644 user-service/node_modules/get-intrinsic/CHANGELOG.md create mode 100644 user-service/node_modules/get-intrinsic/LICENSE create mode 100644 user-service/node_modules/get-intrinsic/README.md create mode 100644 user-service/node_modules/get-intrinsic/index.js create mode 100644 user-service/node_modules/get-intrinsic/package.json create mode 100644 user-service/node_modules/get-intrinsic/test/GetIntrinsic.js create mode 100644 user-service/node_modules/glob-parent/CHANGELOG.md create mode 100644 user-service/node_modules/glob-parent/LICENSE create mode 100644 user-service/node_modules/glob-parent/README.md create mode 100644 user-service/node_modules/glob-parent/index.js create mode 100644 user-service/node_modules/glob-parent/package.json create mode 100644 user-service/node_modules/glob/LICENSE create mode 100644 user-service/node_modules/glob/README.md create mode 100644 user-service/node_modules/glob/common.js create mode 100644 user-service/node_modules/glob/glob.js create mode 100644 user-service/node_modules/glob/package.json create mode 100644 user-service/node_modules/glob/sync.js create mode 100644 user-service/node_modules/gopd/.eslintrc create mode 100644 user-service/node_modules/gopd/.github/FUNDING.yml create mode 100644 user-service/node_modules/gopd/CHANGELOG.md create mode 100644 user-service/node_modules/gopd/LICENSE create mode 100644 user-service/node_modules/gopd/README.md create mode 100644 user-service/node_modules/gopd/index.js create mode 100644 user-service/node_modules/gopd/package.json create mode 100644 user-service/node_modules/gopd/test/index.js create mode 100644 user-service/node_modules/has-flag/index.js create mode 100644 user-service/node_modules/has-flag/license create mode 100644 user-service/node_modules/has-flag/package.json create mode 100644 user-service/node_modules/has-flag/readme.md create mode 100644 user-service/node_modules/has-property-descriptors/.eslintrc create mode 100644 user-service/node_modules/has-property-descriptors/.github/FUNDING.yml create mode 100644 user-service/node_modules/has-property-descriptors/.nycrc create mode 100644 user-service/node_modules/has-property-descriptors/CHANGELOG.md create mode 100644 user-service/node_modules/has-property-descriptors/LICENSE create mode 100644 user-service/node_modules/has-property-descriptors/README.md create mode 100644 user-service/node_modules/has-property-descriptors/index.js create mode 100644 user-service/node_modules/has-property-descriptors/package.json create mode 100644 user-service/node_modules/has-property-descriptors/test/index.js create mode 100644 user-service/node_modules/has-proto/.eslintrc create mode 100644 user-service/node_modules/has-proto/.github/FUNDING.yml create mode 100644 user-service/node_modules/has-proto/CHANGELOG.md create mode 100644 user-service/node_modules/has-proto/LICENSE create mode 100644 user-service/node_modules/has-proto/README.md create mode 100644 user-service/node_modules/has-proto/index.d.ts create mode 100644 user-service/node_modules/has-proto/index.js create mode 100644 user-service/node_modules/has-proto/package.json create mode 100644 user-service/node_modules/has-proto/test/index.js create mode 100644 user-service/node_modules/has-proto/tsconfig.json create mode 100644 user-service/node_modules/has-symbols/.eslintrc create mode 100644 user-service/node_modules/has-symbols/.github/FUNDING.yml create mode 100644 user-service/node_modules/has-symbols/.nycrc create mode 100644 user-service/node_modules/has-symbols/CHANGELOG.md create mode 100644 user-service/node_modules/has-symbols/LICENSE create mode 100644 user-service/node_modules/has-symbols/README.md create mode 100644 user-service/node_modules/has-symbols/index.js create mode 100644 user-service/node_modules/has-symbols/package.json create mode 100644 user-service/node_modules/has-symbols/shams.js create mode 100644 user-service/node_modules/has-symbols/test/index.js create mode 100644 user-service/node_modules/has-symbols/test/shams/core-js.js create mode 100644 user-service/node_modules/has-symbols/test/shams/get-own-property-symbols.js create mode 100644 user-service/node_modules/has-symbols/test/tests.js create mode 100644 user-service/node_modules/has-unicode/LICENSE create mode 100644 user-service/node_modules/has-unicode/README.md create mode 100644 user-service/node_modules/has-unicode/index.js create mode 100644 user-service/node_modules/has-unicode/package.json create mode 100644 user-service/node_modules/hasown/.eslintrc create mode 100644 user-service/node_modules/hasown/.github/FUNDING.yml create mode 100644 user-service/node_modules/hasown/.nycrc create mode 100644 user-service/node_modules/hasown/CHANGELOG.md create mode 100644 user-service/node_modules/hasown/LICENSE create mode 100644 user-service/node_modules/hasown/README.md create mode 100644 user-service/node_modules/hasown/index.d.ts create mode 100644 user-service/node_modules/hasown/index.js create mode 100644 user-service/node_modules/hasown/package.json create mode 100644 user-service/node_modules/hasown/tsconfig.json create mode 100644 user-service/node_modules/http-errors/HISTORY.md create mode 100644 user-service/node_modules/http-errors/LICENSE create mode 100644 user-service/node_modules/http-errors/README.md create mode 100644 user-service/node_modules/http-errors/index.js create mode 100644 user-service/node_modules/http-errors/package.json create mode 100644 user-service/node_modules/https-proxy-agent/README.md create mode 100644 user-service/node_modules/https-proxy-agent/dist/agent.d.ts create mode 100644 user-service/node_modules/https-proxy-agent/dist/agent.js create mode 100644 user-service/node_modules/https-proxy-agent/dist/agent.js.map create mode 100644 user-service/node_modules/https-proxy-agent/dist/index.d.ts create mode 100644 user-service/node_modules/https-proxy-agent/dist/index.js create mode 100644 user-service/node_modules/https-proxy-agent/dist/index.js.map create mode 100644 user-service/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts create mode 100644 user-service/node_modules/https-proxy-agent/dist/parse-proxy-response.js create mode 100644 user-service/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/LICENSE create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/README.md create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/package.json create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/src/browser.js create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/src/common.js create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/src/index.js create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/debug/src/node.js create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/ms/index.js create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/ms/license.md create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/ms/package.json create mode 100644 user-service/node_modules/https-proxy-agent/node_modules/ms/readme.md create mode 100644 user-service/node_modules/https-proxy-agent/package.json create mode 100644 user-service/node_modules/iconv-lite/Changelog.md create mode 100644 user-service/node_modules/iconv-lite/LICENSE create mode 100644 user-service/node_modules/iconv-lite/README.md create mode 100644 user-service/node_modules/iconv-lite/encodings/dbcs-codec.js create mode 100644 user-service/node_modules/iconv-lite/encodings/dbcs-data.js create mode 100644 user-service/node_modules/iconv-lite/encodings/index.js create mode 100644 user-service/node_modules/iconv-lite/encodings/internal.js create mode 100644 user-service/node_modules/iconv-lite/encodings/sbcs-codec.js create mode 100644 user-service/node_modules/iconv-lite/encodings/sbcs-data-generated.js create mode 100644 user-service/node_modules/iconv-lite/encodings/sbcs-data.js create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/big5-added.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/cp936.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/cp949.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/cp950.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/eucjp.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/gbk-added.json create mode 100644 user-service/node_modules/iconv-lite/encodings/tables/shiftjis.json create mode 100644 user-service/node_modules/iconv-lite/encodings/utf16.js create mode 100644 user-service/node_modules/iconv-lite/encodings/utf7.js create mode 100644 user-service/node_modules/iconv-lite/lib/bom-handling.js create mode 100644 user-service/node_modules/iconv-lite/lib/extend-node.js create mode 100644 user-service/node_modules/iconv-lite/lib/index.d.ts create mode 100644 user-service/node_modules/iconv-lite/lib/index.js create mode 100644 user-service/node_modules/iconv-lite/lib/streams.js create mode 100644 user-service/node_modules/iconv-lite/package.json create mode 100644 user-service/node_modules/ignore-by-default/LICENSE create mode 100644 user-service/node_modules/ignore-by-default/README.md create mode 100644 user-service/node_modules/ignore-by-default/index.js create mode 100644 user-service/node_modules/ignore-by-default/package.json create mode 100644 user-service/node_modules/inflight/LICENSE create mode 100644 user-service/node_modules/inflight/README.md create mode 100644 user-service/node_modules/inflight/inflight.js create mode 100644 user-service/node_modules/inflight/package.json create mode 100644 user-service/node_modules/inherits/LICENSE create mode 100644 user-service/node_modules/inherits/README.md create mode 100644 user-service/node_modules/inherits/inherits.js create mode 100644 user-service/node_modules/inherits/inherits_browser.js create mode 100644 user-service/node_modules/inherits/package.json create mode 100644 user-service/node_modules/ipaddr.js/LICENSE create mode 100644 user-service/node_modules/ipaddr.js/README.md create mode 100644 user-service/node_modules/ipaddr.js/ipaddr.min.js create mode 100644 user-service/node_modules/ipaddr.js/lib/ipaddr.js create mode 100644 user-service/node_modules/ipaddr.js/lib/ipaddr.js.d.ts create mode 100644 user-service/node_modules/ipaddr.js/package.json create mode 100644 user-service/node_modules/is-binary-path/index.d.ts create mode 100644 user-service/node_modules/is-binary-path/index.js create mode 100644 user-service/node_modules/is-binary-path/license create mode 100644 user-service/node_modules/is-binary-path/package.json create mode 100644 user-service/node_modules/is-binary-path/readme.md create mode 100644 user-service/node_modules/is-extglob/LICENSE create mode 100644 user-service/node_modules/is-extglob/README.md create mode 100644 user-service/node_modules/is-extglob/index.js create mode 100644 user-service/node_modules/is-extglob/package.json create mode 100644 user-service/node_modules/is-fullwidth-code-point/index.d.ts create mode 100644 user-service/node_modules/is-fullwidth-code-point/index.js create mode 100644 user-service/node_modules/is-fullwidth-code-point/license create mode 100644 user-service/node_modules/is-fullwidth-code-point/package.json create mode 100644 user-service/node_modules/is-fullwidth-code-point/readme.md create mode 100644 user-service/node_modules/is-glob/LICENSE create mode 100644 user-service/node_modules/is-glob/README.md create mode 100644 user-service/node_modules/is-glob/index.js create mode 100644 user-service/node_modules/is-glob/package.json create mode 100644 user-service/node_modules/is-number/LICENSE create mode 100644 user-service/node_modules/is-number/README.md create mode 100644 user-service/node_modules/is-number/index.js create mode 100644 user-service/node_modules/is-number/package.json create mode 100644 user-service/node_modules/jsonwebtoken/LICENSE create mode 100644 user-service/node_modules/jsonwebtoken/README.md create mode 100644 user-service/node_modules/jsonwebtoken/decode.js create mode 100644 user-service/node_modules/jsonwebtoken/index.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/JsonWebTokenError.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/NotBeforeError.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/TokenExpiredError.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/psSupported.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/timespan.js create mode 100644 user-service/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js create mode 100644 user-service/node_modules/jsonwebtoken/node_modules/ms/index.js create mode 100644 user-service/node_modules/jsonwebtoken/node_modules/ms/license.md create mode 100644 user-service/node_modules/jsonwebtoken/node_modules/ms/package.json create mode 100644 user-service/node_modules/jsonwebtoken/node_modules/ms/readme.md create mode 100644 user-service/node_modules/jsonwebtoken/package.json create mode 100644 user-service/node_modules/jsonwebtoken/sign.js create mode 100644 user-service/node_modules/jsonwebtoken/verify.js create mode 100644 user-service/node_modules/jwa/LICENSE create mode 100644 user-service/node_modules/jwa/README.md create mode 100644 user-service/node_modules/jwa/index.js create mode 100644 user-service/node_modules/jwa/package.json create mode 100644 user-service/node_modules/jws/CHANGELOG.md create mode 100644 user-service/node_modules/jws/LICENSE create mode 100644 user-service/node_modules/jws/index.js create mode 100644 user-service/node_modules/jws/lib/data-stream.js create mode 100644 user-service/node_modules/jws/lib/sign-stream.js create mode 100644 user-service/node_modules/jws/lib/tostring.js create mode 100644 user-service/node_modules/jws/lib/verify-stream.js create mode 100644 user-service/node_modules/jws/package.json create mode 100644 user-service/node_modules/jws/readme.md create mode 100644 user-service/node_modules/kareem/CHANGELOG.md create mode 100644 user-service/node_modules/kareem/LICENSE create mode 100644 user-service/node_modules/kareem/README.md create mode 100644 user-service/node_modules/kareem/SECURITY.md create mode 100644 user-service/node_modules/kareem/index.d.ts create mode 100644 user-service/node_modules/kareem/index.js create mode 100644 user-service/node_modules/kareem/package.json create mode 100644 user-service/node_modules/lodash.includes/LICENSE create mode 100644 user-service/node_modules/lodash.includes/README.md create mode 100644 user-service/node_modules/lodash.includes/index.js create mode 100644 user-service/node_modules/lodash.includes/package.json create mode 100644 user-service/node_modules/lodash.isboolean/LICENSE create mode 100644 user-service/node_modules/lodash.isboolean/README.md create mode 100644 user-service/node_modules/lodash.isboolean/index.js create mode 100644 user-service/node_modules/lodash.isboolean/package.json create mode 100644 user-service/node_modules/lodash.isinteger/LICENSE create mode 100644 user-service/node_modules/lodash.isinteger/README.md create mode 100644 user-service/node_modules/lodash.isinteger/index.js create mode 100644 user-service/node_modules/lodash.isinteger/package.json create mode 100644 user-service/node_modules/lodash.isnumber/LICENSE create mode 100644 user-service/node_modules/lodash.isnumber/README.md create mode 100644 user-service/node_modules/lodash.isnumber/index.js create mode 100644 user-service/node_modules/lodash.isnumber/package.json create mode 100644 user-service/node_modules/lodash.isplainobject/LICENSE create mode 100644 user-service/node_modules/lodash.isplainobject/README.md create mode 100644 user-service/node_modules/lodash.isplainobject/index.js create mode 100644 user-service/node_modules/lodash.isplainobject/package.json create mode 100644 user-service/node_modules/lodash.isstring/LICENSE create mode 100644 user-service/node_modules/lodash.isstring/README.md create mode 100644 user-service/node_modules/lodash.isstring/index.js create mode 100644 user-service/node_modules/lodash.isstring/package.json create mode 100644 user-service/node_modules/lodash.once/LICENSE create mode 100644 user-service/node_modules/lodash.once/README.md create mode 100644 user-service/node_modules/lodash.once/index.js create mode 100644 user-service/node_modules/lodash.once/package.json create mode 100644 user-service/node_modules/make-dir/index.d.ts create mode 100644 user-service/node_modules/make-dir/index.js create mode 100644 user-service/node_modules/make-dir/license create mode 120000 user-service/node_modules/make-dir/node_modules/.bin/semver create mode 100644 user-service/node_modules/make-dir/node_modules/semver/LICENSE create mode 100644 user-service/node_modules/make-dir/node_modules/semver/README.md create mode 100755 user-service/node_modules/make-dir/node_modules/semver/bin/semver.js create mode 100644 user-service/node_modules/make-dir/node_modules/semver/package.json create mode 100644 user-service/node_modules/make-dir/node_modules/semver/range.bnf create mode 100644 user-service/node_modules/make-dir/node_modules/semver/semver.js create mode 100644 user-service/node_modules/make-dir/package.json create mode 100644 user-service/node_modules/make-dir/readme.md create mode 100644 user-service/node_modules/media-typer/HISTORY.md create mode 100644 user-service/node_modules/media-typer/LICENSE create mode 100644 user-service/node_modules/media-typer/README.md create mode 100644 user-service/node_modules/media-typer/index.js create mode 100644 user-service/node_modules/media-typer/package.json create mode 100644 user-service/node_modules/memory-pager/.travis.yml create mode 100644 user-service/node_modules/memory-pager/LICENSE create mode 100644 user-service/node_modules/memory-pager/README.md create mode 100644 user-service/node_modules/memory-pager/index.js create mode 100644 user-service/node_modules/memory-pager/package.json create mode 100644 user-service/node_modules/memory-pager/test.js create mode 100644 user-service/node_modules/merge-descriptors/HISTORY.md create mode 100644 user-service/node_modules/merge-descriptors/LICENSE create mode 100644 user-service/node_modules/merge-descriptors/README.md create mode 100644 user-service/node_modules/merge-descriptors/index.js create mode 100644 user-service/node_modules/merge-descriptors/package.json create mode 100644 user-service/node_modules/methods/HISTORY.md create mode 100644 user-service/node_modules/methods/LICENSE create mode 100644 user-service/node_modules/methods/README.md create mode 100644 user-service/node_modules/methods/index.js create mode 100644 user-service/node_modules/methods/package.json create mode 100644 user-service/node_modules/mime-db/HISTORY.md create mode 100644 user-service/node_modules/mime-db/LICENSE create mode 100644 user-service/node_modules/mime-db/README.md create mode 100644 user-service/node_modules/mime-db/db.json create mode 100644 user-service/node_modules/mime-db/index.js create mode 100644 user-service/node_modules/mime-db/package.json create mode 100644 user-service/node_modules/mime-types/HISTORY.md create mode 100644 user-service/node_modules/mime-types/LICENSE create mode 100644 user-service/node_modules/mime-types/README.md create mode 100644 user-service/node_modules/mime-types/index.js create mode 100644 user-service/node_modules/mime-types/package.json create mode 100644 user-service/node_modules/mime/.npmignore create mode 100644 user-service/node_modules/mime/CHANGELOG.md create mode 100644 user-service/node_modules/mime/LICENSE create mode 100644 user-service/node_modules/mime/README.md create mode 100755 user-service/node_modules/mime/cli.js create mode 100644 user-service/node_modules/mime/mime.js create mode 100644 user-service/node_modules/mime/package.json create mode 100755 user-service/node_modules/mime/src/build.js create mode 100644 user-service/node_modules/mime/src/test.js create mode 100644 user-service/node_modules/mime/types.json create mode 100644 user-service/node_modules/minimatch/LICENSE create mode 100644 user-service/node_modules/minimatch/README.md create mode 100644 user-service/node_modules/minimatch/minimatch.js create mode 100644 user-service/node_modules/minimatch/package.json create mode 100644 user-service/node_modules/minipass/LICENSE create mode 100644 user-service/node_modules/minipass/README.md create mode 100644 user-service/node_modules/minipass/index.d.ts create mode 100644 user-service/node_modules/minipass/index.js create mode 100644 user-service/node_modules/minipass/index.mjs create mode 100644 user-service/node_modules/minipass/package.json create mode 100644 user-service/node_modules/minizlib/LICENSE create mode 100644 user-service/node_modules/minizlib/README.md create mode 100644 user-service/node_modules/minizlib/constants.js create mode 100644 user-service/node_modules/minizlib/index.js create mode 100644 user-service/node_modules/minizlib/node_modules/minipass/LICENSE create mode 100644 user-service/node_modules/minizlib/node_modules/minipass/README.md create mode 100644 user-service/node_modules/minizlib/node_modules/minipass/index.d.ts create mode 100644 user-service/node_modules/minizlib/node_modules/minipass/index.js create mode 100644 user-service/node_modules/minizlib/node_modules/minipass/package.json create mode 100644 user-service/node_modules/minizlib/package.json create mode 100644 user-service/node_modules/mkdirp/CHANGELOG.md create mode 100644 user-service/node_modules/mkdirp/LICENSE create mode 100755 user-service/node_modules/mkdirp/bin/cmd.js create mode 100644 user-service/node_modules/mkdirp/index.js create mode 100644 user-service/node_modules/mkdirp/lib/find-made.js create mode 100644 user-service/node_modules/mkdirp/lib/mkdirp-manual.js create mode 100644 user-service/node_modules/mkdirp/lib/mkdirp-native.js create mode 100644 user-service/node_modules/mkdirp/lib/opts-arg.js create mode 100644 user-service/node_modules/mkdirp/lib/path-arg.js create mode 100644 user-service/node_modules/mkdirp/lib/use-native.js create mode 100644 user-service/node_modules/mkdirp/package.json create mode 100644 user-service/node_modules/mkdirp/readme.markdown create mode 100644 user-service/node_modules/mongodb-connection-string-url/.esm-wrapper.mjs create mode 100644 user-service/node_modules/mongodb-connection-string-url/LICENSE create mode 100644 user-service/node_modules/mongodb-connection-string-url/README.md create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/index.d.ts create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/index.js create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/index.js.map create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/redact.d.ts create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/redact.js create mode 100644 user-service/node_modules/mongodb-connection-string-url/lib/redact.js.map create mode 100644 user-service/node_modules/mongodb-connection-string-url/package.json create mode 100644 user-service/node_modules/mongodb/LICENSE.md create mode 100644 user-service/node_modules/mongodb/README.md create mode 100755 user-service/node_modules/mongodb/etc/prepare.js create mode 100644 user-service/node_modules/mongodb/lib/admin.js create mode 100644 user-service/node_modules/mongodb/lib/admin.js.map create mode 100644 user-service/node_modules/mongodb/lib/bson.js create mode 100644 user-service/node_modules/mongodb/lib/bson.js.map create mode 100644 user-service/node_modules/mongodb/lib/bulk/common.js create mode 100644 user-service/node_modules/mongodb/lib/bulk/common.js.map create mode 100644 user-service/node_modules/mongodb/lib/bulk/ordered.js create mode 100644 user-service/node_modules/mongodb/lib/bulk/ordered.js.map create mode 100644 user-service/node_modules/mongodb/lib/bulk/unordered.js create mode 100644 user-service/node_modules/mongodb/lib/bulk/unordered.js.map create mode 100644 user-service/node_modules/mongodb/lib/change_stream.js create mode 100644 user-service/node_modules/mongodb/lib/change_stream.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/auto_encrypter.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/auto_encrypter.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/client_encryption.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/client_encryption.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/crypto_callbacks.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/crypto_callbacks.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/errors.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/errors.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/mongocryptd_manager.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/mongocryptd_manager.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/aws.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/aws.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/azure.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/azure.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/gcp.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/gcp.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/index.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/providers/index.js.map create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/state_machine.js create mode 100644 user-service/node_modules/mongodb/lib/client-side-encryption/state_machine.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/auth_provider.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/auth_provider.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/aws_temporary_credentials.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/aws_temporary_credentials.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/gssapi.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/gssapi.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongo_credentials.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongo_credentials.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongocr.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongocr.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_aws.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_aws.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/automated_callback_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/azure_machine_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/callback_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/command_builders.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/gcp_machine_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/human_callback_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/machine_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/machine_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/token_cache.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/mongodb_oidc/token_machine_workflow.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/plain.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/plain.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/providers.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/providers.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/scram.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/scram.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/x509.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/auth/x509.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/command_monitoring_events.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/command_monitoring_events.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/commands.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/commands.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/connect.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/connect.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection_pool.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection_pool.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection_pool_events.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/connection_pool_events.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/errors.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/errors.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/handshake/client_metadata.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/handshake/client_metadata.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/metrics.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/metrics.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/stream_description.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/stream_description.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/compression.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/compression.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/constants.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/constants.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/on_data.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/on_data.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/on_demand/document.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/on_demand/document.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/responses.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/responses.js.map create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/shared.js create mode 100644 user-service/node_modules/mongodb/lib/cmap/wire_protocol/shared.js.map create mode 100644 user-service/node_modules/mongodb/lib/collection.js create mode 100644 user-service/node_modules/mongodb/lib/collection.js.map create mode 100644 user-service/node_modules/mongodb/lib/connection_string.js create mode 100644 user-service/node_modules/mongodb/lib/connection_string.js.map create mode 100644 user-service/node_modules/mongodb/lib/constants.js create mode 100644 user-service/node_modules/mongodb/lib/constants.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/abstract_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/abstract_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/aggregation_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/aggregation_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/change_stream_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/change_stream_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/find_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/find_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_collections_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_collections_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_indexes_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_indexes_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_search_indexes_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/list_search_indexes_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/cursor/run_command_cursor.js create mode 100644 user-service/node_modules/mongodb/lib/cursor/run_command_cursor.js.map create mode 100644 user-service/node_modules/mongodb/lib/db.js create mode 100644 user-service/node_modules/mongodb/lib/db.js.map create mode 100644 user-service/node_modules/mongodb/lib/deps.js create mode 100644 user-service/node_modules/mongodb/lib/deps.js.map create mode 100644 user-service/node_modules/mongodb/lib/encrypter.js create mode 100644 user-service/node_modules/mongodb/lib/encrypter.js.map create mode 100644 user-service/node_modules/mongodb/lib/error.js create mode 100644 user-service/node_modules/mongodb/lib/error.js.map create mode 100644 user-service/node_modules/mongodb/lib/explain.js create mode 100644 user-service/node_modules/mongodb/lib/explain.js.map create mode 100644 user-service/node_modules/mongodb/lib/gridfs/download.js create mode 100644 user-service/node_modules/mongodb/lib/gridfs/download.js.map create mode 100644 user-service/node_modules/mongodb/lib/gridfs/index.js create mode 100644 user-service/node_modules/mongodb/lib/gridfs/index.js.map create mode 100644 user-service/node_modules/mongodb/lib/gridfs/upload.js create mode 100644 user-service/node_modules/mongodb/lib/gridfs/upload.js.map create mode 100644 user-service/node_modules/mongodb/lib/index.js create mode 100644 user-service/node_modules/mongodb/lib/index.js.map create mode 100644 user-service/node_modules/mongodb/lib/mongo_client.js create mode 100644 user-service/node_modules/mongodb/lib/mongo_client.js.map create mode 100644 user-service/node_modules/mongodb/lib/mongo_client_auth_providers.js create mode 100644 user-service/node_modules/mongodb/lib/mongo_client_auth_providers.js.map create mode 100644 user-service/node_modules/mongodb/lib/mongo_logger.js create mode 100644 user-service/node_modules/mongodb/lib/mongo_logger.js.map create mode 100644 user-service/node_modules/mongodb/lib/mongo_types.js create mode 100644 user-service/node_modules/mongodb/lib/mongo_types.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/aggregate.js create mode 100644 user-service/node_modules/mongodb/lib/operations/aggregate.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/bulk_write.js create mode 100644 user-service/node_modules/mongodb/lib/operations/bulk_write.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/collections.js create mode 100644 user-service/node_modules/mongodb/lib/operations/collections.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/command.js create mode 100644 user-service/node_modules/mongodb/lib/operations/command.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/count.js create mode 100644 user-service/node_modules/mongodb/lib/operations/count.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/count_documents.js create mode 100644 user-service/node_modules/mongodb/lib/operations/count_documents.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/create_collection.js create mode 100644 user-service/node_modules/mongodb/lib/operations/create_collection.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/delete.js create mode 100644 user-service/node_modules/mongodb/lib/operations/delete.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/distinct.js create mode 100644 user-service/node_modules/mongodb/lib/operations/distinct.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/drop.js create mode 100644 user-service/node_modules/mongodb/lib/operations/drop.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/estimated_document_count.js create mode 100644 user-service/node_modules/mongodb/lib/operations/estimated_document_count.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/execute_operation.js create mode 100644 user-service/node_modules/mongodb/lib/operations/execute_operation.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/find.js create mode 100644 user-service/node_modules/mongodb/lib/operations/find.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/find_and_modify.js create mode 100644 user-service/node_modules/mongodb/lib/operations/find_and_modify.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/get_more.js create mode 100644 user-service/node_modules/mongodb/lib/operations/get_more.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/indexes.js create mode 100644 user-service/node_modules/mongodb/lib/operations/indexes.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/insert.js create mode 100644 user-service/node_modules/mongodb/lib/operations/insert.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/is_capped.js create mode 100644 user-service/node_modules/mongodb/lib/operations/is_capped.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/kill_cursors.js create mode 100644 user-service/node_modules/mongodb/lib/operations/kill_cursors.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/list_collections.js create mode 100644 user-service/node_modules/mongodb/lib/operations/list_collections.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/list_databases.js create mode 100644 user-service/node_modules/mongodb/lib/operations/list_databases.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/operation.js create mode 100644 user-service/node_modules/mongodb/lib/operations/operation.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/options_operation.js create mode 100644 user-service/node_modules/mongodb/lib/operations/options_operation.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/profiling_level.js create mode 100644 user-service/node_modules/mongodb/lib/operations/profiling_level.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/remove_user.js create mode 100644 user-service/node_modules/mongodb/lib/operations/remove_user.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/rename.js create mode 100644 user-service/node_modules/mongodb/lib/operations/rename.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/run_command.js create mode 100644 user-service/node_modules/mongodb/lib/operations/run_command.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/create.js create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/create.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/drop.js create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/drop.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/update.js create mode 100644 user-service/node_modules/mongodb/lib/operations/search_indexes/update.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/set_profiling_level.js create mode 100644 user-service/node_modules/mongodb/lib/operations/set_profiling_level.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/stats.js create mode 100644 user-service/node_modules/mongodb/lib/operations/stats.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/update.js create mode 100644 user-service/node_modules/mongodb/lib/operations/update.js.map create mode 100644 user-service/node_modules/mongodb/lib/operations/validate_collection.js create mode 100644 user-service/node_modules/mongodb/lib/operations/validate_collection.js.map create mode 100644 user-service/node_modules/mongodb/lib/read_concern.js create mode 100644 user-service/node_modules/mongodb/lib/read_concern.js.map create mode 100644 user-service/node_modules/mongodb/lib/read_preference.js create mode 100644 user-service/node_modules/mongodb/lib/read_preference.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/common.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/common.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/events.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/events.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/monitor.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/monitor.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/server.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/server.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_description.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_description.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_selection.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_selection.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_selection_events.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/server_selection_events.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/srv_polling.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/srv_polling.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/topology.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/topology.js.map create mode 100644 user-service/node_modules/mongodb/lib/sdam/topology_description.js create mode 100644 user-service/node_modules/mongodb/lib/sdam/topology_description.js.map create mode 100644 user-service/node_modules/mongodb/lib/sessions.js create mode 100644 user-service/node_modules/mongodb/lib/sessions.js.map create mode 100644 user-service/node_modules/mongodb/lib/sort.js create mode 100644 user-service/node_modules/mongodb/lib/sort.js.map create mode 100644 user-service/node_modules/mongodb/lib/timeout.js create mode 100644 user-service/node_modules/mongodb/lib/timeout.js.map create mode 100644 user-service/node_modules/mongodb/lib/transactions.js create mode 100644 user-service/node_modules/mongodb/lib/transactions.js.map create mode 100644 user-service/node_modules/mongodb/lib/utils.js create mode 100644 user-service/node_modules/mongodb/lib/utils.js.map create mode 100644 user-service/node_modules/mongodb/lib/write_concern.js create mode 100644 user-service/node_modules/mongodb/lib/write_concern.js.map create mode 100644 user-service/node_modules/mongodb/mongodb.d.ts create mode 100644 user-service/node_modules/mongodb/package.json create mode 100644 user-service/node_modules/mongodb/src/admin.ts create mode 100644 user-service/node_modules/mongodb/src/bson.ts create mode 100644 user-service/node_modules/mongodb/src/bulk/common.ts create mode 100644 user-service/node_modules/mongodb/src/bulk/ordered.ts create mode 100644 user-service/node_modules/mongodb/src/bulk/unordered.ts create mode 100644 user-service/node_modules/mongodb/src/change_stream.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/auto_encrypter.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/client_encryption.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/crypto_callbacks.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/errors.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/mongocryptd_manager.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/providers/aws.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/providers/azure.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/providers/gcp.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/providers/index.ts create mode 100644 user-service/node_modules/mongodb/src/client-side-encryption/state_machine.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/auth_provider.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/aws_temporary_credentials.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/gssapi.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongo_credentials.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongocr.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_aws.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/automated_callback_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/azure_machine_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/callback_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/command_builders.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/gcp_machine_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/human_callback_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/machine_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/token_cache.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/mongodb_oidc/token_machine_workflow.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/plain.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/providers.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/scram.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/auth/x509.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/command_monitoring_events.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/commands.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/connect.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/connection.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/connection_pool.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/connection_pool_events.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/errors.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/handshake/client_metadata.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/metrics.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/stream_description.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/compression.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/constants.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/on_data.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/on_demand/document.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/responses.ts create mode 100644 user-service/node_modules/mongodb/src/cmap/wire_protocol/shared.ts create mode 100644 user-service/node_modules/mongodb/src/collection.ts create mode 100644 user-service/node_modules/mongodb/src/connection_string.ts create mode 100644 user-service/node_modules/mongodb/src/constants.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/abstract_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/aggregation_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/change_stream_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/find_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/list_collections_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/list_indexes_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/list_search_indexes_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/cursor/run_command_cursor.ts create mode 100644 user-service/node_modules/mongodb/src/db.ts create mode 100644 user-service/node_modules/mongodb/src/deps.ts create mode 100644 user-service/node_modules/mongodb/src/encrypter.ts create mode 100644 user-service/node_modules/mongodb/src/error.ts create mode 100644 user-service/node_modules/mongodb/src/explain.ts create mode 100644 user-service/node_modules/mongodb/src/gridfs/download.ts create mode 100644 user-service/node_modules/mongodb/src/gridfs/index.ts create mode 100644 user-service/node_modules/mongodb/src/gridfs/upload.ts create mode 100644 user-service/node_modules/mongodb/src/index.ts create mode 100644 user-service/node_modules/mongodb/src/mongo_client.ts create mode 100644 user-service/node_modules/mongodb/src/mongo_client_auth_providers.ts create mode 100644 user-service/node_modules/mongodb/src/mongo_logger.ts create mode 100644 user-service/node_modules/mongodb/src/mongo_types.ts create mode 100644 user-service/node_modules/mongodb/src/operations/aggregate.ts create mode 100644 user-service/node_modules/mongodb/src/operations/bulk_write.ts create mode 100644 user-service/node_modules/mongodb/src/operations/collections.ts create mode 100644 user-service/node_modules/mongodb/src/operations/command.ts create mode 100644 user-service/node_modules/mongodb/src/operations/count.ts create mode 100644 user-service/node_modules/mongodb/src/operations/count_documents.ts create mode 100644 user-service/node_modules/mongodb/src/operations/create_collection.ts create mode 100644 user-service/node_modules/mongodb/src/operations/delete.ts create mode 100644 user-service/node_modules/mongodb/src/operations/distinct.ts create mode 100644 user-service/node_modules/mongodb/src/operations/drop.ts create mode 100644 user-service/node_modules/mongodb/src/operations/estimated_document_count.ts create mode 100644 user-service/node_modules/mongodb/src/operations/execute_operation.ts create mode 100644 user-service/node_modules/mongodb/src/operations/find.ts create mode 100644 user-service/node_modules/mongodb/src/operations/find_and_modify.ts create mode 100644 user-service/node_modules/mongodb/src/operations/get_more.ts create mode 100644 user-service/node_modules/mongodb/src/operations/indexes.ts create mode 100644 user-service/node_modules/mongodb/src/operations/insert.ts create mode 100644 user-service/node_modules/mongodb/src/operations/is_capped.ts create mode 100644 user-service/node_modules/mongodb/src/operations/kill_cursors.ts create mode 100644 user-service/node_modules/mongodb/src/operations/list_collections.ts create mode 100644 user-service/node_modules/mongodb/src/operations/list_databases.ts create mode 100644 user-service/node_modules/mongodb/src/operations/operation.ts create mode 100644 user-service/node_modules/mongodb/src/operations/options_operation.ts create mode 100644 user-service/node_modules/mongodb/src/operations/profiling_level.ts create mode 100644 user-service/node_modules/mongodb/src/operations/remove_user.ts create mode 100644 user-service/node_modules/mongodb/src/operations/rename.ts create mode 100644 user-service/node_modules/mongodb/src/operations/run_command.ts create mode 100644 user-service/node_modules/mongodb/src/operations/search_indexes/create.ts create mode 100644 user-service/node_modules/mongodb/src/operations/search_indexes/drop.ts create mode 100644 user-service/node_modules/mongodb/src/operations/search_indexes/update.ts create mode 100644 user-service/node_modules/mongodb/src/operations/set_profiling_level.ts create mode 100644 user-service/node_modules/mongodb/src/operations/stats.ts create mode 100644 user-service/node_modules/mongodb/src/operations/update.ts create mode 100644 user-service/node_modules/mongodb/src/operations/validate_collection.ts create mode 100644 user-service/node_modules/mongodb/src/read_concern.ts create mode 100644 user-service/node_modules/mongodb/src/read_preference.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/common.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/events.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/monitor.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/server.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/server_description.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/server_selection.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/server_selection_events.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/srv_polling.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/topology.ts create mode 100644 user-service/node_modules/mongodb/src/sdam/topology_description.ts create mode 100644 user-service/node_modules/mongodb/src/sessions.ts create mode 100644 user-service/node_modules/mongodb/src/sort.ts create mode 100644 user-service/node_modules/mongodb/src/timeout.ts create mode 100644 user-service/node_modules/mongodb/src/transactions.ts create mode 100644 user-service/node_modules/mongodb/src/utils.ts create mode 100644 user-service/node_modules/mongodb/src/write_concern.ts create mode 100644 user-service/node_modules/mongodb/tsconfig.json create mode 100644 user-service/node_modules/mongoose/LICENSE.md create mode 100644 user-service/node_modules/mongoose/README.md create mode 100644 user-service/node_modules/mongoose/SECURITY.md create mode 100644 user-service/node_modules/mongoose/browser.js create mode 100644 user-service/node_modules/mongoose/dist/browser.umd.js create mode 100644 user-service/node_modules/mongoose/index.js create mode 100644 user-service/node_modules/mongoose/lib/aggregate.js create mode 100644 user-service/node_modules/mongoose/lib/browser.js create mode 100644 user-service/node_modules/mongoose/lib/browserDocument.js create mode 100644 user-service/node_modules/mongoose/lib/cast.js create mode 100644 user-service/node_modules/mongoose/lib/cast/bigint.js create mode 100644 user-service/node_modules/mongoose/lib/cast/boolean.js create mode 100644 user-service/node_modules/mongoose/lib/cast/date.js create mode 100644 user-service/node_modules/mongoose/lib/cast/decimal128.js create mode 100644 user-service/node_modules/mongoose/lib/cast/number.js create mode 100644 user-service/node_modules/mongoose/lib/cast/objectid.js create mode 100644 user-service/node_modules/mongoose/lib/cast/string.js create mode 100644 user-service/node_modules/mongoose/lib/collection.js create mode 100644 user-service/node_modules/mongoose/lib/connection.js create mode 100644 user-service/node_modules/mongoose/lib/connectionState.js create mode 100644 user-service/node_modules/mongoose/lib/constants.js create mode 100644 user-service/node_modules/mongoose/lib/cursor/aggregationCursor.js create mode 100644 user-service/node_modules/mongoose/lib/cursor/changeStream.js create mode 100644 user-service/node_modules/mongoose/lib/cursor/queryCursor.js create mode 100644 user-service/node_modules/mongoose/lib/document.js create mode 100644 user-service/node_modules/mongoose/lib/documentProvider.js create mode 100644 user-service/node_modules/mongoose/lib/driver.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/SPEC.md create mode 100644 user-service/node_modules/mongoose/lib/drivers/browser/binary.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/browser/decimal128.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/browser/index.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/browser/objectid.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/node-mongodb-native/connection.js create mode 100644 user-service/node_modules/mongoose/lib/drivers/node-mongodb-native/index.js create mode 100644 user-service/node_modules/mongoose/lib/error/browserMissingSchema.js create mode 100644 user-service/node_modules/mongoose/lib/error/bulkWriteError.js create mode 100644 user-service/node_modules/mongoose/lib/error/cast.js create mode 100644 user-service/node_modules/mongoose/lib/error/createCollectionsError.js create mode 100644 user-service/node_modules/mongoose/lib/error/divergentArray.js create mode 100644 user-service/node_modules/mongoose/lib/error/eachAsyncMultiError.js create mode 100644 user-service/node_modules/mongoose/lib/error/index.js create mode 100644 user-service/node_modules/mongoose/lib/error/invalidSchemaOption.js create mode 100644 user-service/node_modules/mongoose/lib/error/messages.js create mode 100644 user-service/node_modules/mongoose/lib/error/missingSchema.js create mode 100644 user-service/node_modules/mongoose/lib/error/mongooseError.js create mode 100644 user-service/node_modules/mongoose/lib/error/notFound.js create mode 100644 user-service/node_modules/mongoose/lib/error/objectExpected.js create mode 100644 user-service/node_modules/mongoose/lib/error/objectParameter.js create mode 100644 user-service/node_modules/mongoose/lib/error/overwriteModel.js create mode 100644 user-service/node_modules/mongoose/lib/error/parallelSave.js create mode 100644 user-service/node_modules/mongoose/lib/error/parallelValidate.js create mode 100644 user-service/node_modules/mongoose/lib/error/serverSelection.js create mode 100644 user-service/node_modules/mongoose/lib/error/setOptionError.js create mode 100644 user-service/node_modules/mongoose/lib/error/strict.js create mode 100644 user-service/node_modules/mongoose/lib/error/strictPopulate.js create mode 100644 user-service/node_modules/mongoose/lib/error/syncIndexes.js create mode 100644 user-service/node_modules/mongoose/lib/error/validation.js create mode 100644 user-service/node_modules/mongoose/lib/error/validator.js create mode 100644 user-service/node_modules/mongoose/lib/error/version.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/aggregate/prepareDiscriminatorPipeline.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/aggregate/stringifyFunctionOperators.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/arrayDepth.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/clone.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/common.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/cursor/eachAsync.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/applyEmbeddedDiscriminators.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/areDiscriminatorValuesEqual.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/checkEmbeddedDiscriminatorKeyProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/getConstructor.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/getDiscriminatorByValue.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/getSchemaDiscriminatorByValue.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/discriminator/mergeDiscriminatorSchema.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/applyDefaults.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/cleanModifiedSubpaths.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/compile.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/getDeepestSubdocumentForPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/getEmbeddedDiscriminatorPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/document/handleSpreadDoc.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/each.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/error/combinePathErrors.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/firstKey.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/get.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/getConstructorName.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/getDefaultBulkwriteResult.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/getFunctionName.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/immediate.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/applySchemaCollation.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/decorateDiscriminatorIndexOptions.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/getRelatedIndexes.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/isDefaultIdIndex.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/isIndexEqual.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/indexes/isTextIndex.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isAsyncFunction.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isBsonType.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isMongooseObject.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isObject.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isPOJO.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isPromise.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/isSimpleValidator.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/minimize.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/applyDefaultsToPOJO.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/applyHooks.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/applyMethods.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/applyStaticHooks.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/applyStatics.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/castBulkWrite.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/discriminator.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/model/pushNestedArrayPaths.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/omitUndefined.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/once.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/parallelLimit.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/path/parentPaths.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/path/setDottedPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/pluralize.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/assignRawDocsToIdStructure.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/assignVals.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/createPopulateQueryFilter.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/getModelsMapForPopulate.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/getSchemaTypes.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/getVirtual.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/leanPopulateMap.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/lookupLocalFields.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/markArraySubdocsPopulated.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/modelNamesFromRefPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/removeDeselectedForeignField.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/setPopulatedVirtualValue.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/skipPopulateValue.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/populate/validateRef.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/printJestWarning.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/processConnectionOptions.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/applyProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/hasIncludedChildren.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isDefiningProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isExclusive.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isInclusive.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isNestedProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isPathExcluded.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isPathSelectedInclusive.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/isSubpath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/projection/parseProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/promiseOrCallback.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/applyGlobalOption.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/cast$expr.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/castFilterPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/castUpdate.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/getEmbeddedDiscriminatorPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/handleImmutable.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/handleReadPreferenceAliases.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/hasDollarKeys.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/isOperator.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/sanitizeFilter.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/sanitizeProjection.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/selectPopulatedFields.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/trusted.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/query/validOps.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/addAutoId.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/applyBuiltinPlugins.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/applyPlugins.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/applyReadConcern.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/applyWriteConcern.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/cleanPositionalOperators.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/getIndexes.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/getKeysInSchemaOrder.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/getPath.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/getSubdocumentStrictValue.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/handleIdOption.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/handleTimestampOption.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/idGetter.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schema/merge.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/schematype/handleImmutable.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/setDefaultsOnInsert.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/specialProperties.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/symbols.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/timers.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/timestamps/setDocumentTimestamps.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/timestamps/setupTimestamps.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/topology/allServersUnknown.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/topology/isAtlas.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/topology/isSSLError.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/applyTimestampsToChildren.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/applyTimestampsToUpdate.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/castArrayFilters.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/decorateUpdateWithVersionKey.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/modifiedPaths.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/moveImmutableProperties.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/removeUnusedArrayFilters.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/update/updatedPathsByArrayFilter.js create mode 100644 user-service/node_modules/mongoose/lib/helpers/updateValidators.js create mode 100644 user-service/node_modules/mongoose/lib/index.js create mode 100644 user-service/node_modules/mongoose/lib/internal.js create mode 100644 user-service/node_modules/mongoose/lib/model.js create mode 100644 user-service/node_modules/mongoose/lib/modifiedPathsSnapshot.js create mode 100644 user-service/node_modules/mongoose/lib/mongoose.js create mode 100644 user-service/node_modules/mongoose/lib/options.js create mode 100644 user-service/node_modules/mongoose/lib/options/populateOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/propertyOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/saveOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaArrayOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaBufferOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaDateOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaDocumentArrayOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaMapOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaNumberOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaObjectIdOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaStringOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaSubdocumentOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/schemaTypeOptions.js create mode 100644 user-service/node_modules/mongoose/lib/options/virtualOptions.js create mode 100644 user-service/node_modules/mongoose/lib/plugins/index.js create mode 100644 user-service/node_modules/mongoose/lib/plugins/saveSubdocs.js create mode 100644 user-service/node_modules/mongoose/lib/plugins/sharding.js create mode 100644 user-service/node_modules/mongoose/lib/plugins/trackTransaction.js create mode 100644 user-service/node_modules/mongoose/lib/plugins/validateBeforeSave.js create mode 100644 user-service/node_modules/mongoose/lib/query.js create mode 100644 user-service/node_modules/mongoose/lib/queryHelpers.js create mode 100644 user-service/node_modules/mongoose/lib/schema.js create mode 100644 user-service/node_modules/mongoose/lib/schema/array.js create mode 100644 user-service/node_modules/mongoose/lib/schema/bigint.js create mode 100644 user-service/node_modules/mongoose/lib/schema/boolean.js create mode 100644 user-service/node_modules/mongoose/lib/schema/buffer.js create mode 100644 user-service/node_modules/mongoose/lib/schema/date.js create mode 100644 user-service/node_modules/mongoose/lib/schema/decimal128.js create mode 100644 user-service/node_modules/mongoose/lib/schema/documentArray.js create mode 100644 user-service/node_modules/mongoose/lib/schema/documentArrayElement.js create mode 100644 user-service/node_modules/mongoose/lib/schema/index.js create mode 100644 user-service/node_modules/mongoose/lib/schema/map.js create mode 100644 user-service/node_modules/mongoose/lib/schema/mixed.js create mode 100644 user-service/node_modules/mongoose/lib/schema/number.js create mode 100644 user-service/node_modules/mongoose/lib/schema/objectId.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/bitwise.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/exists.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/geospatial.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/helpers.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/text.js create mode 100644 user-service/node_modules/mongoose/lib/schema/operators/type.js create mode 100644 user-service/node_modules/mongoose/lib/schema/string.js create mode 100644 user-service/node_modules/mongoose/lib/schema/subdocument.js create mode 100644 user-service/node_modules/mongoose/lib/schema/symbols.js create mode 100644 user-service/node_modules/mongoose/lib/schema/uuid.js create mode 100644 user-service/node_modules/mongoose/lib/schemaType.js create mode 100644 user-service/node_modules/mongoose/lib/stateMachine.js create mode 100644 user-service/node_modules/mongoose/lib/types/array/index.js create mode 100644 user-service/node_modules/mongoose/lib/types/array/isMongooseArray.js create mode 100644 user-service/node_modules/mongoose/lib/types/array/methods/index.js create mode 100644 user-service/node_modules/mongoose/lib/types/arraySubdocument.js create mode 100644 user-service/node_modules/mongoose/lib/types/buffer.js create mode 100644 user-service/node_modules/mongoose/lib/types/decimal128.js create mode 100644 user-service/node_modules/mongoose/lib/types/documentArray/index.js create mode 100644 user-service/node_modules/mongoose/lib/types/documentArray/isMongooseDocumentArray.js create mode 100644 user-service/node_modules/mongoose/lib/types/documentArray/methods/index.js create mode 100644 user-service/node_modules/mongoose/lib/types/index.js create mode 100644 user-service/node_modules/mongoose/lib/types/map.js create mode 100644 user-service/node_modules/mongoose/lib/types/objectid.js create mode 100644 user-service/node_modules/mongoose/lib/types/subdocument.js create mode 100644 user-service/node_modules/mongoose/lib/types/uuid.js create mode 100644 user-service/node_modules/mongoose/lib/utils.js create mode 100644 user-service/node_modules/mongoose/lib/validOptions.js create mode 100644 user-service/node_modules/mongoose/lib/virtualType.js create mode 100644 user-service/node_modules/mongoose/node_modules/ms/index.js create mode 100644 user-service/node_modules/mongoose/node_modules/ms/license.md create mode 100644 user-service/node_modules/mongoose/node_modules/ms/package.json create mode 100644 user-service/node_modules/mongoose/node_modules/ms/readme.md create mode 100644 user-service/node_modules/mongoose/package.json create mode 100644 user-service/node_modules/mongoose/types/aggregate.d.ts create mode 100644 user-service/node_modules/mongoose/types/augmentations.d.ts create mode 100644 user-service/node_modules/mongoose/types/callback.d.ts create mode 100644 user-service/node_modules/mongoose/types/collection.d.ts create mode 100644 user-service/node_modules/mongoose/types/connection.d.ts create mode 100644 user-service/node_modules/mongoose/types/cursor.d.ts create mode 100644 user-service/node_modules/mongoose/types/document.d.ts create mode 100644 user-service/node_modules/mongoose/types/error.d.ts create mode 100644 user-service/node_modules/mongoose/types/expressions.d.ts create mode 100644 user-service/node_modules/mongoose/types/helpers.d.ts create mode 100644 user-service/node_modules/mongoose/types/index.d.ts create mode 100644 user-service/node_modules/mongoose/types/indexes.d.ts create mode 100644 user-service/node_modules/mongoose/types/inferrawdoctype.d.ts create mode 100644 user-service/node_modules/mongoose/types/inferschematype.d.ts create mode 100644 user-service/node_modules/mongoose/types/middlewares.d.ts create mode 100644 user-service/node_modules/mongoose/types/models.d.ts create mode 100644 user-service/node_modules/mongoose/types/mongooseoptions.d.ts create mode 100644 user-service/node_modules/mongoose/types/pipelinestage.d.ts create mode 100644 user-service/node_modules/mongoose/types/populate.d.ts create mode 100644 user-service/node_modules/mongoose/types/query.d.ts create mode 100644 user-service/node_modules/mongoose/types/schemaoptions.d.ts create mode 100644 user-service/node_modules/mongoose/types/schematypes.d.ts create mode 100644 user-service/node_modules/mongoose/types/session.d.ts create mode 100644 user-service/node_modules/mongoose/types/types.d.ts create mode 100644 user-service/node_modules/mongoose/types/utility.d.ts create mode 100644 user-service/node_modules/mongoose/types/validation.d.ts create mode 100644 user-service/node_modules/mongoose/types/virtuals.d.ts create mode 100644 user-service/node_modules/mpath/.travis.yml create mode 100644 user-service/node_modules/mpath/History.md create mode 100644 user-service/node_modules/mpath/LICENSE create mode 100644 user-service/node_modules/mpath/README.md create mode 100644 user-service/node_modules/mpath/SECURITY.md create mode 100644 user-service/node_modules/mpath/index.js create mode 100644 user-service/node_modules/mpath/lib/index.js create mode 100644 user-service/node_modules/mpath/lib/stringToParts.js create mode 100644 user-service/node_modules/mpath/package.json create mode 100644 user-service/node_modules/mpath/test/.eslintrc.yml create mode 100644 user-service/node_modules/mpath/test/index.js create mode 100644 user-service/node_modules/mpath/test/stringToParts.js create mode 100644 user-service/node_modules/mquery/.github/ISSUE_TEMPLATE.md create mode 100644 user-service/node_modules/mquery/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 user-service/node_modules/mquery/History.md create mode 100644 user-service/node_modules/mquery/LICENSE create mode 100644 user-service/node_modules/mquery/README.md create mode 100644 user-service/node_modules/mquery/SECURITY.md create mode 100644 user-service/node_modules/mquery/lib/collection/collection.js create mode 100644 user-service/node_modules/mquery/lib/collection/index.js create mode 100644 user-service/node_modules/mquery/lib/collection/node.js create mode 100644 user-service/node_modules/mquery/lib/env.js create mode 100644 user-service/node_modules/mquery/lib/mquery.js create mode 100644 user-service/node_modules/mquery/lib/permissions.js create mode 100644 user-service/node_modules/mquery/lib/utils.js create mode 100644 user-service/node_modules/mquery/node_modules/debug/LICENSE create mode 100644 user-service/node_modules/mquery/node_modules/debug/README.md create mode 100644 user-service/node_modules/mquery/node_modules/debug/package.json create mode 100644 user-service/node_modules/mquery/node_modules/debug/src/browser.js create mode 100644 user-service/node_modules/mquery/node_modules/debug/src/common.js create mode 100644 user-service/node_modules/mquery/node_modules/debug/src/index.js create mode 100644 user-service/node_modules/mquery/node_modules/debug/src/node.js create mode 100644 user-service/node_modules/mquery/node_modules/ms/index.js create mode 100644 user-service/node_modules/mquery/node_modules/ms/license.md create mode 100644 user-service/node_modules/mquery/node_modules/ms/package.json create mode 100644 user-service/node_modules/mquery/node_modules/ms/readme.md create mode 100644 user-service/node_modules/mquery/package.json create mode 100644 user-service/node_modules/ms/index.js create mode 100644 user-service/node_modules/ms/license.md create mode 100644 user-service/node_modules/ms/package.json create mode 100644 user-service/node_modules/ms/readme.md create mode 100644 user-service/node_modules/negotiator/HISTORY.md create mode 100644 user-service/node_modules/negotiator/LICENSE create mode 100644 user-service/node_modules/negotiator/README.md create mode 100644 user-service/node_modules/negotiator/index.js create mode 100644 user-service/node_modules/negotiator/lib/charset.js create mode 100644 user-service/node_modules/negotiator/lib/encoding.js create mode 100644 user-service/node_modules/negotiator/lib/language.js create mode 100644 user-service/node_modules/negotiator/lib/mediaType.js create mode 100644 user-service/node_modules/negotiator/package.json create mode 100644 user-service/node_modules/node-addon-api/LICENSE.md create mode 100644 user-service/node_modules/node-addon-api/README.md create mode 100644 user-service/node_modules/node-addon-api/common.gypi create mode 100644 user-service/node_modules/node-addon-api/except.gypi create mode 100644 user-service/node_modules/node-addon-api/index.js create mode 100644 user-service/node_modules/node-addon-api/napi-inl.deprecated.h create mode 100644 user-service/node_modules/node-addon-api/napi-inl.h create mode 100644 user-service/node_modules/node-addon-api/napi.h create mode 100644 user-service/node_modules/node-addon-api/node_api.gyp create mode 100644 user-service/node_modules/node-addon-api/noexcept.gypi create mode 100644 user-service/node_modules/node-addon-api/nothing.c create mode 100644 user-service/node_modules/node-addon-api/package-support.json create mode 100644 user-service/node_modules/node-addon-api/package.json create mode 100644 user-service/node_modules/node-addon-api/tools/README.md create mode 100644 user-service/node_modules/node-addon-api/tools/check-napi.js create mode 100644 user-service/node_modules/node-addon-api/tools/clang-format.js create mode 100755 user-service/node_modules/node-addon-api/tools/conversion.js create mode 100644 user-service/node_modules/node-addon-api/tools/eslint-format.js create mode 100644 user-service/node_modules/node-fetch/LICENSE.md create mode 100644 user-service/node_modules/node-fetch/README.md create mode 100644 user-service/node_modules/node-fetch/browser.js create mode 100644 user-service/node_modules/node-fetch/lib/index.es.js create mode 100644 user-service/node_modules/node-fetch/lib/index.js create mode 100644 user-service/node_modules/node-fetch/lib/index.mjs create mode 100644 user-service/node_modules/node-fetch/node_modules/tr46/.npmignore create mode 100644 user-service/node_modules/node-fetch/node_modules/tr46/index.js create mode 100644 user-service/node_modules/node-fetch/node_modules/tr46/lib/.gitkeep create mode 100644 user-service/node_modules/node-fetch/node_modules/tr46/lib/mappingTable.json create mode 100644 user-service/node_modules/node-fetch/node_modules/tr46/package.json create mode 100644 user-service/node_modules/node-fetch/node_modules/webidl-conversions/LICENSE.md create mode 100644 user-service/node_modules/node-fetch/node_modules/webidl-conversions/README.md create mode 100644 user-service/node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js create mode 100644 user-service/node_modules/node-fetch/node_modules/webidl-conversions/package.json create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/LICENSE.txt create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/README.md create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js create mode 100644 user-service/node_modules/node-fetch/node_modules/whatwg-url/package.json create mode 100644 user-service/node_modules/node-fetch/package.json create mode 100644 user-service/node_modules/nodemon/.prettierrc.json create mode 100644 user-service/node_modules/nodemon/LICENSE create mode 100644 user-service/node_modules/nodemon/README.md create mode 100755 user-service/node_modules/nodemon/bin/nodemon.js create mode 100644 user-service/node_modules/nodemon/bin/windows-kill.exe create mode 100644 user-service/node_modules/nodemon/doc/cli/authors.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/config.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/help.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/logo.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/options.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/topics.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/usage.txt create mode 100644 user-service/node_modules/nodemon/doc/cli/whoami.txt create mode 100644 user-service/node_modules/nodemon/index.d.ts create mode 100644 user-service/node_modules/nodemon/jsconfig.json create mode 100644 user-service/node_modules/nodemon/lib/cli/index.js create mode 100644 user-service/node_modules/nodemon/lib/cli/parse.js create mode 100644 user-service/node_modules/nodemon/lib/config/command.js create mode 100644 user-service/node_modules/nodemon/lib/config/defaults.js create mode 100644 user-service/node_modules/nodemon/lib/config/exec.js create mode 100644 user-service/node_modules/nodemon/lib/config/index.js create mode 100644 user-service/node_modules/nodemon/lib/config/load.js create mode 100644 user-service/node_modules/nodemon/lib/help/index.js create mode 100644 user-service/node_modules/nodemon/lib/index.js create mode 100644 user-service/node_modules/nodemon/lib/monitor/index.js create mode 100644 user-service/node_modules/nodemon/lib/monitor/match.js create mode 100644 user-service/node_modules/nodemon/lib/monitor/run.js create mode 100644 user-service/node_modules/nodemon/lib/monitor/signals.js create mode 100644 user-service/node_modules/nodemon/lib/monitor/watch.js create mode 100644 user-service/node_modules/nodemon/lib/nodemon.js create mode 100644 user-service/node_modules/nodemon/lib/rules/add.js create mode 100644 user-service/node_modules/nodemon/lib/rules/index.js create mode 100644 user-service/node_modules/nodemon/lib/rules/parse.js create mode 100644 user-service/node_modules/nodemon/lib/spawn.js create mode 100644 user-service/node_modules/nodemon/lib/utils/bus.js create mode 100644 user-service/node_modules/nodemon/lib/utils/clone.js create mode 100644 user-service/node_modules/nodemon/lib/utils/colour.js create mode 100644 user-service/node_modules/nodemon/lib/utils/index.js create mode 100644 user-service/node_modules/nodemon/lib/utils/log.js create mode 100644 user-service/node_modules/nodemon/lib/utils/merge.js create mode 100644 user-service/node_modules/nodemon/lib/version.js create mode 100644 user-service/node_modules/nodemon/node_modules/debug/LICENSE create mode 100644 user-service/node_modules/nodemon/node_modules/debug/README.md create mode 100644 user-service/node_modules/nodemon/node_modules/debug/package.json create mode 100644 user-service/node_modules/nodemon/node_modules/debug/src/browser.js create mode 100644 user-service/node_modules/nodemon/node_modules/debug/src/common.js create mode 100644 user-service/node_modules/nodemon/node_modules/debug/src/index.js create mode 100644 user-service/node_modules/nodemon/node_modules/debug/src/node.js create mode 100644 user-service/node_modules/nodemon/node_modules/ms/index.js create mode 100644 user-service/node_modules/nodemon/node_modules/ms/license.md create mode 100644 user-service/node_modules/nodemon/node_modules/ms/package.json create mode 100644 user-service/node_modules/nodemon/node_modules/ms/readme.md create mode 100644 user-service/node_modules/nodemon/package.json create mode 100644 user-service/node_modules/nopt/CHANGELOG.md create mode 100644 user-service/node_modules/nopt/LICENSE create mode 100644 user-service/node_modules/nopt/README.md create mode 100755 user-service/node_modules/nopt/bin/nopt.js create mode 100644 user-service/node_modules/nopt/lib/nopt.js create mode 100644 user-service/node_modules/nopt/package.json create mode 100644 user-service/node_modules/normalize-path/LICENSE create mode 100644 user-service/node_modules/normalize-path/README.md create mode 100644 user-service/node_modules/normalize-path/index.js create mode 100644 user-service/node_modules/normalize-path/package.json create mode 100644 user-service/node_modules/npmlog/LICENSE create mode 100644 user-service/node_modules/npmlog/README.md create mode 100644 user-service/node_modules/npmlog/log.js create mode 100644 user-service/node_modules/npmlog/package.json create mode 100644 user-service/node_modules/object-assign/index.js create mode 100644 user-service/node_modules/object-assign/license create mode 100644 user-service/node_modules/object-assign/package.json create mode 100644 user-service/node_modules/object-assign/readme.md create mode 100644 user-service/node_modules/object-inspect/.eslintrc create mode 100644 user-service/node_modules/object-inspect/.github/FUNDING.yml create mode 100644 user-service/node_modules/object-inspect/.nycrc create mode 100644 user-service/node_modules/object-inspect/CHANGELOG.md create mode 100644 user-service/node_modules/object-inspect/LICENSE create mode 100644 user-service/node_modules/object-inspect/example/all.js create mode 100644 user-service/node_modules/object-inspect/example/circular.js create mode 100644 user-service/node_modules/object-inspect/example/fn.js create mode 100644 user-service/node_modules/object-inspect/example/inspect.js create mode 100644 user-service/node_modules/object-inspect/index.js create mode 100644 user-service/node_modules/object-inspect/package-support.json create mode 100644 user-service/node_modules/object-inspect/package.json create mode 100644 user-service/node_modules/object-inspect/readme.markdown create mode 100644 user-service/node_modules/object-inspect/test-core-js.js create mode 100644 user-service/node_modules/object-inspect/test/bigint.js create mode 100644 user-service/node_modules/object-inspect/test/browser/dom.js create mode 100644 user-service/node_modules/object-inspect/test/circular.js create mode 100644 user-service/node_modules/object-inspect/test/deep.js create mode 100644 user-service/node_modules/object-inspect/test/element.js create mode 100644 user-service/node_modules/object-inspect/test/err.js create mode 100644 user-service/node_modules/object-inspect/test/fakes.js create mode 100644 user-service/node_modules/object-inspect/test/fn.js create mode 100644 user-service/node_modules/object-inspect/test/global.js create mode 100644 user-service/node_modules/object-inspect/test/has.js create mode 100644 user-service/node_modules/object-inspect/test/holes.js create mode 100644 user-service/node_modules/object-inspect/test/indent-option.js create mode 100644 user-service/node_modules/object-inspect/test/inspect.js create mode 100644 user-service/node_modules/object-inspect/test/lowbyte.js create mode 100644 user-service/node_modules/object-inspect/test/number.js create mode 100644 user-service/node_modules/object-inspect/test/quoteStyle.js create mode 100644 user-service/node_modules/object-inspect/test/toStringTag.js create mode 100644 user-service/node_modules/object-inspect/test/undef.js create mode 100644 user-service/node_modules/object-inspect/test/values.js create mode 100644 user-service/node_modules/object-inspect/util.inspect.js create mode 100644 user-service/node_modules/on-finished/HISTORY.md create mode 100644 user-service/node_modules/on-finished/LICENSE create mode 100644 user-service/node_modules/on-finished/README.md create mode 100644 user-service/node_modules/on-finished/index.js create mode 100644 user-service/node_modules/on-finished/package.json create mode 100644 user-service/node_modules/once/LICENSE create mode 100644 user-service/node_modules/once/README.md create mode 100644 user-service/node_modules/once/once.js create mode 100644 user-service/node_modules/once/package.json create mode 100644 user-service/node_modules/parseurl/HISTORY.md create mode 100644 user-service/node_modules/parseurl/LICENSE create mode 100644 user-service/node_modules/parseurl/README.md create mode 100644 user-service/node_modules/parseurl/index.js create mode 100644 user-service/node_modules/parseurl/package.json create mode 100644 user-service/node_modules/path-is-absolute/index.js create mode 100644 user-service/node_modules/path-is-absolute/license create mode 100644 user-service/node_modules/path-is-absolute/package.json create mode 100644 user-service/node_modules/path-is-absolute/readme.md create mode 100644 user-service/node_modules/path-to-regexp/History.md create mode 100644 user-service/node_modules/path-to-regexp/LICENSE create mode 100644 user-service/node_modules/path-to-regexp/Readme.md create mode 100644 user-service/node_modules/path-to-regexp/index.js create mode 100644 user-service/node_modules/path-to-regexp/package.json create mode 100644 user-service/node_modules/picomatch/CHANGELOG.md create mode 100644 user-service/node_modules/picomatch/LICENSE create mode 100644 user-service/node_modules/picomatch/README.md create mode 100644 user-service/node_modules/picomatch/index.js create mode 100644 user-service/node_modules/picomatch/lib/constants.js create mode 100644 user-service/node_modules/picomatch/lib/parse.js create mode 100644 user-service/node_modules/picomatch/lib/picomatch.js create mode 100644 user-service/node_modules/picomatch/lib/scan.js create mode 100644 user-service/node_modules/picomatch/lib/utils.js create mode 100644 user-service/node_modules/picomatch/package.json create mode 100644 user-service/node_modules/proxy-addr/HISTORY.md create mode 100644 user-service/node_modules/proxy-addr/LICENSE create mode 100644 user-service/node_modules/proxy-addr/README.md create mode 100644 user-service/node_modules/proxy-addr/index.js create mode 100644 user-service/node_modules/proxy-addr/package.json create mode 100644 user-service/node_modules/pstree.remy/.travis.yml create mode 100644 user-service/node_modules/pstree.remy/LICENSE create mode 100644 user-service/node_modules/pstree.remy/README.md create mode 100644 user-service/node_modules/pstree.remy/lib/index.js create mode 100644 user-service/node_modules/pstree.remy/lib/tree.js create mode 100644 user-service/node_modules/pstree.remy/lib/utils.js create mode 100644 user-service/node_modules/pstree.remy/package.json create mode 100644 user-service/node_modules/pstree.remy/tests/fixtures/index.js create mode 100644 user-service/node_modules/pstree.remy/tests/fixtures/out1 create mode 100644 user-service/node_modules/pstree.remy/tests/fixtures/out2 create mode 100644 user-service/node_modules/pstree.remy/tests/index.test.js create mode 100644 user-service/node_modules/punycode/LICENSE-MIT.txt create mode 100644 user-service/node_modules/punycode/README.md create mode 100644 user-service/node_modules/punycode/package.json create mode 100644 user-service/node_modules/punycode/punycode.es6.js create mode 100644 user-service/node_modules/punycode/punycode.js create mode 100644 user-service/node_modules/qs/.editorconfig create mode 100644 user-service/node_modules/qs/.eslintrc create mode 100644 user-service/node_modules/qs/.github/FUNDING.yml create mode 100644 user-service/node_modules/qs/.nycrc create mode 100644 user-service/node_modules/qs/CHANGELOG.md create mode 100644 user-service/node_modules/qs/LICENSE.md create mode 100644 user-service/node_modules/qs/README.md create mode 100644 user-service/node_modules/qs/dist/qs.js create mode 100644 user-service/node_modules/qs/lib/formats.js create mode 100644 user-service/node_modules/qs/lib/index.js create mode 100644 user-service/node_modules/qs/lib/parse.js create mode 100644 user-service/node_modules/qs/lib/stringify.js create mode 100644 user-service/node_modules/qs/lib/utils.js create mode 100644 user-service/node_modules/qs/package.json create mode 100644 user-service/node_modules/qs/test/parse.js create mode 100644 user-service/node_modules/qs/test/stringify.js create mode 100644 user-service/node_modules/qs/test/utils.js create mode 100644 user-service/node_modules/range-parser/HISTORY.md create mode 100644 user-service/node_modules/range-parser/LICENSE create mode 100644 user-service/node_modules/range-parser/README.md create mode 100644 user-service/node_modules/range-parser/index.js create mode 100644 user-service/node_modules/range-parser/package.json create mode 100644 user-service/node_modules/raw-body/HISTORY.md create mode 100644 user-service/node_modules/raw-body/LICENSE create mode 100644 user-service/node_modules/raw-body/README.md create mode 100644 user-service/node_modules/raw-body/SECURITY.md create mode 100644 user-service/node_modules/raw-body/index.d.ts create mode 100644 user-service/node_modules/raw-body/index.js create mode 100644 user-service/node_modules/raw-body/package.json create mode 100644 user-service/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 user-service/node_modules/readable-stream/GOVERNANCE.md create mode 100644 user-service/node_modules/readable-stream/LICENSE create mode 100644 user-service/node_modules/readable-stream/README.md create mode 100644 user-service/node_modules/readable-stream/errors-browser.js create mode 100644 user-service/node_modules/readable-stream/errors.js create mode 100644 user-service/node_modules/readable-stream/experimentalWarning.js create mode 100644 user-service/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 user-service/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 user-service/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 user-service/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 user-service/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/async_iterator.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/buffer_list.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/end-of-stream.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/from-browser.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/from.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/pipeline.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/state.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 user-service/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 user-service/node_modules/readable-stream/package.json create mode 100644 user-service/node_modules/readable-stream/readable-browser.js create mode 100644 user-service/node_modules/readable-stream/readable.js create mode 100644 user-service/node_modules/readdirp/LICENSE create mode 100644 user-service/node_modules/readdirp/README.md create mode 100644 user-service/node_modules/readdirp/index.d.ts create mode 100644 user-service/node_modules/readdirp/index.js create mode 100644 user-service/node_modules/readdirp/package.json create mode 100644 user-service/node_modules/rimraf/CHANGELOG.md create mode 100644 user-service/node_modules/rimraf/LICENSE create mode 100644 user-service/node_modules/rimraf/README.md create mode 100755 user-service/node_modules/rimraf/bin.js create mode 100644 user-service/node_modules/rimraf/package.json create mode 100644 user-service/node_modules/rimraf/rimraf.js create mode 100644 user-service/node_modules/safe-buffer/LICENSE create mode 100644 user-service/node_modules/safe-buffer/README.md create mode 100644 user-service/node_modules/safe-buffer/index.d.ts create mode 100644 user-service/node_modules/safe-buffer/index.js create mode 100644 user-service/node_modules/safe-buffer/package.json create mode 100644 user-service/node_modules/safer-buffer/LICENSE create mode 100644 user-service/node_modules/safer-buffer/Porting-Buffer.md create mode 100644 user-service/node_modules/safer-buffer/Readme.md create mode 100644 user-service/node_modules/safer-buffer/dangerous.js create mode 100644 user-service/node_modules/safer-buffer/package.json create mode 100644 user-service/node_modules/safer-buffer/safer.js create mode 100644 user-service/node_modules/safer-buffer/tests.js create mode 100644 user-service/node_modules/semver/LICENSE create mode 100644 user-service/node_modules/semver/README.md create mode 100755 user-service/node_modules/semver/bin/semver.js create mode 100644 user-service/node_modules/semver/classes/comparator.js create mode 100644 user-service/node_modules/semver/classes/index.js create mode 100644 user-service/node_modules/semver/classes/range.js create mode 100644 user-service/node_modules/semver/classes/semver.js create mode 100644 user-service/node_modules/semver/functions/clean.js create mode 100644 user-service/node_modules/semver/functions/cmp.js create mode 100644 user-service/node_modules/semver/functions/coerce.js create mode 100644 user-service/node_modules/semver/functions/compare-build.js create mode 100644 user-service/node_modules/semver/functions/compare-loose.js create mode 100644 user-service/node_modules/semver/functions/compare.js create mode 100644 user-service/node_modules/semver/functions/diff.js create mode 100644 user-service/node_modules/semver/functions/eq.js create mode 100644 user-service/node_modules/semver/functions/gt.js create mode 100644 user-service/node_modules/semver/functions/gte.js create mode 100644 user-service/node_modules/semver/functions/inc.js create mode 100644 user-service/node_modules/semver/functions/lt.js create mode 100644 user-service/node_modules/semver/functions/lte.js create mode 100644 user-service/node_modules/semver/functions/major.js create mode 100644 user-service/node_modules/semver/functions/minor.js create mode 100644 user-service/node_modules/semver/functions/neq.js create mode 100644 user-service/node_modules/semver/functions/parse.js create mode 100644 user-service/node_modules/semver/functions/patch.js create mode 100644 user-service/node_modules/semver/functions/prerelease.js create mode 100644 user-service/node_modules/semver/functions/rcompare.js create mode 100644 user-service/node_modules/semver/functions/rsort.js create mode 100644 user-service/node_modules/semver/functions/satisfies.js create mode 100644 user-service/node_modules/semver/functions/sort.js create mode 100644 user-service/node_modules/semver/functions/valid.js create mode 100644 user-service/node_modules/semver/index.js create mode 100644 user-service/node_modules/semver/internal/constants.js create mode 100644 user-service/node_modules/semver/internal/debug.js create mode 100644 user-service/node_modules/semver/internal/identifiers.js create mode 100644 user-service/node_modules/semver/internal/lrucache.js create mode 100644 user-service/node_modules/semver/internal/parse-options.js create mode 100644 user-service/node_modules/semver/internal/re.js create mode 100644 user-service/node_modules/semver/package.json create mode 100644 user-service/node_modules/semver/preload.js create mode 100644 user-service/node_modules/semver/range.bnf create mode 100644 user-service/node_modules/semver/ranges/gtr.js create mode 100644 user-service/node_modules/semver/ranges/intersects.js create mode 100644 user-service/node_modules/semver/ranges/ltr.js create mode 100644 user-service/node_modules/semver/ranges/max-satisfying.js create mode 100644 user-service/node_modules/semver/ranges/min-satisfying.js create mode 100644 user-service/node_modules/semver/ranges/min-version.js create mode 100644 user-service/node_modules/semver/ranges/outside.js create mode 100644 user-service/node_modules/semver/ranges/simplify.js create mode 100644 user-service/node_modules/semver/ranges/subset.js create mode 100644 user-service/node_modules/semver/ranges/to-comparators.js create mode 100644 user-service/node_modules/semver/ranges/valid.js create mode 100644 user-service/node_modules/send/HISTORY.md create mode 100644 user-service/node_modules/send/LICENSE create mode 100644 user-service/node_modules/send/README.md create mode 100644 user-service/node_modules/send/SECURITY.md create mode 100644 user-service/node_modules/send/index.js create mode 100644 user-service/node_modules/send/node_modules/ms/index.js create mode 100644 user-service/node_modules/send/node_modules/ms/license.md create mode 100644 user-service/node_modules/send/node_modules/ms/package.json create mode 100644 user-service/node_modules/send/node_modules/ms/readme.md create mode 100644 user-service/node_modules/send/package.json create mode 100644 user-service/node_modules/serve-static/HISTORY.md create mode 100644 user-service/node_modules/serve-static/LICENSE create mode 100644 user-service/node_modules/serve-static/README.md create mode 100644 user-service/node_modules/serve-static/index.js create mode 100644 user-service/node_modules/serve-static/package.json create mode 100644 user-service/node_modules/set-blocking/CHANGELOG.md create mode 100644 user-service/node_modules/set-blocking/LICENSE.txt create mode 100644 user-service/node_modules/set-blocking/README.md create mode 100644 user-service/node_modules/set-blocking/index.js create mode 100644 user-service/node_modules/set-blocking/package.json create mode 100644 user-service/node_modules/set-function-length/.eslintrc create mode 100644 user-service/node_modules/set-function-length/.github/FUNDING.yml create mode 100644 user-service/node_modules/set-function-length/.nycrc create mode 100644 user-service/node_modules/set-function-length/CHANGELOG.md create mode 100644 user-service/node_modules/set-function-length/LICENSE create mode 100644 user-service/node_modules/set-function-length/README.md create mode 100644 user-service/node_modules/set-function-length/env.d.ts create mode 100644 user-service/node_modules/set-function-length/env.js create mode 100644 user-service/node_modules/set-function-length/index.d.ts create mode 100644 user-service/node_modules/set-function-length/index.js create mode 100644 user-service/node_modules/set-function-length/package.json create mode 100644 user-service/node_modules/set-function-length/tsconfig.json create mode 100644 user-service/node_modules/setprototypeof/LICENSE create mode 100644 user-service/node_modules/setprototypeof/README.md create mode 100644 user-service/node_modules/setprototypeof/index.d.ts create mode 100644 user-service/node_modules/setprototypeof/index.js create mode 100644 user-service/node_modules/setprototypeof/package.json create mode 100644 user-service/node_modules/setprototypeof/test/index.js create mode 100644 user-service/node_modules/side-channel/.editorconfig create mode 100644 user-service/node_modules/side-channel/.eslintrc create mode 100644 user-service/node_modules/side-channel/.github/FUNDING.yml create mode 100644 user-service/node_modules/side-channel/.nycrc create mode 100644 user-service/node_modules/side-channel/CHANGELOG.md create mode 100644 user-service/node_modules/side-channel/LICENSE create mode 100644 user-service/node_modules/side-channel/README.md create mode 100644 user-service/node_modules/side-channel/index.d.ts create mode 100644 user-service/node_modules/side-channel/index.js create mode 100644 user-service/node_modules/side-channel/package.json create mode 100644 user-service/node_modules/side-channel/test/index.js create mode 100644 user-service/node_modules/side-channel/tsconfig.json create mode 100644 user-service/node_modules/sift/MIT-LICENSE.txt create mode 100755 user-service/node_modules/sift/README.md create mode 100644 user-service/node_modules/sift/es/index.js create mode 100644 user-service/node_modules/sift/es/index.js.map create mode 100644 user-service/node_modules/sift/es5m/index.js create mode 100644 user-service/node_modules/sift/es5m/index.js.map create mode 100644 user-service/node_modules/sift/index.d.ts create mode 100644 user-service/node_modules/sift/index.js create mode 100644 user-service/node_modules/sift/lib/core.d.ts create mode 100644 user-service/node_modules/sift/lib/index.d.ts create mode 100644 user-service/node_modules/sift/lib/index.js create mode 100644 user-service/node_modules/sift/lib/index.js.map create mode 100644 user-service/node_modules/sift/lib/operations.d.ts create mode 100644 user-service/node_modules/sift/lib/utils.d.ts create mode 100644 user-service/node_modules/sift/package.json create mode 100644 user-service/node_modules/sift/sift.csp.min.js create mode 100644 user-service/node_modules/sift/sift.csp.min.js.map create mode 100644 user-service/node_modules/sift/sift.min.js create mode 100644 user-service/node_modules/sift/sift.min.js.map create mode 100644 user-service/node_modules/sift/src/core.ts create mode 100644 user-service/node_modules/sift/src/index.ts create mode 100644 user-service/node_modules/sift/src/operations.ts create mode 100644 user-service/node_modules/sift/src/utils.ts create mode 100644 user-service/node_modules/signal-exit/LICENSE.txt create mode 100644 user-service/node_modules/signal-exit/README.md create mode 100644 user-service/node_modules/signal-exit/index.js create mode 100644 user-service/node_modules/signal-exit/package.json create mode 100644 user-service/node_modules/signal-exit/signals.js create mode 100644 user-service/node_modules/simple-update-notifier/LICENSE create mode 100644 user-service/node_modules/simple-update-notifier/README.md create mode 100644 user-service/node_modules/simple-update-notifier/build/index.d.ts create mode 100644 user-service/node_modules/simple-update-notifier/build/index.js create mode 100644 user-service/node_modules/simple-update-notifier/package.json create mode 100644 user-service/node_modules/simple-update-notifier/src/borderedText.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/cache.spec.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/cache.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/getDistVersion.spec.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/getDistVersion.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/hasNewVersion.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/index.spec.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/index.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/isNpmOrYarn.ts create mode 100644 user-service/node_modules/simple-update-notifier/src/types.ts create mode 100644 user-service/node_modules/sparse-bitfield/.npmignore create mode 100644 user-service/node_modules/sparse-bitfield/.travis.yml create mode 100644 user-service/node_modules/sparse-bitfield/LICENSE create mode 100644 user-service/node_modules/sparse-bitfield/README.md create mode 100644 user-service/node_modules/sparse-bitfield/index.js create mode 100644 user-service/node_modules/sparse-bitfield/package.json create mode 100644 user-service/node_modules/sparse-bitfield/test.js create mode 100644 user-service/node_modules/statuses/HISTORY.md create mode 100644 user-service/node_modules/statuses/LICENSE create mode 100644 user-service/node_modules/statuses/README.md create mode 100644 user-service/node_modules/statuses/codes.json create mode 100644 user-service/node_modules/statuses/index.js create mode 100644 user-service/node_modules/statuses/package.json create mode 100644 user-service/node_modules/string-width/index.d.ts create mode 100644 user-service/node_modules/string-width/index.js create mode 100644 user-service/node_modules/string-width/license create mode 100644 user-service/node_modules/string-width/package.json create mode 100644 user-service/node_modules/string-width/readme.md create mode 100644 user-service/node_modules/string_decoder/LICENSE create mode 100644 user-service/node_modules/string_decoder/README.md create mode 100644 user-service/node_modules/string_decoder/lib/string_decoder.js create mode 100644 user-service/node_modules/string_decoder/package.json create mode 100644 user-service/node_modules/strip-ansi/index.d.ts create mode 100644 user-service/node_modules/strip-ansi/index.js create mode 100644 user-service/node_modules/strip-ansi/license create mode 100644 user-service/node_modules/strip-ansi/package.json create mode 100644 user-service/node_modules/strip-ansi/readme.md create mode 100644 user-service/node_modules/supports-color/browser.js create mode 100644 user-service/node_modules/supports-color/index.js create mode 100644 user-service/node_modules/supports-color/license create mode 100644 user-service/node_modules/supports-color/package.json create mode 100644 user-service/node_modules/supports-color/readme.md create mode 100644 user-service/node_modules/tar/LICENSE create mode 100644 user-service/node_modules/tar/README.md create mode 100644 user-service/node_modules/tar/index.js create mode 100644 user-service/node_modules/tar/lib/create.js create mode 100644 user-service/node_modules/tar/lib/extract.js create mode 100644 user-service/node_modules/tar/lib/get-write-flag.js create mode 100644 user-service/node_modules/tar/lib/header.js create mode 100644 user-service/node_modules/tar/lib/high-level-opt.js create mode 100644 user-service/node_modules/tar/lib/large-numbers.js create mode 100644 user-service/node_modules/tar/lib/list.js create mode 100644 user-service/node_modules/tar/lib/mkdir.js create mode 100644 user-service/node_modules/tar/lib/mode-fix.js create mode 100644 user-service/node_modules/tar/lib/normalize-unicode.js create mode 100644 user-service/node_modules/tar/lib/normalize-windows-path.js create mode 100644 user-service/node_modules/tar/lib/pack.js create mode 100644 user-service/node_modules/tar/lib/parse.js create mode 100644 user-service/node_modules/tar/lib/path-reservations.js create mode 100644 user-service/node_modules/tar/lib/pax.js create mode 100644 user-service/node_modules/tar/lib/read-entry.js create mode 100644 user-service/node_modules/tar/lib/replace.js create mode 100644 user-service/node_modules/tar/lib/strip-absolute-path.js create mode 100644 user-service/node_modules/tar/lib/strip-trailing-slashes.js create mode 100644 user-service/node_modules/tar/lib/types.js create mode 100644 user-service/node_modules/tar/lib/unpack.js create mode 100644 user-service/node_modules/tar/lib/update.js create mode 100644 user-service/node_modules/tar/lib/warn-mixin.js create mode 100644 user-service/node_modules/tar/lib/winchars.js create mode 100644 user-service/node_modules/tar/lib/write-entry.js create mode 100644 user-service/node_modules/tar/package.json create mode 100644 user-service/node_modules/to-regex-range/LICENSE create mode 100644 user-service/node_modules/to-regex-range/README.md create mode 100644 user-service/node_modules/to-regex-range/index.js create mode 100644 user-service/node_modules/to-regex-range/package.json create mode 100644 user-service/node_modules/toidentifier/HISTORY.md create mode 100644 user-service/node_modules/toidentifier/LICENSE create mode 100644 user-service/node_modules/toidentifier/README.md create mode 100644 user-service/node_modules/toidentifier/index.js create mode 100644 user-service/node_modules/toidentifier/package.json create mode 100644 user-service/node_modules/touch/LICENSE create mode 100644 user-service/node_modules/touch/README.md create mode 100755 user-service/node_modules/touch/bin/nodetouch.js create mode 100644 user-service/node_modules/touch/index.js create mode 100644 user-service/node_modules/touch/package.json create mode 100644 user-service/node_modules/tr46/LICENSE.md create mode 100644 user-service/node_modules/tr46/README.md create mode 100644 user-service/node_modules/tr46/index.js create mode 100644 user-service/node_modules/tr46/lib/mappingTable.json create mode 100644 user-service/node_modules/tr46/lib/regexes.js create mode 100644 user-service/node_modules/tr46/lib/statusMapping.js create mode 100644 user-service/node_modules/tr46/package.json create mode 100644 user-service/node_modules/type-is/HISTORY.md create mode 100644 user-service/node_modules/type-is/LICENSE create mode 100644 user-service/node_modules/type-is/README.md create mode 100644 user-service/node_modules/type-is/index.js create mode 100644 user-service/node_modules/type-is/package.json create mode 100644 user-service/node_modules/undefsafe/.github/workflows/release.yml create mode 100644 user-service/node_modules/undefsafe/.jscsrc create mode 100644 user-service/node_modules/undefsafe/.jshintrc create mode 100644 user-service/node_modules/undefsafe/.travis.yml create mode 100644 user-service/node_modules/undefsafe/LICENSE create mode 100644 user-service/node_modules/undefsafe/README.md create mode 100644 user-service/node_modules/undefsafe/example.js create mode 100644 user-service/node_modules/undefsafe/lib/undefsafe.js create mode 100644 user-service/node_modules/undefsafe/package.json create mode 100644 user-service/node_modules/unpipe/HISTORY.md create mode 100644 user-service/node_modules/unpipe/LICENSE create mode 100644 user-service/node_modules/unpipe/README.md create mode 100644 user-service/node_modules/unpipe/index.js create mode 100644 user-service/node_modules/unpipe/package.json create mode 100644 user-service/node_modules/util-deprecate/History.md create mode 100644 user-service/node_modules/util-deprecate/LICENSE create mode 100644 user-service/node_modules/util-deprecate/README.md create mode 100644 user-service/node_modules/util-deprecate/browser.js create mode 100644 user-service/node_modules/util-deprecate/node.js create mode 100644 user-service/node_modules/util-deprecate/package.json create mode 100644 user-service/node_modules/utils-merge/.npmignore create mode 100644 user-service/node_modules/utils-merge/LICENSE create mode 100644 user-service/node_modules/utils-merge/README.md create mode 100644 user-service/node_modules/utils-merge/index.js create mode 100644 user-service/node_modules/utils-merge/package.json create mode 100644 user-service/node_modules/vary/HISTORY.md create mode 100644 user-service/node_modules/vary/LICENSE create mode 100644 user-service/node_modules/vary/README.md create mode 100644 user-service/node_modules/vary/index.js create mode 100644 user-service/node_modules/vary/package.json create mode 100644 user-service/node_modules/webidl-conversions/LICENSE.md create mode 100644 user-service/node_modules/webidl-conversions/README.md create mode 100644 user-service/node_modules/webidl-conversions/lib/index.js create mode 100644 user-service/node_modules/webidl-conversions/package.json create mode 100644 user-service/node_modules/whatwg-url/LICENSE.txt create mode 100644 user-service/node_modules/whatwg-url/README.md create mode 100644 user-service/node_modules/whatwg-url/index.js create mode 100644 user-service/node_modules/whatwg-url/lib/Function.js create mode 100644 user-service/node_modules/whatwg-url/lib/URL-impl.js create mode 100644 user-service/node_modules/whatwg-url/lib/URL.js create mode 100644 user-service/node_modules/whatwg-url/lib/URLSearchParams-impl.js create mode 100644 user-service/node_modules/whatwg-url/lib/URLSearchParams.js create mode 100644 user-service/node_modules/whatwg-url/lib/VoidFunction.js create mode 100644 user-service/node_modules/whatwg-url/lib/encoding.js create mode 100644 user-service/node_modules/whatwg-url/lib/infra.js create mode 100644 user-service/node_modules/whatwg-url/lib/percent-encoding.js create mode 100644 user-service/node_modules/whatwg-url/lib/url-state-machine.js create mode 100644 user-service/node_modules/whatwg-url/lib/urlencoded.js create mode 100644 user-service/node_modules/whatwg-url/lib/utils.js create mode 100644 user-service/node_modules/whatwg-url/package.json create mode 100644 user-service/node_modules/whatwg-url/webidl2js-wrapper.js create mode 100755 user-service/node_modules/wide-align/LICENSE create mode 100755 user-service/node_modules/wide-align/README.md create mode 100755 user-service/node_modules/wide-align/align.js create mode 100755 user-service/node_modules/wide-align/package.json create mode 100644 user-service/node_modules/wrappy/LICENSE create mode 100644 user-service/node_modules/wrappy/README.md create mode 100644 user-service/node_modules/wrappy/package.json create mode 100644 user-service/node_modules/wrappy/wrappy.js create mode 100644 user-service/node_modules/yallist/LICENSE create mode 100644 user-service/node_modules/yallist/README.md create mode 100644 user-service/node_modules/yallist/iterator.js create mode 100644 user-service/node_modules/yallist/package.json create mode 100644 user-service/node_modules/yallist/yallist.js diff --git a/user-service/.env b/user-service/.env new file mode 100644 index 0000000000..c995ca9a5c --- /dev/null +++ b/user-service/.env @@ -0,0 +1,9 @@ +DB_CLOUD_URI=mongodb+srv://pewggls:osGEKKXddhYyew10@cluster0.vccw4.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0 +DB_LOCAL_URI=mongodb://127.0.0.1:27017/peerprepUserServiceDB +PORT=3001 + +# Will use cloud MongoDB Atlas database +ENV=PROD + +# Secret for creating JWT signature +JWT_SECRET=you-can-replace-this-with-your-own-secret diff --git a/user-service/node_modules/.bin/color-support b/user-service/node_modules/.bin/color-support new file mode 120000 index 0000000000..fcbcb2865a --- /dev/null +++ b/user-service/node_modules/.bin/color-support @@ -0,0 +1 @@ +../color-support/bin.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/mime b/user-service/node_modules/.bin/mime new file mode 120000 index 0000000000..fbb7ee0eed --- /dev/null +++ b/user-service/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/mkdirp b/user-service/node_modules/.bin/mkdirp new file mode 120000 index 0000000000..017896cebb --- /dev/null +++ b/user-service/node_modules/.bin/mkdirp @@ -0,0 +1 @@ +../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/node-pre-gyp b/user-service/node_modules/.bin/node-pre-gyp new file mode 120000 index 0000000000..2946e6a52e --- /dev/null +++ b/user-service/node_modules/.bin/node-pre-gyp @@ -0,0 +1 @@ +../@mapbox/node-pre-gyp/bin/node-pre-gyp \ No newline at end of file diff --git a/user-service/node_modules/.bin/nodemon b/user-service/node_modules/.bin/nodemon new file mode 120000 index 0000000000..1056ddc18d --- /dev/null +++ b/user-service/node_modules/.bin/nodemon @@ -0,0 +1 @@ +../nodemon/bin/nodemon.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/nodetouch b/user-service/node_modules/.bin/nodetouch new file mode 120000 index 0000000000..3409fdb788 --- /dev/null +++ b/user-service/node_modules/.bin/nodetouch @@ -0,0 +1 @@ +../touch/bin/nodetouch.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/nopt b/user-service/node_modules/.bin/nopt new file mode 120000 index 0000000000..6b6566ea7f --- /dev/null +++ b/user-service/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/rimraf b/user-service/node_modules/.bin/rimraf new file mode 120000 index 0000000000..4cd49a49dd --- /dev/null +++ b/user-service/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/bin.js \ No newline at end of file diff --git a/user-service/node_modules/.bin/semver b/user-service/node_modules/.bin/semver new file mode 120000 index 0000000000..5aaadf42c4 --- /dev/null +++ b/user-service/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/user-service/node_modules/.package-lock.json b/user-service/node_modules/.package-lock.json new file mode 100644 index 0000000000..0ad496d3a8 --- /dev/null +++ b/user-service/node_modules/.package-lock.json @@ -0,0 +1,1880 @@ +{ + "name": "user-service", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz", + "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz", + "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.4.tgz", + "integrity": "sha512-nG3eehhWf9l1q80WuHvp5DV+4xDNFpDWLE5ZgcFD5tslUV2USJ56ogun8gaZ62MKAocJnoStjAdno08b8U57hg==", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "6.7.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/.github/workflows/codeql.yml b/user-service/node_modules/@mapbox/node-pre-gyp/.github/workflows/codeql.yml new file mode 100644 index 0000000000..70eaa56fa2 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/.github/workflows/codeql.yml @@ -0,0 +1,74 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '24 5 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/CHANGELOG.md b/user-service/node_modules/@mapbox/node-pre-gyp/CHANGELOG.md new file mode 100644 index 0000000000..990e92977e --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/CHANGELOG.md @@ -0,0 +1,510 @@ +# node-pre-gyp changelog + +## 1.0.11 +- Fixes dependabot alert [CVE-2021-44906](https://nvd.nist.gov/vuln/detail/CVE-2021-44906) + +## 1.0.10 +- Upgraded minimist to 1.2.6 to address dependabot alert [CVE-2021-44906](https://nvd.nist.gov/vuln/detail/CVE-2021-44906) + +## 1.0.9 +- Upgraded node-fetch to 2.6.7 to address [CVE-2022-0235](https://www.cve.org/CVERecord?id=CVE-2022-0235) +- Upgraded detect-libc to 2.0.0 to use non-blocking NodeJS(>=12) Report API + +## 1.0.8 +- Downgraded npmlog to maintain node v10 and v8 support (https://github.com/mapbox/node-pre-gyp/pull/624) + +## 1.0.7 +- Upgraded nyc and npmlog to address https://github.com/advisories/GHSA-93q8-gq69-wqmw + +## 1.0.6 +- Added node v17 to the internal node releases listing +- Upgraded various dependencies declared in package.json to latest major versions (node-fetch from 2.6.1 to 2.6.5, npmlog from 4.1.2 to 5.01, semver from 7.3.4 to 7.3.5, and tar from 6.1.0 to 6.1.11) +- Fixed bug in `staging_host` parameter (https://github.com/mapbox/node-pre-gyp/pull/590) + + +## 1.0.5 +- Fix circular reference warning with node >= v14 + +## 1.0.4 +- Added node v16 to the internal node releases listing + +## 1.0.3 +- Improved support configuring s3 uploads (solves https://github.com/mapbox/node-pre-gyp/issues/571) + - New options added in https://github.com/mapbox/node-pre-gyp/pull/576: 'bucket', 'region', and `s3ForcePathStyle` + +## 1.0.2 +- Fixed regression in proxy support (https://github.com/mapbox/node-pre-gyp/issues/572) + +## 1.0.1 +- Switched from mkdirp@1.0.4 to make-dir@3.1.0 to avoid this bug: https://github.com/isaacs/node-mkdirp/issues/31 + +## 1.0.0 +- Module is now name-spaced at `@mapbox/node-pre-gyp` and the original `node-pre-gyp` is deprecated. +- New: support for staging and production s3 targets (see README.md) +- BREAKING: no longer supporting `node_pre_gyp_accessKeyId` & `node_pre_gyp_secretAccessKey`, use `AWS_ACCESS_KEY_ID` & `AWS_SECRET_ACCESS_KEY` instead to authenticate against s3 for `info`, `publish`, and `unpublish` commands. +- Dropped node v6 support, added node v14 support +- Switched tests to use mapbox-owned bucket for testing +- Added coverage tracking and linting with eslint +- Added back support for symlinks inside the tarball +- Upgraded all test apps to N-API/node-addon-api +- New: support for staging and production s3 targets (see README.md) +- Added `node_pre_gyp_s3_host` env var which has priority over the `--s3_host` option or default. +- Replaced needle with node-fetch +- Added proxy support for node-fetch +- Upgraded to mkdirp@1.x + +## 0.17.0 +- Got travis + appveyor green again +- Added support for more node versions + +## 0.16.0 + +- Added Node 15 support in the local database (https://github.com/mapbox/node-pre-gyp/pull/520) + +## 0.15.0 + +- Bump dependency on `mkdirp` from `^0.5.1` to `^0.5.3` (https://github.com/mapbox/node-pre-gyp/pull/492) +- Bump dependency on `needle` from `^2.2.1` to `^2.5.0` (https://github.com/mapbox/node-pre-gyp/pull/502) +- Added Node 14 support in the local database (https://github.com/mapbox/node-pre-gyp/pull/501) + +## 0.14.0 + +- Defer modules requires in napi.js (https://github.com/mapbox/node-pre-gyp/pull/434) +- Bump dependency on `tar` from `^4` to `^4.4.2` (https://github.com/mapbox/node-pre-gyp/pull/454) +- Support extracting compiled binary from local offline mirror (https://github.com/mapbox/node-pre-gyp/pull/459) +- Added Node 13 support in the local database (https://github.com/mapbox/node-pre-gyp/pull/483) + +## 0.13.0 + +- Added Node 12 support in the local database (https://github.com/mapbox/node-pre-gyp/pull/449) + +## 0.12.0 + +- Fixed double-build problem with node v10 (https://github.com/mapbox/node-pre-gyp/pull/428) +- Added node 11 support in the local database (https://github.com/mapbox/node-pre-gyp/pull/422) + +## 0.11.0 + +- Fixed double-install problem with node v10 +- Significant N-API improvements (https://github.com/mapbox/node-pre-gyp/pull/405) + +## 0.10.3 + +- Now will use `request` over `needle` if request is installed. By default `needle` is used for `https`. This should unbreak proxy support that regressed in v0.9.0 + +## 0.10.2 + +- Fixed rc/deep-extent security vulnerability +- Fixed broken reinstall script do to incorrectly named get_best_napi_version + +## 0.10.1 + +- Fix needle error event (@medns) + +## 0.10.0 + +- Allow for a single-level module path when packing @allenluce (https://github.com/mapbox/node-pre-gyp/pull/371) +- Log warnings instead of errors when falling back @xzyfer (https://github.com/mapbox/node-pre-gyp/pull/366) +- Add Node.js v10 support to tests (https://github.com/mapbox/node-pre-gyp/pull/372) +- Remove retire.js from CI (https://github.com/mapbox/node-pre-gyp/pull/372) +- Remove support for Node.js v4 due to [EOL on April 30th, 2018](https://github.com/nodejs/Release/blob/7dd52354049cae99eed0e9fe01345b0722a86fde/schedule.json#L14) +- Update appveyor tests to install default NPM version instead of NPM v2.x for all Windows builds (https://github.com/mapbox/node-pre-gyp/pull/375) + +## 0.9.1 + +- Fixed regression (in v0.9.0) with support for http redirects @allenluce (https://github.com/mapbox/node-pre-gyp/pull/361) + +## 0.9.0 + +- Switched from using `request` to `needle` to reduce size of module deps (https://github.com/mapbox/node-pre-gyp/pull/350) + +## 0.8.0 + +- N-API support (@inspiredware) + +## 0.7.1 + +- Upgraded to tar v4.x + +## 0.7.0 + + - Updated request and hawk (#347) + - Dropped node v0.10.x support + +## 0.6.40 + + - Improved error reporting if an install fails + +## 0.6.39 + + - Support for node v9 + - Support for versioning on `{libc}` to allow binaries to work on non-glic linux systems like alpine linux + + +## 0.6.38 + + - Maintaining compatibility (for v0.6.x series) with node v0.10.x + +## 0.6.37 + + - Solved one part of #276: now now deduce the node ABI from the major version for node >= 2 even when not stored in the abi_crosswalk.json + - Fixed docs to avoid mentioning the deprecated and dangerous `prepublish` in package.json (#291) + - Add new node versions to crosswalk + - Ported tests to use tape instead of mocha + - Got appveyor tests passing by downgrading npm and node-gyp + +## 0.6.36 + + - Removed the running of `testbinary` during install. Because this was regressed for so long, it is too dangerous to re-enable by default. Developers needing validation can call `node-pre-gyp testbinary` directory. + - Fixed regression in v0.6.35 for electron installs (now skipping binary validation which is not yet supported for electron) + +## 0.6.35 + + - No longer recommending `npm ls` in `prepublish` (#291) + - Fixed testbinary command (#283) @szdavid92 + +## 0.6.34 + + - Added new node versions to crosswalk, including v8 + - Upgraded deps to latest versions, started using `^` instead of `~` for all deps. + +## 0.6.33 + + - Improved support for yarn + +## 0.6.32 + + - Honor npm configuration for CA bundles (@heikkipora) + - Add node-pre-gyp and npm versions to user agent (@addaleax) + - Updated various deps + - Add known node version for v7.x + +## 0.6.31 + + - Updated various deps + +## 0.6.30 + + - Update to npmlog@4.x and semver@5.3.x + - Add known node version for v6.5.0 + +## 0.6.29 + + - Add known node versions for v0.10.45, v0.12.14, v4.4.4, v5.11.1, and v6.1.0 + +## 0.6.28 + + - Now more verbose when remote binaries are not available. This is needed since npm is increasingly more quiet by default + and users need to know why builds are falling back to source compiles that might then error out. + +## 0.6.27 + + - Add known node version for node v6 + - Stopped bundling dependencies + - Documented method for module authors to avoid bundling node-pre-gyp + - See https://github.com/mapbox/node-pre-gyp/tree/master#configuring for details + +## 0.6.26 + + - Skip validation for nw runtime (https://github.com/mapbox/node-pre-gyp/pull/181) via @fleg + +## 0.6.25 + + - Improved support for auto-detection of electron runtime in `node-pre-gyp.find()` + - Pull request from @enlight - https://github.com/mapbox/node-pre-gyp/pull/187 + - Add known node version for 4.4.1 and 5.9.1 + +## 0.6.24 + + - Add known node version for 5.8.0, 5.9.0, and 4.4.0. + +## 0.6.23 + + - Add known node version for 0.10.43, 0.12.11, 4.3.2, and 5.7.1. + +## 0.6.22 + + - Add known node version for 4.3.1, and 5.7.0. + +## 0.6.21 + + - Add known node version for 0.10.42, 0.12.10, 4.3.0, and 5.6.0. + +## 0.6.20 + + - Add known node version for 4.2.5, 4.2.6, 5.4.0, 5.4.1,and 5.5.0. + +## 0.6.19 + + - Add known node version for 4.2.4 + +## 0.6.18 + + - Add new known node versions for 0.10.x, 0.12.x, 4.x, and 5.x + +## 0.6.17 + + - Re-tagged to fix packaging problem of `Error: Cannot find module 'isarray'` + +## 0.6.16 + + - Added known version in crosswalk for 5.1.0. + +## 0.6.15 + + - Upgraded tar-pack (https://github.com/mapbox/node-pre-gyp/issues/182) + - Support custom binary hosting mirror (https://github.com/mapbox/node-pre-gyp/pull/170) + - Added known version in crosswalk for 4.2.2. + +## 0.6.14 + + - Added node 5.x version + +## 0.6.13 + + - Added more known node 4.x versions + +## 0.6.12 + + - Added support for [Electron](http://electron.atom.io/). Just pass the `--runtime=electron` flag when building/installing. Thanks @zcbenz + +## 0.6.11 + + - Added known node and io.js versions including more 3.x and 4.x versions + +## 0.6.10 + + - Added known node and io.js versions including 3.x and 4.x versions + - Upgraded `tar` dep + +## 0.6.9 + + - Upgraded `rc` dep + - Updated known io.js version: v2.4.0 + +## 0.6.8 + + - Upgraded `semver` and `rimraf` deps + - Updated known node and io.js versions + +## 0.6.7 + + - Fixed `node_abi` versions for io.js 1.1.x -> 1.8.x (should be 43, but was stored as 42) (refs https://github.com/iojs/build/issues/94) + +## 0.6.6 + + - Updated with known io.js 2.0.0 version + +## 0.6.5 + + - Now respecting `npm_config_node_gyp` (https://github.com/npm/npm/pull/4887) + - Updated to semver@4.3.2 + - Updated known node v0.12.x versions and io.js 1.x versions. + +## 0.6.4 + + - Improved support for `io.js` (@fengmk2) + - Test coverage improvements (@mikemorris) + - Fixed support for `--dist-url` that regressed in 0.6.3 + +## 0.6.3 + + - Added support for passing raw options to node-gyp using `--` separator. Flags passed after + the `--` to `node-pre-gyp configure` will be passed directly to gyp while flags passed + after the `--` will be passed directly to make/visual studio. + - Added `node-pre-gyp configure` command to be able to call `node-gyp configure` directly + - Fix issue with require validation not working on windows 7 (@edgarsilva) + +## 0.6.2 + + - Support for io.js >= v1.0.2 + - Deferred require of `request` and `tar` to help speed up command line usage of `node-pre-gyp`. + +## 0.6.1 + + - Fixed bundled `tar` version + +## 0.6.0 + + - BREAKING: node odd releases like v0.11.x now use `major.minor.patch` for `{node_abi}` instead of `NODE_MODULE_VERSION` (#124) + - Added support for `toolset` option in versioning. By default is an empty string but `--toolset` can be passed to publish or install to select alternative binaries that target a custom toolset like C++11. For example to target Visual Studio 2014 modules like node-sqlite3 use `--toolset=v140`. + - Added support for `--no-rollback` option to request that a failed binary test does not remove the binary module leaves it in place. + - Added support for `--update-binary` option to request an existing binary be re-installed and the check for a valid local module be skipped. + - Added support for passing build options from `npm` through `node-pre-gyp` to `node-gyp`: `--nodedir`, `--disturl`, `--python`, and `--msvs_version` + +## 0.5.31 + + - Added support for deducing node_abi for node.js runtime from previous release if the series is even + - Added support for --target=0.10.33 + +## 0.5.30 + + - Repackaged with latest bundled deps + +## 0.5.29 + + - Added support for semver `build`. + - Fixed support for downloading from urls that include `+`. + +## 0.5.28 + + - Now reporting unix style paths only in reveal command + +## 0.5.27 + + - Fixed support for auto-detecting s3 bucket name when it contains `.` - @taavo + - Fixed support for installing when path contains a `'` - @halfdan + - Ported tests to mocha + +## 0.5.26 + + - Fix node-webkit support when `--target` option is not provided + +## 0.5.25 + + - Fix bundling of deps + +## 0.5.24 + + - Updated ABI crosswalk to incldue node v0.10.30 and v0.10.31 + +## 0.5.23 + + - Added `reveal` command. Pass no options to get all versioning data as json. Pass a second arg to grab a single versioned property value + - Added support for `--silent` (shortcut for `--loglevel=silent`) + +## 0.5.22 + + - Fixed node-webkit versioning name (NOTE: node-webkit support still experimental) + +## 0.5.21 + + - New package to fix `shasum check failed` error with v0.5.20 + +## 0.5.20 + + - Now versioning node-webkit binaries based on major.minor.patch - assuming no compatible ABI across versions (#90) + +## 0.5.19 + + - Updated to know about more node-webkit releases + +## 0.5.18 + + - Updated to know about more node-webkit releases + +## 0.5.17 + + - Updated to know about node v0.10.29 release + +## 0.5.16 + + - Now supporting all aws-sdk configuration parameters (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html) (#86) + +## 0.5.15 + + - Fixed installation of windows packages sub directories on unix systems (#84) + +## 0.5.14 + + - Finished support for cross building using `--target_platform` option (#82) + - Now skipping binary validation on install if target arch/platform do not match the host. + - Removed multi-arch validing for OS X since it required a FAT node.js binary + +## 0.5.13 + + - Fix problem in 0.5.12 whereby the wrong versions of mkdirp and semver where bundled. + +## 0.5.12 + + - Improved support for node-webkit (@Mithgol) + +## 0.5.11 + + - Updated target versions listing + +## 0.5.10 + + - Fixed handling of `-debug` flag passed directory to node-pre-gyp (#72) + - Added optional second arg to `node_pre_gyp.find` to customize the default versioning options used to locate the runtime binary + - Failed install due to `testbinary` check failure no longer leaves behind binary (#70) + +## 0.5.9 + + - Fixed regression in `testbinary` command causing installs to fail on windows with 0.5.7 (#60) + +## 0.5.8 + + - Started bundling deps + +## 0.5.7 + + - Fixed the `testbinary` check, which is used to determine whether to re-download or source compile, to work even in complex dependency situations (#63) + - Exposed the internal `testbinary` command in node-pre-gyp command line tool + - Fixed minor bug so that `fallback_to_build` option is always respected + +## 0.5.6 + + - Added support for versioning on the `name` value in `package.json` (#57). + - Moved to using streams for reading tarball when publishing (#52) + +## 0.5.5 + + - Improved binary validation that also now works with node-webkit (@Mithgol) + - Upgraded test apps to work with node v0.11.x + - Improved test coverage + +## 0.5.4 + + - No longer depends on external install of node-gyp for compiling builds. + +## 0.5.3 + + - Reverted fix for debian/nodejs since it broke windows (#45) + +## 0.5.2 + + - Support for debian systems where the node binary is named `nodejs` (#45) + - Added `bin/node-pre-gyp.cmd` to be able to run command on windows locally (npm creates an .npm automatically when globally installed) + - Updated abi-crosswalk with node v0.10.26 entry. + +## 0.5.1 + + - Various minor bug fixes, several improving windows support for publishing. + +## 0.5.0 + + - Changed property names in `binary` object: now required are `module_name`, `module_path`, and `host`. + - Now `module_path` supports versioning, which allows developers to opt-in to using a versioned install path (#18). + - Added `remote_path` which also supports versioning. + - Changed `remote_uri` to `host`. + +## 0.4.2 + + - Added support for `--target` flag to request cross-compile against a specific node/node-webkit version. + - Added preliminary support for node-webkit + - Fixed support for `--target_arch` option being respected in all cases. + +## 0.4.1 + + - Fixed exception when only stderr is available in binary test (@bendi / #31) + +## 0.4.0 + + - Enforce only `https:` based remote publishing access. + - Added `node-pre-gyp info` command to display listing of published binaries + - Added support for changing the directory node-pre-gyp should build in with the `-C/--directory` option. + - Added support for S3 prefixes. + +## 0.3.1 + + - Added `unpublish` command. + - Fixed module path construction in tests. + - Added ability to disable falling back to build behavior via `npm install --fallback-to-build=false` which overrides setting in a depedencies package.json `install` target. + +## 0.3.0 + + - Support for packaging all files in `module_path` directory - see `app4` for example + - Added `testpackage` command. + - Changed `clean` command to only delete `.node` not entire `build` directory since node-gyp will handle that. + - `.node` modules must be in a folder of there own since tar-pack will remove everything when it unpacks. diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/LICENSE b/user-service/node_modules/@mapbox/node-pre-gyp/LICENSE new file mode 100644 index 0000000000..8f5fce91b0 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/LICENSE @@ -0,0 +1,27 @@ +Copyright (c), Mapbox + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of node-pre-gyp nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/README.md b/user-service/node_modules/@mapbox/node-pre-gyp/README.md new file mode 100644 index 0000000000..203285a82c --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/README.md @@ -0,0 +1,742 @@ +# @mapbox/node-pre-gyp + +#### @mapbox/node-pre-gyp makes it easy to publish and install Node.js C++ addons from binaries + +[![Build Status](https://travis-ci.com/mapbox/node-pre-gyp.svg?branch=master)](https://travis-ci.com/mapbox/node-pre-gyp) +[![Build status](https://ci.appveyor.com/api/projects/status/3nxewb425y83c0gv)](https://ci.appveyor.com/project/Mapbox/node-pre-gyp) + +`@mapbox/node-pre-gyp` stands between [npm](https://github.com/npm/npm) and [node-gyp](https://github.com/Tootallnate/node-gyp) and offers a cross-platform method of binary deployment. + +### Special note on previous package + +On Feb 9th, 2021 `@mapbox/node-pre-gyp@1.0.0` was [released](./CHANGELOG.md). Older, unscoped versions that are not part of the `@mapbox` org are deprecated and only `@mapbox/node-pre-gyp` will see updates going forward. To upgrade to the new package do: + +``` +npm uninstall node-pre-gyp --save +npm install @mapbox/node-pre-gyp --save +``` + +### Features + + - A command line tool called `node-pre-gyp` that can install your package's C++ module from a binary. + - A variety of developer targeted commands for packaging, testing, and publishing binaries. + - A JavaScript module that can dynamically require your installed binary: `require('@mapbox/node-pre-gyp').find` + +For a hello world example of a module packaged with `node-pre-gyp` see and [the wiki ](https://github.com/mapbox/node-pre-gyp/wiki/Modules-using-node-pre-gyp) for real world examples. + +## Credits + + - The module is modeled after [node-gyp](https://github.com/Tootallnate/node-gyp) by [@Tootallnate](https://github.com/Tootallnate) + - Motivation for initial development came from [@ErisDS](https://github.com/ErisDS) and the [Ghost Project](https://github.com/TryGhost/Ghost). + - Development is sponsored by [Mapbox](https://www.mapbox.com/) + +## FAQ + +See the [Frequently Ask Questions](https://github.com/mapbox/node-pre-gyp/wiki/FAQ). + +## Depends + + - Node.js >= node v8.x + +## Install + +`node-pre-gyp` is designed to be installed as a local dependency of your Node.js C++ addon and accessed like: + + ./node_modules/.bin/node-pre-gyp --help + +But you can also install it globally: + + npm install @mapbox/node-pre-gyp -g + +## Usage + +### Commands + +View all possible commands: + + node-pre-gyp --help + +- clean - Remove the entire folder containing the compiled .node module +- install - Install pre-built binary for module +- reinstall - Run "clean" and "install" at once +- build - Compile the module by dispatching to node-gyp or nw-gyp +- rebuild - Run "clean" and "build" at once +- package - Pack binary into tarball +- testpackage - Test that the staged package is valid +- publish - Publish pre-built binary +- unpublish - Unpublish pre-built binary +- info - Fetch info on published binaries + +You can also chain commands: + + node-pre-gyp clean build unpublish publish info + +### Options + +Options include: + + - `-C/--directory`: run the command in this directory + - `--build-from-source`: build from source instead of using pre-built binary + - `--update-binary`: reinstall by replacing previously installed local binary with remote binary + - `--runtime=node-webkit`: customize the runtime: `node`, `electron` and `node-webkit` are the valid options + - `--fallback-to-build`: fallback to building from source if pre-built binary is not available + - `--target=0.4.0`: Pass the target node or node-webkit version to compile against + - `--target_arch=ia32`: Pass the target arch and override the host `arch`. Any value that is [supported by Node.js](https://nodejs.org/api/os.html#osarch) is valid. + - `--target_platform=win32`: Pass the target platform and override the host `platform`. Valid values are `linux`, `darwin`, `win32`, `sunos`, `freebsd`, `openbsd`, and `aix`. + +Both `--build-from-source` and `--fallback-to-build` can be passed alone or they can provide values. You can pass `--fallback-to-build=false` to override the option as declared in package.json. In addition to being able to pass `--build-from-source` you can also pass `--build-from-source=myapp` where `myapp` is the name of your module. + +For example: `npm install --build-from-source=myapp`. This is useful if: + + - `myapp` is referenced in the package.json of a larger app and therefore `myapp` is being installed as a dependency with `npm install`. + - The larger app also depends on other modules installed with `node-pre-gyp` + - You only want to trigger a source compile for `myapp` and the other modules. + +### Configuring + +This is a guide to configuring your module to use node-pre-gyp. + +#### 1) Add new entries to your `package.json` + + - Add `@mapbox/node-pre-gyp` to `dependencies` + - Add `aws-sdk` as a `devDependency` + - Add a custom `install` script + - Declare a `binary` object + +This looks like: + +```js + "dependencies" : { + "@mapbox/node-pre-gyp": "1.x" + }, + "devDependencies": { + "aws-sdk": "2.x" + } + "scripts": { + "install": "node-pre-gyp install --fallback-to-build" + }, + "binary": { + "module_name": "your_module", + "module_path": "./lib/binding/", + "host": "https://your_module.s3-us-west-1.amazonaws.com" + } +``` + +For a full example see [node-addon-examples's package.json](https://github.com/springmeyer/node-addon-example/blob/master/package.json). + +Let's break this down: + + - Dependencies need to list `node-pre-gyp` + - Your devDependencies should list `aws-sdk` so that you can run `node-pre-gyp publish` locally or a CI system. We recommend using `devDependencies` only since `aws-sdk` is large and not needed for `node-pre-gyp install` since it only uses http to fetch binaries + - Your `scripts` section should override the `install` target with `"install": "node-pre-gyp install --fallback-to-build"`. This allows node-pre-gyp to be used instead of the default npm behavior of always source compiling with `node-gyp` directly. + - Your package.json should contain a `binary` section describing key properties you provide to allow node-pre-gyp to package optimally. They are detailed below. + +Note: in the past we recommended putting `@mapbox/node-pre-gyp` in the `bundledDependencies`, but we no longer recommend this. In the past there were npm bugs (with node versions 0.10.x) that could lead to node-pre-gyp not being available at the right time during install (unless we bundled). This should no longer be the case. Also, for a time we recommended using `"preinstall": "npm install @mapbox/node-pre-gyp"` as an alternative method to avoid needing to bundle. But this did not behave predictably across all npm versions - see https://github.com/mapbox/node-pre-gyp/issues/260 for the details. So we do not recommend using `preinstall` to install `@mapbox/node-pre-gyp`. More history on this at https://github.com/strongloop/fsevents/issues/157#issuecomment-265545908. + +##### The `binary` object has three required properties + +###### module_name + +The name of your native node module. This value must: + + - Match the name passed to [the NODE_MODULE macro](http://nodejs.org/api/addons.html#addons_hello_world) + - Must be a valid C variable name (e.g. it cannot contain `-`) + - Should not include the `.node` extension. + +###### module_path + +The location your native module is placed after a build. This should be an empty directory without other Javascript files. This entire directory will be packaged in the binary tarball. When installing from a remote package this directory will be overwritten with the contents of the tarball. + +Note: This property supports variables based on [Versioning](#versioning). + +###### host + +A url to the remote location where you've published tarball binaries (must be `https` not `http`). + +It is highly recommended that you use Amazon S3. The reasons are: + + - Various node-pre-gyp commands like `publish` and `info` only work with an S3 host. + - S3 is a very solid hosting platform for distributing large files. + - We provide detail documentation for using [S3 hosting](#s3-hosting) with node-pre-gyp. + +Why then not require S3? Because while some applications using node-pre-gyp need to distribute binaries as large as 20-30 MB, others might have very small binaries and might wish to store them in a GitHub repo. This is not recommended, but if an author really wants to host in a non-S3 location then it should be possible. + +It should also be mentioned that there is an optional and entirely separate npm module called [node-pre-gyp-github](https://github.com/bchr02/node-pre-gyp-github) which is intended to complement node-pre-gyp and be installed along with it. It provides the ability to store and publish your binaries within your repositories GitHub Releases if you would rather not use S3 directly. Installation and usage instructions can be found [here](https://github.com/bchr02/node-pre-gyp-github), but the basic premise is that instead of using the ```node-pre-gyp publish``` command you would use ```node-pre-gyp-github publish```. + +##### The `binary` object other optional S3 properties + +If you are not using a standard s3 path like `bucket_name.s3(.-)region.amazonaws.com`, you might get an error on `publish` because node-pre-gyp extracts the region and bucket from the `host` url. For example, you may have an on-premises s3-compatible storage server, or may have configured a specific dns redirecting to an s3 endpoint. In these cases, you can explicitly set the `region` and `bucket` properties to tell node-pre-gyp to use these values instead of guessing from the `host` property. The following values can be used in the `binary` section: + +###### host + +The url to the remote server root location (must be `https` not `http`). + +###### bucket + +The bucket name where your tarball binaries should be located. + +###### region + +Your S3 server region. + +###### s3ForcePathStyle + +Set `s3ForcePathStyle` to true if the endpoint url should not be prefixed with the bucket name. If false (default), the server endpoint would be constructed as `bucket_name.your_server.com`. + +##### The `binary` object has optional properties + +###### remote_path + +It **is recommended** that you customize this property. This is an extra path to use for publishing and finding remote tarballs. The default value for `remote_path` is `""` meaning that if you do not provide it then all packages will be published at the base of the `host`. It is recommended to provide a value like `./{name}/v{version}` to help organize remote packages in the case that you choose to publish multiple node addons to the same `host`. + +Note: This property supports variables based on [Versioning](#versioning). + +###### package_name + +It is **not recommended** to override this property unless you are also overriding the `remote_path`. This is the versioned name of the remote tarball containing the binary `.node` module and any supporting files you've placed inside the `module_path` directory. Unless you specify `package_name` in your `package.json` then it defaults to `{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz` which allows your binary to work across node versions, platforms, and architectures. If you are using `remote_path` that is also versioned by `./{module_name}/v{version}` then you could remove these variables from the `package_name` and just use: `{node_abi}-{platform}-{arch}.tar.gz`. Then your remote tarball will be looked up at, for example, `https://example.com/your-module/v0.1.0/node-v11-linux-x64.tar.gz`. + +Avoiding the version of your module in the `package_name` and instead only embedding in a directory name can be useful when you want to make a quick tag of your module that does not change any C++ code. In this case you can just copy binaries to the new version behind the scenes like: + +```sh +aws s3 sync --acl public-read s3://mapbox-node-binary/sqlite3/v3.0.3/ s3://mapbox-node-binary/sqlite3/v3.0.4/ +``` + +Note: This property supports variables based on [Versioning](#versioning). + +#### 2) Add a new target to binding.gyp + +`node-pre-gyp` calls out to `node-gyp` to compile the module and passes variables along like [module_name](#module_name) and [module_path](#module_path). + +A new target must be added to `binding.gyp` that moves the compiled `.node` module from `./build/Release/module_name.node` into the directory specified by `module_path`. + +Add a target like this at the end of your `targets` list: + +```js + { + "target_name": "action_after_build", + "type": "none", + "dependencies": [ "<(module_name)" ], + "copies": [ + { + "files": [ "<(PRODUCT_DIR)/<(module_name).node" ], + "destination": "<(module_path)" + } + ] + } +``` + +For a full example see [node-addon-example's binding.gyp](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/binding.gyp). + +#### 3) Dynamically require your `.node` + +Inside the main js file that requires your addon module you are likely currently doing: + +```js +var binding = require('../build/Release/binding.node'); +``` + +or: + +```js +var bindings = require('./bindings') +``` + +Change those lines to: + +```js +var binary = require('@mapbox/node-pre-gyp'); +var path = require('path'); +var binding_path = binary.find(path.resolve(path.join(__dirname,'./package.json'))); +var binding = require(binding_path); +``` + +For a full example see [node-addon-example's index.js](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/index.js#L1-L4) + +#### 4) Build and package your app + +Now build your module from source: + + npm install --build-from-source + +The `--build-from-source` tells `node-pre-gyp` to not look for a remote package and instead dispatch to node-gyp to build. + +Now `node-pre-gyp` should now also be installed as a local dependency so the command line tool it offers can be found at `./node_modules/.bin/node-pre-gyp`. + +#### 5) Test + +Now `npm test` should work just as it did before. + +#### 6) Publish the tarball + +Then package your app: + + ./node_modules/.bin/node-pre-gyp package + +Once packaged, now you can publish: + + ./node_modules/.bin/node-pre-gyp publish + +Currently the `publish` command pushes your binary to S3. This requires: + + - You have installed `aws-sdk` with `npm install aws-sdk` + - You have created a bucket already. + - The `host` points to an S3 http or https endpoint. + - You have configured node-pre-gyp to read your S3 credentials (see [S3 hosting](#s3-hosting) for details). + +You can also host your binaries elsewhere. To do this requires: + + - You manually publish the binary created by the `package` command to an `https` endpoint + - Ensure that the `host` value points to your custom `https` endpoint. + +#### 7) Automate builds + +Now you need to publish builds for all the platforms and node versions you wish to support. This is best automated. + + - See [Appveyor Automation](#appveyor-automation) for how to auto-publish builds on Windows. + - See [Travis Automation](#travis-automation) for how to auto-publish builds on OS X and Linux. + +#### 8) You're done! + +Now publish your module to the npm registry. Users will now be able to install your module from a binary. + +What will happen is this: + +1. `npm install ` will pull from the npm registry +2. npm will run the `install` script which will call out to `node-pre-gyp` +3. `node-pre-gyp` will fetch the binary `.node` module and unpack in the right place +4. Assuming that all worked, you are done + +If a a binary was not available for a given platform and `--fallback-to-build` was used then `node-gyp rebuild` will be called to try to source compile the module. + +#### 9) One more option + +It may be that you want to work with two s3 buckets, one for staging and one for production; this +arrangement makes it less likely to accidentally overwrite a production binary. It also allows the production +environment to have more restrictive permissions than staging while still enabling publishing when +developing and testing. + +The binary.host property can be set at execution time. In order to do so all of the following conditions +must be true. + +- binary.host is falsey or not present +- binary.staging_host is not empty +- binary.production_host is not empty + +If any of these checks fail then the operation will not perform execution time determination of the s3 target. + +If the command being executed is either "publish" or "unpublish" then the default is set to `binary.staging_host`. In all other cases +the default is `binary.production_host`. + +The command-line options `--s3_host=staging` or `--s3_host=production` override the default. If `s3_host` +is present and not `staging` or `production` an exception is thrown. + +This allows installing from staging by specifying `--s3_host=staging`. And it requires specifying +`--s3_option=production` in order to publish to, or unpublish from, production, making accidental errors less likely. + +## Node-API Considerations + +[Node-API](https://nodejs.org/api/n-api.html#n_api_node_api), which was previously known as N-API, is an ABI-stable alternative to previous technologies such as [nan](https://github.com/nodejs/nan) which are tied to a specific Node runtime engine. Node-API is Node runtime engine agnostic and guarantees modules created today will continue to run, without changes, into the future. + +Using `node-pre-gyp` with Node-API projects requires a handful of additional configuration values and imposes some additional requirements. + +The most significant difference is that an Node-API module can be coded to target multiple Node-API versions. Therefore, an Node-API module must declare in its `package.json` file which Node-API versions the module is designed to run against. In addition, since multiple builds may be required for a single module, path and file names must be specified in way that avoids naming conflicts. + +### The `napi_versions` array property + +A Node-API module must declare in its `package.json` file, the Node-API versions the module is intended to support. This is accomplished by including an `napi-versions` array property in the `binary` object. For example: + +```js +"binary": { + "module_name": "your_module", + "module_path": "your_module_path", + "host": "https://your_bucket.s3-us-west-1.amazonaws.com", + "napi_versions": [1,3] + } +``` + +If the `napi_versions` array property is *not* present, `node-pre-gyp` operates as it always has. Including the `napi_versions` array property instructs `node-pre-gyp` that this is a Node-API module build. + +When the `napi_versions` array property is present, `node-pre-gyp` fires off multiple operations, one for each of the Node-API versions in the array. In the example above, two operations are initiated, one for Node-API version 1 and second for Node-API version 3. How this version number is communicated is described next. + +### The `napi_build_version` value + +For each of the Node-API module operations `node-pre-gyp` initiates, it ensures that the `napi_build_version` is set appropriately. + +This value is of importance in two areas: + +1. The C/C++ code which needs to know against which Node-API version it should compile. +2. `node-pre-gyp` itself which must assign appropriate path and file names to avoid collisions. + +### Defining `NAPI_VERSION` for the C/C++ code + +The `napi_build_version` value is communicated to the C/C++ code by adding this code to the `binding.gyp` file: + +``` +"defines": [ + "NAPI_VERSION=<(napi_build_version)", +] +``` + +This ensures that `NAPI_VERSION`, an integer value, is declared appropriately to the C/C++ code for each build. + +> Note that earlier versions of this document recommended defining the symbol `NAPI_BUILD_VERSION`. `NAPI_VERSION` is preferred because it used by the Node-API C/C++ headers to configure the specific Node-API versions being requested. + +### Path and file naming requirements in `package.json` + +Since `node-pre-gyp` fires off multiple operations for each request, it is essential that path and file names be created in such a way as to avoid collisions. This is accomplished by imposing additional path and file naming requirements. + +Specifically, when performing Node-API builds, the `{napi_build_version}` text configuration value *must* be present in the `module_path` property. In addition, the `{napi_build_version}` text configuration value *must* be present in either the `remote_path` or `package_name` property. (No problem if it's in both.) + +Here's an example: + +```js +"binary": { + "module_name": "your_module", + "module_path": "./lib/binding/napi-v{napi_build_version}", + "remote_path": "./{module_name}/v{version}/{configuration}/", + "package_name": "{platform}-{arch}-napi-v{napi_build_version}.tar.gz", + "host": "https://your_bucket.s3-us-west-1.amazonaws.com", + "napi_versions": [1,3] + } +``` + +## Supporting both Node-API and NAN builds + +You may have a legacy native add-on that you wish to continue supporting for those versions of Node that do not support Node-API, as you add Node-API support for later Node versions. This can be accomplished by specifying the `node_napi_label` configuration value in the package.json `binary.package_name` property. + +Placing the configuration value `node_napi_label` in the package.json `binary.package_name` property instructs `node-pre-gyp` to build all viable Node-API binaries supported by the current Node instance. If the current Node instance does not support Node-API, `node-pre-gyp` will request a traditional, non-Node-API build. + +The configuration value `node_napi_label` is set by `node-pre-gyp` to the type of build created, `napi` or `node`, and the version number. For Node-API builds, the string contains the Node-API version nad has values like `napi-v3`. For traditional, non-Node-API builds, the string contains the ABI version with values like `node-v46`. + +Here's how the `binary` configuration above might be changed to support both Node-API and NAN builds: + +```js +"binary": { + "module_name": "your_module", + "module_path": "./lib/binding/{node_napi_label}", + "remote_path": "./{module_name}/v{version}/{configuration}/", + "package_name": "{platform}-{arch}-{node_napi_label}.tar.gz", + "host": "https://your_bucket.s3-us-west-1.amazonaws.com", + "napi_versions": [1,3] + } +``` + +The C/C++ symbol `NAPI_VERSION` can be used to distinguish Node-API and non-Node-API builds. The value of `NAPI_VERSION` is set to the integer Node-API version for Node-API builds and is set to `0` for non-Node-API builds. + +For example: + +```C +#if NAPI_VERSION +// Node-API code goes here +#else +// NAN code goes here +#endif +``` + +### Two additional configuration values + +The following two configuration values, which were implemented in previous versions of `node-pre-gyp`, continue to exist, but have been replaced by the `node_napi_label` configuration value described above. + +1. `napi_version` If Node-API is supported by the currently executing Node instance, this value is the Node-API version number supported by Node. If Node-API is not supported, this value is an empty string. + +2. `node_abi_napi` If the value returned for `napi_version` is non empty, this value is `'napi'`. If the value returned for `napi_version` is empty, this value is the value returned for `node_abi`. + +These values are present for use in the `binding.gyp` file and may be used as `{napi_version}` and `{node_abi_napi}` for text substituion in the `binary` properties of the `package.json` file. + +## S3 Hosting + +You can host wherever you choose but S3 is cheap, `node-pre-gyp publish` expects it, and S3 can be integrated well with [Travis.ci](http://travis-ci.org) to automate builds for OS X and Ubuntu, and with [Appveyor](http://appveyor.com) to automate builds for Windows. Here is an approach to do this: + +First, get setup locally and test the workflow: + +#### 1) Create an S3 bucket + +And have your **key** and **secret key** ready for writing to the bucket. + +It is recommended to create a IAM user with a policy that only gives permissions to the specific bucket you plan to publish to. This can be done in the [IAM console](https://console.aws.amazon.com/iam/) by: 1) adding a new user, 2) choosing `Attach User Policy`, 3) Using the `Policy Generator`, 4) selecting `Amazon S3` for the service, 5) adding the actions: `DeleteObject`, `GetObject`, `GetObjectAcl`, `ListBucket`, `HeadBucket`, `PutObject`, `PutObjectAcl`, 6) adding an ARN of `arn:aws:s3:::bucket/*` (replacing `bucket` with your bucket name), and finally 7) clicking `Add Statement` and saving the policy. It should generate a policy like: + +```js +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "objects", + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetObjectAcl", + "s3:GetObject", + "s3:DeleteObject", + "s3:PutObjectAcl" + ], + "Resource": "arn:aws:s3:::your-bucket-name/*" + }, + { + "Sid": "bucket", + "Effect": "Allow", + "Action": "s3:ListBucket", + "Resource": "arn:aws:s3:::your-bucket-name" + }, + { + "Sid": "buckets", + "Effect": "Allow", + "Action": "s3:HeadBucket", + "Resource": "*" + } + ] +} +``` + +#### 2) Install node-pre-gyp + +Either install it globally: + + npm install node-pre-gyp -g + +Or put the local version on your PATH + + export PATH=`pwd`/node_modules/.bin/:$PATH + +#### 3) Configure AWS credentials + +It is recommended to configure the AWS JS SDK v2 used internally by `node-pre-gyp` by setting these environment variables: + +- AWS_ACCESS_KEY_ID +- AWS_SECRET_ACCESS_KEY + +But also you can also use the `Shared Config File` mentioned [in the AWS JS SDK v2 docs](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/configuring-the-jssdk.html) + +#### 4) Package and publish your build + +Install the `aws-sdk`: + + npm install aws-sdk + +Then publish: + + node-pre-gyp package publish + +Note: if you hit an error like `Hostname/IP doesn't match certificate's altnames` it may mean that you need to provide the `region` option in your config. + +## Appveyor Automation + +[Appveyor](http://www.appveyor.com/) can build binaries and publish the results per commit and supports: + + - Windows Visual Studio 2013 and related compilers + - Both 64 bit (x64) and 32 bit (x86) build configurations + - Multiple Node.js versions + +For an example of doing this see [node-sqlite3's appveyor.yml](https://github.com/mapbox/node-sqlite3/blob/master/appveyor.yml). + +Below is a guide to getting set up: + +#### 1) Create a free Appveyor account + +Go to https://ci.appveyor.com/signup/free and sign in with your GitHub account. + +#### 2) Create a new project + +Go to https://ci.appveyor.com/projects/new and select the GitHub repo for your module + +#### 3) Add appveyor.yml and push it + +Once you have committed an `appveyor.yml` ([appveyor.yml reference](http://www.appveyor.com/docs/appveyor-yml)) to your GitHub repo and pushed it AppVeyor should automatically start building your project. + +#### 4) Create secure variables + +Encrypt your S3 AWS keys by going to and hitting the `encrypt` button. + +Then paste the result into your `appveyor.yml` + +```yml +environment: + AWS_ACCESS_KEY_ID: + secure: Dn9HKdLNYvDgPdQOzRq/DqZ/MPhjknRHB1o+/lVU8MA= + AWS_SECRET_ACCESS_KEY: + secure: W1rwNoSnOku1r+28gnoufO8UA8iWADmL1LiiwH9IOkIVhDTNGdGPJqAlLjNqwLnL +``` + +NOTE: keys are per account but not per repo (this is difference than Travis where keys are per repo but not related to the account used to encrypt them). + +#### 5) Hook up publishing + +Just put `node-pre-gyp package publish` in your `appveyor.yml` after `npm install`. + +#### 6) Publish when you want + +You might wish to publish binaries only on a specific commit. To do this you could borrow from the [Travis CI idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`: + + SET CM=%APPVEYOR_REPO_COMMIT_MESSAGE% + if not "%CM%" == "%CM:[publish binary]=%" node-pre-gyp --msvs_version=2013 publish + +If your commit message contains special characters (e.g. `&`) this method might fail. An alternative is to use PowerShell, which gives you additional possibilities, like ignoring case by using `ToLower()`: + + ps: if($env:APPVEYOR_REPO_COMMIT_MESSAGE.ToLower().Contains('[publish binary]')) { node-pre-gyp --msvs_version=2013 publish } + +Remember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. + +## Travis Automation + +[Travis](https://travis-ci.org/) can push to S3 after a successful build and supports both: + + - Ubuntu Precise and OS X (64 bit) + - Multiple Node.js versions + +For an example of doing this see [node-add-example's .travis.yml](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/.travis.yml). + +Note: if you need 32 bit binaries, this can be done from a 64 bit Travis machine. See [the node-sqlite3 scripts for an example of doing this](https://github.com/mapbox/node-sqlite3/blob/bae122aa6a2b8a45f6b717fab24e207740e32b5d/scripts/build_against_node.sh#L54-L74). + +Below is a guide to getting set up: + +#### 1) Install the Travis gem + + gem install travis + +#### 2) Create secure variables + +Make sure you run this command from within the directory of your module. + +Use `travis-encrypt` like: + + travis encrypt AWS_ACCESS_KEY_ID=${node_pre_gyp_accessKeyId} + travis encrypt AWS_SECRET_ACCESS_KEY=${node_pre_gyp_secretAccessKey} + +Then put those values in your `.travis.yml` like: + +```yaml +env: + global: + - secure: F+sEL/v56CzHqmCSSES4pEyC9NeQlkoR0Gs/ZuZxX1ytrj8SKtp3MKqBj7zhIclSdXBz4Ev966Da5ctmcTd410p0b240MV6BVOkLUtkjZJyErMBOkeb8n8yVfSoeMx8RiIhBmIvEn+rlQq+bSFis61/JkE9rxsjkGRZi14hHr4M= + - secure: o2nkUQIiABD139XS6L8pxq3XO5gch27hvm/gOdV+dzNKc/s2KomVPWcOyXNxtJGhtecAkABzaW8KHDDi5QL1kNEFx6BxFVMLO8rjFPsMVaBG9Ks6JiDQkkmrGNcnVdxI/6EKTLHTH5WLsz8+J7caDBzvKbEfTux5EamEhxIWgrI= +``` + +More details on Travis encryption at http://about.travis-ci.org/docs/user/encryption-keys/. + +#### 3) Hook up publishing + +Just put `node-pre-gyp package publish` in your `.travis.yml` after `npm install`. + +##### OS X publishing + +If you want binaries for OS X in addition to linux you can enable [multi-os for Travis](http://docs.travis-ci.com/user/multi-os/#Setting-.travis.yml) + +Use a configuration like: + +```yml + +language: cpp + +os: +- linux +- osx + +env: + matrix: + - NODE_VERSION="4" + - NODE_VERSION="6" + +before_install: +- rm -rf ~/.nvm/ && git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm +- source ~/.nvm/nvm.sh +- nvm install $NODE_VERSION +- nvm use $NODE_VERSION +``` + +See [Travis OS X Gotchas](#travis-os-x-gotchas) for why we replace `language: node_js` and `node_js:` sections with `language: cpp` and a custom matrix. + +Also create platform specific sections for any deps that need install. For example if you need libpng: + +```yml +- if [ $(uname -s) == 'Linux' ]; then apt-get install libpng-dev; fi; +- if [ $(uname -s) == 'Darwin' ]; then brew install libpng; fi; +``` + +For detailed multi-OS examples see [node-mapnik](https://github.com/mapnik/node-mapnik/blob/master/.travis.yml) and [node-sqlite3](https://github.com/mapbox/node-sqlite3/blob/master/.travis.yml). + +##### Travis OS X Gotchas + +First, unlike the Travis Linux machines, the OS X machines do not put `node-pre-gyp` on PATH by default. To do so you will need to: + +```sh +export PATH=$(pwd)/node_modules/.bin:${PATH} +``` + +Second, the OS X machines do not support using a matrix for installing different Node.js versions. So you need to bootstrap the installation of Node.js in a cross platform way. + +By doing: + +```yml +env: + matrix: + - NODE_VERSION="4" + - NODE_VERSION="6" + +before_install: + - rm -rf ~/.nvm/ && git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm + - source ~/.nvm/nvm.sh + - nvm install $NODE_VERSION + - nvm use $NODE_VERSION +``` + +You can easily recreate the previous behavior of this matrix: + +```yml +node_js: + - "4" + - "6" +``` + +#### 4) Publish when you want + +You might wish to publish binaries only on a specific commit. To do this you could borrow from the [Travis CI idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`: + + COMMIT_MESSAGE=$(git log --format=%B --no-merges -n 1 | tr -d '\n') + if [[ ${COMMIT_MESSAGE} =~ "[publish binary]" ]]; then node-pre-gyp publish; fi; + +Then you can trigger new binaries to be built like: + + git commit -a -m "[publish binary]" + +Or, if you don't have any changes to make simply run: + + git commit --allow-empty -m "[publish binary]" + +WARNING: if you are working in a pull request and publishing binaries from there then you will want to avoid double publishing when Travis CI builds both the `push` and `pr`. You only want to run the publish on the `push` commit. See https://github.com/Project-OSRM/node-osrm/blob/8eb837abe2e2e30e595093d16e5354bc5c573575/scripts/is_pr_merge.sh which is called from https://github.com/Project-OSRM/node-osrm/blob/8eb837abe2e2e30e595093d16e5354bc5c573575/scripts/publish.sh for an example of how to do this. + +Remember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. To automate the publishing of your entire package to npm on Travis see http://about.travis-ci.org/docs/user/deployment/npm/ + +# Versioning + +The `binary` properties of `module_path`, `remote_path`, and `package_name` support variable substitution. The strings are evaluated by `node-pre-gyp` depending on your system and any custom build flags you passed. + + - `node_abi`: The node C++ `ABI` number. This value is available in Javascript as `process.versions.modules` as of [`>= v0.10.4 >= v0.11.7`](https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e) and in C++ as the `NODE_MODULE_VERSION` define much earlier. For versions of Node before this was available we fallback to the V8 major and minor version. + - `platform` matches node's `process.platform` like `linux`, `darwin`, and `win32` unless the user passed the `--target_platform` option to override. + - `arch` matches node's `process.arch` like `x64` or `ia32` unless the user passes the `--target_arch` option to override. + - `libc` matches `require('detect-libc').family` like `glibc` or `musl` unless the user passes the `--target_libc` option to override. + - `configuration` - Either 'Release' or 'Debug' depending on if `--debug` is passed during the build. + - `module_name` - the `binary.module_name` attribute from `package.json`. + - `version` - the semver `version` value for your module from `package.json` (NOTE: ignores the `semver.build` property). + - `major`, `minor`, `patch`, and `prelease` match the individual semver values for your module's `version` + - `build` - the sevmer `build` value. For example it would be `this.that` if your package.json `version` was `v1.0.0+this.that` + - `prerelease` - the semver `prerelease` value. For example it would be `alpha.beta` if your package.json `version` was `v1.0.0-alpha.beta` + + +The options are visible in the code at + +# Download binary files from a mirror + +S3 is broken in China for the well known reason. + +Using the `npm` config argument: `--{module_name}_binary_host_mirror` can download binary files through a mirror, `-` in `module_name` will be replaced with `_`. + +e.g.: Install [v8-profiler](https://www.npmjs.com/package/v8-profiler) from `npm`. + +```bash +$ npm install v8-profiler --profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/ +``` + +e.g.: Install [canvas-prebuilt](https://www.npmjs.com/package/canvas-prebuilt) from `npm`. + +```bash +$ npm install canvas-prebuilt --canvas_prebuilt_binary_host_mirror=https://npm.taobao.org/mirrors/canvas-prebuilt/ +``` diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp b/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp new file mode 100755 index 0000000000..c38d34d104 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp @@ -0,0 +1,4 @@ +#!/usr/bin/env node +'use strict'; + +require('../lib/main'); diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp.cmd b/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp.cmd new file mode 100644 index 0000000000..46e14b5417 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp.cmd @@ -0,0 +1,2 @@ +@echo off +node "%~dp0\node-pre-gyp" %* diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/contributing.md b/user-service/node_modules/@mapbox/node-pre-gyp/contributing.md new file mode 100644 index 0000000000..4038fa6a6a --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/contributing.md @@ -0,0 +1,10 @@ +# Contributing + + +### Releasing a new version: + +- Ensure tests are passing on travis and appveyor +- Run `node scripts/abi_crosswalk.js` and commit any changes +- Update the changelog +- Tag a new release like: `git tag -a v0.6.34 -m "tagging v0.6.34" && git push --tags` +- Run `npm publish` diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/build.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/build.js new file mode 100644 index 0000000000..e8a1459d40 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/build.js @@ -0,0 +1,51 @@ +'use strict'; + +module.exports = exports = build; + +exports.usage = 'Attempts to compile the module by dispatching to node-gyp or nw-gyp'; + +const napi = require('./util/napi.js'); +const compile = require('./util/compile.js'); +const handle_gyp_opts = require('./util/handle_gyp_opts.js'); +const configure = require('./configure.js'); + +function do_build(gyp, argv, callback) { + handle_gyp_opts(gyp, argv, (err, result) => { + let final_args = ['build'].concat(result.gyp).concat(result.pre); + if (result.unparsed.length > 0) { + final_args = final_args. + concat(['--']). + concat(result.unparsed); + } + if (!err && result.opts.napi_build_version) { + napi.swap_build_dir_in(result.opts.napi_build_version); + } + compile.run_gyp(final_args, result.opts, (err2) => { + if (result.opts.napi_build_version) { + napi.swap_build_dir_out(result.opts.napi_build_version); + } + return callback(err2); + }); + }); +} + +function build(gyp, argv, callback) { + + // Form up commands to pass to node-gyp: + // We map `node-pre-gyp build` to `node-gyp configure build` so that we do not + // trigger a clean and therefore do not pay the penalty of a full recompile + if (argv.length && (argv.indexOf('rebuild') > -1)) { + argv.shift(); // remove `rebuild` + // here we map `node-pre-gyp rebuild` to `node-gyp rebuild` which internally means + // "clean + configure + build" and triggers a full recompile + compile.run_gyp(['clean'], {}, (err3) => { + if (err3) return callback(err3); + configure(gyp, argv, (err4) => { + if (err4) return callback(err4); + return do_build(gyp, argv, callback); + }); + }); + } else { + return do_build(gyp, argv, callback); + } +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/clean.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/clean.js new file mode 100644 index 0000000000..e6933923ef --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/clean.js @@ -0,0 +1,31 @@ +'use strict'; + +module.exports = exports = clean; + +exports.usage = 'Removes the entire folder containing the compiled .node module'; + +const rm = require('rimraf'); +const exists = require('fs').exists || require('path').exists; +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const path = require('path'); + +function clean(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + const to_delete = opts.module_path; + if (!to_delete) { + return callback(new Error('module_path is empty, refusing to delete')); + } else if (path.normalize(to_delete) === path.normalize(process.cwd())) { + return callback(new Error('module_path is not set, refusing to delete')); + } else { + exists(to_delete, (found) => { + if (found) { + if (!gyp.opts.silent_clean) console.log('[' + package_json.name + '] Removing "%s"', to_delete); + return rm(to_delete, callback); + } + return callback(); + }); + } +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/configure.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/configure.js new file mode 100644 index 0000000000..1337c0cb2e --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/configure.js @@ -0,0 +1,52 @@ +'use strict'; + +module.exports = exports = configure; + +exports.usage = 'Attempts to configure node-gyp or nw-gyp build'; + +const napi = require('./util/napi.js'); +const compile = require('./util/compile.js'); +const handle_gyp_opts = require('./util/handle_gyp_opts.js'); + +function configure(gyp, argv, callback) { + handle_gyp_opts(gyp, argv, (err, result) => { + let final_args = result.gyp.concat(result.pre); + // pull select node-gyp configure options out of the npm environ + const known_gyp_args = ['dist-url', 'python', 'nodedir', 'msvs_version']; + known_gyp_args.forEach((key) => { + const val = gyp.opts[key] || gyp.opts[key.replace('-', '_')]; + if (val) { + final_args.push('--' + key + '=' + val); + } + }); + // --ensure=false tell node-gyp to re-install node development headers + // but it is only respected by node-gyp install, so we have to call install + // as a separate step if the user passes it + if (gyp.opts.ensure === false) { + const install_args = final_args.concat(['install', '--ensure=false']); + compile.run_gyp(install_args, result.opts, (err2) => { + if (err2) return callback(err2); + if (result.unparsed.length > 0) { + final_args = final_args. + concat(['--']). + concat(result.unparsed); + } + compile.run_gyp(['configure'].concat(final_args), result.opts, (err3) => { + return callback(err3); + }); + }); + } else { + if (result.unparsed.length > 0) { + final_args = final_args. + concat(['--']). + concat(result.unparsed); + } + compile.run_gyp(['configure'].concat(final_args), result.opts, (err4) => { + if (!err4 && result.opts.napi_build_version) { + napi.swap_build_dir_out(result.opts.napi_build_version); + } + return callback(err4); + }); + } + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/info.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/info.js new file mode 100644 index 0000000000..ba22f3271d --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/info.js @@ -0,0 +1,38 @@ +'use strict'; + +module.exports = exports = info; + +exports.usage = 'Lists all published binaries (requires aws-sdk)'; + +const log = require('npmlog'); +const versioning = require('./util/versioning.js'); +const s3_setup = require('./util/s3_setup.js'); + +function info(gyp, argv, callback) { + const package_json = gyp.package_json; + const opts = versioning.evaluate(package_json, gyp.opts); + const config = {}; + s3_setup.detect(opts, config); + const s3 = s3_setup.get_s3(config); + const s3_opts = { + Bucket: config.bucket, + Prefix: config.prefix + }; + s3.listObjects(s3_opts, (err, meta) => { + if (err && err.code === 'NotFound') { + return callback(new Error('[' + package_json.name + '] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + config.prefix)); + } else if (err) { + return callback(err); + } else { + log.verbose(JSON.stringify(meta, null, 1)); + if (meta && meta.Contents) { + meta.Contents.forEach((obj) => { + console.log(obj.Key); + }); + } else { + console.error('[' + package_json.name + '] No objects found at https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + config.prefix); + } + return callback(); + } + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/install.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/install.js new file mode 100644 index 0000000000..617dd86637 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/install.js @@ -0,0 +1,235 @@ +'use strict'; + +module.exports = exports = install; + +exports.usage = 'Attempts to install pre-built binary for module'; + +const fs = require('fs'); +const path = require('path'); +const log = require('npmlog'); +const existsAsync = fs.exists || path.exists; +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const makeDir = require('make-dir'); +// for fetching binaries +const fetch = require('node-fetch'); +const tar = require('tar'); + +let npgVersion = 'unknown'; +try { + // Read own package.json to get the current node-pre-pyp version. + const ownPackageJSON = fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'); + npgVersion = JSON.parse(ownPackageJSON).version; +} catch (e) { + // do nothing +} + +function place_binary(uri, targetDir, opts, callback) { + log.http('GET', uri); + + // Try getting version info from the currently running npm. + const envVersionInfo = process.env.npm_config_user_agent || + 'node ' + process.version; + + const sanitized = uri.replace('+', '%2B'); + const requestOpts = { + uri: sanitized, + headers: { + 'User-Agent': 'node-pre-gyp (v' + npgVersion + ', ' + envVersionInfo + ')' + }, + follow_max: 10 + }; + + if (opts.cafile) { + try { + requestOpts.ca = fs.readFileSync(opts.cafile); + } catch (e) { + return callback(e); + } + } else if (opts.ca) { + requestOpts.ca = opts.ca; + } + + const proxyUrl = opts.proxy || + process.env.http_proxy || + process.env.HTTP_PROXY || + process.env.npm_config_proxy; + let agent; + if (proxyUrl) { + const ProxyAgent = require('https-proxy-agent'); + agent = new ProxyAgent(proxyUrl); + log.http('download', 'proxy agent configured using: "%s"', proxyUrl); + } + + fetch(sanitized, { agent }) + .then((res) => { + if (!res.ok) { + throw new Error(`response status ${res.status} ${res.statusText} on ${sanitized}`); + } + const dataStream = res.body; + + return new Promise((resolve, reject) => { + let extractions = 0; + const countExtractions = (entry) => { + extractions += 1; + log.info('install', 'unpacking %s', entry.path); + }; + + dataStream.pipe(extract(targetDir, countExtractions)) + .on('error', (e) => { + reject(e); + }); + dataStream.on('end', () => { + resolve(`extracted file count: ${extractions}`); + }); + dataStream.on('error', (e) => { + reject(e); + }); + }); + }) + .then((text) => { + log.info(text); + callback(); + }) + .catch((e) => { + log.error(`install ${e.message}`); + callback(e); + }); +} + +function extract(to, onentry) { + return tar.extract({ + cwd: to, + strip: 1, + onentry + }); +} + +function extract_from_local(from, targetDir, callback) { + if (!fs.existsSync(from)) { + return callback(new Error('Cannot find file ' + from)); + } + log.info('Found local file to extract from ' + from); + + // extract helpers + let extractCount = 0; + function countExtractions(entry) { + extractCount += 1; + log.info('install', 'unpacking ' + entry.path); + } + function afterExtract(err) { + if (err) return callback(err); + if (extractCount === 0) { + return callback(new Error('There was a fatal problem while extracting the tarball')); + } + log.info('tarball', 'done parsing tarball'); + callback(); + } + + fs.createReadStream(from).pipe(extract(targetDir, countExtractions)) + .on('close', afterExtract) + .on('error', afterExtract); +} + +function do_build(gyp, argv, callback) { + const args = ['rebuild'].concat(argv); + gyp.todo.push({ name: 'build', args: args }); + process.nextTick(callback); +} + +function print_fallback_error(err, opts, package_json) { + const fallback_message = ' (falling back to source compile with node-gyp)'; + let full_message = ''; + if (err.statusCode !== undefined) { + // If we got a network response it but failed to download + // it means remote binaries are not available, so let's try to help + // the user/developer with the info to debug why + full_message = 'Pre-built binaries not found for ' + package_json.name + '@' + package_json.version; + full_message += ' and ' + opts.runtime + '@' + (opts.target || process.versions.node) + ' (' + opts.node_abi + ' ABI, ' + opts.libc + ')'; + full_message += fallback_message; + log.warn('Tried to download(' + err.statusCode + '): ' + opts.hosted_tarball); + log.warn(full_message); + log.http(err.message); + } else { + // If we do not have a statusCode that means an unexpected error + // happened and prevented an http response, so we output the exact error + full_message = 'Pre-built binaries not installable for ' + package_json.name + '@' + package_json.version; + full_message += ' and ' + opts.runtime + '@' + (opts.target || process.versions.node) + ' (' + opts.node_abi + ' ABI, ' + opts.libc + ')'; + full_message += fallback_message; + log.warn(full_message); + log.warn('Hit error ' + err.message); + } +} + +// +// install +// +function install(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const source_build = gyp.opts['build-from-source'] || gyp.opts.build_from_source; + const update_binary = gyp.opts['update-binary'] || gyp.opts.update_binary; + const should_do_source_build = source_build === package_json.name || (source_build === true || source_build === 'true'); + if (should_do_source_build) { + log.info('build', 'requesting source compile'); + return do_build(gyp, argv, callback); + } else { + const fallback_to_build = gyp.opts['fallback-to-build'] || gyp.opts.fallback_to_build; + let should_do_fallback_build = fallback_to_build === package_json.name || (fallback_to_build === true || fallback_to_build === 'true'); + // but allow override from npm + if (process.env.npm_config_argv) { + const cooked = JSON.parse(process.env.npm_config_argv).cooked; + const match = cooked.indexOf('--fallback-to-build'); + if (match > -1 && cooked.length > match && cooked[match + 1] === 'false') { + should_do_fallback_build = false; + log.info('install', 'Build fallback disabled via npm flag: --fallback-to-build=false'); + } + } + let opts; + try { + opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + } catch (err) { + return callback(err); + } + + opts.ca = gyp.opts.ca; + opts.cafile = gyp.opts.cafile; + + const from = opts.hosted_tarball; + const to = opts.module_path; + const binary_module = path.join(to, opts.module_name + '.node'); + existsAsync(binary_module, (found) => { + if (!update_binary) { + if (found) { + console.log('[' + package_json.name + '] Success: "' + binary_module + '" already installed'); + console.log('Pass --update-binary to reinstall or --build-from-source to recompile'); + return callback(); + } + log.info('check', 'checked for "' + binary_module + '" (not found)'); + } + + makeDir(to).then(() => { + const fileName = from.startsWith('file://') && from.slice('file://'.length); + if (fileName) { + extract_from_local(fileName, to, after_place); + } else { + place_binary(from, to, opts, after_place); + } + }).catch((err) => { + after_place(err); + }); + + function after_place(err) { + if (err && should_do_fallback_build) { + print_fallback_error(err, opts, package_json); + return do_build(gyp, argv, callback); + } else if (err) { + return callback(err); + } else { + console.log('[' + package_json.name + '] Success: "' + binary_module + '" is installed via remote'); + return callback(); + } + } + }); + } +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/main.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/main.js new file mode 100644 index 0000000000..bae32acb7b --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/main.js @@ -0,0 +1,125 @@ +'use strict'; + +/** + * Set the title. + */ + +process.title = 'node-pre-gyp'; + +const node_pre_gyp = require('../'); +const log = require('npmlog'); + +/** + * Process and execute the selected commands. + */ + +const prog = new node_pre_gyp.Run({ argv: process.argv }); +let completed = false; + +if (prog.todo.length === 0) { + if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) { + console.log('v%s', prog.version); + process.exit(0); + } else if (~process.argv.indexOf('-h') || ~process.argv.indexOf('--help')) { + console.log('%s', prog.usage()); + process.exit(0); + } + console.log('%s', prog.usage()); + process.exit(1); +} + +// if --no-color is passed +if (prog.opts && Object.hasOwnProperty.call(prog, 'color') && !prog.opts.color) { + log.disableColor(); +} + +log.info('it worked if it ends with', 'ok'); +log.verbose('cli', process.argv); +log.info('using', process.title + '@%s', prog.version); +log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, process.arch); + + +/** + * Change dir if -C/--directory was passed. + */ + +const dir = prog.opts.directory; +if (dir) { + const fs = require('fs'); + try { + const stat = fs.statSync(dir); + if (stat.isDirectory()) { + log.info('chdir', dir); + process.chdir(dir); + } else { + log.warn('chdir', dir + ' is not a directory'); + } + } catch (e) { + if (e.code === 'ENOENT') { + log.warn('chdir', dir + ' is not a directory'); + } else { + log.warn('chdir', 'error during chdir() "%s"', e.message); + } + } +} + +function run() { + const command = prog.todo.shift(); + if (!command) { + // done! + completed = true; + log.info('ok'); + return; + } + + // set binary.host when appropriate. host determines the s3 target bucket. + const target = prog.setBinaryHostProperty(command.name); + if (target && ['install', 'publish', 'unpublish', 'info'].indexOf(command.name) >= 0) { + log.info('using binary.host: ' + prog.package_json.binary.host); + } + + prog.commands[command.name](command.args, function(err) { + if (err) { + log.error(command.name + ' error'); + log.error('stack', err.stack); + errorMessage(); + log.error('not ok'); + console.log(err.message); + return process.exit(1); + } + const args_array = [].slice.call(arguments, 1); + if (args_array.length) { + console.log.apply(console, args_array); + } + // now run the next command in the queue + process.nextTick(run); + }); +} + +process.on('exit', (code) => { + if (!completed && !code) { + log.error('Completion callback never invoked!'); + errorMessage(); + process.exit(6); + } +}); + +process.on('uncaughtException', (err) => { + log.error('UNCAUGHT EXCEPTION'); + log.error('stack', err.stack); + errorMessage(); + process.exit(7); +}); + +function errorMessage() { + // copied from npm's lib/util/error-handler.js + const os = require('os'); + log.error('System', os.type() + ' ' + os.release()); + log.error('command', process.argv.map(JSON.stringify).join(' ')); + log.error('cwd', process.cwd()); + log.error('node -v', process.version); + log.error(process.title + ' -v', 'v' + prog.package.version); +} + +// start running the given commands! +run(); diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js new file mode 100644 index 0000000000..dc18e749ea --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js @@ -0,0 +1,309 @@ +'use strict'; + +/** + * Module exports. + */ + +module.exports = exports; + +/** + * Module dependencies. + */ + +// load mocking control function for accessing s3 via https. the function is a noop always returning +// false if not mocking. +exports.mockS3Http = require('./util/s3_setup').get_mockS3Http(); +exports.mockS3Http('on'); +const mocking = exports.mockS3Http('get'); + + +const fs = require('fs'); +const path = require('path'); +const nopt = require('nopt'); +const log = require('npmlog'); +log.disableProgress(); +const napi = require('./util/napi.js'); + +const EE = require('events').EventEmitter; +const inherits = require('util').inherits; +const cli_commands = [ + 'clean', + 'install', + 'reinstall', + 'build', + 'rebuild', + 'package', + 'testpackage', + 'publish', + 'unpublish', + 'info', + 'testbinary', + 'reveal', + 'configure' +]; +const aliases = {}; + +// differentiate node-pre-gyp's logs from npm's +log.heading = 'node-pre-gyp'; + +if (mocking) { + log.warn(`mocking s3 to ${process.env.node_pre_gyp_mock_s3}`); +} + +// this is a getter to avoid circular reference warnings with node v14. +Object.defineProperty(exports, 'find', { + get: function() { + return require('./pre-binding').find; + }, + enumerable: true +}); + +// in the following, "my_module" is using node-pre-gyp to +// prebuild and install pre-built binaries. "main_module" +// is using "my_module". +// +// "bin/node-pre-gyp" invokes Run() without a path. the +// expectation is that the working directory is the package +// root "my_module". this is true because in all cases npm is +// executing a script in the context of "my_module". +// +// "pre-binding.find()" is executed by "my_module" but in the +// context of "main_module". this is because "main_module" is +// executing and requires "my_module" which is then executing +// "pre-binding.find()" via "node-pre-gyp.find()", so the working +// directory is that of "main_module". +// +// that's why "find()" must pass the path to package.json. +// +function Run({ package_json_path = './package.json', argv }) { + this.package_json_path = package_json_path; + this.commands = {}; + + const self = this; + cli_commands.forEach((command) => { + self.commands[command] = function(argvx, callback) { + log.verbose('command', command, argvx); + return require('./' + command)(self, argvx, callback); + }; + }); + + this.parseArgv(argv); + + // this is set to true after the binary.host property was set to + // either staging_host or production_host. + this.binaryHostSet = false; +} +inherits(Run, EE); +exports.Run = Run; +const proto = Run.prototype; + +/** + * Export the contents of the package.json. + */ + +proto.package = require('../package.json'); + +/** + * nopt configuration definitions + */ + +proto.configDefs = { + help: Boolean, // everywhere + arch: String, // 'configure' + debug: Boolean, // 'build' + directory: String, // bin + proxy: String, // 'install' + loglevel: String // everywhere +}; + +/** + * nopt shorthands + */ + +proto.shorthands = { + release: '--no-debug', + C: '--directory', + debug: '--debug', + j: '--jobs', + silent: '--loglevel=silent', + silly: '--loglevel=silly', + verbose: '--loglevel=verbose' +}; + +/** + * expose the command aliases for the bin file to use. + */ + +proto.aliases = aliases; + +/** + * Parses the given argv array and sets the 'opts', 'argv', + * 'command', and 'package_json' properties. + */ + +proto.parseArgv = function parseOpts(argv) { + this.opts = nopt(this.configDefs, this.shorthands, argv); + this.argv = this.opts.argv.remain.slice(); + const commands = this.todo = []; + + // create a copy of the argv array with aliases mapped + argv = this.argv.map((arg) => { + // is this an alias? + if (arg in this.aliases) { + arg = this.aliases[arg]; + } + return arg; + }); + + // process the mapped args into "command" objects ("name" and "args" props) + argv.slice().forEach((arg) => { + if (arg in this.commands) { + const args = argv.splice(0, argv.indexOf(arg)); + argv.shift(); + if (commands.length > 0) { + commands[commands.length - 1].args = args; + } + commands.push({ name: arg, args: [] }); + } + }); + if (commands.length > 0) { + commands[commands.length - 1].args = argv.splice(0); + } + + + // if a directory was specified package.json is assumed to be relative + // to it. + let package_json_path = this.package_json_path; + if (this.opts.directory) { + package_json_path = path.join(this.opts.directory, package_json_path); + } + + this.package_json = JSON.parse(fs.readFileSync(package_json_path)); + + // expand commands entries for multiple napi builds + this.todo = napi.expand_commands(this.package_json, this.opts, commands); + + // support for inheriting config env variables from npm + const npm_config_prefix = 'npm_config_'; + Object.keys(process.env).forEach((name) => { + if (name.indexOf(npm_config_prefix) !== 0) return; + const val = process.env[name]; + if (name === npm_config_prefix + 'loglevel') { + log.level = val; + } else { + // add the user-defined options to the config + name = name.substring(npm_config_prefix.length); + // avoid npm argv clobber already present args + // which avoids problem of 'npm test' calling + // script that runs unique npm install commands + if (name === 'argv') { + if (this.opts.argv && + this.opts.argv.remain && + this.opts.argv.remain.length) { + // do nothing + } else { + this.opts[name] = val; + } + } else { + this.opts[name] = val; + } + } + }); + + if (this.opts.loglevel) { + log.level = this.opts.loglevel; + } + log.resume(); +}; + +/** + * allow the binary.host property to be set at execution time. + * + * for this to take effect requires all the following to be true. + * - binary is a property in package.json + * - binary.host is falsey + * - binary.staging_host is not empty + * - binary.production_host is not empty + * + * if any of the previous checks fail then the function returns an empty string + * and makes no changes to package.json's binary property. + * + * + * if command is "publish" then the default is set to "binary.staging_host" + * if command is not "publish" the the default is set to "binary.production_host" + * + * if the command-line option '--s3_host' is set to "staging" or "production" then + * "binary.host" is set to the specified "staging_host" or "production_host". if + * '--s3_host' is any other value an exception is thrown. + * + * if '--s3_host' is not present then "binary.host" is set to the default as above. + * + * this strategy was chosen so that any command other than "publish" or "unpublish" uses "production" + * as the default without requiring any command-line options but that "publish" and "unpublish" require + * '--s3_host production_host' to be specified in order to *really* publish (or unpublish). publishing + * to staging can be done freely without worrying about disturbing any production releases. + */ +proto.setBinaryHostProperty = function(command) { + if (this.binaryHostSet) { + return this.package_json.binary.host; + } + const p = this.package_json; + // don't set anything if host is present. it must be left blank to trigger this. + if (!p || !p.binary || p.binary.host) { + return ''; + } + // and both staging and production must be present. errors will be reported later. + if (!p.binary.staging_host || !p.binary.production_host) { + return ''; + } + let target = 'production_host'; + if (command === 'publish' || command === 'unpublish') { + target = 'staging_host'; + } + // the environment variable has priority over the default or the command line. if + // either the env var or the command line option are invalid throw an error. + const npg_s3_host = process.env.node_pre_gyp_s3_host; + if (npg_s3_host === 'staging' || npg_s3_host === 'production') { + target = `${npg_s3_host}_host`; + } else if (this.opts['s3_host'] === 'staging' || this.opts['s3_host'] === 'production') { + target = `${this.opts['s3_host']}_host`; + } else if (this.opts['s3_host'] || npg_s3_host) { + throw new Error(`invalid s3_host ${this.opts['s3_host'] || npg_s3_host}`); + } + + p.binary.host = p.binary[target]; + this.binaryHostSet = true; + + return p.binary.host; +}; + +/** + * Returns the usage instructions for node-pre-gyp. + */ + +proto.usage = function usage() { + const str = [ + '', + ' Usage: node-pre-gyp [options]', + '', + ' where is one of:', + cli_commands.map((c) => { + return ' - ' + c + ' - ' + require('./' + c).usage; + }).join('\n'), + '', + 'node-pre-gyp@' + this.version + ' ' + path.resolve(__dirname, '..'), + 'node@' + process.versions.node + ].join('\n'); + return str; +}; + +/** + * Version number getter. + */ + +Object.defineProperty(proto, 'version', { + get: function() { + return this.package.version; + }, + enumerable: true +}); diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/package.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/package.js new file mode 100644 index 0000000000..0734984692 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/package.js @@ -0,0 +1,73 @@ +'use strict'; + +module.exports = exports = _package; + +exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball'; + +const fs = require('fs'); +const path = require('path'); +const log = require('npmlog'); +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const existsAsync = fs.exists || path.exists; +const makeDir = require('make-dir'); +const tar = require('tar'); + +function readdirSync(dir) { + let list = []; + const files = fs.readdirSync(dir); + + files.forEach((file) => { + const stats = fs.lstatSync(path.join(dir, file)); + if (stats.isDirectory()) { + list = list.concat(readdirSync(path.join(dir, file))); + } else { + list.push(path.join(dir, file)); + } + }); + return list; +} + +function _package(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + const from = opts.module_path; + const binary_module = path.join(from, opts.module_name + '.node'); + existsAsync(binary_module, (found) => { + if (!found) { + return callback(new Error('Cannot package because ' + binary_module + ' missing: run `node-pre-gyp rebuild` first')); + } + const tarball = opts.staged_tarball; + const filter_func = function(entry) { + const basename = path.basename(entry); + if (basename.length && basename[0] !== '.') { + console.log('packing ' + entry); + return true; + } else { + console.log('skipping ' + entry); + } + return false; + }; + makeDir(path.dirname(tarball)).then(() => { + let files = readdirSync(from); + const base = path.basename(from); + files = files.map((file) => { + return path.join(base, path.relative(from, file)); + }); + tar.create({ + portable: false, + gzip: true, + filter: filter_func, + file: tarball, + cwd: path.dirname(from) + }, files, (err2) => { + if (err2) console.error('[' + package_json.name + '] ' + err2.message); + else log.info('package', 'Binary staged at "' + tarball + '"'); + return callback(err2); + }); + }).catch((err) => { + return callback(err); + }); + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/pre-binding.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/pre-binding.js new file mode 100644 index 0000000000..e110fe3810 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/pre-binding.js @@ -0,0 +1,34 @@ +'use strict'; + +const npg = require('..'); +const versioning = require('../lib/util/versioning.js'); +const napi = require('../lib/util/napi.js'); +const existsSync = require('fs').existsSync || require('path').existsSync; +const path = require('path'); + +module.exports = exports; + +exports.usage = 'Finds the require path for the node-pre-gyp installed module'; + +exports.validate = function(package_json, opts) { + versioning.validate_config(package_json, opts); +}; + +exports.find = function(package_json_path, opts) { + if (!existsSync(package_json_path)) { + throw new Error(package_json_path + 'does not exist'); + } + const prog = new npg.Run({ package_json_path, argv: process.argv }); + prog.setBinaryHostProperty(); + const package_json = prog.package_json; + + versioning.validate_config(package_json, opts); + let napi_build_version; + if (napi.get_napi_build_versions(package_json, opts)) { + napi_build_version = napi.get_best_napi_build_version(package_json, opts); + } + opts = opts || {}; + if (!opts.module_root) opts.module_root = path.dirname(package_json_path); + const meta = versioning.evaluate(package_json, opts, napi_build_version); + return meta.module; +}; diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/publish.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/publish.js new file mode 100644 index 0000000000..8367b15042 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/publish.js @@ -0,0 +1,81 @@ +'use strict'; + +module.exports = exports = publish; + +exports.usage = 'Publishes pre-built binary (requires aws-sdk)'; + +const fs = require('fs'); +const path = require('path'); +const log = require('npmlog'); +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const s3_setup = require('./util/s3_setup.js'); +const existsAsync = fs.exists || path.exists; +const url = require('url'); + +function publish(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + const tarball = opts.staged_tarball; + existsAsync(tarball, (found) => { + if (!found) { + return callback(new Error('Cannot publish because ' + tarball + ' missing: run `node-pre-gyp package` first')); + } + + log.info('publish', 'Detecting s3 credentials'); + const config = {}; + s3_setup.detect(opts, config); + const s3 = s3_setup.get_s3(config); + + const key_name = url.resolve(config.prefix, opts.package_name); + const s3_opts = { + Bucket: config.bucket, + Key: key_name + }; + log.info('publish', 'Authenticating with s3'); + log.info('publish', config); + + log.info('publish', 'Checking for existing binary at ' + opts.hosted_path); + s3.headObject(s3_opts, (err, meta) => { + if (meta) log.info('publish', JSON.stringify(meta)); + if (err && err.code === 'NotFound') { + // we are safe to publish because + // the object does not already exist + log.info('publish', 'Preparing to put object'); + const s3_put_opts = { + ACL: 'public-read', + Body: fs.createReadStream(tarball), + Key: key_name, + Bucket: config.bucket + }; + log.info('publish', 'Putting object', s3_put_opts.ACL, s3_put_opts.Bucket, s3_put_opts.Key); + try { + s3.putObject(s3_put_opts, (err2, resp) => { + log.info('publish', 'returned from putting object'); + if (err2) { + log.info('publish', 's3 putObject error: "' + err2 + '"'); + return callback(err2); + } + if (resp) log.info('publish', 's3 putObject response: "' + JSON.stringify(resp) + '"'); + log.info('publish', 'successfully put object'); + console.log('[' + package_json.name + '] published to ' + opts.hosted_path); + return callback(); + }); + } catch (err3) { + log.info('publish', 's3 putObject error: "' + err3 + '"'); + return callback(err3); + } + } else if (err) { + log.info('publish', 's3 headObject error: "' + err + '"'); + return callback(err); + } else { + log.error('publish', 'Cannot publish over existing version'); + log.error('publish', "Update the 'version' field in package.json and try again"); + log.error('publish', 'If the previous version was published in error see:'); + log.error('publish', '\t node-pre-gyp unpublish'); + return callback(new Error('Failed publishing to ' + opts.hosted_path)); + } + }); + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/rebuild.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/rebuild.js new file mode 100644 index 0000000000..31510fbd13 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/rebuild.js @@ -0,0 +1,20 @@ +'use strict'; + +module.exports = exports = rebuild; + +exports.usage = 'Runs "clean" and "build" at once'; + +const napi = require('./util/napi.js'); + +function rebuild(gyp, argv, callback) { + const package_json = gyp.package_json; + let commands = [ + { name: 'clean', args: [] }, + { name: 'build', args: ['rebuild'] } + ]; + commands = napi.expand_commands(package_json, gyp.opts, commands); + for (let i = commands.length; i !== 0; i--) { + gyp.todo.unshift(commands[i - 1]); + } + process.nextTick(callback); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/reinstall.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/reinstall.js new file mode 100644 index 0000000000..a29b5c9b6a --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/reinstall.js @@ -0,0 +1,19 @@ +'use strict'; + +module.exports = exports = rebuild; + +exports.usage = 'Runs "clean" and "install" at once'; + +const napi = require('./util/napi.js'); + +function rebuild(gyp, argv, callback) { + const package_json = gyp.package_json; + let installArgs = []; + const napi_build_version = napi.get_best_napi_build_version(package_json, gyp.opts); + if (napi_build_version != null) installArgs = [napi.get_command_arg(napi_build_version)]; + gyp.todo.unshift( + { name: 'clean', args: [] }, + { name: 'install', args: installArgs } + ); + process.nextTick(callback); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/reveal.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/reveal.js new file mode 100644 index 0000000000..7255e5f0ac --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/reveal.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = exports = reveal; + +exports.usage = 'Reveals data on the versioned binary'; + +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); + +function unix_paths(key, val) { + return val && val.replace ? val.replace(/\\/g, '/') : val; +} + +function reveal(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + let hit = false; + // if a second arg is passed look to see + // if it is a known option + // console.log(JSON.stringify(gyp.opts,null,1)) + const remain = gyp.opts.argv.remain[gyp.opts.argv.remain.length - 1]; + if (remain && Object.hasOwnProperty.call(opts, remain)) { + console.log(opts[remain].replace(/\\/g, '/')); + hit = true; + } + // otherwise return all options as json + if (!hit) { + console.log(JSON.stringify(opts, unix_paths, 2)); + } + return callback(); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/testbinary.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/testbinary.js new file mode 100644 index 0000000000..429cb13011 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/testbinary.js @@ -0,0 +1,79 @@ +'use strict'; + +module.exports = exports = testbinary; + +exports.usage = 'Tests that the binary.node can be required'; + +const path = require('path'); +const log = require('npmlog'); +const cp = require('child_process'); +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); + +function testbinary(gyp, argv, callback) { + const args = []; + const options = {}; + let shell_cmd = process.execPath; + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + // skip validation for runtimes we don't explicitly support (like electron) + if (opts.runtime && + opts.runtime !== 'node-webkit' && + opts.runtime !== 'node') { + return callback(); + } + const nw = (opts.runtime && opts.runtime === 'node-webkit'); + // ensure on windows that / are used for require path + const binary_module = opts.module.replace(/\\/g, '/'); + if ((process.arch !== opts.target_arch) || + (process.platform !== opts.target_platform)) { + let msg = 'skipping validation since host platform/arch ('; + msg += process.platform + '/' + process.arch + ')'; + msg += ' does not match target ('; + msg += opts.target_platform + '/' + opts.target_arch + ')'; + log.info('validate', msg); + return callback(); + } + if (nw) { + options.timeout = 5000; + if (process.platform === 'darwin') { + shell_cmd = 'node-webkit'; + } else if (process.platform === 'win32') { + shell_cmd = 'nw.exe'; + } else { + shell_cmd = 'nw'; + } + const modulePath = path.resolve(binary_module); + const appDir = path.join(__dirname, 'util', 'nw-pre-gyp'); + args.push(appDir); + args.push(modulePath); + log.info('validate', "Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'"); + cp.execFile(shell_cmd, args, options, (err, stdout, stderr) => { + // check for normal timeout for node-webkit + if (err) { + if (err.killed === true && err.signal && err.signal.indexOf('SIG') > -1) { + return callback(); + } + const stderrLog = stderr.toString(); + log.info('stderr', stderrLog); + if (/^\s*Xlib:\s*extension\s*"RANDR"\s*missing\s*on\s*display\s*":\d+\.\d+"\.\s*$/.test(stderrLog)) { + log.info('RANDR', 'stderr contains only RANDR error, ignored'); + return callback(); + } + return callback(err); + } + return callback(); + }); + return; + } + args.push('--eval'); + args.push("require('" + binary_module.replace(/'/g, '\'') + "')"); + log.info('validate', "Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'"); + cp.execFile(shell_cmd, args, options, (err, stdout, stderr) => { + if (err) { + return callback(err, { stdout: stdout, stderr: stderr }); + } + return callback(); + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/testpackage.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/testpackage.js new file mode 100644 index 0000000000..fab1911b9f --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/testpackage.js @@ -0,0 +1,53 @@ +'use strict'; + +module.exports = exports = testpackage; + +exports.usage = 'Tests that the staged package is valid'; + +const fs = require('fs'); +const path = require('path'); +const log = require('npmlog'); +const existsAsync = fs.exists || path.exists; +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const testbinary = require('./testbinary.js'); +const tar = require('tar'); +const makeDir = require('make-dir'); + +function testpackage(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + const tarball = opts.staged_tarball; + existsAsync(tarball, (found) => { + if (!found) { + return callback(new Error('Cannot test package because ' + tarball + ' missing: run `node-pre-gyp package` first')); + } + const to = opts.module_path; + function filter_func(entry) { + log.info('install', 'unpacking [' + entry.path + ']'); + } + + makeDir(to).then(() => { + tar.extract({ + file: tarball, + cwd: to, + strip: 1, + onentry: filter_func + }).then(after_extract, callback); + }).catch((err) => { + return callback(err); + }); + + function after_extract() { + testbinary(gyp, argv, (err) => { + if (err) { + return callback(err); + } else { + console.log('[' + package_json.name + '] Package appears valid'); + return callback(); + } + }); + } + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/unpublish.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/unpublish.js new file mode 100644 index 0000000000..12c9f56158 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/unpublish.js @@ -0,0 +1,41 @@ +'use strict'; + +module.exports = exports = unpublish; + +exports.usage = 'Unpublishes pre-built binary (requires aws-sdk)'; + +const log = require('npmlog'); +const versioning = require('./util/versioning.js'); +const napi = require('./util/napi.js'); +const s3_setup = require('./util/s3_setup.js'); +const url = require('url'); + +function unpublish(gyp, argv, callback) { + const package_json = gyp.package_json; + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version); + const config = {}; + s3_setup.detect(opts, config); + const s3 = s3_setup.get_s3(config); + const key_name = url.resolve(config.prefix, opts.package_name); + const s3_opts = { + Bucket: config.bucket, + Key: key_name + }; + s3.headObject(s3_opts, (err, meta) => { + if (err && err.code === 'NotFound') { + console.log('[' + package_json.name + '] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key); + return callback(); + } else if (err) { + return callback(err); + } else { + log.info('unpublish', JSON.stringify(meta)); + s3.deleteObject(s3_opts, (err2, resp) => { + if (err2) return callback(err2); + log.info(JSON.stringify(resp)); + console.log('[' + package_json.name + '] Success: removed https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key); + return callback(); + }); + } + }); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/abi_crosswalk.json b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/abi_crosswalk.json new file mode 100644 index 0000000000..7f52972768 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/abi_crosswalk.json @@ -0,0 +1,2602 @@ +{ + "0.1.14": { + "node_abi": null, + "v8": "1.3" + }, + "0.1.15": { + "node_abi": null, + "v8": "1.3" + }, + "0.1.16": { + "node_abi": null, + "v8": "1.3" + }, + "0.1.17": { + "node_abi": null, + "v8": "1.3" + }, + "0.1.18": { + "node_abi": null, + "v8": "1.3" + }, + "0.1.19": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.20": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.21": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.22": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.23": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.24": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.25": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.26": { + "node_abi": null, + "v8": "2.0" + }, + "0.1.27": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.28": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.29": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.30": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.31": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.32": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.33": { + "node_abi": null, + "v8": "2.1" + }, + "0.1.90": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.91": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.92": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.93": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.94": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.95": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.96": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.97": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.98": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.99": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.100": { + "node_abi": null, + "v8": "2.2" + }, + "0.1.101": { + "node_abi": null, + "v8": "2.3" + }, + "0.1.102": { + "node_abi": null, + "v8": "2.3" + }, + "0.1.103": { + "node_abi": null, + "v8": "2.3" + }, + "0.1.104": { + "node_abi": null, + "v8": "2.3" + }, + "0.2.0": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.1": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.2": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.3": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.4": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.5": { + "node_abi": 1, + "v8": "2.3" + }, + "0.2.6": { + "node_abi": 1, + "v8": "2.3" + }, + "0.3.0": { + "node_abi": 1, + "v8": "2.5" + }, + "0.3.1": { + "node_abi": 1, + "v8": "2.5" + }, + "0.3.2": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.3": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.4": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.5": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.6": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.7": { + "node_abi": 1, + "v8": "3.0" + }, + "0.3.8": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.0": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.1": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.2": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.3": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.4": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.5": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.6": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.7": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.8": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.9": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.10": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.11": { + "node_abi": 1, + "v8": "3.1" + }, + "0.4.12": { + "node_abi": 1, + "v8": "3.1" + }, + "0.5.0": { + "node_abi": 1, + "v8": "3.1" + }, + "0.5.1": { + "node_abi": 1, + "v8": "3.4" + }, + "0.5.2": { + "node_abi": 1, + "v8": "3.4" + }, + "0.5.3": { + "node_abi": 1, + "v8": "3.4" + }, + "0.5.4": { + "node_abi": 1, + "v8": "3.5" + }, + "0.5.5": { + "node_abi": 1, + "v8": "3.5" + }, + "0.5.6": { + "node_abi": 1, + "v8": "3.6" + }, + "0.5.7": { + "node_abi": 1, + "v8": "3.6" + }, + "0.5.8": { + "node_abi": 1, + "v8": "3.6" + }, + "0.5.9": { + "node_abi": 1, + "v8": "3.6" + }, + "0.5.10": { + "node_abi": 1, + "v8": "3.7" + }, + "0.6.0": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.1": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.2": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.3": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.4": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.5": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.6": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.7": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.8": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.9": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.10": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.11": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.12": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.13": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.14": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.15": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.16": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.17": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.18": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.19": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.20": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.21": { + "node_abi": 1, + "v8": "3.6" + }, + "0.7.0": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.1": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.2": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.3": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.4": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.5": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.6": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.7": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.8": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.9": { + "node_abi": 1, + "v8": "3.11" + }, + "0.7.10": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.11": { + "node_abi": 1, + "v8": "3.11" + }, + "0.7.12": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.0": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.1": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.2": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.3": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.4": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.5": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.6": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.7": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.8": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.9": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.10": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.11": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.12": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.13": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.14": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.15": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.16": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.17": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.18": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.19": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.20": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.21": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.22": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.23": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.24": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.25": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.26": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.27": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.28": { + "node_abi": 1, + "v8": "3.11" + }, + "0.9.0": { + "node_abi": 1, + "v8": "3.11" + }, + "0.9.1": { + "node_abi": 10, + "v8": "3.11" + }, + "0.9.2": { + "node_abi": 10, + "v8": "3.11" + }, + "0.9.3": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.4": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.5": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.6": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.7": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.8": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.9": { + "node_abi": 11, + "v8": "3.15" + }, + "0.9.10": { + "node_abi": 11, + "v8": "3.15" + }, + "0.9.11": { + "node_abi": 11, + "v8": "3.14" + }, + "0.9.12": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.0": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.1": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.2": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.3": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.4": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.5": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.6": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.7": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.8": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.9": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.10": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.11": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.12": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.13": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.14": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.15": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.16": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.17": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.18": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.19": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.20": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.21": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.22": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.23": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.24": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.25": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.26": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.27": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.28": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.29": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.30": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.31": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.32": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.33": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.34": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.35": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.36": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.37": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.38": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.39": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.40": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.41": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.42": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.43": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.44": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.45": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.46": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.47": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.48": { + "node_abi": 11, + "v8": "3.14" + }, + "0.11.0": { + "node_abi": 12, + "v8": "3.17" + }, + "0.11.1": { + "node_abi": 12, + "v8": "3.18" + }, + "0.11.2": { + "node_abi": 12, + "v8": "3.19" + }, + "0.11.3": { + "node_abi": 12, + "v8": "3.19" + }, + "0.11.4": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.5": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.6": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.7": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.8": { + "node_abi": 13, + "v8": "3.21" + }, + "0.11.9": { + "node_abi": 13, + "v8": "3.22" + }, + "0.11.10": { + "node_abi": 13, + "v8": "3.22" + }, + "0.11.11": { + "node_abi": 14, + "v8": "3.22" + }, + "0.11.12": { + "node_abi": 14, + "v8": "3.22" + }, + "0.11.13": { + "node_abi": 14, + "v8": "3.25" + }, + "0.11.14": { + "node_abi": 14, + "v8": "3.26" + }, + "0.11.15": { + "node_abi": 14, + "v8": "3.28" + }, + "0.11.16": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.0": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.1": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.2": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.3": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.4": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.5": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.6": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.7": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.8": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.9": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.10": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.11": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.12": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.13": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.14": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.15": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.16": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.17": { + "node_abi": 14, + "v8": "3.28" + }, + "0.12.18": { + "node_abi": 14, + "v8": "3.28" + }, + "1.0.0": { + "node_abi": 42, + "v8": "3.31" + }, + "1.0.1": { + "node_abi": 42, + "v8": "3.31" + }, + "1.0.2": { + "node_abi": 42, + "v8": "3.31" + }, + "1.0.3": { + "node_abi": 42, + "v8": "4.1" + }, + "1.0.4": { + "node_abi": 42, + "v8": "4.1" + }, + "1.1.0": { + "node_abi": 43, + "v8": "4.1" + }, + "1.2.0": { + "node_abi": 43, + "v8": "4.1" + }, + "1.3.0": { + "node_abi": 43, + "v8": "4.1" + }, + "1.4.1": { + "node_abi": 43, + "v8": "4.1" + }, + "1.4.2": { + "node_abi": 43, + "v8": "4.1" + }, + "1.4.3": { + "node_abi": 43, + "v8": "4.1" + }, + "1.5.0": { + "node_abi": 43, + "v8": "4.1" + }, + "1.5.1": { + "node_abi": 43, + "v8": "4.1" + }, + "1.6.0": { + "node_abi": 43, + "v8": "4.1" + }, + "1.6.1": { + "node_abi": 43, + "v8": "4.1" + }, + "1.6.2": { + "node_abi": 43, + "v8": "4.1" + }, + "1.6.3": { + "node_abi": 43, + "v8": "4.1" + }, + "1.6.4": { + "node_abi": 43, + "v8": "4.1" + }, + "1.7.1": { + "node_abi": 43, + "v8": "4.1" + }, + "1.8.1": { + "node_abi": 43, + "v8": "4.1" + }, + "1.8.2": { + "node_abi": 43, + "v8": "4.1" + }, + "1.8.3": { + "node_abi": 43, + "v8": "4.1" + }, + "1.8.4": { + "node_abi": 43, + "v8": "4.1" + }, + "2.0.0": { + "node_abi": 44, + "v8": "4.2" + }, + "2.0.1": { + "node_abi": 44, + "v8": "4.2" + }, + "2.0.2": { + "node_abi": 44, + "v8": "4.2" + }, + "2.1.0": { + "node_abi": 44, + "v8": "4.2" + }, + "2.2.0": { + "node_abi": 44, + "v8": "4.2" + }, + "2.2.1": { + "node_abi": 44, + "v8": "4.2" + }, + "2.3.0": { + "node_abi": 44, + "v8": "4.2" + }, + "2.3.1": { + "node_abi": 44, + "v8": "4.2" + }, + "2.3.2": { + "node_abi": 44, + "v8": "4.2" + }, + "2.3.3": { + "node_abi": 44, + "v8": "4.2" + }, + "2.3.4": { + "node_abi": 44, + "v8": "4.2" + }, + "2.4.0": { + "node_abi": 44, + "v8": "4.2" + }, + "2.5.0": { + "node_abi": 44, + "v8": "4.2" + }, + "3.0.0": { + "node_abi": 45, + "v8": "4.4" + }, + "3.1.0": { + "node_abi": 45, + "v8": "4.4" + }, + "3.2.0": { + "node_abi": 45, + "v8": "4.4" + }, + "3.3.0": { + "node_abi": 45, + "v8": "4.4" + }, + "3.3.1": { + "node_abi": 45, + "v8": "4.4" + }, + "4.0.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.1.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.1.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.1.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.3": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.4": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.5": { + "node_abi": 46, + "v8": "4.5" + }, + "4.2.6": { + "node_abi": 46, + "v8": "4.5" + }, + "4.3.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.3.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.3.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.3": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.4": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.5": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.6": { + "node_abi": 46, + "v8": "4.5" + }, + "4.4.7": { + "node_abi": 46, + "v8": "4.5" + }, + "4.5.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.6.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.6.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.6.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.7.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.7.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.7.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.7.3": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.1": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.2": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.3": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.4": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.5": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.6": { + "node_abi": 46, + "v8": "4.5" + }, + "4.8.7": { + "node_abi": 46, + "v8": "4.5" + }, + "4.9.0": { + "node_abi": 46, + "v8": "4.5" + }, + "4.9.1": { + "node_abi": 46, + "v8": "4.5" + }, + "5.0.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.1.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.1.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.2.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.3.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.4.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.4.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.5.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.6.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.7.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.7.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.8.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.9.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.9.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.10.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.10.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.11.0": { + "node_abi": 47, + "v8": "4.6" + }, + "5.11.1": { + "node_abi": 47, + "v8": "4.6" + }, + "5.12.0": { + "node_abi": 47, + "v8": "4.6" + }, + "6.0.0": { + "node_abi": 48, + "v8": "5.0" + }, + "6.1.0": { + "node_abi": 48, + "v8": "5.0" + }, + "6.2.0": { + "node_abi": 48, + "v8": "5.0" + }, + "6.2.1": { + "node_abi": 48, + "v8": "5.0" + }, + "6.2.2": { + "node_abi": 48, + "v8": "5.0" + }, + "6.3.0": { + "node_abi": 48, + "v8": "5.0" + }, + "6.3.1": { + "node_abi": 48, + "v8": "5.0" + }, + "6.4.0": { + "node_abi": 48, + "v8": "5.0" + }, + "6.5.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.6.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.7.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.8.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.8.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.2": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.3": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.4": { + "node_abi": 48, + "v8": "5.1" + }, + "6.9.5": { + "node_abi": 48, + "v8": "5.1" + }, + "6.10.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.10.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.10.2": { + "node_abi": 48, + "v8": "5.1" + }, + "6.10.3": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.2": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.3": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.4": { + "node_abi": 48, + "v8": "5.1" + }, + "6.11.5": { + "node_abi": 48, + "v8": "5.1" + }, + "6.12.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.12.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.12.2": { + "node_abi": 48, + "v8": "5.1" + }, + "6.12.3": { + "node_abi": 48, + "v8": "5.1" + }, + "6.13.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.13.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.14.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.14.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.14.2": { + "node_abi": 48, + "v8": "5.1" + }, + "6.14.3": { + "node_abi": 48, + "v8": "5.1" + }, + "6.14.4": { + "node_abi": 48, + "v8": "5.1" + }, + "6.15.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.15.1": { + "node_abi": 48, + "v8": "5.1" + }, + "6.16.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.17.0": { + "node_abi": 48, + "v8": "5.1" + }, + "6.17.1": { + "node_abi": 48, + "v8": "5.1" + }, + "7.0.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.1.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.2.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.2.1": { + "node_abi": 51, + "v8": "5.4" + }, + "7.3.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.4.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.5.0": { + "node_abi": 51, + "v8": "5.4" + }, + "7.6.0": { + "node_abi": 51, + "v8": "5.5" + }, + "7.7.0": { + "node_abi": 51, + "v8": "5.5" + }, + "7.7.1": { + "node_abi": 51, + "v8": "5.5" + }, + "7.7.2": { + "node_abi": 51, + "v8": "5.5" + }, + "7.7.3": { + "node_abi": 51, + "v8": "5.5" + }, + "7.7.4": { + "node_abi": 51, + "v8": "5.5" + }, + "7.8.0": { + "node_abi": 51, + "v8": "5.5" + }, + "7.9.0": { + "node_abi": 51, + "v8": "5.5" + }, + "7.10.0": { + "node_abi": 51, + "v8": "5.5" + }, + "7.10.1": { + "node_abi": 51, + "v8": "5.5" + }, + "8.0.0": { + "node_abi": 57, + "v8": "5.8" + }, + "8.1.0": { + "node_abi": 57, + "v8": "5.8" + }, + "8.1.1": { + "node_abi": 57, + "v8": "5.8" + }, + "8.1.2": { + "node_abi": 57, + "v8": "5.8" + }, + "8.1.3": { + "node_abi": 57, + "v8": "5.8" + }, + "8.1.4": { + "node_abi": 57, + "v8": "5.8" + }, + "8.2.0": { + "node_abi": 57, + "v8": "5.8" + }, + "8.2.1": { + "node_abi": 57, + "v8": "5.8" + }, + "8.3.0": { + "node_abi": 57, + "v8": "6.0" + }, + "8.4.0": { + "node_abi": 57, + "v8": "6.0" + }, + "8.5.0": { + "node_abi": 57, + "v8": "6.0" + }, + "8.6.0": { + "node_abi": 57, + "v8": "6.0" + }, + "8.7.0": { + "node_abi": 57, + "v8": "6.1" + }, + "8.8.0": { + "node_abi": 57, + "v8": "6.1" + }, + "8.8.1": { + "node_abi": 57, + "v8": "6.1" + }, + "8.9.0": { + "node_abi": 57, + "v8": "6.1" + }, + "8.9.1": { + "node_abi": 57, + "v8": "6.1" + }, + "8.9.2": { + "node_abi": 57, + "v8": "6.1" + }, + "8.9.3": { + "node_abi": 57, + "v8": "6.1" + }, + "8.9.4": { + "node_abi": 57, + "v8": "6.1" + }, + "8.10.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.11.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.11.1": { + "node_abi": 57, + "v8": "6.2" + }, + "8.11.2": { + "node_abi": 57, + "v8": "6.2" + }, + "8.11.3": { + "node_abi": 57, + "v8": "6.2" + }, + "8.11.4": { + "node_abi": 57, + "v8": "6.2" + }, + "8.12.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.13.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.14.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.14.1": { + "node_abi": 57, + "v8": "6.2" + }, + "8.15.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.15.1": { + "node_abi": 57, + "v8": "6.2" + }, + "8.16.0": { + "node_abi": 57, + "v8": "6.2" + }, + "8.16.1": { + "node_abi": 57, + "v8": "6.2" + }, + "8.16.2": { + "node_abi": 57, + "v8": "6.2" + }, + "8.17.0": { + "node_abi": 57, + "v8": "6.2" + }, + "9.0.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.1.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.2.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.2.1": { + "node_abi": 59, + "v8": "6.2" + }, + "9.3.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.4.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.5.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.6.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.6.1": { + "node_abi": 59, + "v8": "6.2" + }, + "9.7.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.7.1": { + "node_abi": 59, + "v8": "6.2" + }, + "9.8.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.9.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.10.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.10.1": { + "node_abi": 59, + "v8": "6.2" + }, + "9.11.0": { + "node_abi": 59, + "v8": "6.2" + }, + "9.11.1": { + "node_abi": 59, + "v8": "6.2" + }, + "9.11.2": { + "node_abi": 59, + "v8": "6.2" + }, + "10.0.0": { + "node_abi": 64, + "v8": "6.6" + }, + "10.1.0": { + "node_abi": 64, + "v8": "6.6" + }, + "10.2.0": { + "node_abi": 64, + "v8": "6.6" + }, + "10.2.1": { + "node_abi": 64, + "v8": "6.6" + }, + "10.3.0": { + "node_abi": 64, + "v8": "6.6" + }, + "10.4.0": { + "node_abi": 64, + "v8": "6.7" + }, + "10.4.1": { + "node_abi": 64, + "v8": "6.7" + }, + "10.5.0": { + "node_abi": 64, + "v8": "6.7" + }, + "10.6.0": { + "node_abi": 64, + "v8": "6.7" + }, + "10.7.0": { + "node_abi": 64, + "v8": "6.7" + }, + "10.8.0": { + "node_abi": 64, + "v8": "6.7" + }, + "10.9.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.10.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.11.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.12.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.13.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.14.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.14.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.14.2": { + "node_abi": 64, + "v8": "6.8" + }, + "10.15.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.15.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.15.2": { + "node_abi": 64, + "v8": "6.8" + }, + "10.15.3": { + "node_abi": 64, + "v8": "6.8" + }, + "10.16.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.16.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.16.2": { + "node_abi": 64, + "v8": "6.8" + }, + "10.16.3": { + "node_abi": 64, + "v8": "6.8" + }, + "10.17.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.18.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.18.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.19.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.20.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.20.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.21.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.22.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.22.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.23.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.23.1": { + "node_abi": 64, + "v8": "6.8" + }, + "10.23.2": { + "node_abi": 64, + "v8": "6.8" + }, + "10.23.3": { + "node_abi": 64, + "v8": "6.8" + }, + "10.24.0": { + "node_abi": 64, + "v8": "6.8" + }, + "10.24.1": { + "node_abi": 64, + "v8": "6.8" + }, + "11.0.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.1.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.2.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.3.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.4.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.5.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.6.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.7.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.8.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.9.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.10.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.10.1": { + "node_abi": 67, + "v8": "7.0" + }, + "11.11.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.12.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.13.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.14.0": { + "node_abi": 67, + "v8": "7.0" + }, + "11.15.0": { + "node_abi": 67, + "v8": "7.0" + }, + "12.0.0": { + "node_abi": 72, + "v8": "7.4" + }, + "12.1.0": { + "node_abi": 72, + "v8": "7.4" + }, + "12.2.0": { + "node_abi": 72, + "v8": "7.4" + }, + "12.3.0": { + "node_abi": 72, + "v8": "7.4" + }, + "12.3.1": { + "node_abi": 72, + "v8": "7.4" + }, + "12.4.0": { + "node_abi": 72, + "v8": "7.4" + }, + "12.5.0": { + "node_abi": 72, + "v8": "7.5" + }, + "12.6.0": { + "node_abi": 72, + "v8": "7.5" + }, + "12.7.0": { + "node_abi": 72, + "v8": "7.5" + }, + "12.8.0": { + "node_abi": 72, + "v8": "7.5" + }, + "12.8.1": { + "node_abi": 72, + "v8": "7.5" + }, + "12.9.0": { + "node_abi": 72, + "v8": "7.6" + }, + "12.9.1": { + "node_abi": 72, + "v8": "7.6" + }, + "12.10.0": { + "node_abi": 72, + "v8": "7.6" + }, + "12.11.0": { + "node_abi": 72, + "v8": "7.7" + }, + "12.11.1": { + "node_abi": 72, + "v8": "7.7" + }, + "12.12.0": { + "node_abi": 72, + "v8": "7.7" + }, + "12.13.0": { + "node_abi": 72, + "v8": "7.7" + }, + "12.13.1": { + "node_abi": 72, + "v8": "7.7" + }, + "12.14.0": { + "node_abi": 72, + "v8": "7.7" + }, + "12.14.1": { + "node_abi": 72, + "v8": "7.7" + }, + "12.15.0": { + "node_abi": 72, + "v8": "7.7" + }, + "12.16.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.16.1": { + "node_abi": 72, + "v8": "7.8" + }, + "12.16.2": { + "node_abi": 72, + "v8": "7.8" + }, + "12.16.3": { + "node_abi": 72, + "v8": "7.8" + }, + "12.17.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.18.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.18.1": { + "node_abi": 72, + "v8": "7.8" + }, + "12.18.2": { + "node_abi": 72, + "v8": "7.8" + }, + "12.18.3": { + "node_abi": 72, + "v8": "7.8" + }, + "12.18.4": { + "node_abi": 72, + "v8": "7.8" + }, + "12.19.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.19.1": { + "node_abi": 72, + "v8": "7.8" + }, + "12.20.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.20.1": { + "node_abi": 72, + "v8": "7.8" + }, + "12.20.2": { + "node_abi": 72, + "v8": "7.8" + }, + "12.21.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.0": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.1": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.2": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.3": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.4": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.5": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.6": { + "node_abi": 72, + "v8": "7.8" + }, + "12.22.7": { + "node_abi": 72, + "v8": "7.8" + }, + "13.0.0": { + "node_abi": 79, + "v8": "7.8" + }, + "13.0.1": { + "node_abi": 79, + "v8": "7.8" + }, + "13.1.0": { + "node_abi": 79, + "v8": "7.8" + }, + "13.2.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.3.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.4.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.5.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.6.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.7.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.8.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.9.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.10.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.10.1": { + "node_abi": 79, + "v8": "7.9" + }, + "13.11.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.12.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.13.0": { + "node_abi": 79, + "v8": "7.9" + }, + "13.14.0": { + "node_abi": 79, + "v8": "7.9" + }, + "14.0.0": { + "node_abi": 83, + "v8": "8.1" + }, + "14.1.0": { + "node_abi": 83, + "v8": "8.1" + }, + "14.2.0": { + "node_abi": 83, + "v8": "8.1" + }, + "14.3.0": { + "node_abi": 83, + "v8": "8.1" + }, + "14.4.0": { + "node_abi": 83, + "v8": "8.1" + }, + "14.5.0": { + "node_abi": 83, + "v8": "8.3" + }, + "14.6.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.7.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.8.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.9.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.10.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.10.1": { + "node_abi": 83, + "v8": "8.4" + }, + "14.11.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.12.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.13.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.13.1": { + "node_abi": 83, + "v8": "8.4" + }, + "14.14.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.1": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.2": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.3": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.4": { + "node_abi": 83, + "v8": "8.4" + }, + "14.15.5": { + "node_abi": 83, + "v8": "8.4" + }, + "14.16.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.16.1": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.1": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.2": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.3": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.4": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.5": { + "node_abi": 83, + "v8": "8.4" + }, + "14.17.6": { + "node_abi": 83, + "v8": "8.4" + }, + "14.18.0": { + "node_abi": 83, + "v8": "8.4" + }, + "14.18.1": { + "node_abi": 83, + "v8": "8.4" + }, + "15.0.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.0.1": { + "node_abi": 88, + "v8": "8.6" + }, + "15.1.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.2.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.2.1": { + "node_abi": 88, + "v8": "8.6" + }, + "15.3.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.4.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.5.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.5.1": { + "node_abi": 88, + "v8": "8.6" + }, + "15.6.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.7.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.8.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.9.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.10.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.11.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.12.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.13.0": { + "node_abi": 88, + "v8": "8.6" + }, + "15.14.0": { + "node_abi": 88, + "v8": "8.6" + }, + "16.0.0": { + "node_abi": 93, + "v8": "9.0" + }, + "16.1.0": { + "node_abi": 93, + "v8": "9.0" + }, + "16.2.0": { + "node_abi": 93, + "v8": "9.0" + }, + "16.3.0": { + "node_abi": 93, + "v8": "9.0" + }, + "16.4.0": { + "node_abi": 93, + "v8": "9.1" + }, + "16.4.1": { + "node_abi": 93, + "v8": "9.1" + }, + "16.4.2": { + "node_abi": 93, + "v8": "9.1" + }, + "16.5.0": { + "node_abi": 93, + "v8": "9.1" + }, + "16.6.0": { + "node_abi": 93, + "v8": "9.2" + }, + "16.6.1": { + "node_abi": 93, + "v8": "9.2" + }, + "16.6.2": { + "node_abi": 93, + "v8": "9.2" + }, + "16.7.0": { + "node_abi": 93, + "v8": "9.2" + }, + "16.8.0": { + "node_abi": 93, + "v8": "9.2" + }, + "16.9.0": { + "node_abi": 93, + "v8": "9.3" + }, + "16.9.1": { + "node_abi": 93, + "v8": "9.3" + }, + "16.10.0": { + "node_abi": 93, + "v8": "9.3" + }, + "16.11.0": { + "node_abi": 93, + "v8": "9.4" + }, + "16.11.1": { + "node_abi": 93, + "v8": "9.4" + }, + "16.12.0": { + "node_abi": 93, + "v8": "9.4" + }, + "16.13.0": { + "node_abi": 93, + "v8": "9.4" + }, + "17.0.0": { + "node_abi": 102, + "v8": "9.5" + }, + "17.0.1": { + "node_abi": 102, + "v8": "9.5" + }, + "17.1.0": { + "node_abi": 102, + "v8": "9.5" + } +} \ No newline at end of file diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/compile.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/compile.js new file mode 100644 index 0000000000..956e5aa61e --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/compile.js @@ -0,0 +1,93 @@ +'use strict'; + +module.exports = exports; + +const fs = require('fs'); +const path = require('path'); +const win = process.platform === 'win32'; +const existsSync = fs.existsSync || path.existsSync; +const cp = require('child_process'); + +// try to build up the complete path to node-gyp +/* priority: + - node-gyp on ENV:npm_config_node_gyp (https://github.com/npm/npm/pull/4887) + - node-gyp on NODE_PATH + - node-gyp inside npm on NODE_PATH (ignore on iojs) + - node-gyp inside npm beside node exe +*/ +function which_node_gyp() { + let node_gyp_bin; + if (process.env.npm_config_node_gyp) { + try { + node_gyp_bin = process.env.npm_config_node_gyp; + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } + } catch (err) { + // do nothing + } + } + try { + const node_gyp_main = require.resolve('node-gyp'); // eslint-disable-line node/no-missing-require + node_gyp_bin = path.join(path.dirname( + path.dirname(node_gyp_main)), + 'bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } + } catch (err) { + // do nothing + } + if (process.execPath.indexOf('iojs') === -1) { + try { + const npm_main = require.resolve('npm'); // eslint-disable-line node/no-missing-require + node_gyp_bin = path.join(path.dirname( + path.dirname(npm_main)), + 'node_modules/node-gyp/bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } + } catch (err) { + // do nothing + } + } + const npm_base = path.join(path.dirname( + path.dirname(process.execPath)), + 'lib/node_modules/npm/'); + node_gyp_bin = path.join(npm_base, 'node_modules/node-gyp/bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } +} + +module.exports.run_gyp = function(args, opts, callback) { + let shell_cmd = ''; + const cmd_args = []; + if (opts.runtime && opts.runtime === 'node-webkit') { + shell_cmd = 'nw-gyp'; + if (win) shell_cmd += '.cmd'; + } else { + const node_gyp_path = which_node_gyp(); + if (node_gyp_path) { + shell_cmd = process.execPath; + cmd_args.push(node_gyp_path); + } else { + shell_cmd = 'node-gyp'; + if (win) shell_cmd += '.cmd'; + } + } + const final_args = cmd_args.concat(args); + const cmd = cp.spawn(shell_cmd, final_args, { cwd: undefined, env: process.env, stdio: [0, 1, 2] }); + cmd.on('error', (err) => { + if (err) { + return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + err + ')')); + } + callback(null, opts); + }); + cmd.on('close', (code) => { + if (code && code !== 0) { + return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + code + ')')); + } + callback(null, opts); + }); +}; diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/handle_gyp_opts.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/handle_gyp_opts.js new file mode 100644 index 0000000000..d702f785ea --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/handle_gyp_opts.js @@ -0,0 +1,102 @@ +'use strict'; + +module.exports = exports = handle_gyp_opts; + +const versioning = require('./versioning.js'); +const napi = require('./napi.js'); + +/* + +Here we gather node-pre-gyp generated options (from versioning) and pass them along to node-gyp. + +We massage the args and options slightly to account for differences in what commands mean between +node-pre-gyp and node-gyp (e.g. see the difference between "build" and "rebuild" below) + +Keep in mind: the values inside `argv` and `gyp.opts` below are different depending on whether +node-pre-gyp is called directory, or if it is called in a `run-script` phase of npm. + +We also try to preserve any command line options that might have been passed to npm or node-pre-gyp. +But this is fairly difficult without passing way to much through. For example `gyp.opts` contains all +the process.env and npm pushes a lot of variables into process.env which node-pre-gyp inherits. So we have +to be very selective about what we pass through. + +For example: + +`npm install --build-from-source` will give: + +argv == [ 'rebuild' ] +gyp.opts.argv == { remain: [ 'install' ], + cooked: [ 'install', '--fallback-to-build' ], + original: [ 'install', '--fallback-to-build' ] } + +`./bin/node-pre-gyp build` will give: + +argv == [] +gyp.opts.argv == { remain: [ 'build' ], + cooked: [ 'build' ], + original: [ '-C', 'test/app1', 'build' ] } + +*/ + +// select set of node-pre-gyp versioning info +// to share with node-gyp +const share_with_node_gyp = [ + 'module', + 'module_name', + 'module_path', + 'napi_version', + 'node_abi_napi', + 'napi_build_version', + 'node_napi_label' +]; + +function handle_gyp_opts(gyp, argv, callback) { + + // Collect node-pre-gyp specific variables to pass to node-gyp + const node_pre_gyp_options = []; + // generate custom node-pre-gyp versioning info + const napi_build_version = napi.get_napi_build_version_from_command_args(argv); + const opts = versioning.evaluate(gyp.package_json, gyp.opts, napi_build_version); + share_with_node_gyp.forEach((key) => { + const val = opts[key]; + if (val) { + node_pre_gyp_options.push('--' + key + '=' + val); + } else if (key === 'napi_build_version') { + node_pre_gyp_options.push('--' + key + '=0'); + } else { + if (key !== 'napi_version' && key !== 'node_abi_napi') + return callback(new Error('Option ' + key + ' required but not found by node-pre-gyp')); + } + }); + + // Collect options that follow the special -- which disables nopt parsing + const unparsed_options = []; + let double_hyphen_found = false; + gyp.opts.argv.original.forEach((opt) => { + if (double_hyphen_found) { + unparsed_options.push(opt); + } + if (opt === '--') { + double_hyphen_found = true; + } + }); + + // We try respect and pass through remaining command + // line options (like --foo=bar) to node-gyp + const cooked = gyp.opts.argv.cooked; + const node_gyp_options = []; + cooked.forEach((value) => { + if (value.length > 2 && value.slice(0, 2) === '--') { + const key = value.slice(2); + const val = cooked[cooked.indexOf(value) + 1]; + if (val && val.indexOf('--') === -1) { // handle '--foo=bar' or ['--foo','bar'] + node_gyp_options.push('--' + key + '=' + val); + } else { // pass through --foo + node_gyp_options.push(value); + } + } + }); + + const result = { 'opts': opts, 'gyp': node_gyp_options, 'pre': node_pre_gyp_options, 'unparsed': unparsed_options }; + return callback(null, result); +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/napi.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/napi.js new file mode 100644 index 0000000000..5d14ad6d93 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/napi.js @@ -0,0 +1,205 @@ +'use strict'; + +const fs = require('fs'); + +module.exports = exports; + +const versionArray = process.version + .substr(1) + .replace(/-.*$/, '') + .split('.') + .map((item) => { + return +item; + }); + +const napi_multiple_commands = [ + 'build', + 'clean', + 'configure', + 'package', + 'publish', + 'reveal', + 'testbinary', + 'testpackage', + 'unpublish' +]; + +const napi_build_version_tag = 'napi_build_version='; + +module.exports.get_napi_version = function() { + // returns the non-zero numeric napi version or undefined if napi is not supported. + // correctly supporting target requires an updated cross-walk + let version = process.versions.napi; // can be undefined + if (!version) { // this code should never need to be updated + if (versionArray[0] === 9 && versionArray[1] >= 3) version = 2; // 9.3.0+ + else if (versionArray[0] === 8) version = 1; // 8.0.0+ + } + return version; +}; + +module.exports.get_napi_version_as_string = function(target) { + // returns the napi version as a string or an empty string if napi is not supported. + const version = module.exports.get_napi_version(target); + return version ? '' + version : ''; +}; + +module.exports.validate_package_json = function(package_json, opts) { // throws Error + + const binary = package_json.binary; + const module_path_ok = pathOK(binary.module_path); + const remote_path_ok = pathOK(binary.remote_path); + const package_name_ok = pathOK(binary.package_name); + const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts, true); + const napi_build_versions_raw = module.exports.get_napi_build_versions_raw(package_json); + + if (napi_build_versions) { + napi_build_versions.forEach((napi_build_version)=> { + if (!(parseInt(napi_build_version, 10) === napi_build_version && napi_build_version > 0)) { + throw new Error('All values specified in napi_versions must be positive integers.'); + } + }); + } + + if (napi_build_versions && (!module_path_ok || (!remote_path_ok && !package_name_ok))) { + throw new Error('When napi_versions is specified; module_path and either remote_path or ' + + "package_name must contain the substitution string '{napi_build_version}`."); + } + + if ((module_path_ok || remote_path_ok || package_name_ok) && !napi_build_versions_raw) { + throw new Error("When the substitution string '{napi_build_version}` is specified in " + + 'module_path, remote_path, or package_name; napi_versions must also be specified.'); + } + + if (napi_build_versions && !module.exports.get_best_napi_build_version(package_json, opts) && + module.exports.build_napi_only(package_json)) { + throw new Error( + 'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' + + 'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' + + 'This Node instance cannot run this module.'); + } + + if (napi_build_versions_raw && !napi_build_versions && module.exports.build_napi_only(package_json)) { + throw new Error( + 'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' + + 'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' + + 'This Node instance cannot run this module.'); + } + +}; + +function pathOK(path) { + return path && (path.indexOf('{napi_build_version}') !== -1 || path.indexOf('{node_napi_label}') !== -1); +} + +module.exports.expand_commands = function(package_json, opts, commands) { + const expanded_commands = []; + const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts); + commands.forEach((command)=> { + if (napi_build_versions && command.name === 'install') { + const napi_build_version = module.exports.get_best_napi_build_version(package_json, opts); + const args = napi_build_version ? [napi_build_version_tag + napi_build_version] : []; + expanded_commands.push({ name: command.name, args: args }); + } else if (napi_build_versions && napi_multiple_commands.indexOf(command.name) !== -1) { + napi_build_versions.forEach((napi_build_version)=> { + const args = command.args.slice(); + args.push(napi_build_version_tag + napi_build_version); + expanded_commands.push({ name: command.name, args: args }); + }); + } else { + expanded_commands.push(command); + } + }); + return expanded_commands; +}; + +module.exports.get_napi_build_versions = function(package_json, opts, warnings) { // opts may be undefined + const log = require('npmlog'); + let napi_build_versions = []; + const supported_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined); + // remove duplicates, verify each napi version can actaully be built + if (package_json.binary && package_json.binary.napi_versions) { + package_json.binary.napi_versions.forEach((napi_version) => { + const duplicated = napi_build_versions.indexOf(napi_version) !== -1; + if (!duplicated && supported_napi_version && napi_version <= supported_napi_version) { + napi_build_versions.push(napi_version); + } else if (warnings && !duplicated && supported_napi_version) { + log.info('This Node instance does not support builds for Node-API version', napi_version); + } + }); + } + if (opts && opts['build-latest-napi-version-only']) { + let latest_version = 0; + napi_build_versions.forEach((napi_version) => { + if (napi_version > latest_version) latest_version = napi_version; + }); + napi_build_versions = latest_version ? [latest_version] : []; + } + return napi_build_versions.length ? napi_build_versions : undefined; +}; + +module.exports.get_napi_build_versions_raw = function(package_json) { + const napi_build_versions = []; + // remove duplicates + if (package_json.binary && package_json.binary.napi_versions) { + package_json.binary.napi_versions.forEach((napi_version) => { + if (napi_build_versions.indexOf(napi_version) === -1) { + napi_build_versions.push(napi_version); + } + }); + } + return napi_build_versions.length ? napi_build_versions : undefined; +}; + +module.exports.get_command_arg = function(napi_build_version) { + return napi_build_version_tag + napi_build_version; +}; + +module.exports.get_napi_build_version_from_command_args = function(command_args) { + for (let i = 0; i < command_args.length; i++) { + const arg = command_args[i]; + if (arg.indexOf(napi_build_version_tag) === 0) { + return parseInt(arg.substr(napi_build_version_tag.length), 10); + } + } + return undefined; +}; + +module.exports.swap_build_dir_out = function(napi_build_version) { + if (napi_build_version) { + const rm = require('rimraf'); + rm.sync(module.exports.get_build_dir(napi_build_version)); + fs.renameSync('build', module.exports.get_build_dir(napi_build_version)); + } +}; + +module.exports.swap_build_dir_in = function(napi_build_version) { + if (napi_build_version) { + const rm = require('rimraf'); + rm.sync('build'); + fs.renameSync(module.exports.get_build_dir(napi_build_version), 'build'); + } +}; + +module.exports.get_build_dir = function(napi_build_version) { + return 'build-tmp-napi-v' + napi_build_version; +}; + +module.exports.get_best_napi_build_version = function(package_json, opts) { + let best_napi_build_version = 0; + const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts); + if (napi_build_versions) { + const our_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined); + napi_build_versions.forEach((napi_build_version)=> { + if (napi_build_version > best_napi_build_version && + napi_build_version <= our_napi_version) { + best_napi_build_version = napi_build_version; + } + }); + } + return best_napi_build_version === 0 ? undefined : best_napi_build_version; +}; + +module.exports.build_napi_only = function(package_json) { + return package_json.binary && package_json.binary.package_name && + package_json.binary.package_name.indexOf('{node_napi_label}') === -1; +}; diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/index.html b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/index.html new file mode 100644 index 0000000000..244466c4c5 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/index.html @@ -0,0 +1,26 @@ + + + + +Node-webkit-based module test + + + +

    Node-webkit-based module test

    + + diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/package.json b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/package.json new file mode 100644 index 0000000000..71d03f8226 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp/package.json @@ -0,0 +1,9 @@ +{ +"main": "index.html", +"name": "nw-pre-gyp-module-test", +"description": "Node-webkit-based module test.", +"version": "0.0.1", +"window": { + "show": false +} +} diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js new file mode 100644 index 0000000000..6b1b1a6c27 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js @@ -0,0 +1,163 @@ +'use strict'; + +module.exports = exports; + +const url = require('url'); +const fs = require('fs'); +const path = require('path'); + +module.exports.detect = function(opts, config) { + const to = opts.hosted_path; + const uri = url.parse(to); + config.prefix = (!uri.pathname || uri.pathname === '/') ? '' : uri.pathname.replace('/', ''); + if (opts.bucket && opts.region) { + config.bucket = opts.bucket; + config.region = opts.region; + config.endpoint = opts.host; + config.s3ForcePathStyle = opts.s3ForcePathStyle; + } else { + const parts = uri.hostname.split('.s3'); + const bucket = parts[0]; + if (!bucket) { + return; + } + if (!config.bucket) { + config.bucket = bucket; + } + if (!config.region) { + const region = parts[1].slice(1).split('.')[0]; + if (region === 'amazonaws') { + config.region = 'us-east-1'; + } else { + config.region = region; + } + } + } +}; + +module.exports.get_s3 = function(config) { + + if (process.env.node_pre_gyp_mock_s3) { + // here we're mocking. node_pre_gyp_mock_s3 is the scratch directory + // for the mock code. + const AWSMock = require('mock-aws-s3'); + const os = require('os'); + + AWSMock.config.basePath = `${os.tmpdir()}/mock`; + + const s3 = AWSMock.S3(); + + // wrapped callback maker. fs calls return code of ENOENT but AWS.S3 returns + // NotFound. + const wcb = (fn) => (err, ...args) => { + if (err && err.code === 'ENOENT') { + err.code = 'NotFound'; + } + return fn(err, ...args); + }; + + return { + listObjects(params, callback) { + return s3.listObjects(params, wcb(callback)); + }, + headObject(params, callback) { + return s3.headObject(params, wcb(callback)); + }, + deleteObject(params, callback) { + return s3.deleteObject(params, wcb(callback)); + }, + putObject(params, callback) { + return s3.putObject(params, wcb(callback)); + } + }; + } + + // if not mocking then setup real s3. + const AWS = require('aws-sdk'); + + AWS.config.update(config); + const s3 = new AWS.S3(); + + // need to change if additional options need to be specified. + return { + listObjects(params, callback) { + return s3.listObjects(params, callback); + }, + headObject(params, callback) { + return s3.headObject(params, callback); + }, + deleteObject(params, callback) { + return s3.deleteObject(params, callback); + }, + putObject(params, callback) { + return s3.putObject(params, callback); + } + }; + + + +}; + +// +// function to get the mocking control function. if not mocking it returns a no-op. +// +// if mocking it sets up the mock http interceptors that use the mocked s3 file system +// to fulfill reponses. +module.exports.get_mockS3Http = function() { + let mock_s3 = false; + if (!process.env.node_pre_gyp_mock_s3) { + return () => mock_s3; + } + + const nock = require('nock'); + // the bucket used for testing, as addressed by https. + const host = 'https://mapbox-node-pre-gyp-public-testing-bucket.s3.us-east-1.amazonaws.com'; + const mockDir = process.env.node_pre_gyp_mock_s3 + '/mapbox-node-pre-gyp-public-testing-bucket'; + + // function to setup interceptors. they are "turned off" by setting mock_s3 to false. + const mock_http = () => { + // eslint-disable-next-line no-unused-vars + function get(uri, requestBody) { + const filepath = path.join(mockDir, uri.replace('%2B', '+')); + + try { + fs.accessSync(filepath, fs.constants.R_OK); + } catch (e) { + return [404, 'not found\n']; + } + + // the mock s3 functions just write to disk, so just read from it. + return [200, fs.createReadStream(filepath)]; + } + + // eslint-disable-next-line no-unused-vars + return nock(host) + .persist() + .get(() => mock_s3) // mock any uri for s3 when true + .reply(get); + }; + + // setup interceptors. they check the mock_s3 flag to determine whether to intercept. + mock_http(nock, host, mockDir); + // function to turn matching all requests to s3 on/off. + const mockS3Http = (action) => { + const previous = mock_s3; + if (action === 'off') { + mock_s3 = false; + } else if (action === 'on') { + mock_s3 = true; + } else if (action !== 'get') { + throw new Error(`illegal action for setMockHttp ${action}`); + } + return previous; + }; + + // call mockS3Http with the argument + // - 'on' - turn it on + // - 'off' - turn it off (used by fetch.test.js so it doesn't interfere with redirects) + // - 'get' - return true or false for 'on' or 'off' + return mockS3Http; +}; + + + diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/versioning.js b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/versioning.js new file mode 100644 index 0000000000..825cfa1dfc --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/lib/util/versioning.js @@ -0,0 +1,335 @@ +'use strict'; + +module.exports = exports; + +const path = require('path'); +const semver = require('semver'); +const url = require('url'); +const detect_libc = require('detect-libc'); +const napi = require('./napi.js'); + +let abi_crosswalk; + +// This is used for unit testing to provide a fake +// ABI crosswalk that emulates one that is not updated +// for the current version +if (process.env.NODE_PRE_GYP_ABI_CROSSWALK) { + abi_crosswalk = require(process.env.NODE_PRE_GYP_ABI_CROSSWALK); +} else { + abi_crosswalk = require('./abi_crosswalk.json'); +} + +const major_versions = {}; +Object.keys(abi_crosswalk).forEach((v) => { + const major = v.split('.')[0]; + if (!major_versions[major]) { + major_versions[major] = v; + } +}); + +function get_electron_abi(runtime, target_version) { + if (!runtime) { + throw new Error('get_electron_abi requires valid runtime arg'); + } + if (typeof target_version === 'undefined') { + // erroneous CLI call + throw new Error('Empty target version is not supported if electron is the target.'); + } + // Electron guarantees that patch version update won't break native modules. + const sem_ver = semver.parse(target_version); + return runtime + '-v' + sem_ver.major + '.' + sem_ver.minor; +} +module.exports.get_electron_abi = get_electron_abi; + +function get_node_webkit_abi(runtime, target_version) { + if (!runtime) { + throw new Error('get_node_webkit_abi requires valid runtime arg'); + } + if (typeof target_version === 'undefined') { + // erroneous CLI call + throw new Error('Empty target version is not supported if node-webkit is the target.'); + } + return runtime + '-v' + target_version; +} +module.exports.get_node_webkit_abi = get_node_webkit_abi; + +function get_node_abi(runtime, versions) { + if (!runtime) { + throw new Error('get_node_abi requires valid runtime arg'); + } + if (!versions) { + throw new Error('get_node_abi requires valid process.versions object'); + } + const sem_ver = semver.parse(versions.node); + if (sem_ver.major === 0 && sem_ver.minor % 2) { // odd series + // https://github.com/mapbox/node-pre-gyp/issues/124 + return runtime + '-v' + versions.node; + } else { + // process.versions.modules added in >= v0.10.4 and v0.11.7 + // https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e + return versions.modules ? runtime + '-v' + (+versions.modules) : + 'v8-' + versions.v8.split('.').slice(0, 2).join('.'); + } +} +module.exports.get_node_abi = get_node_abi; + +function get_runtime_abi(runtime, target_version) { + if (!runtime) { + throw new Error('get_runtime_abi requires valid runtime arg'); + } + if (runtime === 'node-webkit') { + return get_node_webkit_abi(runtime, target_version || process.versions['node-webkit']); + } else if (runtime === 'electron') { + return get_electron_abi(runtime, target_version || process.versions.electron); + } else { + if (runtime !== 'node') { + throw new Error("Unknown Runtime: '" + runtime + "'"); + } + if (!target_version) { + return get_node_abi(runtime, process.versions); + } else { + let cross_obj; + // abi_crosswalk generated with ./scripts/abi_crosswalk.js + if (abi_crosswalk[target_version]) { + cross_obj = abi_crosswalk[target_version]; + } else { + const target_parts = target_version.split('.').map((i) => { return +i; }); + if (target_parts.length !== 3) { // parse failed + throw new Error('Unknown target version: ' + target_version); + } + /* + The below code tries to infer the last known ABI compatible version + that we have recorded in the abi_crosswalk.json when an exact match + is not possible. The reasons for this to exist are complicated: + + - We support passing --target to be able to allow developers to package binaries for versions of node + that are not the same one as they are running. This might also be used in combination with the + --target_arch or --target_platform flags to also package binaries for alternative platforms + - When --target is passed we can't therefore determine the ABI (process.versions.modules) from the node + version that is running in memory + - So, therefore node-pre-gyp keeps an "ABI crosswalk" (lib/util/abi_crosswalk.json) to be able to look + this info up for all versions + - But we cannot easily predict what the future ABI will be for released versions + - And node-pre-gyp needs to be a `bundledDependency` in apps that depend on it in order to work correctly + by being fully available at install time. + - So, the speed of node releases and the bundled nature of node-pre-gyp mean that a new node-pre-gyp release + need to happen for every node.js/io.js/node-webkit/nw.js/atom-shell/etc release that might come online if + you want the `--target` flag to keep working for the latest version + - Which is impractical ^^ + - Hence the below code guesses about future ABI to make the need to update node-pre-gyp less demanding. + + In practice then you can have a dependency of your app like `node-sqlite3` that bundles a `node-pre-gyp` that + only knows about node v0.10.33 in the `abi_crosswalk.json` but target node v0.10.34 (which is assumed to be + ABI compatible with v0.10.33). + + TODO: use semver module instead of custom version parsing + */ + const major = target_parts[0]; + let minor = target_parts[1]; + let patch = target_parts[2]; + // io.js: yeah if node.js ever releases 1.x this will break + // but that is unlikely to happen: https://github.com/iojs/io.js/pull/253#issuecomment-69432616 + if (major === 1) { + // look for last release that is the same major version + // e.g. we assume io.js 1.x is ABI compatible with >= 1.0.0 + while (true) { + if (minor > 0) --minor; + if (patch > 0) --patch; + const new_iojs_target = '' + major + '.' + minor + '.' + patch; + if (abi_crosswalk[new_iojs_target]) { + cross_obj = abi_crosswalk[new_iojs_target]; + console.log('Warning: node-pre-gyp could not find exact match for ' + target_version); + console.log('Warning: but node-pre-gyp successfully choose ' + new_iojs_target + ' as ABI compatible target'); + break; + } + if (minor === 0 && patch === 0) { + break; + } + } + } else if (major >= 2) { + // look for last release that is the same major version + if (major_versions[major]) { + cross_obj = abi_crosswalk[major_versions[major]]; + console.log('Warning: node-pre-gyp could not find exact match for ' + target_version); + console.log('Warning: but node-pre-gyp successfully choose ' + major_versions[major] + ' as ABI compatible target'); + } + } else if (major === 0) { // node.js + if (target_parts[1] % 2 === 0) { // for stable/even node.js series + // look for the last release that is the same minor release + // e.g. we assume node 0.10.x is ABI compatible with >= 0.10.0 + while (--patch > 0) { + const new_node_target = '' + major + '.' + minor + '.' + patch; + if (abi_crosswalk[new_node_target]) { + cross_obj = abi_crosswalk[new_node_target]; + console.log('Warning: node-pre-gyp could not find exact match for ' + target_version); + console.log('Warning: but node-pre-gyp successfully choose ' + new_node_target + ' as ABI compatible target'); + break; + } + } + } + } + } + if (!cross_obj) { + throw new Error('Unsupported target version: ' + target_version); + } + // emulate process.versions + const versions_obj = { + node: target_version, + v8: cross_obj.v8 + '.0', + // abi_crosswalk uses 1 for node versions lacking process.versions.modules + // process.versions.modules added in >= v0.10.4 and v0.11.7 + modules: cross_obj.node_abi > 1 ? cross_obj.node_abi : undefined + }; + return get_node_abi(runtime, versions_obj); + } + } +} +module.exports.get_runtime_abi = get_runtime_abi; + +const required_parameters = [ + 'module_name', + 'module_path', + 'host' +]; + +function validate_config(package_json, opts) { + const msg = package_json.name + ' package.json is not node-pre-gyp ready:\n'; + const missing = []; + if (!package_json.main) { + missing.push('main'); + } + if (!package_json.version) { + missing.push('version'); + } + if (!package_json.name) { + missing.push('name'); + } + if (!package_json.binary) { + missing.push('binary'); + } + const o = package_json.binary; + if (o) { + required_parameters.forEach((p) => { + if (!o[p] || typeof o[p] !== 'string') { + missing.push('binary.' + p); + } + }); + } + + if (missing.length >= 1) { + throw new Error(msg + 'package.json must declare these properties: \n' + missing.join('\n')); + } + if (o) { + // enforce https over http + const protocol = url.parse(o.host).protocol; + if (protocol === 'http:') { + throw new Error("'host' protocol (" + protocol + ") is invalid - only 'https:' is accepted"); + } + } + napi.validate_package_json(package_json, opts); +} + +module.exports.validate_config = validate_config; + +function eval_template(template, opts) { + Object.keys(opts).forEach((key) => { + const pattern = '{' + key + '}'; + while (template.indexOf(pattern) > -1) { + template = template.replace(pattern, opts[key]); + } + }); + return template; +} + +// url.resolve needs single trailing slash +// to behave correctly, otherwise a double slash +// may end up in the url which breaks requests +// and a lacking slash may not lead to proper joining +function fix_slashes(pathname) { + if (pathname.slice(-1) !== '/') { + return pathname + '/'; + } + return pathname; +} + +// remove double slashes +// note: path.normalize will not work because +// it will convert forward to back slashes +function drop_double_slashes(pathname) { + return pathname.replace(/\/\//g, '/'); +} + +function get_process_runtime(versions) { + let runtime = 'node'; + if (versions['node-webkit']) { + runtime = 'node-webkit'; + } else if (versions.electron) { + runtime = 'electron'; + } + return runtime; +} + +module.exports.get_process_runtime = get_process_runtime; + +const default_package_name = '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz'; +const default_remote_path = ''; + +module.exports.evaluate = function(package_json, options, napi_build_version) { + options = options || {}; + validate_config(package_json, options); // options is a suitable substitute for opts in this case + const v = package_json.version; + const module_version = semver.parse(v); + const runtime = options.runtime || get_process_runtime(process.versions); + const opts = { + name: package_json.name, + configuration: options.debug ? 'Debug' : 'Release', + debug: options.debug, + module_name: package_json.binary.module_name, + version: module_version.version, + prerelease: module_version.prerelease.length ? module_version.prerelease.join('.') : '', + build: module_version.build.length ? module_version.build.join('.') : '', + major: module_version.major, + minor: module_version.minor, + patch: module_version.patch, + runtime: runtime, + node_abi: get_runtime_abi(runtime, options.target), + node_abi_napi: napi.get_napi_version(options.target) ? 'napi' : get_runtime_abi(runtime, options.target), + napi_version: napi.get_napi_version(options.target), // non-zero numeric, undefined if unsupported + napi_build_version: napi_build_version || '', + node_napi_label: napi_build_version ? 'napi-v' + napi_build_version : get_runtime_abi(runtime, options.target), + target: options.target || '', + platform: options.target_platform || process.platform, + target_platform: options.target_platform || process.platform, + arch: options.target_arch || process.arch, + target_arch: options.target_arch || process.arch, + libc: options.target_libc || detect_libc.familySync() || 'unknown', + module_main: package_json.main, + toolset: options.toolset || '', // address https://github.com/mapbox/node-pre-gyp/issues/119 + bucket: package_json.binary.bucket, + region: package_json.binary.region, + s3ForcePathStyle: package_json.binary.s3ForcePathStyle || false + }; + // support host mirror with npm config `--{module_name}_binary_host_mirror` + // e.g.: https://github.com/node-inspector/v8-profiler/blob/master/package.json#L25 + // > npm install v8-profiler --profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/ + const validModuleName = opts.module_name.replace('-', '_'); + const host = process.env['npm_config_' + validModuleName + '_binary_host_mirror'] || package_json.binary.host; + opts.host = fix_slashes(eval_template(host, opts)); + opts.module_path = eval_template(package_json.binary.module_path, opts); + // now we resolve the module_path to ensure it is absolute so that binding.gyp variables work predictably + if (options.module_root) { + // resolve relative to known module root: works for pre-binding require + opts.module_path = path.join(options.module_root, opts.module_path); + } else { + // resolve relative to current working directory: works for node-pre-gyp commands + opts.module_path = path.resolve(opts.module_path); + } + opts.module = path.join(opts.module_path, opts.module_name + '.node'); + opts.remote_path = package_json.binary.remote_path ? drop_double_slashes(fix_slashes(eval_template(package_json.binary.remote_path, opts))) : default_remote_path; + const package_name = package_json.binary.package_name ? package_json.binary.package_name : default_package_name; + opts.package_name = eval_template(package_name, opts); + opts.staged_tarball = path.join('build/stage', opts.remote_path, opts.package_name); + opts.hosted_path = url.resolve(opts.host, opts.remote_path); + opts.hosted_tarball = url.resolve(opts.hosted_path, opts.package_name); + return opts; +}; diff --git a/user-service/node_modules/@mapbox/node-pre-gyp/package.json b/user-service/node_modules/@mapbox/node-pre-gyp/package.json new file mode 100644 index 0000000000..5e1d6fd584 --- /dev/null +++ b/user-service/node_modules/@mapbox/node-pre-gyp/package.json @@ -0,0 +1,62 @@ +{ + "name": "@mapbox/node-pre-gyp", + "description": "Node.js native addon binary install tool", + "version": "1.0.11", + "keywords": [ + "native", + "addon", + "module", + "c", + "c++", + "bindings", + "binary" + ], + "license": "BSD-3-Clause", + "author": "Dane Springmeyer ", + "repository": { + "type": "git", + "url": "git://github.com/mapbox/node-pre-gyp.git" + }, + "bin": "./bin/node-pre-gyp", + "main": "./lib/node-pre-gyp.js", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "devDependencies": { + "@mapbox/cloudfriend": "^5.1.0", + "@mapbox/eslint-config-mapbox": "^3.0.0", + "aws-sdk": "^2.1087.0", + "codecov": "^3.8.3", + "eslint": "^7.32.0", + "eslint-plugin-node": "^11.1.0", + "mock-aws-s3": "^4.0.2", + "nock": "^12.0.3", + "node-addon-api": "^4.3.0", + "nyc": "^15.1.0", + "tape": "^5.5.2", + "tar-fs": "^2.1.1" + }, + "nyc": { + "all": true, + "skip-full": false, + "exclude": [ + "test/**" + ] + }, + "scripts": { + "coverage": "nyc --all --include index.js --include lib/ npm test", + "upload-coverage": "nyc report --reporter json && codecov --clear --flags=unit --file=./coverage/coverage-final.json", + "lint": "eslint bin/node-pre-gyp lib/*js lib/util/*js test/*js scripts/*js", + "fix": "npm run lint -- --fix", + "update-crosswalk": "node scripts/abi_crosswalk.js", + "test": "tape test/*test.js" + } +} diff --git a/user-service/node_modules/@mongodb-js/saslprep/LICENSE b/user-service/node_modules/@mongodb-js/saslprep/LICENSE new file mode 100644 index 0000000000..481c7a50f9 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 Dmitry Tsvettsikh + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/.esm-wrapper.mjs b/user-service/node_modules/@mongodb-js/saslprep/dist/.esm-wrapper.mjs new file mode 100644 index 0000000000..0b46bfa630 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/.esm-wrapper.mjs @@ -0,0 +1,4 @@ +import mod from "./node.js"; + +export default mod; +export const saslprep = mod.saslprep; diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts new file mode 100644 index 0000000000..70a71a5a0b --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts @@ -0,0 +1,5 @@ +declare const saslprep: (args_0: string, args_1?: { + allowUnassigned?: boolean | undefined; +} | undefined) => string; +export = saslprep; +//# sourceMappingURL=browser.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts.map new file mode 100644 index 0000000000..669fc6433d --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,QAAQ;;wBAAmC,CAAC;AAIlD,SAAS,QAAQ,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js new file mode 100644 index 0000000000..1bedd860eb --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js @@ -0,0 +1,12 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const index_1 = __importDefault(require("./index")); +const memory_code_points_1 = require("./memory-code-points"); +const code_points_data_browser_1 = __importDefault(require("./code-points-data-browser")); +const codePoints = (0, memory_code_points_1.createMemoryCodePoints)(code_points_data_browser_1.default); +const saslprep = index_1.default.bind(null, codePoints); +Object.assign(saslprep, { saslprep, default: saslprep }); +module.exports = saslprep; +//# sourceMappingURL=browser.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js.map new file mode 100644 index 0000000000..40edf44bec --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/browser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":";;;;AAAA,oDAAgC;AAChC,6DAA8D;AAC9D,0FAA8C;AAE9C,MAAM,UAAU,GAAG,IAAA,2CAAsB,EAAC,kCAAI,CAAC,CAAC;AAEhD,MAAM,QAAQ,GAAG,eAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AAEzD,iBAAS,QAAQ,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts new file mode 100644 index 0000000000..f85af5b8ba --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts @@ -0,0 +1,4 @@ +/// +declare const data: Buffer; +export default data; +//# sourceMappingURL=code-points-data-browser.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts.map new file mode 100644 index 0000000000..617b217b8b --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-data-browser.d.ts","sourceRoot":"","sources":["../src/code-points-data-browser.ts"],"names":[],"mappings":";AAAA,QAAA,MAAM,IAAI,QAGT,CAAC;AACF,eAAe,IAAI,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js new file mode 100644 index 0000000000..5ea9635511 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const data = Buffer.from('AAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAP////AAAAAAAAAAAAAAADAAAAAAAAAAH//wAAAAAAAAAAAAD//wAA893wFAAAIAAAAAABAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAz8AAP////+AAAAAAYCAAAAAAJ+AACAAACAH/wAAAB8H///3/+6AAAAfAAAD/wAAAAAAAAAAAAAAAAAAAAAAAwABAAIAAAAHAAAAH////////wAAAAAAAD///////////////////////////////////////////////////////4gAAAAAAAAwAAMHAAAAf/+IBmAAAEBcNAZj/vIMAAAf2B5gAABASTQeY/+F/AAH/4gKIAAAQEgwAiN//3wA//+IBmAAAEBMMA5j/PI8AH//yBxDlOccAjwcQ/7//gAf/4gEQAAAQAg8BEP5/zwA///IBEAAAEAIPARD+f08AP//yARAAABAADwMQ/7/PAD//8gAAcAAACALAd4FAP//x/+AAAAAAAAAHgAAAA//////llvwgIrIACMFAwAz/////wAAAAAAAAAAAIAAAAAfgAAADwCAAAAABAAG////////AAAAACCQHD8AAAA///////////8AAAAAA/8AAAAAAG8AAAAAAAAAAAAAAD4AAAAAAAAAAB8AAAAAAAAAAAAAPwEAAAAAAAAAAUMBQwAAAAABQwAAAAFDAUMBAQAAAQAAAAFDAQAAAAABAAAfgAAAB/////8AAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAcAAAAAAAAAAAAAf/8ABAf/AAAB/wAAD/8ABE//AAAAAAAAAAAAAAAHAD///wABAD8AAAAAAAAAAAAAAP8AAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAA/AAADAwAAAAADAwCqAAAAAwAAAAAAAAQABAAMCAAAxAEAAAAAAAAAAAAAHv4PwDAAAAH//wAAP////wAAAB///wAAAAAAAAAYAA/gAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///////wAAAAAB////AB///wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAAAAAAAAAAAAAADAD///////////////////4QwAAAAgAAAAAodAYAAAAAAAAcAAACAAf//AAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAACAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///8ADwAAAAAAAAAAgAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAA+AAAAAAHgAAAAAAAAAAAAAABAAAAAAD/////////AAAAAAAHAAAAAA//gAAAAAAOAAAAAAAAAAAADwAAAAAAAQAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAB////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAB////////////////////////8B/+D4AAABBSQAAAAAAAAAAAAAAAAAP////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAwAAAAAAAAP8AAAAAAAcAAP//D/8AAAGAEAABDwQAAAAAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDAwMcBAf+A////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAQ//AAAAH/////////////////////////////8AAAAAAwAAAAAD//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAEAAAAAAAAAAAE2YQAKEgAAAAAAAAAAhgEBAAAACEFwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////y/////AAAAAAAAAAAAAAAA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAD/////AAAAAAAAAAAAAAAB/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAD/AAAAAAAB8D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAP///+D4AAAAABF////g/+AAAAAHf////////////////AQGAAA+//y////4AAAAAAAAAAAAAP/////8AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF/7/++tv/////////////////wAAAAB////////////////////////////////////////////////////////////wAAP//////////P////////wAAAAAA//gAAAAAAAAAAAAAAAAAAPv/////////////////////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAf///4H///+AAAAAAACAEIP///v////7/////////////////////////////////////////////////v//wAAAA///////////////8/5/AAMAA+AIAAAAAAAAAAAAAAAAAAAAAACAC6///3//////+//////wA/////////////////////+A///////////7//////MD//wAAAAB//////n9//////0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABf////////HgHiA/8//gAA3+Z///7+jw4GYAQ3D/8/gB+Gf//+/tsOAAAB6A/84ABf13///v7fHgFiAAIP/AAA3+Z///7+zxoGYAQ3D/4AAF+O8axjj/cNjuAEAAf/gAHf7v///v/fAeAAAAMP/AAA3+7///7/3wvmwBgLD/wAAN/u///+//8ODuAEAw/8AADf//j///9/0/gHA/wAAOAB///////+wAP4B//AAAAAAaaQPf3U3sAT6AP/MAAAAAP///z////qD/3/////gAAEE8AAAAAAAA/35AAAAAAAA/////99oQID///8AAAAAAAAAAAD//////AD//////5D//////////////8H//////////+D/////////////wP7//////////rz+vP/////+vP////68/rz+/v///v////68/v/////+///gf///+AAAAAD/////////////+AB////////////////////////////////////////////////////////////////////////////////////////////////////////+AH///+D/////////////gAD/+8AA///GAP//wAD/+4AA/////////gP9gA/o/8AAAAAA/8D//////////////wD//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////////////////////w///////////////A///8/P/////8/P9V/////P////////v6O/jz8P/4O/gAAgAAAAAAAAAAAAAAAEABAAAAAAAAAAAAAAAAAAAAACE/9HwKvd/HB8AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////gAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAB/wHz4f/////////////4Hf//////////////vB//////4f//////////////+//////8AAAAAAAAA///////4//////AAAAD////x////////gAD/8P///////v///////////////////h////////////////z////+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/////////+AAAAAAAAAAAAAAAAAAAAAAAAD+AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB////gf///4AP//////////////j8/PzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////vAA////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////P/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////////////////////////////8AP/////+P/////////4/4AAYD////8P///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////////7///////////7Jnv/17f//////////ef7+////976P7////////////////////////////////////////////////////////D////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w=', 'base64'); +exports.default = data; +//# sourceMappingURL=code-points-data-browser.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js.map new file mode 100644 index 0000000000..feba4779b3 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data-browser.js.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-data-browser.js","sourceRoot":"","sources":["../src/code-points-data-browser.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,8sliBAA8sliB,EAC9sliB,QAAQ,CACT,CAAC;AACF,kBAAe,IAAI,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts new file mode 100644 index 0000000000..cc908ec596 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts @@ -0,0 +1,4 @@ +/// +declare const _default: Buffer; +export default _default; +//# sourceMappingURL=code-points-data.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts.map new file mode 100644 index 0000000000..772442e0bd --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-data.d.ts","sourceRoot":"","sources":["../src/code-points-data.ts"],"names":[],"mappings":";;AAEA,wBAKE"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js new file mode 100644 index 0000000000..6af9a89b96 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const zlib_1 = require("zlib"); +exports.default = (0, zlib_1.gunzipSync)(Buffer.from('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', 'base64')); +//# sourceMappingURL=code-points-data.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js.map new file mode 100644 index 0000000000..1da1c5500f --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-data.js.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-data.js","sourceRoot":"","sources":["../src/code-points-data.ts"],"names":[],"mappings":";;AAAA,+BAAkC;AAElC,kBAAe,IAAA,iBAAU,EACvB,MAAM,CAAC,IAAI,CACT,knFAAknF,EAClnF,QAAQ,CACT,CACF,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts new file mode 100644 index 0000000000..36b6c56503 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts @@ -0,0 +1,7 @@ +export declare const unassigned_code_points: Set; +export declare const commonly_mapped_to_nothing: Set; +export declare const non_ASCII_space_characters: Set; +export declare const prohibited_characters: Set; +export declare const bidirectional_r_al: Set; +export declare const bidirectional_l: Set; +//# sourceMappingURL=code-points-src.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts.map new file mode 100644 index 0000000000..ef0e6947b4 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-src.d.ts","sourceRoot":"","sources":["../src/code-points-src.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,aA6YjC,CAAC;AAMH,eAAO,MAAM,0BAA0B,aAIrC,CAAC;AAMH,eAAO,MAAM,0BAA0B,aASrC,CAAC;AAMH,eAAO,MAAM,qBAAqB,aA6GhC,CAAC;AAMH,eAAO,MAAM,kBAAkB,aAmC7B,CAAC;AAMH,eAAO,MAAM,eAAe,aAyW1B,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js new file mode 100644 index 0000000000..2caa629787 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js @@ -0,0 +1,881 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.bidirectional_l = exports.bidirectional_r_al = exports.prohibited_characters = exports.non_ASCII_space_characters = exports.commonly_mapped_to_nothing = exports.unassigned_code_points = void 0; +const util_1 = require("./util"); +exports.unassigned_code_points = new Set([ + 0x0221, + ...(0, util_1.range)(0x0234, 0x024f), + ...(0, util_1.range)(0x02ae, 0x02af), + ...(0, util_1.range)(0x02ef, 0x02ff), + ...(0, util_1.range)(0x0350, 0x035f), + ...(0, util_1.range)(0x0370, 0x0373), + ...(0, util_1.range)(0x0376, 0x0379), + ...(0, util_1.range)(0x037b, 0x037d), + ...(0, util_1.range)(0x037f, 0x0383), + 0x038b, + 0x038d, + 0x03a2, + 0x03cf, + ...(0, util_1.range)(0x03f7, 0x03ff), + 0x0487, + 0x04cf, + ...(0, util_1.range)(0x04f6, 0x04f7), + ...(0, util_1.range)(0x04fa, 0x04ff), + ...(0, util_1.range)(0x0510, 0x0530), + ...(0, util_1.range)(0x0557, 0x0558), + 0x0560, + 0x0588, + ...(0, util_1.range)(0x058b, 0x0590), + 0x05a2, + 0x05ba, + ...(0, util_1.range)(0x05c5, 0x05cf), + ...(0, util_1.range)(0x05eb, 0x05ef), + ...(0, util_1.range)(0x05f5, 0x060b), + ...(0, util_1.range)(0x060d, 0x061a), + ...(0, util_1.range)(0x061c, 0x061e), + 0x0620, + ...(0, util_1.range)(0x063b, 0x063f), + ...(0, util_1.range)(0x0656, 0x065f), + ...(0, util_1.range)(0x06ee, 0x06ef), + 0x06ff, + 0x070e, + ...(0, util_1.range)(0x072d, 0x072f), + ...(0, util_1.range)(0x074b, 0x077f), + ...(0, util_1.range)(0x07b2, 0x0900), + 0x0904, + ...(0, util_1.range)(0x093a, 0x093b), + ...(0, util_1.range)(0x094e, 0x094f), + ...(0, util_1.range)(0x0955, 0x0957), + ...(0, util_1.range)(0x0971, 0x0980), + 0x0984, + ...(0, util_1.range)(0x098d, 0x098e), + ...(0, util_1.range)(0x0991, 0x0992), + 0x09a9, + 0x09b1, + ...(0, util_1.range)(0x09b3, 0x09b5), + ...(0, util_1.range)(0x09ba, 0x09bb), + 0x09bd, + ...(0, util_1.range)(0x09c5, 0x09c6), + ...(0, util_1.range)(0x09c9, 0x09ca), + ...(0, util_1.range)(0x09ce, 0x09d6), + ...(0, util_1.range)(0x09d8, 0x09db), + 0x09de, + ...(0, util_1.range)(0x09e4, 0x09e5), + ...(0, util_1.range)(0x09fb, 0x0a01), + ...(0, util_1.range)(0x0a03, 0x0a04), + ...(0, util_1.range)(0x0a0b, 0x0a0e), + ...(0, util_1.range)(0x0a11, 0x0a12), + 0x0a29, + 0x0a31, + 0x0a34, + 0x0a37, + ...(0, util_1.range)(0x0a3a, 0x0a3b), + 0x0a3d, + ...(0, util_1.range)(0x0a43, 0x0a46), + ...(0, util_1.range)(0x0a49, 0x0a4a), + ...(0, util_1.range)(0x0a4e, 0x0a58), + 0x0a5d, + ...(0, util_1.range)(0x0a5f, 0x0a65), + ...(0, util_1.range)(0x0a75, 0x0a80), + 0x0a84, + 0x0a8c, + 0x0a8e, + 0x0a92, + 0x0aa9, + 0x0ab1, + 0x0ab4, + ...(0, util_1.range)(0x0aba, 0x0abb), + 0x0ac6, + 0x0aca, + ...(0, util_1.range)(0x0ace, 0x0acf), + ...(0, util_1.range)(0x0ad1, 0x0adf), + ...(0, util_1.range)(0x0ae1, 0x0ae5), + ...(0, util_1.range)(0x0af0, 0x0b00), + 0x0b04, + ...(0, util_1.range)(0x0b0d, 0x0b0e), + ...(0, util_1.range)(0x0b11, 0x0b12), + 0x0b29, + 0x0b31, + ...(0, util_1.range)(0x0b34, 0x0b35), + ...(0, util_1.range)(0x0b3a, 0x0b3b), + ...(0, util_1.range)(0x0b44, 0x0b46), + ...(0, util_1.range)(0x0b49, 0x0b4a), + ...(0, util_1.range)(0x0b4e, 0x0b55), + ...(0, util_1.range)(0x0b58, 0x0b5b), + 0x0b5e, + ...(0, util_1.range)(0x0b62, 0x0b65), + ...(0, util_1.range)(0x0b71, 0x0b81), + 0x0b84, + ...(0, util_1.range)(0x0b8b, 0x0b8d), + 0x0b91, + ...(0, util_1.range)(0x0b96, 0x0b98), + 0x0b9b, + 0x0b9d, + ...(0, util_1.range)(0x0ba0, 0x0ba2), + ...(0, util_1.range)(0x0ba5, 0x0ba7), + ...(0, util_1.range)(0x0bab, 0x0bad), + 0x0bb6, + ...(0, util_1.range)(0x0bba, 0x0bbd), + ...(0, util_1.range)(0x0bc3, 0x0bc5), + 0x0bc9, + ...(0, util_1.range)(0x0bce, 0x0bd6), + ...(0, util_1.range)(0x0bd8, 0x0be6), + ...(0, util_1.range)(0x0bf3, 0x0c00), + 0x0c04, + 0x0c0d, + 0x0c11, + 0x0c29, + 0x0c34, + ...(0, util_1.range)(0x0c3a, 0x0c3d), + 0x0c45, + 0x0c49, + ...(0, util_1.range)(0x0c4e, 0x0c54), + ...(0, util_1.range)(0x0c57, 0x0c5f), + ...(0, util_1.range)(0x0c62, 0x0c65), + ...(0, util_1.range)(0x0c70, 0x0c81), + 0x0c84, + 0x0c8d, + 0x0c91, + 0x0ca9, + 0x0cb4, + ...(0, util_1.range)(0x0cba, 0x0cbd), + 0x0cc5, + 0x0cc9, + ...(0, util_1.range)(0x0cce, 0x0cd4), + ...(0, util_1.range)(0x0cd7, 0x0cdd), + 0x0cdf, + ...(0, util_1.range)(0x0ce2, 0x0ce5), + ...(0, util_1.range)(0x0cf0, 0x0d01), + 0x0d04, + 0x0d0d, + 0x0d11, + 0x0d29, + ...(0, util_1.range)(0x0d3a, 0x0d3d), + ...(0, util_1.range)(0x0d44, 0x0d45), + 0x0d49, + ...(0, util_1.range)(0x0d4e, 0x0d56), + ...(0, util_1.range)(0x0d58, 0x0d5f), + ...(0, util_1.range)(0x0d62, 0x0d65), + ...(0, util_1.range)(0x0d70, 0x0d81), + 0x0d84, + ...(0, util_1.range)(0x0d97, 0x0d99), + 0x0db2, + 0x0dbc, + ...(0, util_1.range)(0x0dbe, 0x0dbf), + ...(0, util_1.range)(0x0dc7, 0x0dc9), + ...(0, util_1.range)(0x0dcb, 0x0dce), + 0x0dd5, + 0x0dd7, + ...(0, util_1.range)(0x0de0, 0x0df1), + ...(0, util_1.range)(0x0df5, 0x0e00), + ...(0, util_1.range)(0x0e3b, 0x0e3e), + ...(0, util_1.range)(0x0e5c, 0x0e80), + 0x0e83, + ...(0, util_1.range)(0x0e85, 0x0e86), + 0x0e89, + ...(0, util_1.range)(0x0e8b, 0x0e8c), + ...(0, util_1.range)(0x0e8e, 0x0e93), + 0x0e98, + 0x0ea0, + 0x0ea4, + 0x0ea6, + ...(0, util_1.range)(0x0ea8, 0x0ea9), + 0x0eac, + 0x0eba, + ...(0, util_1.range)(0x0ebe, 0x0ebf), + 0x0ec5, + 0x0ec7, + ...(0, util_1.range)(0x0ece, 0x0ecf), + ...(0, util_1.range)(0x0eda, 0x0edb), + ...(0, util_1.range)(0x0ede, 0x0eff), + 0x0f48, + ...(0, util_1.range)(0x0f6b, 0x0f70), + ...(0, util_1.range)(0x0f8c, 0x0f8f), + 0x0f98, + 0x0fbd, + ...(0, util_1.range)(0x0fcd, 0x0fce), + ...(0, util_1.range)(0x0fd0, 0x0fff), + 0x1022, + 0x1028, + 0x102b, + ...(0, util_1.range)(0x1033, 0x1035), + ...(0, util_1.range)(0x103a, 0x103f), + ...(0, util_1.range)(0x105a, 0x109f), + ...(0, util_1.range)(0x10c6, 0x10cf), + ...(0, util_1.range)(0x10f9, 0x10fa), + ...(0, util_1.range)(0x10fc, 0x10ff), + ...(0, util_1.range)(0x115a, 0x115e), + ...(0, util_1.range)(0x11a3, 0x11a7), + ...(0, util_1.range)(0x11fa, 0x11ff), + 0x1207, + 0x1247, + 0x1249, + ...(0, util_1.range)(0x124e, 0x124f), + 0x1257, + 0x1259, + ...(0, util_1.range)(0x125e, 0x125f), + 0x1287, + 0x1289, + ...(0, util_1.range)(0x128e, 0x128f), + 0x12af, + 0x12b1, + ...(0, util_1.range)(0x12b6, 0x12b7), + 0x12bf, + 0x12c1, + ...(0, util_1.range)(0x12c6, 0x12c7), + 0x12cf, + 0x12d7, + 0x12ef, + 0x130f, + 0x1311, + ...(0, util_1.range)(0x1316, 0x1317), + 0x131f, + 0x1347, + ...(0, util_1.range)(0x135b, 0x1360), + ...(0, util_1.range)(0x137d, 0x139f), + ...(0, util_1.range)(0x13f5, 0x1400), + ...(0, util_1.range)(0x1677, 0x167f), + ...(0, util_1.range)(0x169d, 0x169f), + ...(0, util_1.range)(0x16f1, 0x16ff), + 0x170d, + ...(0, util_1.range)(0x1715, 0x171f), + ...(0, util_1.range)(0x1737, 0x173f), + ...(0, util_1.range)(0x1754, 0x175f), + 0x176d, + 0x1771, + ...(0, util_1.range)(0x1774, 0x177f), + ...(0, util_1.range)(0x17dd, 0x17df), + ...(0, util_1.range)(0x17ea, 0x17ff), + 0x180f, + ...(0, util_1.range)(0x181a, 0x181f), + ...(0, util_1.range)(0x1878, 0x187f), + ...(0, util_1.range)(0x18aa, 0x1dff), + ...(0, util_1.range)(0x1e9c, 0x1e9f), + ...(0, util_1.range)(0x1efa, 0x1eff), + ...(0, util_1.range)(0x1f16, 0x1f17), + ...(0, util_1.range)(0x1f1e, 0x1f1f), + ...(0, util_1.range)(0x1f46, 0x1f47), + ...(0, util_1.range)(0x1f4e, 0x1f4f), + 0x1f58, + 0x1f5a, + 0x1f5c, + 0x1f5e, + ...(0, util_1.range)(0x1f7e, 0x1f7f), + 0x1fb5, + 0x1fc5, + ...(0, util_1.range)(0x1fd4, 0x1fd5), + 0x1fdc, + ...(0, util_1.range)(0x1ff0, 0x1ff1), + 0x1ff5, + 0x1fff, + ...(0, util_1.range)(0x2053, 0x2056), + ...(0, util_1.range)(0x2058, 0x205e), + ...(0, util_1.range)(0x2064, 0x2069), + ...(0, util_1.range)(0x2072, 0x2073), + ...(0, util_1.range)(0x208f, 0x209f), + ...(0, util_1.range)(0x20b2, 0x20cf), + ...(0, util_1.range)(0x20eb, 0x20ff), + ...(0, util_1.range)(0x213b, 0x213c), + ...(0, util_1.range)(0x214c, 0x2152), + ...(0, util_1.range)(0x2184, 0x218f), + ...(0, util_1.range)(0x23cf, 0x23ff), + ...(0, util_1.range)(0x2427, 0x243f), + ...(0, util_1.range)(0x244b, 0x245f), + 0x24ff, + ...(0, util_1.range)(0x2614, 0x2615), + 0x2618, + ...(0, util_1.range)(0x267e, 0x267f), + ...(0, util_1.range)(0x268a, 0x2700), + 0x2705, + ...(0, util_1.range)(0x270a, 0x270b), + 0x2728, + 0x274c, + 0x274e, + ...(0, util_1.range)(0x2753, 0x2755), + 0x2757, + ...(0, util_1.range)(0x275f, 0x2760), + ...(0, util_1.range)(0x2795, 0x2797), + 0x27b0, + ...(0, util_1.range)(0x27bf, 0x27cf), + ...(0, util_1.range)(0x27ec, 0x27ef), + ...(0, util_1.range)(0x2b00, 0x2e7f), + 0x2e9a, + ...(0, util_1.range)(0x2ef4, 0x2eff), + ...(0, util_1.range)(0x2fd6, 0x2fef), + ...(0, util_1.range)(0x2ffc, 0x2fff), + 0x3040, + ...(0, util_1.range)(0x3097, 0x3098), + ...(0, util_1.range)(0x3100, 0x3104), + ...(0, util_1.range)(0x312d, 0x3130), + 0x318f, + ...(0, util_1.range)(0x31b8, 0x31ef), + ...(0, util_1.range)(0x321d, 0x321f), + ...(0, util_1.range)(0x3244, 0x3250), + ...(0, util_1.range)(0x327c, 0x327e), + ...(0, util_1.range)(0x32cc, 0x32cf), + 0x32ff, + ...(0, util_1.range)(0x3377, 0x337a), + ...(0, util_1.range)(0x33de, 0x33df), + 0x33ff, + ...(0, util_1.range)(0x4db6, 0x4dff), + ...(0, util_1.range)(0x9fa6, 0x9fff), + ...(0, util_1.range)(0xa48d, 0xa48f), + ...(0, util_1.range)(0xa4c7, 0xabff), + ...(0, util_1.range)(0xd7a4, 0xd7ff), + ...(0, util_1.range)(0xfa2e, 0xfa2f), + ...(0, util_1.range)(0xfa6b, 0xfaff), + ...(0, util_1.range)(0xfb07, 0xfb12), + ...(0, util_1.range)(0xfb18, 0xfb1c), + 0xfb37, + 0xfb3d, + 0xfb3f, + 0xfb42, + 0xfb45, + ...(0, util_1.range)(0xfbb2, 0xfbd2), + ...(0, util_1.range)(0xfd40, 0xfd4f), + ...(0, util_1.range)(0xfd90, 0xfd91), + ...(0, util_1.range)(0xfdc8, 0xfdcf), + ...(0, util_1.range)(0xfdfd, 0xfdff), + ...(0, util_1.range)(0xfe10, 0xfe1f), + ...(0, util_1.range)(0xfe24, 0xfe2f), + ...(0, util_1.range)(0xfe47, 0xfe48), + 0xfe53, + 0xfe67, + ...(0, util_1.range)(0xfe6c, 0xfe6f), + 0xfe75, + ...(0, util_1.range)(0xfefd, 0xfefe), + 0xff00, + ...(0, util_1.range)(0xffbf, 0xffc1), + ...(0, util_1.range)(0xffc8, 0xffc9), + ...(0, util_1.range)(0xffd0, 0xffd1), + ...(0, util_1.range)(0xffd8, 0xffd9), + ...(0, util_1.range)(0xffdd, 0xffdf), + 0xffe7, + ...(0, util_1.range)(0xffef, 0xfff8), + ...(0, util_1.range)(0x10000, 0x102ff), + 0x1031f, + ...(0, util_1.range)(0x10324, 0x1032f), + ...(0, util_1.range)(0x1034b, 0x103ff), + ...(0, util_1.range)(0x10426, 0x10427), + ...(0, util_1.range)(0x1044e, 0x1cfff), + ...(0, util_1.range)(0x1d0f6, 0x1d0ff), + ...(0, util_1.range)(0x1d127, 0x1d129), + ...(0, util_1.range)(0x1d1de, 0x1d3ff), + 0x1d455, + 0x1d49d, + ...(0, util_1.range)(0x1d4a0, 0x1d4a1), + ...(0, util_1.range)(0x1d4a3, 0x1d4a4), + ...(0, util_1.range)(0x1d4a7, 0x1d4a8), + 0x1d4ad, + 0x1d4ba, + 0x1d4bc, + 0x1d4c1, + 0x1d4c4, + 0x1d506, + ...(0, util_1.range)(0x1d50b, 0x1d50c), + 0x1d515, + 0x1d51d, + 0x1d53a, + 0x1d53f, + 0x1d545, + ...(0, util_1.range)(0x1d547, 0x1d549), + 0x1d551, + ...(0, util_1.range)(0x1d6a4, 0x1d6a7), + ...(0, util_1.range)(0x1d7ca, 0x1d7cd), + ...(0, util_1.range)(0x1d800, 0x1fffd), + ...(0, util_1.range)(0x2a6d7, 0x2f7ff), + ...(0, util_1.range)(0x2fa1e, 0x2fffd), + ...(0, util_1.range)(0x30000, 0x3fffd), + ...(0, util_1.range)(0x40000, 0x4fffd), + ...(0, util_1.range)(0x50000, 0x5fffd), + ...(0, util_1.range)(0x60000, 0x6fffd), + ...(0, util_1.range)(0x70000, 0x7fffd), + ...(0, util_1.range)(0x80000, 0x8fffd), + ...(0, util_1.range)(0x90000, 0x9fffd), + ...(0, util_1.range)(0xa0000, 0xafffd), + ...(0, util_1.range)(0xb0000, 0xbfffd), + ...(0, util_1.range)(0xc0000, 0xcfffd), + ...(0, util_1.range)(0xd0000, 0xdfffd), + 0xe0000, + ...(0, util_1.range)(0xe0002, 0xe001f), + ...(0, util_1.range)(0xe0080, 0xefffd), +]); +exports.commonly_mapped_to_nothing = new Set([ + 0x00ad, 0x034f, 0x1806, 0x180b, 0x180c, 0x180d, 0x200b, 0x200c, 0x200d, + 0x2060, 0xfe00, 0xfe01, 0xfe02, 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, + 0xfe08, 0xfe09, 0xfe0a, 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, 0xfeff, +]); +exports.non_ASCII_space_characters = new Set([ + 0x00a0, 0x1680, + 0x2000, 0x2001, 0x2002, + 0x2003, 0x2004, + 0x2005, 0x2006, + 0x2007, 0x2008, + 0x2009, 0x200a, + 0x200b, 0x202f, + 0x205f, 0x3000, +]); +exports.prohibited_characters = new Set([ + ...exports.non_ASCII_space_characters, + ...(0, util_1.range)(0, 0x001f), + 0x007f, + ...(0, util_1.range)(0x0080, 0x009f), + 0x06dd, + 0x070f, + 0x180e, + 0x200c, + 0x200d, + 0x2028, + 0x2029, + 0x2060, + 0x2061, + 0x2062, + 0x2063, + ...(0, util_1.range)(0x206a, 0x206f), + 0xfeff, + ...(0, util_1.range)(0xfff9, 0xfffc), + ...(0, util_1.range)(0x1d173, 0x1d17a), + ...(0, util_1.range)(0xe000, 0xf8ff), + ...(0, util_1.range)(0xf0000, 0xffffd), + ...(0, util_1.range)(0x100000, 0x10fffd), + ...(0, util_1.range)(0xfdd0, 0xfdef), + ...(0, util_1.range)(0xfffe, 0xffff), + ...(0, util_1.range)(0x1fffe, 0x1ffff), + ...(0, util_1.range)(0x2fffe, 0x2ffff), + ...(0, util_1.range)(0x3fffe, 0x3ffff), + ...(0, util_1.range)(0x4fffe, 0x4ffff), + ...(0, util_1.range)(0x5fffe, 0x5ffff), + ...(0, util_1.range)(0x6fffe, 0x6ffff), + ...(0, util_1.range)(0x7fffe, 0x7ffff), + ...(0, util_1.range)(0x8fffe, 0x8ffff), + ...(0, util_1.range)(0x9fffe, 0x9ffff), + ...(0, util_1.range)(0xafffe, 0xaffff), + ...(0, util_1.range)(0xbfffe, 0xbffff), + ...(0, util_1.range)(0xcfffe, 0xcffff), + ...(0, util_1.range)(0xdfffe, 0xdffff), + ...(0, util_1.range)(0xefffe, 0xeffff), + ...(0, util_1.range)(0x10fffe, 0x10ffff), + ...(0, util_1.range)(0xd800, 0xdfff), + 0xfff9, + 0xfffa, + 0xfffb, + 0xfffc, + 0xfffd, + ...(0, util_1.range)(0x2ff0, 0x2ffb), + 0x0340, + 0x0341, + 0x200e, + 0x200f, + 0x202a, + 0x202b, + 0x202c, + 0x202d, + 0x202e, + 0x206a, + 0x206b, + 0x206c, + 0x206d, + 0x206e, + 0x206f, + 0xe0001, + ...(0, util_1.range)(0xe0020, 0xe007f), +]); +exports.bidirectional_r_al = new Set([ + 0x05be, + 0x05c0, + 0x05c3, + ...(0, util_1.range)(0x05d0, 0x05ea), + ...(0, util_1.range)(0x05f0, 0x05f4), + 0x061b, + 0x061f, + ...(0, util_1.range)(0x0621, 0x063a), + ...(0, util_1.range)(0x0640, 0x064a), + ...(0, util_1.range)(0x066d, 0x066f), + ...(0, util_1.range)(0x0671, 0x06d5), + 0x06dd, + ...(0, util_1.range)(0x06e5, 0x06e6), + ...(0, util_1.range)(0x06fa, 0x06fe), + ...(0, util_1.range)(0x0700, 0x070d), + 0x0710, + ...(0, util_1.range)(0x0712, 0x072c), + ...(0, util_1.range)(0x0780, 0x07a5), + 0x07b1, + 0x200f, + 0xfb1d, + ...(0, util_1.range)(0xfb1f, 0xfb28), + ...(0, util_1.range)(0xfb2a, 0xfb36), + ...(0, util_1.range)(0xfb38, 0xfb3c), + 0xfb3e, + ...(0, util_1.range)(0xfb40, 0xfb41), + ...(0, util_1.range)(0xfb43, 0xfb44), + ...(0, util_1.range)(0xfb46, 0xfbb1), + ...(0, util_1.range)(0xfbd3, 0xfd3d), + ...(0, util_1.range)(0xfd50, 0xfd8f), + ...(0, util_1.range)(0xfd92, 0xfdc7), + ...(0, util_1.range)(0xfdf0, 0xfdfc), + ...(0, util_1.range)(0xfe70, 0xfe74), + ...(0, util_1.range)(0xfe76, 0xfefc), +]); +exports.bidirectional_l = new Set([ + ...(0, util_1.range)(0x0041, 0x005a), + ...(0, util_1.range)(0x0061, 0x007a), + 0x00aa, + 0x00b5, + 0x00ba, + ...(0, util_1.range)(0x00c0, 0x00d6), + ...(0, util_1.range)(0x00d8, 0x00f6), + ...(0, util_1.range)(0x00f8, 0x0220), + ...(0, util_1.range)(0x0222, 0x0233), + ...(0, util_1.range)(0x0250, 0x02ad), + ...(0, util_1.range)(0x02b0, 0x02b8), + ...(0, util_1.range)(0x02bb, 0x02c1), + ...(0, util_1.range)(0x02d0, 0x02d1), + ...(0, util_1.range)(0x02e0, 0x02e4), + 0x02ee, + 0x037a, + 0x0386, + ...(0, util_1.range)(0x0388, 0x038a), + 0x038c, + ...(0, util_1.range)(0x038e, 0x03a1), + ...(0, util_1.range)(0x03a3, 0x03ce), + ...(0, util_1.range)(0x03d0, 0x03f5), + ...(0, util_1.range)(0x0400, 0x0482), + ...(0, util_1.range)(0x048a, 0x04ce), + ...(0, util_1.range)(0x04d0, 0x04f5), + ...(0, util_1.range)(0x04f8, 0x04f9), + ...(0, util_1.range)(0x0500, 0x050f), + ...(0, util_1.range)(0x0531, 0x0556), + ...(0, util_1.range)(0x0559, 0x055f), + ...(0, util_1.range)(0x0561, 0x0587), + 0x0589, + 0x0903, + ...(0, util_1.range)(0x0905, 0x0939), + ...(0, util_1.range)(0x093d, 0x0940), + ...(0, util_1.range)(0x0949, 0x094c), + 0x0950, + ...(0, util_1.range)(0x0958, 0x0961), + ...(0, util_1.range)(0x0964, 0x0970), + ...(0, util_1.range)(0x0982, 0x0983), + ...(0, util_1.range)(0x0985, 0x098c), + ...(0, util_1.range)(0x098f, 0x0990), + ...(0, util_1.range)(0x0993, 0x09a8), + ...(0, util_1.range)(0x09aa, 0x09b0), + 0x09b2, + ...(0, util_1.range)(0x09b6, 0x09b9), + ...(0, util_1.range)(0x09be, 0x09c0), + ...(0, util_1.range)(0x09c7, 0x09c8), + ...(0, util_1.range)(0x09cb, 0x09cc), + 0x09d7, + ...(0, util_1.range)(0x09dc, 0x09dd), + ...(0, util_1.range)(0x09df, 0x09e1), + ...(0, util_1.range)(0x09e6, 0x09f1), + ...(0, util_1.range)(0x09f4, 0x09fa), + ...(0, util_1.range)(0x0a05, 0x0a0a), + ...(0, util_1.range)(0x0a0f, 0x0a10), + ...(0, util_1.range)(0x0a13, 0x0a28), + ...(0, util_1.range)(0x0a2a, 0x0a30), + ...(0, util_1.range)(0x0a32, 0x0a33), + ...(0, util_1.range)(0x0a35, 0x0a36), + ...(0, util_1.range)(0x0a38, 0x0a39), + ...(0, util_1.range)(0x0a3e, 0x0a40), + ...(0, util_1.range)(0x0a59, 0x0a5c), + 0x0a5e, + ...(0, util_1.range)(0x0a66, 0x0a6f), + ...(0, util_1.range)(0x0a72, 0x0a74), + 0x0a83, + ...(0, util_1.range)(0x0a85, 0x0a8b), + 0x0a8d, + ...(0, util_1.range)(0x0a8f, 0x0a91), + ...(0, util_1.range)(0x0a93, 0x0aa8), + ...(0, util_1.range)(0x0aaa, 0x0ab0), + ...(0, util_1.range)(0x0ab2, 0x0ab3), + ...(0, util_1.range)(0x0ab5, 0x0ab9), + ...(0, util_1.range)(0x0abd, 0x0ac0), + 0x0ac9, + ...(0, util_1.range)(0x0acb, 0x0acc), + 0x0ad0, + 0x0ae0, + ...(0, util_1.range)(0x0ae6, 0x0aef), + ...(0, util_1.range)(0x0b02, 0x0b03), + ...(0, util_1.range)(0x0b05, 0x0b0c), + ...(0, util_1.range)(0x0b0f, 0x0b10), + ...(0, util_1.range)(0x0b13, 0x0b28), + ...(0, util_1.range)(0x0b2a, 0x0b30), + ...(0, util_1.range)(0x0b32, 0x0b33), + ...(0, util_1.range)(0x0b36, 0x0b39), + ...(0, util_1.range)(0x0b3d, 0x0b3e), + 0x0b40, + ...(0, util_1.range)(0x0b47, 0x0b48), + ...(0, util_1.range)(0x0b4b, 0x0b4c), + 0x0b57, + ...(0, util_1.range)(0x0b5c, 0x0b5d), + ...(0, util_1.range)(0x0b5f, 0x0b61), + ...(0, util_1.range)(0x0b66, 0x0b70), + 0x0b83, + ...(0, util_1.range)(0x0b85, 0x0b8a), + ...(0, util_1.range)(0x0b8e, 0x0b90), + ...(0, util_1.range)(0x0b92, 0x0b95), + ...(0, util_1.range)(0x0b99, 0x0b9a), + 0x0b9c, + ...(0, util_1.range)(0x0b9e, 0x0b9f), + ...(0, util_1.range)(0x0ba3, 0x0ba4), + ...(0, util_1.range)(0x0ba8, 0x0baa), + ...(0, util_1.range)(0x0bae, 0x0bb5), + ...(0, util_1.range)(0x0bb7, 0x0bb9), + ...(0, util_1.range)(0x0bbe, 0x0bbf), + ...(0, util_1.range)(0x0bc1, 0x0bc2), + ...(0, util_1.range)(0x0bc6, 0x0bc8), + ...(0, util_1.range)(0x0bca, 0x0bcc), + 0x0bd7, + ...(0, util_1.range)(0x0be7, 0x0bf2), + ...(0, util_1.range)(0x0c01, 0x0c03), + ...(0, util_1.range)(0x0c05, 0x0c0c), + ...(0, util_1.range)(0x0c0e, 0x0c10), + ...(0, util_1.range)(0x0c12, 0x0c28), + ...(0, util_1.range)(0x0c2a, 0x0c33), + ...(0, util_1.range)(0x0c35, 0x0c39), + ...(0, util_1.range)(0x0c41, 0x0c44), + ...(0, util_1.range)(0x0c60, 0x0c61), + ...(0, util_1.range)(0x0c66, 0x0c6f), + ...(0, util_1.range)(0x0c82, 0x0c83), + ...(0, util_1.range)(0x0c85, 0x0c8c), + ...(0, util_1.range)(0x0c8e, 0x0c90), + ...(0, util_1.range)(0x0c92, 0x0ca8), + ...(0, util_1.range)(0x0caa, 0x0cb3), + ...(0, util_1.range)(0x0cb5, 0x0cb9), + 0x0cbe, + ...(0, util_1.range)(0x0cc0, 0x0cc4), + ...(0, util_1.range)(0x0cc7, 0x0cc8), + ...(0, util_1.range)(0x0cca, 0x0ccb), + ...(0, util_1.range)(0x0cd5, 0x0cd6), + 0x0cde, + ...(0, util_1.range)(0x0ce0, 0x0ce1), + ...(0, util_1.range)(0x0ce6, 0x0cef), + ...(0, util_1.range)(0x0d02, 0x0d03), + ...(0, util_1.range)(0x0d05, 0x0d0c), + ...(0, util_1.range)(0x0d0e, 0x0d10), + ...(0, util_1.range)(0x0d12, 0x0d28), + ...(0, util_1.range)(0x0d2a, 0x0d39), + ...(0, util_1.range)(0x0d3e, 0x0d40), + ...(0, util_1.range)(0x0d46, 0x0d48), + ...(0, util_1.range)(0x0d4a, 0x0d4c), + 0x0d57, + ...(0, util_1.range)(0x0d60, 0x0d61), + ...(0, util_1.range)(0x0d66, 0x0d6f), + ...(0, util_1.range)(0x0d82, 0x0d83), + ...(0, util_1.range)(0x0d85, 0x0d96), + ...(0, util_1.range)(0x0d9a, 0x0db1), + ...(0, util_1.range)(0x0db3, 0x0dbb), + 0x0dbd, + ...(0, util_1.range)(0x0dc0, 0x0dc6), + ...(0, util_1.range)(0x0dcf, 0x0dd1), + ...(0, util_1.range)(0x0dd8, 0x0ddf), + ...(0, util_1.range)(0x0df2, 0x0df4), + ...(0, util_1.range)(0x0e01, 0x0e30), + ...(0, util_1.range)(0x0e32, 0x0e33), + ...(0, util_1.range)(0x0e40, 0x0e46), + ...(0, util_1.range)(0x0e4f, 0x0e5b), + ...(0, util_1.range)(0x0e81, 0x0e82), + 0x0e84, + ...(0, util_1.range)(0x0e87, 0x0e88), + 0x0e8a, + 0x0e8d, + ...(0, util_1.range)(0x0e94, 0x0e97), + ...(0, util_1.range)(0x0e99, 0x0e9f), + ...(0, util_1.range)(0x0ea1, 0x0ea3), + 0x0ea5, + 0x0ea7, + ...(0, util_1.range)(0x0eaa, 0x0eab), + ...(0, util_1.range)(0x0ead, 0x0eb0), + ...(0, util_1.range)(0x0eb2, 0x0eb3), + 0x0ebd, + ...(0, util_1.range)(0x0ec0, 0x0ec4), + 0x0ec6, + ...(0, util_1.range)(0x0ed0, 0x0ed9), + ...(0, util_1.range)(0x0edc, 0x0edd), + ...(0, util_1.range)(0x0f00, 0x0f17), + ...(0, util_1.range)(0x0f1a, 0x0f34), + 0x0f36, + 0x0f38, + ...(0, util_1.range)(0x0f3e, 0x0f47), + ...(0, util_1.range)(0x0f49, 0x0f6a), + 0x0f7f, + 0x0f85, + ...(0, util_1.range)(0x0f88, 0x0f8b), + ...(0, util_1.range)(0x0fbe, 0x0fc5), + ...(0, util_1.range)(0x0fc7, 0x0fcc), + 0x0fcf, + ...(0, util_1.range)(0x1000, 0x1021), + ...(0, util_1.range)(0x1023, 0x1027), + ...(0, util_1.range)(0x1029, 0x102a), + 0x102c, + 0x1031, + 0x1038, + ...(0, util_1.range)(0x1040, 0x1057), + ...(0, util_1.range)(0x10a0, 0x10c5), + ...(0, util_1.range)(0x10d0, 0x10f8), + 0x10fb, + ...(0, util_1.range)(0x1100, 0x1159), + ...(0, util_1.range)(0x115f, 0x11a2), + ...(0, util_1.range)(0x11a8, 0x11f9), + ...(0, util_1.range)(0x1200, 0x1206), + ...(0, util_1.range)(0x1208, 0x1246), + 0x1248, + ...(0, util_1.range)(0x124a, 0x124d), + ...(0, util_1.range)(0x1250, 0x1256), + 0x1258, + ...(0, util_1.range)(0x125a, 0x125d), + ...(0, util_1.range)(0x1260, 0x1286), + 0x1288, + ...(0, util_1.range)(0x128a, 0x128d), + ...(0, util_1.range)(0x1290, 0x12ae), + 0x12b0, + ...(0, util_1.range)(0x12b2, 0x12b5), + ...(0, util_1.range)(0x12b8, 0x12be), + 0x12c0, + ...(0, util_1.range)(0x12c2, 0x12c5), + ...(0, util_1.range)(0x12c8, 0x12ce), + ...(0, util_1.range)(0x12d0, 0x12d6), + ...(0, util_1.range)(0x12d8, 0x12ee), + ...(0, util_1.range)(0x12f0, 0x130e), + 0x1310, + ...(0, util_1.range)(0x1312, 0x1315), + ...(0, util_1.range)(0x1318, 0x131e), + ...(0, util_1.range)(0x1320, 0x1346), + ...(0, util_1.range)(0x1348, 0x135a), + ...(0, util_1.range)(0x1361, 0x137c), + ...(0, util_1.range)(0x13a0, 0x13f4), + ...(0, util_1.range)(0x1401, 0x1676), + ...(0, util_1.range)(0x1681, 0x169a), + ...(0, util_1.range)(0x16a0, 0x16f0), + ...(0, util_1.range)(0x1700, 0x170c), + ...(0, util_1.range)(0x170e, 0x1711), + ...(0, util_1.range)(0x1720, 0x1731), + ...(0, util_1.range)(0x1735, 0x1736), + ...(0, util_1.range)(0x1740, 0x1751), + ...(0, util_1.range)(0x1760, 0x176c), + ...(0, util_1.range)(0x176e, 0x1770), + ...(0, util_1.range)(0x1780, 0x17b6), + ...(0, util_1.range)(0x17be, 0x17c5), + ...(0, util_1.range)(0x17c7, 0x17c8), + ...(0, util_1.range)(0x17d4, 0x17da), + 0x17dc, + ...(0, util_1.range)(0x17e0, 0x17e9), + ...(0, util_1.range)(0x1810, 0x1819), + ...(0, util_1.range)(0x1820, 0x1877), + ...(0, util_1.range)(0x1880, 0x18a8), + ...(0, util_1.range)(0x1e00, 0x1e9b), + ...(0, util_1.range)(0x1ea0, 0x1ef9), + ...(0, util_1.range)(0x1f00, 0x1f15), + ...(0, util_1.range)(0x1f18, 0x1f1d), + ...(0, util_1.range)(0x1f20, 0x1f45), + ...(0, util_1.range)(0x1f48, 0x1f4d), + ...(0, util_1.range)(0x1f50, 0x1f57), + 0x1f59, + 0x1f5b, + 0x1f5d, + ...(0, util_1.range)(0x1f5f, 0x1f7d), + ...(0, util_1.range)(0x1f80, 0x1fb4), + ...(0, util_1.range)(0x1fb6, 0x1fbc), + 0x1fbe, + ...(0, util_1.range)(0x1fc2, 0x1fc4), + ...(0, util_1.range)(0x1fc6, 0x1fcc), + ...(0, util_1.range)(0x1fd0, 0x1fd3), + ...(0, util_1.range)(0x1fd6, 0x1fdb), + ...(0, util_1.range)(0x1fe0, 0x1fec), + ...(0, util_1.range)(0x1ff2, 0x1ff4), + ...(0, util_1.range)(0x1ff6, 0x1ffc), + 0x200e, + 0x2071, + 0x207f, + 0x2102, + 0x2107, + ...(0, util_1.range)(0x210a, 0x2113), + 0x2115, + ...(0, util_1.range)(0x2119, 0x211d), + 0x2124, + 0x2126, + 0x2128, + ...(0, util_1.range)(0x212a, 0x212d), + ...(0, util_1.range)(0x212f, 0x2131), + ...(0, util_1.range)(0x2133, 0x2139), + ...(0, util_1.range)(0x213d, 0x213f), + ...(0, util_1.range)(0x2145, 0x2149), + ...(0, util_1.range)(0x2160, 0x2183), + ...(0, util_1.range)(0x2336, 0x237a), + 0x2395, + ...(0, util_1.range)(0x249c, 0x24e9), + ...(0, util_1.range)(0x3005, 0x3007), + ...(0, util_1.range)(0x3021, 0x3029), + ...(0, util_1.range)(0x3031, 0x3035), + ...(0, util_1.range)(0x3038, 0x303c), + ...(0, util_1.range)(0x3041, 0x3096), + ...(0, util_1.range)(0x309d, 0x309f), + ...(0, util_1.range)(0x30a1, 0x30fa), + ...(0, util_1.range)(0x30fc, 0x30ff), + ...(0, util_1.range)(0x3105, 0x312c), + ...(0, util_1.range)(0x3131, 0x318e), + ...(0, util_1.range)(0x3190, 0x31b7), + ...(0, util_1.range)(0x31f0, 0x321c), + ...(0, util_1.range)(0x3220, 0x3243), + ...(0, util_1.range)(0x3260, 0x327b), + ...(0, util_1.range)(0x327f, 0x32b0), + ...(0, util_1.range)(0x32c0, 0x32cb), + ...(0, util_1.range)(0x32d0, 0x32fe), + ...(0, util_1.range)(0x3300, 0x3376), + ...(0, util_1.range)(0x337b, 0x33dd), + ...(0, util_1.range)(0x33e0, 0x33fe), + ...(0, util_1.range)(0x3400, 0x4db5), + ...(0, util_1.range)(0x4e00, 0x9fa5), + ...(0, util_1.range)(0xa000, 0xa48c), + ...(0, util_1.range)(0xac00, 0xd7a3), + ...(0, util_1.range)(0xd800, 0xfa2d), + ...(0, util_1.range)(0xfa30, 0xfa6a), + ...(0, util_1.range)(0xfb00, 0xfb06), + ...(0, util_1.range)(0xfb13, 0xfb17), + ...(0, util_1.range)(0xff21, 0xff3a), + ...(0, util_1.range)(0xff41, 0xff5a), + ...(0, util_1.range)(0xff66, 0xffbe), + ...(0, util_1.range)(0xffc2, 0xffc7), + ...(0, util_1.range)(0xffca, 0xffcf), + ...(0, util_1.range)(0xffd2, 0xffd7), + ...(0, util_1.range)(0xffda, 0xffdc), + ...(0, util_1.range)(0x10300, 0x1031e), + ...(0, util_1.range)(0x10320, 0x10323), + ...(0, util_1.range)(0x10330, 0x1034a), + ...(0, util_1.range)(0x10400, 0x10425), + ...(0, util_1.range)(0x10428, 0x1044d), + ...(0, util_1.range)(0x1d000, 0x1d0f5), + ...(0, util_1.range)(0x1d100, 0x1d126), + ...(0, util_1.range)(0x1d12a, 0x1d166), + ...(0, util_1.range)(0x1d16a, 0x1d172), + ...(0, util_1.range)(0x1d183, 0x1d184), + ...(0, util_1.range)(0x1d18c, 0x1d1a9), + ...(0, util_1.range)(0x1d1ae, 0x1d1dd), + ...(0, util_1.range)(0x1d400, 0x1d454), + ...(0, util_1.range)(0x1d456, 0x1d49c), + ...(0, util_1.range)(0x1d49e, 0x1d49f), + 0x1d4a2, + ...(0, util_1.range)(0x1d4a5, 0x1d4a6), + ...(0, util_1.range)(0x1d4a9, 0x1d4ac), + ...(0, util_1.range)(0x1d4ae, 0x1d4b9), + 0x1d4bb, + ...(0, util_1.range)(0x1d4bd, 0x1d4c0), + ...(0, util_1.range)(0x1d4c2, 0x1d4c3), + ...(0, util_1.range)(0x1d4c5, 0x1d505), + ...(0, util_1.range)(0x1d507, 0x1d50a), + ...(0, util_1.range)(0x1d50d, 0x1d514), + ...(0, util_1.range)(0x1d516, 0x1d51c), + ...(0, util_1.range)(0x1d51e, 0x1d539), + ...(0, util_1.range)(0x1d53b, 0x1d53e), + ...(0, util_1.range)(0x1d540, 0x1d544), + 0x1d546, + ...(0, util_1.range)(0x1d54a, 0x1d550), + ...(0, util_1.range)(0x1d552, 0x1d6a3), + ...(0, util_1.range)(0x1d6a8, 0x1d7c9), + ...(0, util_1.range)(0x20000, 0x2a6d6), + ...(0, util_1.range)(0x2f800, 0x2fa1d), + ...(0, util_1.range)(0xf0000, 0xffffd), + ...(0, util_1.range)(0x100000, 0x10fffd), +]); +//# sourceMappingURL=code-points-src.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js.map new file mode 100644 index 0000000000..dfb14ea823 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/code-points-src.js.map @@ -0,0 +1 @@ +{"version":3,"file":"code-points-src.js","sourceRoot":"","sources":["../src/code-points-src.ts"],"names":[],"mappings":";;;AAAA,iCAA+B;AAMlB,QAAA,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAA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C;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,MAAM;IACN,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,MAAM;IACN,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,IAAA,YAAK,EAAC,MAAM,EAAE,MAAM,CAAC;IACxB,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"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts new file mode 100644 index 0000000000..5a83ab249e --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=generate-code-points.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts.map new file mode 100644 index 0000000000..b102903ec4 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-code-points.d.ts","sourceRoot":"","sources":["../src/generate-code-points.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js new file mode 100644 index 0000000000..5dbf948494 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js @@ -0,0 +1,73 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const zlib_1 = require("zlib"); +const sparse_bitfield_1 = __importDefault(require("sparse-bitfield")); +const codePoints = __importStar(require("./code-points-src")); +const fs_1 = require("fs"); +const prettier = __importStar(require("prettier")); +const unassigned_code_points = (0, sparse_bitfield_1.default)(); +const commonly_mapped_to_nothing = (0, sparse_bitfield_1.default)(); +const non_ascii_space_characters = (0, sparse_bitfield_1.default)(); +const prohibited_characters = (0, sparse_bitfield_1.default)(); +const bidirectional_r_al = (0, sparse_bitfield_1.default)(); +const bidirectional_l = (0, sparse_bitfield_1.default)(); +function traverse(bits, src) { + for (const code of src.keys()) { + bits.set(code, true); + } + const buffer = bits.toBuffer(); + return Buffer.concat([createSize(buffer), buffer]); +} +function createSize(buffer) { + const buf = Buffer.alloc(4); + buf.writeUInt32BE(buffer.length); + return buf; +} +const memory = []; +memory.push(traverse(unassigned_code_points, codePoints.unassigned_code_points), traverse(commonly_mapped_to_nothing, codePoints.commonly_mapped_to_nothing), traverse(non_ascii_space_characters, codePoints.non_ASCII_space_characters), traverse(prohibited_characters, codePoints.prohibited_characters), traverse(bidirectional_r_al, codePoints.bidirectional_r_al), traverse(bidirectional_l, codePoints.bidirectional_l)); +async function writeCodepoints() { + const config = await prettier.resolveConfig(__dirname); + const formatOptions = { ...config, parser: 'typescript' }; + function write(stream, chunk) { + return new Promise((resolve) => stream.write(chunk, () => resolve())); + } + await write((0, fs_1.createWriteStream)(process.argv[2]), prettier.format(`import { gunzipSync } from 'zlib'; + + export default gunzipSync( + Buffer.from( + '${(0, zlib_1.gzipSync)(Buffer.concat(memory), { level: 9 }).toString('base64')}', + 'base64' + ) + ); + `, formatOptions)); + const fsStreamUncompressedData = (0, fs_1.createWriteStream)(process.argv[3]); + await write(fsStreamUncompressedData, prettier.format(`const data = Buffer.from('${Buffer.concat(memory).toString('base64')}', 'base64');\nexport default data;\n`, formatOptions)); +} +writeCodepoints().catch((error) => console.error('error occurred generating saslprep codepoint data', { error })); +//# sourceMappingURL=generate-code-points.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js.map new file mode 100644 index 0000000000..ba30023348 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/generate-code-points.js.map @@ -0,0 +1 @@ +{"version":3,"file":"generate-code-points.js","sourceRoot":"","sources":["../src/generate-code-points.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts new file mode 100644 index 0000000000..24d575c541 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts @@ -0,0 +1,11 @@ +import type { createMemoryCodePoints } from './memory-code-points'; +declare function saslprep({ unassigned_code_points, commonly_mapped_to_nothing, non_ASCII_space_characters, prohibited_characters, bidirectional_r_al, bidirectional_l, }: ReturnType, input: string, opts?: { + allowUnassigned?: boolean; +}): string; +declare namespace saslprep { + export var saslprep: typeof import("."); + var _a: typeof import("."); + export { _a as default }; +} +export = saslprep; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts.map new file mode 100644 index 0000000000..e53e394615 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAsCnE,iBAAS,QAAQ,CACf,EACE,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,EAC5C,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,MAAM,CAqGR;kBAhHQ,QAAQ;;;;;AAoHjB,SAAS,QAAQ,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/index.js b/user-service/node_modules/@mongodb-js/saslprep/dist/index.js new file mode 100644 index 0000000000..07d87bc580 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/index.js @@ -0,0 +1,65 @@ +"use strict"; +const getCodePoint = (character) => character.codePointAt(0); +const first = (x) => x[0]; +const last = (x) => x[x.length - 1]; +function toCodePoints(input) { + const codepoints = []; + const size = input.length; + for (let i = 0; i < size; i += 1) { + const before = input.charCodeAt(i); + if (before >= 0xd800 && before <= 0xdbff && size > i + 1) { + const next = input.charCodeAt(i + 1); + if (next >= 0xdc00 && next <= 0xdfff) { + codepoints.push((before - 0xd800) * 0x400 + next - 0xdc00 + 0x10000); + i += 1; + continue; + } + } + codepoints.push(before); + } + return codepoints; +} +function saslprep({ unassigned_code_points, commonly_mapped_to_nothing, non_ASCII_space_characters, prohibited_characters, bidirectional_r_al, bidirectional_l, }, input, opts = {}) { + const mapping2space = non_ASCII_space_characters; + const mapping2nothing = commonly_mapped_to_nothing; + if (typeof input !== 'string') { + throw new TypeError('Expected string.'); + } + if (input.length === 0) { + return ''; + } + const mapped_input = toCodePoints(input) + .map((character) => (mapping2space.get(character) ? 0x20 : character)) + .filter((character) => !mapping2nothing.get(character)); + const normalized_input = String.fromCodePoint + .apply(null, mapped_input) + .normalize('NFKC'); + const normalized_map = toCodePoints(normalized_input); + const hasProhibited = normalized_map.some((character) => prohibited_characters.get(character)); + if (hasProhibited) { + throw new Error('Prohibited character, see https://tools.ietf.org/html/rfc4013#section-2.3'); + } + if (opts.allowUnassigned !== true) { + const hasUnassigned = normalized_map.some((character) => unassigned_code_points.get(character)); + if (hasUnassigned) { + throw new Error('Unassigned code point, see https://tools.ietf.org/html/rfc4013#section-2.5'); + } + } + const hasBidiRAL = normalized_map.some((character) => bidirectional_r_al.get(character)); + const hasBidiL = normalized_map.some((character) => bidirectional_l.get(character)); + if (hasBidiRAL && hasBidiL) { + throw new Error('String must not contain RandALCat and LCat at the same time,' + + ' see https://tools.ietf.org/html/rfc3454#section-6'); + } + const isFirstBidiRAL = bidirectional_r_al.get(getCodePoint(first(normalized_input))); + const isLastBidiRAL = bidirectional_r_al.get(getCodePoint(last(normalized_input))); + if (hasBidiRAL && !(isFirstBidiRAL && isLastBidiRAL)) { + throw new Error('Bidirectional RandALCat character must be the first and the last' + + ' character of the string, see https://tools.ietf.org/html/rfc3454#section-6'); + } + return normalized_input; +} +saslprep.saslprep = saslprep; +saslprep.default = saslprep; +module.exports = saslprep; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/index.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/index.js.map new file mode 100644 index 0000000000..5b2b276dcf --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts new file mode 100644 index 0000000000..8c675a0085 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts @@ -0,0 +1,11 @@ +/// +import bitfield from 'sparse-bitfield'; +export declare function createMemoryCodePoints(data: Buffer): { + unassigned_code_points: bitfield.BitFieldInstance; + commonly_mapped_to_nothing: bitfield.BitFieldInstance; + non_ASCII_space_characters: bitfield.BitFieldInstance; + prohibited_characters: bitfield.BitFieldInstance; + bidirectional_r_al: bitfield.BitFieldInstance; + bidirectional_l: bitfield.BitFieldInstance; +}; +//# sourceMappingURL=memory-code-points.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts.map new file mode 100644 index 0000000000..83b7b57dae --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"memory-code-points.d.ts","sourceRoot":"","sources":["../src/memory-code-points.ts"],"names":[],"mappings":";AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM;;;;;;;EA+BlD"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js new file mode 100644 index 0000000000..05133de9fb --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js @@ -0,0 +1,33 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createMemoryCodePoints = void 0; +const sparse_bitfield_1 = __importDefault(require("sparse-bitfield")); +function createMemoryCodePoints(data) { + let offset = 0; + function read() { + const size = data.readUInt32BE(offset); + offset += 4; + const codepoints = data.slice(offset, offset + size); + offset += size; + return (0, sparse_bitfield_1.default)({ buffer: codepoints }); + } + const unassigned_code_points = read(); + const commonly_mapped_to_nothing = read(); + const non_ASCII_space_characters = read(); + const prohibited_characters = read(); + const bidirectional_r_al = read(); + const bidirectional_l = read(); + return { + unassigned_code_points, + commonly_mapped_to_nothing, + non_ASCII_space_characters, + prohibited_characters, + bidirectional_r_al, + bidirectional_l, + }; +} +exports.createMemoryCodePoints = createMemoryCodePoints; +//# sourceMappingURL=memory-code-points.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js.map new file mode 100644 index 0000000000..0bb5a144af --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/memory-code-points.js.map @@ -0,0 +1 @@ +{"version":3,"file":"memory-code-points.js","sourceRoot":"","sources":["../src/memory-code-points.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAuC;AAEvC,SAAgB,sBAAsB,CAAC,IAAY;IACjD,IAAI,MAAM,GAAG,CAAC,CAAC;IAKf,SAAS,IAAI;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,CAAC;QAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QACrD,MAAM,IAAI,IAAI,CAAC;QAEf,OAAO,IAAA,yBAAQ,EAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,sBAAsB,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,0BAA0B,GAAG,IAAI,EAAE,CAAC;IAC1C,MAAM,0BAA0B,GAAG,IAAI,EAAE,CAAC;IAC1C,MAAM,qBAAqB,GAAG,IAAI,EAAE,CAAC;IACrC,MAAM,kBAAkB,GAAG,IAAI,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,IAAI,EAAE,CAAC;IAE/B,OAAO;QACL,sBAAsB;QACtB,0BAA0B;QAC1B,0BAA0B;QAC1B,qBAAqB;QACrB,kBAAkB;QAClB,eAAe;KAChB,CAAC;AACJ,CAAC;AA/BD,wDA+BC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts new file mode 100644 index 0000000000..0208c8ed2f --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts @@ -0,0 +1,10 @@ +declare function saslprep(input: string, opts?: { + allowUnassigned?: boolean; +}): string; +declare namespace saslprep { + export var saslprep: typeof import("./node"); + var _a: typeof import("./node"); + export { _a as default }; +} +export = saslprep; +//# sourceMappingURL=node.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts.map new file mode 100644 index 0000000000..3032ff996f --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/node.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAMA,iBAAS,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAE7E;kBAFQ,QAAQ;;;;;AAOjB,SAAS,QAAQ,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/node.js b/user-service/node_modules/@mongodb-js/saslprep/dist/node.js new file mode 100644 index 0000000000..1007f86bdb --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/node.js @@ -0,0 +1,15 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const index_1 = __importDefault(require("./index")); +const memory_code_points_1 = require("./memory-code-points"); +const code_points_data_1 = __importDefault(require("./code-points-data")); +const codePoints = (0, memory_code_points_1.createMemoryCodePoints)(code_points_data_1.default); +function saslprep(input, opts) { + return (0, index_1.default)(codePoints, input, opts); +} +saslprep.saslprep = saslprep; +saslprep.default = saslprep; +module.exports = saslprep; +//# sourceMappingURL=node.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/node.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/node.js.map new file mode 100644 index 0000000000..107ee6485f --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/node.js.map @@ -0,0 +1 @@ +{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":";;;;AAAA,oDAAgC;AAChC,6DAA8D;AAC9D,0EAAsC;AAEtC,MAAM,UAAU,GAAG,IAAA,2CAAsB,EAAC,0BAAI,CAAC,CAAC;AAEhD,SAAS,QAAQ,CAAC,KAAa,EAAE,IAAoC;IACnE,OAAO,IAAA,eAAS,EAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC7B,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;AAE5B,iBAAS,QAAQ,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts b/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts new file mode 100644 index 0000000000..3a0466ecde --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts @@ -0,0 +1,2 @@ +export declare function range(from: number, to: number): number[]; +//# sourceMappingURL=util.d.ts.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts.map b/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts.map new file mode 100644 index 0000000000..50c716780e --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/util.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAQxD"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/util.js b/user-service/node_modules/@mongodb-js/saslprep/dist/util.js new file mode 100644 index 0000000000..f679cab005 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/util.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.range = void 0; +function range(from, to) { + const list = new Array(to - from + 1); + for (let i = 0; i < list.length; i += 1) { + list[i] = from + i; + } + return list; +} +exports.range = range; +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/dist/util.js.map b/user-service/node_modules/@mongodb-js/saslprep/dist/util.js.map new file mode 100644 index 0000000000..1bab68133f --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/dist/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;AAGA,SAAgB,KAAK,CAAC,IAAY,EAAE,EAAU;IAE5C,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QACvC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;KACpB;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AARD,sBAQC"} \ No newline at end of file diff --git a/user-service/node_modules/@mongodb-js/saslprep/package.json b/user-service/node_modules/@mongodb-js/saslprep/package.json new file mode 100644 index 0000000000..f830c503fb --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/package.json @@ -0,0 +1,87 @@ +{ + "name": "@mongodb-js/saslprep", + "description": "SASLprep: Stringprep Profile for User Names and Passwords, rfc4013", + "keywords": [ + "sasl", + "saslprep", + "stringprep", + "rfc4013", + "4013" + ], + "author": "Dmitry Tsvettsikh ", + "publishConfig": { + "access": "public" + }, + "main": "dist/node.js", + "bugs": { + "url": "https://jira.mongodb.org/projects/COMPASS/issues", + "email": "compass@mongodb.com" + }, + "homepage": "https://github.com/mongodb-js/devtools-shared/tree/main/packages/saslprep", + "version": "1.1.8", + "repository": { + "type": "git", + "url": "https://github.com/mongodb-js/devtools-shared.git" + }, + "files": [ + "dist" + ], + "license": "MIT", + "exports": { + "browser": { + "types": "./dist/browser.d.ts", + "default": "./dist/browser.js" + }, + "import": { + "types": "./dist/node.d.ts", + "default": "./dist/.esm-wrapper.mjs" + }, + "require": { + "types": "./dist/node.d.ts", + "default": "./dist/node.js" + } + }, + "types": "./dist/node.d.ts", + "scripts": { + "gen-code-points": "ts-node src/generate-code-points.ts src/code-points-data.ts src/code-points-data-browser.ts", + "bootstrap": "npm run compile", + "prepublishOnly": "npm run compile", + "compile": "npm run gen-code-points && tsc -p tsconfig.json && gen-esm-wrapper . ./dist/.esm-wrapper.mjs", + "typecheck": "tsc --noEmit", + "eslint": "eslint", + "prettier": "prettier", + "lint": "npm run eslint . && npm run prettier -- --check .", + "depcheck": "depcheck", + "check": "npm run typecheck && npm run lint && npm run depcheck", + "check-ci": "npm run check", + "test": "mocha", + "test-cov": "nyc -x \"**/*.spec.*\" --reporter=lcov --reporter=text --reporter=html npm run test", + "test-watch": "npm run test -- --watch", + "test-ci": "npm run test-cov", + "reformat": "npm run prettier -- --write ." + }, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "devDependencies": { + "@mongodb-js/eslint-config-devtools": "0.9.10", + "@mongodb-js/mocha-config-devtools": "^1.0.3", + "@mongodb-js/prettier-config-devtools": "^1.0.1", + "@mongodb-js/tsconfig-devtools": "^1.0.2", + "@types/chai": "^4.2.21", + "@types/mocha": "^9.0.0", + "@types/node": "^17.0.35", + "@types/sinon-chai": "^3.2.5", + "@types/sparse-bitfield": "^3.0.1", + "chai": "^4.3.6", + "depcheck": "^1.4.1", + "eslint": "^7.25.0", + "gen-esm-wrapper": "^1.1.0", + "mocha": "^8.4.0", + "nyc": "^15.1.0", + "prettier": "^2.3.2", + "sinon": "^9.2.3", + "typescript": "^5.0.4" + }, + "gitHead": "8037a984c0ae116b11c10e9c361a09dfeb45db85" +} diff --git a/user-service/node_modules/@mongodb-js/saslprep/readme.md b/user-service/node_modules/@mongodb-js/saslprep/readme.md new file mode 100644 index 0000000000..28539edaa3 --- /dev/null +++ b/user-service/node_modules/@mongodb-js/saslprep/readme.md @@ -0,0 +1,29 @@ +# saslprep + +_Note: This is a fork of the original [`saslprep`](https://www.npmjs.com/package/saslprep) npm package +and provides equivalent functionality._ + +Stringprep Profile for User Names and Passwords, [rfc4013](https://tools.ietf.org/html/rfc4013) + +### Usage + +```js +const saslprep = require('@mongodb-js/saslprep'); + +saslprep('password\u00AD'); // password +saslprep('password\u0007'); // Error: prohibited character +``` + +### API + +##### `saslprep(input: String, opts: Options): String` + +Normalize user name or password. + +##### `Options.allowUnassigned: bool` + +A special behavior for unassigned code points, see https://tools.ietf.org/html/rfc4013#section-2.5. Disabled by default. + +## License + +MIT, 2017-2019 (c) Dmitriy Tsvettsikh diff --git a/user-service/node_modules/@types/webidl-conversions/LICENSE b/user-service/node_modules/@types/webidl-conversions/LICENSE new file mode 100644 index 0000000000..9e841e7a26 --- /dev/null +++ b/user-service/node_modules/@types/webidl-conversions/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/user-service/node_modules/@types/webidl-conversions/README.md b/user-service/node_modules/@types/webidl-conversions/README.md new file mode 100644 index 0000000000..7cd5c9d669 --- /dev/null +++ b/user-service/node_modules/@types/webidl-conversions/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/webidl-conversions` + +# Summary +This package contains type definitions for webidl-conversions (https://github.com/jsdom/webidl-conversions#readme). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/webidl-conversions. + +### Additional Details + * Last updated: Tue, 07 Nov 2023 15:11:36 GMT + * Dependencies: none + +# Credits +These definitions were written by [ExE Boss](https://github.com/ExE-Boss), and [BendingBender](https://github.com/BendingBender). diff --git a/user-service/node_modules/@types/webidl-conversions/index.d.ts b/user-service/node_modules/@types/webidl-conversions/index.d.ts new file mode 100644 index 0000000000..bcf395ab20 --- /dev/null +++ b/user-service/node_modules/@types/webidl-conversions/index.d.ts @@ -0,0 +1,91 @@ +declare namespace WebIDLConversions { + interface Globals { + [key: string]: unknown; + + Number: (value?: unknown) => number; + String: (value?: unknown) => string; + TypeError: new(message?: string) => TypeError; + } + + interface Options { + context?: string | undefined; + globals?: Globals | undefined; + } + + interface IntegerOptions extends Options { + enforceRange?: boolean | undefined; + clamp?: boolean | undefined; + } + + interface StringOptions extends Options { + treatNullAsEmptyString?: boolean | undefined; + } + + interface BufferSourceOptions extends Options { + allowShared?: boolean | undefined; + } + + type IntegerConversion = (V: unknown, opts?: IntegerOptions) => number; + type StringConversion = (V: unknown, opts?: StringOptions) => string; + type NumberConversion = (V: unknown, opts?: Options) => number; +} + +declare const WebIDLConversions: { + any(V: V, opts?: WebIDLConversions.Options): V; + undefined(V?: unknown, opts?: WebIDLConversions.Options): void; + boolean(V: unknown, opts?: WebIDLConversions.Options): boolean; + + byte(V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + octet(V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + + short(V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + ["unsigned short"](V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + + long(V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + ["unsigned long"](V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + + ["long long"](V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + ["unsigned long long"](V: unknown, opts?: WebIDLConversions.IntegerOptions): number; + + double(V: unknown, opts?: WebIDLConversions.Options): number; + ["unrestricted double"](V: unknown, opts?: WebIDLConversions.Options): number; + + float(V: unknown, opts?: WebIDLConversions.Options): number; + ["unrestricted float"](V: unknown, opts?: WebIDLConversions.Options): number; + + DOMString(V: unknown, opts?: WebIDLConversions.StringOptions): string; + ByteString(V: unknown, opts?: WebIDLConversions.StringOptions): string; + USVString(V: unknown, opts?: WebIDLConversions.StringOptions): string; + + object(V: V, opts?: WebIDLConversions.Options): V extends object ? V : V & object; + ArrayBuffer( + V: unknown, + opts?: WebIDLConversions.BufferSourceOptions & { allowShared?: false | undefined }, + ): ArrayBuffer; + ArrayBuffer(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): ArrayBufferLike; + DataView(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): DataView; + + Int8Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Int8Array; + Int16Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Int16Array; + Int32Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Int32Array; + + Uint8Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Uint8Array; + Uint16Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Uint16Array; + Uint32Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Uint32Array; + Uint8ClampedArray(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Uint8ClampedArray; + + Float32Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Float32Array; + Float64Array(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): Float64Array; + + ArrayBufferView(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): ArrayBufferView; + BufferSource( + V: unknown, + opts?: WebIDLConversions.BufferSourceOptions & { allowShared?: false | undefined }, + ): ArrayBuffer | ArrayBufferView; + BufferSource(V: unknown, opts?: WebIDLConversions.BufferSourceOptions): ArrayBufferLike | ArrayBufferView; + + DOMTimeStamp(V: unknown, opts?: WebIDLConversions.Options): number; +}; + +// This can't use ES6 style exports, as those can't have spaces in export names. +export = WebIDLConversions; diff --git a/user-service/node_modules/@types/webidl-conversions/package.json b/user-service/node_modules/@types/webidl-conversions/package.json new file mode 100644 index 0000000000..21fdb95864 --- /dev/null +++ b/user-service/node_modules/@types/webidl-conversions/package.json @@ -0,0 +1,30 @@ +{ + "name": "@types/webidl-conversions", + "version": "7.0.3", + "description": "TypeScript definitions for webidl-conversions", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/webidl-conversions", + "license": "MIT", + "contributors": [ + { + "name": "ExE Boss", + "githubUsername": "ExE-Boss", + "url": "https://github.com/ExE-Boss" + }, + { + "name": "BendingBender", + "githubUsername": "BendingBender", + "url": "https://github.com/BendingBender" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/webidl-conversions" + }, + "scripts": {}, + "dependencies": {}, + "typesPublisherContentHash": "ff1514e10869784e8b7cca9c4099a4213d3f14b48c198b1bf116300df94bf608", + "typeScriptVersion": "4.5" +} \ No newline at end of file diff --git a/user-service/node_modules/@types/whatwg-url/LICENSE b/user-service/node_modules/@types/whatwg-url/LICENSE new file mode 100644 index 0000000000..9e841e7a26 --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/user-service/node_modules/@types/whatwg-url/README.md b/user-service/node_modules/@types/whatwg-url/README.md new file mode 100644 index 0000000000..11061ebd2e --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/whatwg-url` + +# Summary +This package contains type definitions for whatwg-url (https://github.com/jsdom/whatwg-url#readme). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/whatwg-url. + +### Additional Details + * Last updated: Sat, 18 May 2024 21:06:54 GMT + * Dependencies: [@types/webidl-conversions](https://npmjs.com/package/@types/webidl-conversions) + +# Credits +These definitions were written by [Alexander Marks](https://github.com/aomarks), [ExE Boss](https://github.com/ExE-Boss), and [BendingBender](https://github.com/BendingBender). diff --git a/user-service/node_modules/@types/whatwg-url/index.d.ts b/user-service/node_modules/@types/whatwg-url/index.d.ts new file mode 100644 index 0000000000..7c554cca9f --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/index.d.ts @@ -0,0 +1,169 @@ +/// +/** https://url.spec.whatwg.org/#url-representation */ +export interface URLRecord { + scheme: string; + username: string; + password: string; + host: string | number | IPv6Address | null; + port: number | null; + path: string | string[]; + query: string | null; + fragment: string | null; +} + +/** https://url.spec.whatwg.org/#concept-ipv6 */ +export type IPv6Address = [number, number, number, number, number, number, number, number]; + +/** https://url.spec.whatwg.org/#url-class */ +export class URL { + constructor(url: string, base?: string | URL); + + get href(): string; + set href(V: string); + + get origin(): string; + + get protocol(): string; + set protocol(V: string); + + get username(): string; + set username(V: string); + + get password(): string; + set password(V: string); + + get host(): string; + set host(V: string); + + get hostname(): string; + set hostname(V: string); + + get port(): string; + set port(V: string); + + get pathname(): string; + set pathname(V: string); + + get search(): string; + set search(V: string); + + get searchParams(): URLSearchParams; + + get hash(): string; + set hash(V: string); + + toJSON(): string; + + readonly [Symbol.toStringTag]: "URL"; +} + +/** https://url.spec.whatwg.org/#interface-urlsearchparams */ +export class URLSearchParams { + constructor( + init?: + | ReadonlyArray + | Iterable + | { readonly [name: string]: string } + | string, + ); + + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string): boolean; + set(name: string, value: string): void; + sort(): void; + + keys(): IterableIterator; + values(): IterableIterator; + entries(): IterableIterator<[name: string, value: string]>; + forEach( + callback: (this: THIS_ARG, value: string, name: string, searchParams: this) => void, + thisArg?: THIS_ARG, + ): void; + + readonly [Symbol.toStringTag]: "URLSearchParams"; + [Symbol.iterator](): IterableIterator<[name: string, value: string]>; +} + +/** https://url.spec.whatwg.org/#concept-url-parser */ +export function parseURL(input: string, options?: { readonly baseURL?: URLRecord | undefined }): URLRecord | null; + +/** https://url.spec.whatwg.org/#concept-basic-url-parser */ +export function basicURLParse( + input: string, + options?: { + baseURL?: URLRecord | undefined; + url?: URLRecord | undefined; + stateOverride?: StateOverride | undefined; + }, +): URLRecord | null; + +/** https://url.spec.whatwg.org/#scheme-start-state */ +export type StateOverride = + | "scheme start" + | "scheme" + | "no scheme" + | "special relative or authority" + | "path or authority" + | "relative" + | "relative slash" + | "special authority slashes" + | "special authority ignore slashes" + | "authority" + | "host" + | "hostname" + | "port" + | "file" + | "file slash" + | "file host" + | "path start" + | "path" + | "opaque path" + | "query" + | "fragment"; + +/** https://url.spec.whatwg.org/#concept-url-serializer */ +export function serializeURL(urlRecord: URLRecord, excludeFragment?: boolean): string; + +/** https://url.spec.whatwg.org/#concept-host-serializer */ +export function serializeHost(host: string | number | IPv6Address): string; + +/** https://url.spec.whatwg.org/#url-path-serializer */ +export function serializePath(urlRecord: URLRecord): string; + +/** https://url.spec.whatwg.org/#serialize-an-integer */ +export function serializeInteger(number: number): string; + +/** https://html.spec.whatwg.org#ascii-serialisation-of-an-origin */ +export function serializeURLOrigin(urlRecord: URLRecord): string; + +/** https://url.spec.whatwg.org/#set-the-username */ +export function setTheUsername(urlRecord: URLRecord, username: string): void; + +/** https://url.spec.whatwg.org/#set-the-password */ +export function setThePassword(urlRecord: URLRecord, password: string): void; + +/** https://url.spec.whatwg.org/#url-opaque-path */ +export function hasAnOpaquePath(urlRecord: URLRecord): boolean; + +/** https://url.spec.whatwg.org/#cannot-have-a-username-password-port */ +export function cannotHaveAUsernamePasswordPort(urlRecord: URLRecord): boolean; + +/** https://url.spec.whatwg.org/#percent-decode */ +export function percentDecodeBytes(buffer: TypedArray): Uint8Array; + +/** https://url.spec.whatwg.org/#string-percent-decode */ +export function percentDecodeString(string: string): Uint8Array; + +export type TypedArray = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | Float32Array + | Float64Array; diff --git a/user-service/node_modules/@types/whatwg-url/lib/URL-impl.d.ts b/user-service/node_modules/@types/whatwg-url/lib/URL-impl.d.ts new file mode 100644 index 0000000000..c0bb598433 --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/lib/URL-impl.d.ts @@ -0,0 +1,22 @@ +import { Globals } from "webidl-conversions"; +import { implementation as URLSearchParamsImpl } from "./URLSearchParams-impl"; + +declare class URLImpl { + constructor(globalObject: Globals, constructorArgs: readonly [url: string, base?: string]); + + href: string; + readonly origin: string; + protocol: string; + username: string; + password: string; + host: string; + hostname: string; + port: string; + pathname: string; + search: string; + readonly searchParams: URLSearchParamsImpl; + hash: string; + + toJSON(): string; +} +export { URLImpl as implementation }; diff --git a/user-service/node_modules/@types/whatwg-url/lib/URL.d.ts b/user-service/node_modules/@types/whatwg-url/lib/URL.d.ts new file mode 100644 index 0000000000..85474a7025 --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/lib/URL.d.ts @@ -0,0 +1,66 @@ +import { URL } from "../index"; +import { implementation as URLImpl } from "./URL-impl"; + +/** + * Checks whether `obj` is a `URL` object with an implementation + * provided by this package. + */ +export function is(obj: unknown): obj is URL; + +/** + * Checks whether `obj` is a `URLImpl` WebIDL2JS implementation object + * provided by this package. + */ +export function isImpl(obj: unknown): obj is URLImpl; + +/** + * Converts the `URL` wrapper into a `URLImpl` object. + * + * @throws {TypeError} If `obj` is not a `URL` wrapper instance provided by this package. + */ +export function convert(globalObject: object, obj: unknown, { context }?: { context: string }): URLImpl; + +/** + * Creates a new `URL` instance. + * + * @throws {Error} If the `globalObject` doesn't have a WebIDL2JS constructor + * registry or a `URL` constructor provided by this package + * in the WebIDL2JS constructor registry. + */ +export function create(globalObject: object, constructorArgs: readonly [url: string, base?: string]): URL; + +/** + * Calls `create()` and returns the internal `URLImpl`. + * + * @throws {Error} If the `globalObject` doesn't have a WebIDL2JS constructor + * registry or a `URL` constructor provided by this package + * in the WebIDL2JS constructor registry. + */ +export function createImpl(globalObject: object, constructorArgs: readonly [url: string, base?: string]): URLImpl; + +/** + * Initializes the `URL` instance, called by `create()`. + * + * Useful when manually sub-classing a non-constructable wrapper object. + */ +export function setup( + obj: T, + globalObject: object, + constructorArgs: readonly [url: string, base?: string], +): T; + +/** + * Creates a new `URL` object without runing the constructor steps. + * + * Useful when implementing specifications that initialize objects + * in different ways than their constructors do. + */ +declare function _new(globalObject: object, newTarget?: new(url: string, base?: string) => URL): URLImpl; +export { _new as new }; + +/** + * Installs the `URL` constructor onto the `globalObject`. + * + * @throws {Error} If the target `globalObject` doesn't have an `Error` constructor. + */ +export function install(globalObject: object, globalNames: readonly string[]): void; diff --git a/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams-impl.d.ts b/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams-impl.d.ts new file mode 100644 index 0000000000..cf50701176 --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams-impl.d.ts @@ -0,0 +1,20 @@ +declare class URLSearchParamsImpl { + constructor( + globalObject: object, + constructorArgs: readonly [ + init?: ReadonlyArray | { readonly [name: string]: string } | string, + ], + privateData: { readonly doNotStripQMark?: boolean | undefined }, + ); + + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string): boolean; + set(name: string, value: string): void; + sort(): void; + + [Symbol.iterator](): IterableIterator<[name: string, value: string]>; +} +export { URLSearchParamsImpl as implementation }; diff --git a/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams.d.ts b/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams.d.ts new file mode 100644 index 0000000000..8b35d1d1e1 --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/lib/URLSearchParams.d.ts @@ -0,0 +1,92 @@ +import { URLSearchParams } from "../index"; +import { implementation as URLSearchParamsImpl } from "./URLSearchParams-impl"; + +/** + * Checks whether `obj` is a `URLSearchParams` object with an implementation + * provided by this package. + */ +export function is(obj: unknown): obj is URLSearchParams; + +/** + * Checks whether `obj` is a `URLSearchParamsImpl` WebIDL2JS implementation object + * provided by this package. + */ +export function isImpl(obj: unknown): obj is URLSearchParamsImpl; + +/** + * Converts the `URLSearchParams` wrapper into a `URLSearchParamsImpl` object. + * + * @throws {TypeError} If `obj` is not a `URLSearchParams` wrapper instance provided by this package. + */ +export function convert(globalObject: object, obj: unknown, { context }?: { context: string }): URLSearchParamsImpl; + +export function createDefaultIterator( + globalObject: object, + target: URLSearchParamsImpl, + kind: TIteratorKind, +): IterableIterator; + +/** + * Creates a new `URLSearchParams` instance. + * + * @throws {Error} If the `globalObject` doesn't have a WebIDL2JS constructor + * registry or a `URLSearchParams` constructor provided by this package + * in the WebIDL2JS constructor registry. + */ +export function create( + globalObject: object, + constructorArgs?: readonly [ + init: ReadonlyArray<[name: string, value: string]> | { readonly [name: string]: string } | string, + ], + privateData?: { doNotStripQMark?: boolean | undefined }, +): URLSearchParams; + +/** + * Calls `create()` and returns the internal `URLSearchParamsImpl`. + * + * @throws {Error} If the `globalObject` doesn't have a WebIDL2JS constructor + * registry or a `URLSearchParams` constructor provided by this package + * in the WebIDL2JS constructor registry. + */ +export function createImpl( + globalObject: object, + constructorArgs?: readonly [ + init: ReadonlyArray<[name: string, value: string]> | { readonly [name: string]: string } | string, + ], + privateData?: { doNotStripQMark?: boolean | undefined }, +): URLSearchParamsImpl; + +/** + * Initializes the `URLSearchParams` instance, called by `create()`. + * + * Useful when manually sub-classing a non-constructable wrapper object. + */ +export function setup( + obj: T, + globalObject: object, + constructorArgs?: readonly [ + init: ReadonlyArray<[name: string, value: string]> | { readonly [name: string]: string } | string, + ], + privateData?: { doNotStripQMark?: boolean | undefined }, +): T; + +/** + * Creates a new `URLSearchParams` object without runing the constructor steps. + * + * Useful when implementing specifications that initialize objects + * in different ways than their constructors do. + */ +declare function _new( + globalObject: object, + newTarget?: new( + init: ReadonlyArray<[name: string, value: string]> | { readonly [name: string]: string } | string, + ) => URLSearchParams, +): URLSearchParamsImpl; +export { _new as new }; + +/** + * Installs the `URLSearchParams` constructor onto the `globalObject`. + * + * @throws {Error} If the target `globalObject` doesn't have an `Error` constructor. + */ +export function install(globalObject: object, globalNames: readonly string[]): void; diff --git a/user-service/node_modules/@types/whatwg-url/package.json b/user-service/node_modules/@types/whatwg-url/package.json new file mode 100644 index 0000000000..418e8b676b --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/package.json @@ -0,0 +1,37 @@ +{ + "name": "@types/whatwg-url", + "version": "11.0.5", + "description": "TypeScript definitions for whatwg-url", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/whatwg-url", + "license": "MIT", + "contributors": [ + { + "name": "Alexander Marks", + "githubUsername": "aomarks", + "url": "https://github.com/aomarks" + }, + { + "name": "ExE Boss", + "githubUsername": "ExE-Boss", + "url": "https://github.com/ExE-Boss" + }, + { + "name": "BendingBender", + "githubUsername": "BendingBender", + "url": "https://github.com/BendingBender" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/whatwg-url" + }, + "scripts": {}, + "dependencies": { + "@types/webidl-conversions": "*" + }, + "typesPublisherContentHash": "c6cfac1bbd7b2ef315fdad11fc9bdb6a8f0ae2b1c3ff057cfca7bc9880eeaa9d", + "typeScriptVersion": "4.7" +} \ No newline at end of file diff --git a/user-service/node_modules/@types/whatwg-url/webidl2js-wrapper.d.ts b/user-service/node_modules/@types/whatwg-url/webidl2js-wrapper.d.ts new file mode 100644 index 0000000000..96029b766d --- /dev/null +++ b/user-service/node_modules/@types/whatwg-url/webidl2js-wrapper.d.ts @@ -0,0 +1,4 @@ +import * as URL from "./lib/URL"; +import * as URLSearchParams from "./lib/URLSearchParams"; + +export { URL, URLSearchParams }; diff --git a/user-service/node_modules/abbrev/LICENSE b/user-service/node_modules/abbrev/LICENSE new file mode 100644 index 0000000000..9bcfa9d7d8 --- /dev/null +++ b/user-service/node_modules/abbrev/LICENSE @@ -0,0 +1,46 @@ +This software is dual-licensed under the ISC and MIT licenses. +You may use this software under EITHER of the following licenses. + +---------- + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------- + +Copyright Isaac Z. Schlueter and Contributors +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/abbrev/README.md b/user-service/node_modules/abbrev/README.md new file mode 100644 index 0000000000..99746fe67c --- /dev/null +++ b/user-service/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/user-service/node_modules/abbrev/abbrev.js b/user-service/node_modules/abbrev/abbrev.js new file mode 100644 index 0000000000..7b1dc5d676 --- /dev/null +++ b/user-service/node_modules/abbrev/abbrev.js @@ -0,0 +1,61 @@ +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/user-service/node_modules/abbrev/package.json b/user-service/node_modules/abbrev/package.json new file mode 100644 index 0000000000..bf4e8015bb --- /dev/null +++ b/user-service/node_modules/abbrev/package.json @@ -0,0 +1,21 @@ +{ + "name": "abbrev", + "version": "1.1.1", + "description": "Like ruby's abbrev module, but in js", + "author": "Isaac Z. Schlueter ", + "main": "abbrev.js", + "scripts": { + "test": "tap test.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "repository": "http://github.com/isaacs/abbrev-js", + "license": "ISC", + "devDependencies": { + "tap": "^10.1" + }, + "files": [ + "abbrev.js" + ] +} diff --git a/user-service/node_modules/accepts/HISTORY.md b/user-service/node_modules/accepts/HISTORY.md new file mode 100644 index 0000000000..cb5990c7c3 --- /dev/null +++ b/user-service/node_modules/accepts/HISTORY.md @@ -0,0 +1,243 @@ +1.3.8 / 2022-02-02 +================== + + * deps: mime-types@~2.1.34 + - deps: mime-db@~1.51.0 + * deps: negotiator@0.6.3 + +1.3.7 / 2019-04-29 +================== + + * deps: negotiator@0.6.2 + - Fix sorting charset, encoding, and language with extra parameters + +1.3.6 / 2019-04-28 +================== + + * deps: mime-types@~2.1.24 + - deps: mime-db@~1.40.0 + +1.3.5 / 2018-02-28 +================== + + * deps: mime-types@~2.1.18 + - deps: mime-db@~1.33.0 + +1.3.4 / 2017-08-22 +================== + + * deps: mime-types@~2.1.16 + - deps: mime-db@~1.29.0 + +1.3.3 / 2016-05-02 +================== + + * deps: mime-types@~2.1.11 + - deps: mime-db@~1.23.0 + * deps: negotiator@0.6.1 + - perf: improve `Accept` parsing speed + - perf: improve `Accept-Charset` parsing speed + - perf: improve `Accept-Encoding` parsing speed + - perf: improve `Accept-Language` parsing speed + +1.3.2 / 2016-03-08 +================== + + * deps: mime-types@~2.1.10 + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + - deps: mime-db@~1.22.0 + +1.3.1 / 2016-01-19 +================== + + * deps: mime-types@~2.1.9 + - deps: mime-db@~1.21.0 + +1.3.0 / 2015-09-29 +================== + + * deps: mime-types@~2.1.7 + - deps: mime-db@~1.19.0 + * deps: negotiator@0.6.0 + - Fix including type extensions in parameters in `Accept` parsing + - Fix parsing `Accept` parameters with quoted equals + - Fix parsing `Accept` parameters with quoted semicolons + - Lazy-load modules from main entry point + - perf: delay type concatenation until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove closures getting spec properties + - perf: remove a closure from media type parsing + - perf: remove property delete from media type parsing + +1.2.13 / 2015-09-06 +=================== + + * deps: mime-types@~2.1.6 + - deps: mime-db@~1.18.0 + +1.2.12 / 2015-07-30 +=================== + + * deps: mime-types@~2.1.4 + - deps: mime-db@~1.16.0 + +1.2.11 / 2015-07-16 +=================== + + * deps: mime-types@~2.1.3 + - deps: mime-db@~1.15.0 + +1.2.10 / 2015-07-01 +=================== + + * deps: mime-types@~2.1.2 + - deps: mime-db@~1.14.0 + +1.2.9 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - perf: fix deopt during mapping + +1.2.8 / 2015-06-07 +================== + + * deps: mime-types@~2.1.0 + - deps: mime-db@~1.13.0 + * perf: avoid argument reassignment & argument slice + * perf: avoid negotiator recursive construction + * perf: enable strict mode + * perf: remove unnecessary bitwise operator + +1.2.7 / 2015-05-10 +================== + + * deps: negotiator@0.5.3 + - Fix media type parameter matching to be case-insensitive + +1.2.6 / 2015-05-07 +================== + + * deps: mime-types@~2.0.11 + - deps: mime-db@~1.9.1 + * deps: negotiator@0.5.2 + - Fix comparing media types with quoted values + - Fix splitting media types with quoted commas + +1.2.5 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - deps: mime-db@~1.8.0 + +1.2.4 / 2015-02-14 +================== + + * Support Node.js 0.6 + * deps: mime-types@~2.0.9 + - deps: mime-db@~1.7.0 + * deps: negotiator@0.5.1 + - Fix preference sorting to be stable for long acceptable lists + +1.2.3 / 2015-01-31 +================== + + * deps: mime-types@~2.0.8 + - deps: mime-db@~1.6.0 + +1.2.2 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - deps: mime-db@~1.5.0 + +1.2.1 / 2014-12-30 +================== + + * deps: mime-types@~2.0.5 + - deps: mime-db@~1.3.1 + +1.2.0 / 2014-12-19 +================== + + * deps: negotiator@0.5.0 + - Fix list return order when large accepted list + - Fix missing identity encoding when q=0 exists + - Remove dynamic building of Negotiator class + +1.1.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - deps: mime-db@~1.3.0 + +1.1.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - deps: mime-db@~1.2.0 + +1.1.2 / 2014-10-14 +================== + + * deps: negotiator@0.4.9 + - Fix error when media type has invalid parameter + +1.1.1 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - deps: mime-db@~1.1.0 + * deps: negotiator@0.4.8 + - Fix all negotiations to be case-insensitive + - Stable sort preferences of same quality according to client order + +1.1.0 / 2014-09-02 +================== + + * update `mime-types` + +1.0.7 / 2014-07-04 +================== + + * Fix wrong type returned from `type` when match after unknown extension + +1.0.6 / 2014-06-24 +================== + + * deps: negotiator@0.4.7 + +1.0.5 / 2014-06-20 +================== + + * fix crash when unknown extension given + +1.0.4 / 2014-06-19 +================== + + * use `mime-types` + +1.0.3 / 2014-06-11 +================== + + * deps: negotiator@0.4.6 + - Order by specificity when quality is the same + +1.0.2 / 2014-05-29 +================== + + * Fix interpretation when header not in request + * deps: pin negotiator@0.4.5 + +1.0.1 / 2014-01-18 +================== + + * Identity encoding isn't always acceptable + * deps: negotiator@~0.4.0 + +1.0.0 / 2013-12-27 +================== + + * Genesis diff --git a/user-service/node_modules/accepts/LICENSE b/user-service/node_modules/accepts/LICENSE new file mode 100644 index 0000000000..06166077be --- /dev/null +++ b/user-service/node_modules/accepts/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/accepts/README.md b/user-service/node_modules/accepts/README.md new file mode 100644 index 0000000000..82680c530c --- /dev/null +++ b/user-service/node_modules/accepts/README.md @@ -0,0 +1,140 @@ +# accepts + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). +Extracted from [koa](https://www.npmjs.com/package/koa) for general use. + +In addition to negotiator, it allows: + +- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` + as well as `('text/html', 'application/json')`. +- Allows type shorthands such as `json`. +- Returns `false` when no types match +- Treats non-existent headers as `*` + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install accepts +``` + +## API + +```js +var accepts = require('accepts') +``` + +### accepts(req) + +Create a new `Accepts` object for the given `req`. + +#### .charset(charsets) + +Return the first accepted charset. If nothing in `charsets` is accepted, +then `false` is returned. + +#### .charsets() + +Return the charsets that the request accepts, in the order of the client's +preference (most preferred first). + +#### .encoding(encodings) + +Return the first accepted encoding. If nothing in `encodings` is accepted, +then `false` is returned. + +#### .encodings() + +Return the encodings that the request accepts, in the order of the client's +preference (most preferred first). + +#### .language(languages) + +Return the first accepted language. If nothing in `languages` is accepted, +then `false` is returned. + +#### .languages() + +Return the languages that the request accepts, in the order of the client's +preference (most preferred first). + +#### .type(types) + +Return the first accepted type (and it is returned as the same text as what +appears in the `types` array). If nothing in `types` is accepted, then `false` +is returned. + +The `types` array can contain full MIME types or file extensions. Any value +that is not a full MIME types is passed to `require('mime-types').lookup`. + +#### .types() + +Return the types that the request accepts, in the order of the client's +preference (most preferred first). + +## Examples + +### Simple type negotiation + +This simple example shows how to use `accepts` to return a different typed +respond body based on what the client wants to accept. The server lists it's +preferences in order and will get back the best match between the client and +server. + +```js +var accepts = require('accepts') +var http = require('http') + +function app (req, res) { + var accept = accepts(req) + + // the order of this list is significant; should be server preferred order + switch (accept.type(['json', 'html'])) { + case 'json': + res.setHeader('Content-Type', 'application/json') + res.write('{"hello":"world!"}') + break + case 'html': + res.setHeader('Content-Type', 'text/html') + res.write('hello, world!') + break + default: + // the fallback is text/plain, so no need to specify it above + res.setHeader('Content-Type', 'text/plain') + res.write('hello, world!') + break + } + + res.end() +} + +http.createServer(app).listen(3000) +``` + +You can test this out with the cURL program: +```sh +curl -I -H'Accept: text/html' http://localhost:3000/ +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master +[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml +[node-version-image]: https://badgen.net/npm/node/accepts +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/accepts +[npm-url]: https://npmjs.org/package/accepts +[npm-version-image]: https://badgen.net/npm/v/accepts diff --git a/user-service/node_modules/accepts/index.js b/user-service/node_modules/accepts/index.js new file mode 100644 index 0000000000..e9b2f63fb1 --- /dev/null +++ b/user-service/node_modules/accepts/index.js @@ -0,0 +1,238 @@ +/*! + * accepts + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var Negotiator = require('negotiator') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = Accepts + +/** + * Create a new Accepts object for the given req. + * + * @param {object} req + * @public + */ + +function Accepts (req) { + if (!(this instanceof Accepts)) { + return new Accepts(req) + } + + this.headers = req.headers + this.negotiator = new Negotiator(req) +} + +/** + * Check if the given `type(s)` is acceptable, returning + * the best match when true, otherwise `undefined`, in which + * case you should respond with 406 "Not Acceptable". + * + * The `type` value may be a single mime type string + * such as "application/json", the extension name + * such as "json" or an array `["json", "html", "text/plain"]`. When a list + * or array is given the _best_ match, if any is returned. + * + * Examples: + * + * // Accept: text/html + * this.types('html'); + * // => "html" + * + * // Accept: text/*, application/json + * this.types('html'); + * // => "html" + * this.types('text/html'); + * // => "text/html" + * this.types('json', 'text'); + * // => "json" + * this.types('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * this.types('image/png'); + * this.types('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * this.types(['html', 'json']); + * this.types('html', 'json'); + * // => "json" + * + * @param {String|Array} types... + * @return {String|Array|Boolean} + * @public + */ + +Accepts.prototype.type = +Accepts.prototype.types = function (types_) { + var types = types_ + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i] + } + } + + // no types, return all requested types + if (!types || types.length === 0) { + return this.negotiator.mediaTypes() + } + + // no accept header, return first given type + if (!this.headers.accept) { + return types[0] + } + + var mimes = types.map(extToMime) + var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) + var first = accepts[0] + + return first + ? types[mimes.indexOf(first)] + : false +} + +/** + * Return accepted encodings or best fit based on `encodings`. + * + * Given `Accept-Encoding: gzip, deflate` + * an array sorted by quality is returned: + * + * ['gzip', 'deflate'] + * + * @param {String|Array} encodings... + * @return {String|Array} + * @public + */ + +Accepts.prototype.encoding = +Accepts.prototype.encodings = function (encodings_) { + var encodings = encodings_ + + // support flattened arguments + if (encodings && !Array.isArray(encodings)) { + encodings = new Array(arguments.length) + for (var i = 0; i < encodings.length; i++) { + encodings[i] = arguments[i] + } + } + + // no encodings, return all requested encodings + if (!encodings || encodings.length === 0) { + return this.negotiator.encodings() + } + + return this.negotiator.encodings(encodings)[0] || false +} + +/** + * Return accepted charsets or best fit based on `charsets`. + * + * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` + * an array sorted by quality is returned: + * + * ['utf-8', 'utf-7', 'iso-8859-1'] + * + * @param {String|Array} charsets... + * @return {String|Array} + * @public + */ + +Accepts.prototype.charset = +Accepts.prototype.charsets = function (charsets_) { + var charsets = charsets_ + + // support flattened arguments + if (charsets && !Array.isArray(charsets)) { + charsets = new Array(arguments.length) + for (var i = 0; i < charsets.length; i++) { + charsets[i] = arguments[i] + } + } + + // no charsets, return all requested charsets + if (!charsets || charsets.length === 0) { + return this.negotiator.charsets() + } + + return this.negotiator.charsets(charsets)[0] || false +} + +/** + * Return accepted languages or best fit based on `langs`. + * + * Given `Accept-Language: en;q=0.8, es, pt` + * an array sorted by quality is returned: + * + * ['es', 'pt', 'en'] + * + * @param {String|Array} langs... + * @return {Array|String} + * @public + */ + +Accepts.prototype.lang = +Accepts.prototype.langs = +Accepts.prototype.language = +Accepts.prototype.languages = function (languages_) { + var languages = languages_ + + // support flattened arguments + if (languages && !Array.isArray(languages)) { + languages = new Array(arguments.length) + for (var i = 0; i < languages.length; i++) { + languages[i] = arguments[i] + } + } + + // no languages, return all requested languages + if (!languages || languages.length === 0) { + return this.negotiator.languages() + } + + return this.negotiator.languages(languages)[0] || false +} + +/** + * Convert extnames to mime. + * + * @param {String} type + * @return {String} + * @private + */ + +function extToMime (type) { + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if mime is valid. + * + * @param {String} type + * @return {String} + * @private + */ + +function validMime (type) { + return typeof type === 'string' +} diff --git a/user-service/node_modules/accepts/package.json b/user-service/node_modules/accepts/package.json new file mode 100644 index 0000000000..0f2d15da92 --- /dev/null +++ b/user-service/node_modules/accepts/package.json @@ -0,0 +1,47 @@ +{ + "name": "accepts", + "description": "Higher-level content negotiation", + "version": "1.3.8", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "jshttp/accepts", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "keywords": [ + "content", + "negotiation", + "accept", + "accepts" + ] +} diff --git a/user-service/node_modules/agent-base/README.md b/user-service/node_modules/agent-base/README.md new file mode 100644 index 0000000000..256f1f3219 --- /dev/null +++ b/user-service/node_modules/agent-base/README.md @@ -0,0 +1,145 @@ +agent-base +========== +### Turn a function into an [`http.Agent`][http.Agent] instance +[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI) + +This module provides an `http.Agent` generator. That is, you pass it an async +callback function, and it returns a new `http.Agent` instance that will invoke the +given callback function when sending outbound HTTP requests. + +#### Some subclasses: + +Here's some more interesting uses of `agent-base`. +Send a pull request to list yours! + + * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints + * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints + * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS + * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install agent-base +``` + + +Example +------- + +Here's a minimal example that creates a new `net.Socket` connection to the server +for every HTTP request (i.e. the equivalent of `agent: false` option): + +```js +var net = require('net'); +var tls = require('tls'); +var url = require('url'); +var http = require('http'); +var agent = require('agent-base'); + +var endpoint = 'http://nodejs.org/api/'; +var parsed = url.parse(endpoint); + +// This is the important part! +parsed.agent = agent(function (req, opts) { + var socket; + // `secureEndpoint` is true when using the https module + if (opts.secureEndpoint) { + socket = tls.connect(opts); + } else { + socket = net.connect(opts); + } + return socket; +}); + +// Everything else works just like normal... +http.get(parsed, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); +``` + +Returning a Promise or using an `async` function is also supported: + +```js +agent(async function (req, opts) { + await sleep(1000); + // etc… +}); +``` + +Return another `http.Agent` instance to "pass through" the responsibility +for that HTTP request to that agent: + +```js +agent(function (req, opts) { + return opts.secureEndpoint ? https.globalAgent : http.globalAgent; +}); +``` + + +API +--- + +## Agent(Function callback[, Object options]) → [http.Agent][] + +Creates a base `http.Agent` that will execute the callback function `callback` +for every HTTP request that it is used as the `agent` for. The callback function +is responsible for creating a `stream.Duplex` instance of some kind that will be +used as the underlying socket in the HTTP request. + +The `options` object accepts the following properties: + + * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional). + +The callback function should have the following signature: + +### callback(http.ClientRequest req, Object options, Function cb) → undefined + +The ClientRequest `req` can be accessed to read request headers and +and the path, etc. The `options` object contains the options passed +to the `http.request()`/`https.request()` function call, and is formatted +to be directly passed to `net.connect()`/`tls.connect()`, or however +else you want a Socket to be created. Pass the created socket to +the callback function `cb` once created, and the HTTP request will +continue to proceed. + +If the `https` module is used to invoke the HTTP request, then the +`secureEndpoint` property on `options` _will be set to `true`_. + + +License +------- + +(The MIT License) + +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent +[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent +[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent +[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent +[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent diff --git a/user-service/node_modules/agent-base/dist/src/index.d.ts b/user-service/node_modules/agent-base/dist/src/index.d.ts new file mode 100644 index 0000000000..bc4ab744c5 --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/index.d.ts @@ -0,0 +1,78 @@ +/// +import net from 'net'; +import http from 'http'; +import https from 'https'; +import { Duplex } from 'stream'; +import { EventEmitter } from 'events'; +declare function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent; +declare function createAgent(callback: createAgent.AgentCallback, opts?: createAgent.AgentOptions): createAgent.Agent; +declare namespace createAgent { + interface ClientRequest extends http.ClientRequest { + _last?: boolean; + _hadError?: boolean; + method: string; + } + interface AgentRequestOptions { + host?: string; + path?: string; + port: number; + } + interface HttpRequestOptions extends AgentRequestOptions, Omit { + secureEndpoint: false; + } + interface HttpsRequestOptions extends AgentRequestOptions, Omit { + secureEndpoint: true; + } + type RequestOptions = HttpRequestOptions | HttpsRequestOptions; + type AgentLike = Pick | http.Agent; + type AgentCallbackReturn = Duplex | AgentLike; + type AgentCallbackCallback = (err?: Error | null, socket?: createAgent.AgentCallbackReturn) => void; + type AgentCallbackPromise = (req: createAgent.ClientRequest, opts: createAgent.RequestOptions) => createAgent.AgentCallbackReturn | Promise; + type AgentCallback = typeof Agent.prototype.callback; + type AgentOptions = { + timeout?: number; + }; + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + class Agent extends EventEmitter { + timeout: number | null; + maxFreeSockets: number; + maxTotalSockets: number; + maxSockets: number; + sockets: { + [key: string]: net.Socket[]; + }; + freeSockets: { + [key: string]: net.Socket[]; + }; + requests: { + [key: string]: http.IncomingMessage[]; + }; + options: https.AgentOptions; + private promisifiedCallback?; + private explicitDefaultPort?; + private explicitProtocol?; + constructor(callback?: createAgent.AgentCallback | createAgent.AgentOptions, _opts?: createAgent.AgentOptions); + get defaultPort(): number; + set defaultPort(v: number); + get protocol(): string; + set protocol(v: string); + callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions, fn: createAgent.AgentCallbackCallback): void; + callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions): createAgent.AgentCallbackReturn | Promise; + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req: ClientRequest, _opts: RequestOptions): void; + freeSocket(socket: net.Socket, opts: AgentOptions): void; + destroy(): void; + } +} +export = createAgent; diff --git a/user-service/node_modules/agent-base/dist/src/index.js b/user-service/node_modules/agent-base/dist/src/index.js new file mode 100644 index 0000000000..bfd9e22071 --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/index.js @@ -0,0 +1,203 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const events_1 = require("events"); +const debug_1 = __importDefault(require("debug")); +const promisify_1 = __importDefault(require("./promisify")); +const debug = debug_1.default('agent-base'); +function isAgent(v) { + return Boolean(v) && typeof v.addRequest === 'function'; +} +function isSecureEndpoint() { + const { stack } = new Error(); + if (typeof stack !== 'string') + return false; + return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1); +} +function createAgent(callback, opts) { + return new createAgent.Agent(callback, opts); +} +(function (createAgent) { + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + class Agent extends events_1.EventEmitter { + constructor(callback, _opts) { + super(); + let opts = _opts; + if (typeof callback === 'function') { + this.callback = callback; + } + else if (callback) { + opts = callback; + } + // Timeout for the socket to be returned from the callback + this.timeout = null; + if (opts && typeof opts.timeout === 'number') { + this.timeout = opts.timeout; + } + // These aren't actually used by `agent-base`, but are required + // for the TypeScript definition files in `@types/node` :/ + this.maxFreeSockets = 1; + this.maxSockets = 1; + this.maxTotalSockets = Infinity; + this.sockets = {}; + this.freeSockets = {}; + this.requests = {}; + this.options = {}; + } + get defaultPort() { + if (typeof this.explicitDefaultPort === 'number') { + return this.explicitDefaultPort; + } + return isSecureEndpoint() ? 443 : 80; + } + set defaultPort(v) { + this.explicitDefaultPort = v; + } + get protocol() { + if (typeof this.explicitProtocol === 'string') { + return this.explicitProtocol; + } + return isSecureEndpoint() ? 'https:' : 'http:'; + } + set protocol(v) { + this.explicitProtocol = v; + } + callback(req, opts, fn) { + throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`'); + } + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req, _opts) { + const opts = Object.assign({}, _opts); + if (typeof opts.secureEndpoint !== 'boolean') { + opts.secureEndpoint = isSecureEndpoint(); + } + if (opts.host == null) { + opts.host = 'localhost'; + } + if (opts.port == null) { + opts.port = opts.secureEndpoint ? 443 : 80; + } + if (opts.protocol == null) { + opts.protocol = opts.secureEndpoint ? 'https:' : 'http:'; + } + if (opts.host && opts.path) { + // If both a `host` and `path` are specified then it's most + // likely the result of a `url.parse()` call... we need to + // remove the `path` portion so that `net.connect()` doesn't + // attempt to open that as a unix socket file. + delete opts.path; + } + delete opts.agent; + delete opts.hostname; + delete opts._defaultAgent; + delete opts.defaultPort; + delete opts.createConnection; + // Hint to use "Connection: close" + // XXX: non-documented `http` module API :( + req._last = true; + req.shouldKeepAlive = false; + let timedOut = false; + let timeoutId = null; + const timeoutMs = opts.timeout || this.timeout; + const onerror = (err) => { + if (req._hadError) + return; + req.emit('error', err); + // For Safety. Some additional errors might fire later on + // and we need to make sure we don't double-fire the error event. + req._hadError = true; + }; + const ontimeout = () => { + timeoutId = null; + timedOut = true; + const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`); + err.code = 'ETIMEOUT'; + onerror(err); + }; + const callbackError = (err) => { + if (timedOut) + return; + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + onerror(err); + }; + const onsocket = (socket) => { + if (timedOut) + return; + if (timeoutId != null) { + clearTimeout(timeoutId); + timeoutId = null; + } + if (isAgent(socket)) { + // `socket` is actually an `http.Agent` instance, so + // relinquish responsibility for this `req` to the Agent + // from here on + debug('Callback returned another Agent instance %o', socket.constructor.name); + socket.addRequest(req, opts); + return; + } + if (socket) { + socket.once('free', () => { + this.freeSocket(socket, opts); + }); + req.onSocket(socket); + return; + } + const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``); + onerror(err); + }; + if (typeof this.callback !== 'function') { + onerror(new Error('`callback` is not defined')); + return; + } + if (!this.promisifiedCallback) { + if (this.callback.length >= 3) { + debug('Converting legacy callback function to promise'); + this.promisifiedCallback = promisify_1.default(this.callback); + } + else { + this.promisifiedCallback = this.callback; + } + } + if (typeof timeoutMs === 'number' && timeoutMs > 0) { + timeoutId = setTimeout(ontimeout, timeoutMs); + } + if ('port' in opts && typeof opts.port !== 'number') { + opts.port = Number(opts.port); + } + try { + debug('Resolving socket for %o request: %o', opts.protocol, `${req.method} ${req.path}`); + Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError); + } + catch (err) { + Promise.reject(err).catch(callbackError); + } + } + freeSocket(socket, opts) { + debug('Freeing socket %o %o', socket.constructor.name, opts); + socket.destroy(); + } + destroy() { + debug('Destroying agent %o', this.constructor.name); + } + } + createAgent.Agent = Agent; + // So that `instanceof` works correctly + createAgent.prototype = createAgent.Agent.prototype; +})(createAgent || (createAgent = {})); +module.exports = createAgent; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/user-service/node_modules/agent-base/dist/src/index.js.map b/user-service/node_modules/agent-base/dist/src/index.js.map new file mode 100644 index 0000000000..bd118ab6bb --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAIA,mCAAsC;AACtC,kDAAgC;AAChC,4DAAoC;AAEpC,MAAM,KAAK,GAAG,eAAW,CAAC,YAAY,CAAC,CAAC;AAExC,SAAS,OAAO,CAAC,CAAM;IACtB,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB;IACxB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAK,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC;AAOD,SAAS,WAAW,CACnB,QAA+D,EAC/D,IAA+B;IAE/B,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,WAAU,WAAW;IAmDpB;;;;;;OAMG;IACH,MAAa,KAAM,SAAQ,qBAAY;QAmBtC,YACC,QAA+D,EAC/D,KAAgC;YAEhC,KAAK,EAAE,CAAC;YAER,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;aACzB;iBAAM,IAAI,QAAQ,EAAE;gBACpB,IAAI,GAAG,QAAQ,CAAC;aAChB;YAED,0DAA0D;YAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;gBAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;aAC5B;YAED,+DAA+D;YAC/D,0DAA0D;YAC1D,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,WAAW;YACd,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,QAAQ,EAAE;gBACjD,OAAO,IAAI,CAAC,mBAAmB,CAAC;aAChC;YACD,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,WAAW,CAAC,CAAS;YACxB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ;YACX,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;gBAC9C,OAAO,IAAI,CAAC,gBAAgB,CAAC;aAC7B;YACD,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,CAAC;QAED,IAAI,QAAQ,CAAC,CAAS;YACrB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC3B,CAAC;QAaD,QAAQ,CACP,GAA8B,EAC9B,IAA8B,EAC9B,EAAsC;YAKtC,MAAM,IAAI,KAAK,CACd,yFAAyF,CACzF,CAAC;QACH,CAAC;QAED;;;;;WAKG;QACH,UAAU,CAAC,GAAkB,EAAE,KAAqB;YACnD,MAAM,IAAI,qBAAwB,KAAK,CAAE,CAAC;YAE1C,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;gBAC7C,IAAI,CAAC,cAAc,GAAG,gBAAgB,EAAE,CAAC;aACzC;YAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;aACxB;YAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3C;YAED,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;aACzD;YAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,2DAA2D;gBAC3D,0DAA0D;gBAC1D,4DAA4D;gBAC5D,8CAA8C;gBAC9C,OAAO,IAAI,CAAC,IAAI,CAAC;aACjB;YAED,OAAO,IAAI,CAAC,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,OAAO,IAAI,CAAC,WAAW,CAAC;YACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAE7B,kCAAkC;YAClC,2CAA2C;YAC3C,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACjB,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;YAE5B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,SAAS,GAAyC,IAAI,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;YAE/C,MAAM,OAAO,GAAG,CAAC,GAA0B,EAAE,EAAE;gBAC9C,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO;gBAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACvB,yDAAyD;gBACzD,iEAAiE;gBACjE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,GAAG,EAAE;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,GAAG,GAA0B,IAAI,KAAK,CAC3C,sDAAsD,SAAS,IAAI,CACnE,CAAC;gBACF,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,GAA0B,EAAE,EAAE;gBACpD,IAAI,QAAQ;oBAAE,OAAO;gBACrB,IAAI,SAAS,KAAK,IAAI,EAAE;oBACvB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,SAAS,GAAG,IAAI,CAAC;iBACjB;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;YAEF,MAAM,QAAQ,GAAG,CAAC,MAA2B,EAAE,EAAE;gBAChD,IAAI,QAAQ;oBAAE,OAAO;gBACrB,IAAI,SAAS,IAAI,IAAI,EAAE;oBACtB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,SAAS,GAAG,IAAI,CAAC;iBACjB;gBAED,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;oBACpB,oDAAoD;oBACpD,wDAAwD;oBACxD,eAAe;oBACf,KAAK,CACJ,6CAA6C,EAC7C,MAAM,CAAC,WAAW,CAAC,IAAI,CACvB,CAAC;oBACD,MAA4B,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACpD,OAAO;iBACP;gBAED,IAAI,MAAM,EAAE;oBACX,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;wBACxB,IAAI,CAAC,UAAU,CAAC,MAAoB,EAAE,IAAI,CAAC,CAAC;oBAC7C,CAAC,CAAC,CAAC;oBACH,GAAG,CAAC,QAAQ,CAAC,MAAoB,CAAC,CAAC;oBACnC,OAAO;iBACP;gBAED,MAAM,GAAG,GAAG,IAAI,KAAK,CACpB,qDAAqD,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAC/E,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;YAEF,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;gBACxC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAChD,OAAO;aACP;YAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;oBAC9B,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBACxD,IAAI,CAAC,mBAAmB,GAAG,mBAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACpD;qBAAM;oBACN,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC;iBACzC;aACD;YAED,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC,EAAE;gBACnD,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC7C;YAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACpD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9B;YAED,IAAI;gBACH,KAAK,CACJ,qCAAqC,EACrC,IAAI,CAAC,QAAQ,EACb,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAC3B,CAAC;gBACF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACxD,QAAQ,EACR,aAAa,CACb,CAAC;aACF;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;aACzC;QACF,CAAC;QAED,UAAU,CAAC,MAAkB,EAAE,IAAkB;YAChD,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;QAED,OAAO;YACN,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;KACD;IAxPY,iBAAK,QAwPjB,CAAA;IAED,uCAAuC;IACvC,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;AACrD,CAAC,EAtTS,WAAW,KAAX,WAAW,QAsTpB;AAED,iBAAS,WAAW,CAAC"} \ No newline at end of file diff --git a/user-service/node_modules/agent-base/dist/src/promisify.d.ts b/user-service/node_modules/agent-base/dist/src/promisify.d.ts new file mode 100644 index 0000000000..02688696fb --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/promisify.d.ts @@ -0,0 +1,4 @@ +import { ClientRequest, RequestOptions, AgentCallbackCallback, AgentCallbackPromise } from './index'; +declare type LegacyCallback = (req: ClientRequest, opts: RequestOptions, fn: AgentCallbackCallback) => void; +export default function promisify(fn: LegacyCallback): AgentCallbackPromise; +export {}; diff --git a/user-service/node_modules/agent-base/dist/src/promisify.js b/user-service/node_modules/agent-base/dist/src/promisify.js new file mode 100644 index 0000000000..b2f6132a7b --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/promisify.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function promisify(fn) { + return function (req, opts) { + return new Promise((resolve, reject) => { + fn.call(this, req, opts, (err, rtn) => { + if (err) { + reject(err); + } + else { + resolve(rtn); + } + }); + }); + }; +} +exports.default = promisify; +//# sourceMappingURL=promisify.js.map \ No newline at end of file diff --git a/user-service/node_modules/agent-base/dist/src/promisify.js.map b/user-service/node_modules/agent-base/dist/src/promisify.js.map new file mode 100644 index 0000000000..4bff9bfcfa --- /dev/null +++ b/user-service/node_modules/agent-base/dist/src/promisify.js.map @@ -0,0 +1 @@ +{"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/promisify.ts"],"names":[],"mappings":";;AAeA,SAAwB,SAAS,CAAC,EAAkB;IACnD,OAAO,UAAsB,GAAkB,EAAE,IAAoB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,IAAI,CACN,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,CAAC,GAA6B,EAAE,GAAyB,EAAE,EAAE;gBAC5D,IAAI,GAAG,EAAE;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;iBACZ;qBAAM;oBACN,OAAO,CAAC,GAAG,CAAC,CAAC;iBACb;YACF,CAAC,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAjBD,4BAiBC"} \ No newline at end of file diff --git a/user-service/node_modules/agent-base/node_modules/debug/LICENSE b/user-service/node_modules/agent-base/node_modules/debug/LICENSE new file mode 100644 index 0000000000..1a9820e262 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/user-service/node_modules/agent-base/node_modules/debug/README.md b/user-service/node_modules/agent-base/node_modules/debug/README.md new file mode 100644 index 0000000000..e9c3e047c2 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/README.md @@ -0,0 +1,481 @@ +# debug +[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny JavaScript debugging utility modelled after Node.js core's debugging +technique. Works in Node.js and web browsers. + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example [_app.js_](./examples/node/app.js): + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %o', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example [_worker.js_](./examples/node/worker.js): + +```js +var a = require('debug')('worker:a') + , b = require('debug')('worker:b'); + +function work() { + a('doing lots of uninteresting work'); + setTimeout(work, Math.random() * 1000); +} + +work(); + +function workb() { + b('doing some work'); + setTimeout(workb, Math.random() * 2000); +} + +workb(); +``` + +The `DEBUG` environment variable is then used to enable these based on space or +comma-delimited names. + +Here are some examples: + +screen shot 2017-08-08 at 12 53 04 pm +screen shot 2017-08-08 at 12 53 38 pm +screen shot 2017-08-08 at 12 53 25 pm + +#### Windows command prompt notes + +##### CMD + +On Windows the environment variable is set using the `set` command. + +```cmd +set DEBUG=*,-not_this +``` + +Example: + +```cmd +set DEBUG=* & node app.js +``` + +##### PowerShell (VS Code default) + +PowerShell uses different syntax to set environment variables. + +```cmd +$env:DEBUG = "*,-not_this" +``` + +Example: + +```cmd +$env:DEBUG='app';node app.js +``` + +Then, run the program to be debugged as usual. + +npm script example: +```js + "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js", +``` + +## Namespace Colors + +Every debug instance has a color generated for it based on its namespace name. +This helps when visually parsing the debug output to identify which debug instance +a debug line belongs to. + +#### Node.js + +In Node.js, colors are enabled when stderr is a TTY. You also _should_ install +the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, +otherwise debug will only use a small handful of basic colors. + + + +#### Web Browser + +Colors are also enabled on "Web Inspectors" that understand the `%c` formatting +option. These are WebKit web inspectors, Firefox ([since version +31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) +and the Firebug plugin for Firefox (any version). + + + + +## Millisecond diff + +When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + + +When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: + + + + +## Conventions + +If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. + +## Wildcards + +The `*` character may be used as a wildcard. Suppose for example your library has +debuggers named "connect:bodyParser", "connect:compress", "connect:session", +instead of listing all three with +`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do +`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + +You can also exclude specific debuggers by prefixing them with a "-" character. +For example, `DEBUG=*,-connect:*` would include all debuggers except those +starting with "connect:". + +## Environment Variables + +When running through Node.js, you can set a few environment variables that will +change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + +__Note:__ The environment variables beginning with `DEBUG_` end up being +converted into an Options object that gets used with `%o`/`%O` formatters. +See the Node.js documentation for +[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) +for the complete list. + +## Formatters + +Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. +Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + + +### Custom formatters + +You can add custom formatters by extending the `debug.formatters` object. +For example, if you wanted to add support for rendering a Buffer as hex with +`%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + + +## Browser Support + +You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), +or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), +if you don't want to build it yourself. + +Debug's enable state is currently persisted by `localStorage`. +Consider the situation shown below where you have `worker:a` and `worker:b`, +and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_. + + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example [_stdout.js_](./examples/node/stdout.js): + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + +## Extend +You can simply extend debugger +```js +const log = require('debug')('auth'); + +//creates new debug instance with extended namespace +const logSign = log.extend('sign'); +const logLogin = log.extend('login'); + +log('hello'); // auth hello +logSign('hello'); //auth:sign hello +logLogin('hello'); //auth:login hello +``` + +## Set dynamically + +You can also enable debug dynamically by calling the `enable()` method : + +```js +let debug = require('debug'); + +console.log(1, debug.enabled('test')); + +debug.enable('test'); +console.log(2, debug.enabled('test')); + +debug.disable(); +console.log(3, debug.enabled('test')); + +``` + +print : +``` +1 false +2 true +3 false +``` + +Usage : +`enable(namespaces)` +`namespaces` can include modes separated by a colon and wildcards. + +Note that calling `enable()` completely overrides previously set DEBUG variable : + +``` +$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' +=> false +``` + +`disable()` + +Will disable all namespaces. The functions returns the namespaces currently +enabled (and skipped). This can be useful if you want to disable debugging +temporarily without knowing what was enabled to begin with. + +For example: + +```js +let debug = require('debug'); +debug.enable('foo:*,-foo:bar'); +let namespaces = debug.disable(); +debug.enable(namespaces); +``` + +Note: There is no guarantee that the string will be identical to the initial +enable string, but semantically they will be identical. + +## Checking whether a debug target is enabled + +After you've created a debug instance, you can determine whether or not it is +enabled by checking the `enabled` property: + +```javascript +const debug = require('debug')('http'); + +if (debug.enabled) { + // do stuff... +} +``` + +You can also manually toggle this property to force the debug instance to be +enabled or disabled. + +## Usage in child processes + +Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process. +For example: + +```javascript +worker = fork(WORKER_WRAP_PATH, [workerPath], { + stdio: [ + /* stdin: */ 0, + /* stdout: */ 'pipe', + /* stderr: */ 'pipe', + 'ipc', + ], + env: Object.assign({}, process.env, { + DEBUG_COLORS: 1 // without this settings, colors won't be shown + }), +}); + +worker.stderr.pipe(process.stderr, { end: false }); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + - Josh Junon + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2018-2021 Josh Junon + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/agent-base/node_modules/debug/package.json b/user-service/node_modules/agent-base/node_modules/debug/package.json new file mode 100644 index 0000000000..8eea055205 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/package.json @@ -0,0 +1,60 @@ +{ + "name": "debug", + "version": "4.3.6", + "repository": { + "type": "git", + "url": "git://github.com/debug-js/debug.git" + }, + "description": "Lightweight debugging utility for Node.js and the browser", + "keywords": [ + "debug", + "log", + "debugger" + ], + "files": [ + "src", + "LICENSE", + "README.md" + ], + "author": "Josh Junon (https://github.com/qix-)", + "contributors": [ + "TJ Holowaychuk ", + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "scripts": { + "lint": "xo", + "test": "npm run test:node && npm run test:browser && npm run lint", + "test:node": "istanbul cover _mocha -- test.js test.node.js", + "test:browser": "karma start --single-run", + "test:coverage": "cat ./coverage/lcov.info | coveralls" + }, + "dependencies": { + "ms": "2.1.2" + }, + "devDependencies": { + "brfs": "^2.0.1", + "browserify": "^16.2.3", + "coveralls": "^3.0.2", + "istanbul": "^0.4.5", + "karma": "^3.1.4", + "karma-browserify": "^6.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-mocha": "^1.3.0", + "mocha": "^5.2.0", + "mocha-lcov-reporter": "^1.2.0", + "sinon": "^14.0.0", + "xo": "^0.23.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "engines": { + "node": ">=6.0" + } +} diff --git a/user-service/node_modules/agent-base/node_modules/debug/src/browser.js b/user-service/node_modules/agent-base/node_modules/debug/src/browser.js new file mode 100644 index 0000000000..8d808e5889 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/src/browser.js @@ -0,0 +1,271 @@ +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; +})(); + +/** + * Colors. + */ + +exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + let m; + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ +exports.log = console.debug || console.log || (() => {}); + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; diff --git a/user-service/node_modules/agent-base/node_modules/debug/src/common.js b/user-service/node_modules/agent-base/node_modules/debug/src/common.js new file mode 100644 index 0000000000..e3291b20fa --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/src/common.js @@ -0,0 +1,274 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require('ms'); + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + + return enabledCache; + }, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +module.exports = setup; diff --git a/user-service/node_modules/agent-base/node_modules/debug/src/index.js b/user-service/node_modules/agent-base/node_modules/debug/src/index.js new file mode 100644 index 0000000000..bf4c57f259 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/user-service/node_modules/agent-base/node_modules/debug/src/node.js b/user-service/node_modules/agent-base/node_modules/debug/src/node.js new file mode 100644 index 0000000000..715560a4ca --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/debug/src/node.js @@ -0,0 +1,263 @@ +/** + * Module dependencies. + */ + +const tty = require('tty'); +const util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util.deprecate( + () => {}, + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' +); + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = require('supports-color'); + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty.isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; diff --git a/user-service/node_modules/agent-base/node_modules/ms/index.js b/user-service/node_modules/agent-base/node_modules/ms/index.js new file mode 100644 index 0000000000..c4498bcc21 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/user-service/node_modules/agent-base/node_modules/ms/license.md b/user-service/node_modules/agent-base/node_modules/ms/license.md new file mode 100644 index 0000000000..69b61253a3 --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/agent-base/node_modules/ms/package.json b/user-service/node_modules/agent-base/node_modules/ms/package.json new file mode 100644 index 0000000000..eea666e1fb --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/ms/package.json @@ -0,0 +1,37 @@ +{ + "name": "ms", + "version": "2.1.2", + "description": "Tiny millisecond conversion utility", + "repository": "zeit/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "4.12.1", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1" + } +} diff --git a/user-service/node_modules/agent-base/node_modules/ms/readme.md b/user-service/node_modules/agent-base/node_modules/ms/readme.md new file mode 100644 index 0000000000..9a1996b17e --- /dev/null +++ b/user-service/node_modules/agent-base/node_modules/ms/readme.md @@ -0,0 +1,60 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/user-service/node_modules/agent-base/package.json b/user-service/node_modules/agent-base/package.json new file mode 100644 index 0000000000..fadce3ad99 --- /dev/null +++ b/user-service/node_modules/agent-base/package.json @@ -0,0 +1,64 @@ +{ + "name": "agent-base", + "version": "6.0.2", + "description": "Turn a function into an `http.Agent` instance", + "main": "dist/src/index", + "typings": "dist/src/index", + "files": [ + "dist/src", + "src" + ], + "scripts": { + "prebuild": "rimraf dist", + "build": "tsc", + "postbuild": "cpy --parents src test '!**/*.ts' dist", + "test": "mocha --reporter spec dist/test/*.js", + "test-lint": "eslint src --ext .js,.ts", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-agent-base.git" + }, + "keywords": [ + "http", + "agent", + "base", + "barebones", + "https" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/node-agent-base/issues" + }, + "dependencies": { + "debug": "4" + }, + "devDependencies": { + "@types/debug": "4", + "@types/mocha": "^5.2.7", + "@types/node": "^14.0.20", + "@types/semver": "^7.1.0", + "@types/ws": "^6.0.3", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.1.0", + "async-listen": "^1.2.0", + "cpy-cli": "^2.0.0", + "eslint": "5.16.0", + "eslint-config-airbnb": "17.1.0", + "eslint-config-prettier": "4.1.0", + "eslint-import-resolver-typescript": "1.1.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "mocha": "^6.2.0", + "rimraf": "^3.0.0", + "semver": "^7.1.2", + "typescript": "^3.5.3", + "ws": "^3.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } +} diff --git a/user-service/node_modules/agent-base/src/index.ts b/user-service/node_modules/agent-base/src/index.ts new file mode 100644 index 0000000000..a47ccd493f --- /dev/null +++ b/user-service/node_modules/agent-base/src/index.ts @@ -0,0 +1,345 @@ +import net from 'net'; +import http from 'http'; +import https from 'https'; +import { Duplex } from 'stream'; +import { EventEmitter } from 'events'; +import createDebug from 'debug'; +import promisify from './promisify'; + +const debug = createDebug('agent-base'); + +function isAgent(v: any): v is createAgent.AgentLike { + return Boolean(v) && typeof v.addRequest === 'function'; +} + +function isSecureEndpoint(): boolean { + const { stack } = new Error(); + if (typeof stack !== 'string') return false; + return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1); +} + +function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent; +function createAgent( + callback: createAgent.AgentCallback, + opts?: createAgent.AgentOptions +): createAgent.Agent; +function createAgent( + callback?: createAgent.AgentCallback | createAgent.AgentOptions, + opts?: createAgent.AgentOptions +) { + return new createAgent.Agent(callback, opts); +} + +namespace createAgent { + export interface ClientRequest extends http.ClientRequest { + _last?: boolean; + _hadError?: boolean; + method: string; + } + + export interface AgentRequestOptions { + host?: string; + path?: string; + // `port` on `http.RequestOptions` can be a string or undefined, + // but `net.TcpNetConnectOpts` expects only a number + port: number; + } + + export interface HttpRequestOptions + extends AgentRequestOptions, + Omit { + secureEndpoint: false; + } + + export interface HttpsRequestOptions + extends AgentRequestOptions, + Omit { + secureEndpoint: true; + } + + export type RequestOptions = HttpRequestOptions | HttpsRequestOptions; + + export type AgentLike = Pick | http.Agent; + + export type AgentCallbackReturn = Duplex | AgentLike; + + export type AgentCallbackCallback = ( + err?: Error | null, + socket?: createAgent.AgentCallbackReturn + ) => void; + + export type AgentCallbackPromise = ( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions + ) => + | createAgent.AgentCallbackReturn + | Promise; + + export type AgentCallback = typeof Agent.prototype.callback; + + export type AgentOptions = { + timeout?: number; + }; + + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + export class Agent extends EventEmitter { + public timeout: number | null; + public maxFreeSockets: number; + public maxTotalSockets: number; + public maxSockets: number; + public sockets: { + [key: string]: net.Socket[]; + }; + public freeSockets: { + [key: string]: net.Socket[]; + }; + public requests: { + [key: string]: http.IncomingMessage[]; + }; + public options: https.AgentOptions; + private promisifiedCallback?: createAgent.AgentCallbackPromise; + private explicitDefaultPort?: number; + private explicitProtocol?: string; + + constructor( + callback?: createAgent.AgentCallback | createAgent.AgentOptions, + _opts?: createAgent.AgentOptions + ) { + super(); + + let opts = _opts; + if (typeof callback === 'function') { + this.callback = callback; + } else if (callback) { + opts = callback; + } + + // Timeout for the socket to be returned from the callback + this.timeout = null; + if (opts && typeof opts.timeout === 'number') { + this.timeout = opts.timeout; + } + + // These aren't actually used by `agent-base`, but are required + // for the TypeScript definition files in `@types/node` :/ + this.maxFreeSockets = 1; + this.maxSockets = 1; + this.maxTotalSockets = Infinity; + this.sockets = {}; + this.freeSockets = {}; + this.requests = {}; + this.options = {}; + } + + get defaultPort(): number { + if (typeof this.explicitDefaultPort === 'number') { + return this.explicitDefaultPort; + } + return isSecureEndpoint() ? 443 : 80; + } + + set defaultPort(v: number) { + this.explicitDefaultPort = v; + } + + get protocol(): string { + if (typeof this.explicitProtocol === 'string') { + return this.explicitProtocol; + } + return isSecureEndpoint() ? 'https:' : 'http:'; + } + + set protocol(v: string) { + this.explicitProtocol = v; + } + + callback( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions, + fn: createAgent.AgentCallbackCallback + ): void; + callback( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions + ): + | createAgent.AgentCallbackReturn + | Promise; + callback( + req: createAgent.ClientRequest, + opts: createAgent.AgentOptions, + fn?: createAgent.AgentCallbackCallback + ): + | createAgent.AgentCallbackReturn + | Promise + | void { + throw new Error( + '"agent-base" has no default implementation, you must subclass and override `callback()`' + ); + } + + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req: ClientRequest, _opts: RequestOptions): void { + const opts: RequestOptions = { ..._opts }; + + if (typeof opts.secureEndpoint !== 'boolean') { + opts.secureEndpoint = isSecureEndpoint(); + } + + if (opts.host == null) { + opts.host = 'localhost'; + } + + if (opts.port == null) { + opts.port = opts.secureEndpoint ? 443 : 80; + } + + if (opts.protocol == null) { + opts.protocol = opts.secureEndpoint ? 'https:' : 'http:'; + } + + if (opts.host && opts.path) { + // If both a `host` and `path` are specified then it's most + // likely the result of a `url.parse()` call... we need to + // remove the `path` portion so that `net.connect()` doesn't + // attempt to open that as a unix socket file. + delete opts.path; + } + + delete opts.agent; + delete opts.hostname; + delete opts._defaultAgent; + delete opts.defaultPort; + delete opts.createConnection; + + // Hint to use "Connection: close" + // XXX: non-documented `http` module API :( + req._last = true; + req.shouldKeepAlive = false; + + let timedOut = false; + let timeoutId: ReturnType | null = null; + const timeoutMs = opts.timeout || this.timeout; + + const onerror = (err: NodeJS.ErrnoException) => { + if (req._hadError) return; + req.emit('error', err); + // For Safety. Some additional errors might fire later on + // and we need to make sure we don't double-fire the error event. + req._hadError = true; + }; + + const ontimeout = () => { + timeoutId = null; + timedOut = true; + const err: NodeJS.ErrnoException = new Error( + `A "socket" was not created for HTTP request before ${timeoutMs}ms` + ); + err.code = 'ETIMEOUT'; + onerror(err); + }; + + const callbackError = (err: NodeJS.ErrnoException) => { + if (timedOut) return; + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + onerror(err); + }; + + const onsocket = (socket: AgentCallbackReturn) => { + if (timedOut) return; + if (timeoutId != null) { + clearTimeout(timeoutId); + timeoutId = null; + } + + if (isAgent(socket)) { + // `socket` is actually an `http.Agent` instance, so + // relinquish responsibility for this `req` to the Agent + // from here on + debug( + 'Callback returned another Agent instance %o', + socket.constructor.name + ); + (socket as createAgent.Agent).addRequest(req, opts); + return; + } + + if (socket) { + socket.once('free', () => { + this.freeSocket(socket as net.Socket, opts); + }); + req.onSocket(socket as net.Socket); + return; + } + + const err = new Error( + `no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\`` + ); + onerror(err); + }; + + if (typeof this.callback !== 'function') { + onerror(new Error('`callback` is not defined')); + return; + } + + if (!this.promisifiedCallback) { + if (this.callback.length >= 3) { + debug('Converting legacy callback function to promise'); + this.promisifiedCallback = promisify(this.callback); + } else { + this.promisifiedCallback = this.callback; + } + } + + if (typeof timeoutMs === 'number' && timeoutMs > 0) { + timeoutId = setTimeout(ontimeout, timeoutMs); + } + + if ('port' in opts && typeof opts.port !== 'number') { + opts.port = Number(opts.port); + } + + try { + debug( + 'Resolving socket for %o request: %o', + opts.protocol, + `${req.method} ${req.path}` + ); + Promise.resolve(this.promisifiedCallback(req, opts)).then( + onsocket, + callbackError + ); + } catch (err) { + Promise.reject(err).catch(callbackError); + } + } + + freeSocket(socket: net.Socket, opts: AgentOptions) { + debug('Freeing socket %o %o', socket.constructor.name, opts); + socket.destroy(); + } + + destroy() { + debug('Destroying agent %o', this.constructor.name); + } + } + + // So that `instanceof` works correctly + createAgent.prototype = createAgent.Agent.prototype; +} + +export = createAgent; diff --git a/user-service/node_modules/agent-base/src/promisify.ts b/user-service/node_modules/agent-base/src/promisify.ts new file mode 100644 index 0000000000..60cc662710 --- /dev/null +++ b/user-service/node_modules/agent-base/src/promisify.ts @@ -0,0 +1,33 @@ +import { + Agent, + ClientRequest, + RequestOptions, + AgentCallbackCallback, + AgentCallbackPromise, + AgentCallbackReturn +} from './index'; + +type LegacyCallback = ( + req: ClientRequest, + opts: RequestOptions, + fn: AgentCallbackCallback +) => void; + +export default function promisify(fn: LegacyCallback): AgentCallbackPromise { + return function(this: Agent, req: ClientRequest, opts: RequestOptions) { + return new Promise((resolve, reject) => { + fn.call( + this, + req, + opts, + (err: Error | null | undefined, rtn?: AgentCallbackReturn) => { + if (err) { + reject(err); + } else { + resolve(rtn); + } + } + ); + }); + }; +} diff --git a/user-service/node_modules/ansi-regex/index.d.ts b/user-service/node_modules/ansi-regex/index.d.ts new file mode 100644 index 0000000000..2dbf6af2b6 --- /dev/null +++ b/user-service/node_modules/ansi-regex/index.d.ts @@ -0,0 +1,37 @@ +declare namespace ansiRegex { + interface Options { + /** + Match only the first ANSI escape. + + @default false + */ + onlyFirst: boolean; + } +} + +/** +Regular expression for matching ANSI escape codes. + +@example +``` +import ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` +*/ +declare function ansiRegex(options?: ansiRegex.Options): RegExp; + +export = ansiRegex; diff --git a/user-service/node_modules/ansi-regex/index.js b/user-service/node_modules/ansi-regex/index.js new file mode 100644 index 0000000000..616ff837d3 --- /dev/null +++ b/user-service/node_modules/ansi-regex/index.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = ({onlyFirst = false} = {}) => { + const pattern = [ + '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + ].join('|'); + + return new RegExp(pattern, onlyFirst ? undefined : 'g'); +}; diff --git a/user-service/node_modules/ansi-regex/license b/user-service/node_modules/ansi-regex/license new file mode 100644 index 0000000000..e7af2f7710 --- /dev/null +++ b/user-service/node_modules/ansi-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/ansi-regex/package.json b/user-service/node_modules/ansi-regex/package.json new file mode 100644 index 0000000000..017f53116a --- /dev/null +++ b/user-service/node_modules/ansi-regex/package.json @@ -0,0 +1,55 @@ +{ + "name": "ansi-regex", + "version": "5.0.1", + "description": "Regular expression for matching ANSI escape codes", + "license": "MIT", + "repository": "chalk/ansi-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd", + "view-supported": "node fixtures/view-codes.js" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "text", + "regex", + "regexp", + "re", + "match", + "test", + "find", + "pattern" + ], + "devDependencies": { + "ava": "^2.4.0", + "tsd": "^0.9.0", + "xo": "^0.25.3" + } +} diff --git a/user-service/node_modules/ansi-regex/readme.md b/user-service/node_modules/ansi-regex/readme.md new file mode 100644 index 0000000000..4d848bc36f --- /dev/null +++ b/user-service/node_modules/ansi-regex/readme.md @@ -0,0 +1,78 @@ +# ansi-regex + +> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install ansi-regex +``` + + +## Usage + +```js +const ansiRegex = require('ansi-regex'); + +ansiRegex().test('\u001B[4mcake\u001B[0m'); +//=> true + +ansiRegex().test('cake'); +//=> false + +'\u001B[4mcake\u001B[0m'.match(ansiRegex()); +//=> ['\u001B[4m', '\u001B[0m'] + +'\u001B[4mcake\u001B[0m'.match(ansiRegex({onlyFirst: true})); +//=> ['\u001B[4m'] + +'\u001B]8;;https://github.com\u0007click\u001B]8;;\u0007'.match(ansiRegex()); +//=> ['\u001B]8;;https://github.com\u0007', '\u001B]8;;\u0007'] +``` + + +## API + +### ansiRegex(options?) + +Returns a regex for matching ANSI escape codes. + +#### options + +Type: `object` + +##### onlyFirst + +Type: `boolean`
    +Default: `false` *(Matches any ANSI escape codes in a string)* + +Match only the first ANSI escape. + + +## FAQ + +### Why do you test for codes not in the ECMA 48 standard? + +Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them. + +On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out. + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +--- + +
    + + Get professional support for this package with a Tidelift subscription + +
    + + Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. +
    +
    diff --git a/user-service/node_modules/anymatch/LICENSE b/user-service/node_modules/anymatch/LICENSE new file mode 100644 index 0000000000..491766ca79 --- /dev/null +++ b/user-service/node_modules/anymatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/user-service/node_modules/anymatch/README.md b/user-service/node_modules/anymatch/README.md new file mode 100644 index 0000000000..1dd67f5344 --- /dev/null +++ b/user-service/node_modules/anymatch/README.md @@ -0,0 +1,87 @@ +anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) +====== +Javascript module to match a string against a regular expression, glob, string, +or function that takes the string as an argument and returns a truthy or falsy +value. The matcher can also be an array of any or all of these. Useful for +allowing a very flexible user-defined config to define things like file paths. + +__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ + + +Usage +----- +```sh +npm install anymatch +``` + +#### anymatch(matchers, testString, [returnIndex], [options]) +* __matchers__: (_Array|String|RegExp|Function_) +String to be directly matched, string with glob patterns, regular expression +test, function that takes the testString as an argument and returns a truthy +value if it should be matched, or an array of any number and mix of these types. +* __testString__: (_String|Array_) The string to test against the matchers. If +passed as an array, the first element of the array will be used as the +`testString` for non-function matchers, while the entire array will be applied +as the arguments for function matchers. +* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. + * __returnIndex__: (_Boolean [optional]_) If true, return the array index of +the first matcher that that testString matched, or -1 if no match, instead of a +boolean result. + +```js +const anymatch = require('anymatch'); + +const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; + +anymatch(matchers, 'path/to/file.js'); // true +anymatch(matchers, 'path/anyjs/baz.js'); // true +anymatch(matchers, 'path/to/foo.js'); // true +anymatch(matchers, 'path/to/bar.js'); // true +anymatch(matchers, 'bar.js'); // false + +// returnIndex = true +anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 +anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 + +// any picomatc + +// using globs to match directories and their children +anymatch('node_modules', 'node_modules'); // true +anymatch('node_modules', 'node_modules/somelib/index.js'); // false +anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true +anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false +anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true + +const matcher = anymatch(matchers); +['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] +anymatch master* ❯ + +``` + +#### anymatch(matchers) +You can also pass in only your matcher(s) to get a curried function that has +already been bound to the provided matching criteria. This can be used as an +`Array#filter` callback. + +```js +var matcher = anymatch(matchers); + +matcher('path/to/file.js'); // true +matcher('path/anyjs/baz.js', true); // 1 + +['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] +``` + +Changelog +---------- +[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) + +- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. +- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). +- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) +for glob pattern matching. Issues with glob pattern matching should be +reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). + +License +------- +[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/user-service/node_modules/anymatch/index.d.ts b/user-service/node_modules/anymatch/index.d.ts new file mode 100644 index 0000000000..3ef7eaaddd --- /dev/null +++ b/user-service/node_modules/anymatch/index.d.ts @@ -0,0 +1,20 @@ +type AnymatchFn = (testString: string) => boolean; +type AnymatchPattern = string|RegExp|AnymatchFn; +type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] +type AnymatchTester = { + (testString: string|any[], returnIndex: true): number; + (testString: string|any[]): boolean; +} + +type PicomatchOptions = {dot: boolean}; + +declare const anymatch: { + (matchers: AnymatchMatcher): AnymatchTester; + (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester; + (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; + (matchers: AnymatchMatcher, testString: string|any[]): boolean; +} + +export {AnymatchMatcher as Matcher} +export {AnymatchTester as Tester} +export default anymatch diff --git a/user-service/node_modules/anymatch/index.js b/user-service/node_modules/anymatch/index.js new file mode 100644 index 0000000000..8eb73e9c9a --- /dev/null +++ b/user-service/node_modules/anymatch/index.js @@ -0,0 +1,104 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { value: true }); + +const picomatch = require('picomatch'); +const normalizePath = require('normalize-path'); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const DEFAULT_OPTIONS = {returnIndex: false}; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @param {object} options + * @returns {AnymatchFn} + */ +const createPattern = (matcher, options) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negPatterns + * @param {String|Array} args + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(_path)) + } + const path = normalizePath(_path, false); + + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {object} options + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + const opts = typeof options === 'boolean' ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, opts)); + const patterns = mtchers + .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG)) + .map(matcher => createPattern(matcher, opts)); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +anymatch.default = anymatch; +module.exports = anymatch; diff --git a/user-service/node_modules/anymatch/package.json b/user-service/node_modules/anymatch/package.json new file mode 100644 index 0000000000..2cb2307e49 --- /dev/null +++ b/user-service/node_modules/anymatch/package.json @@ -0,0 +1,48 @@ +{ + "name": "anymatch", + "version": "3.1.3", + "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", + "files": [ + "index.js", + "index.d.ts" + ], + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "author": { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + "license": "ISC", + "homepage": "https://github.com/micromatch/anymatch", + "repository": { + "type": "git", + "url": "https://github.com/micromatch/anymatch" + }, + "keywords": [ + "match", + "any", + "string", + "file", + "fs", + "list", + "glob", + "regex", + "regexp", + "regular", + "expression", + "function" + ], + "scripts": { + "test": "nyc mocha", + "mocha": "mocha" + }, + "devDependencies": { + "mocha": "^6.1.3", + "nyc": "^14.0.0" + }, + "engines": { + "node": ">= 8" + } +} diff --git a/user-service/node_modules/aproba/CHANGELOG.md b/user-service/node_modules/aproba/CHANGELOG.md new file mode 100644 index 0000000000..bab30ecb7e --- /dev/null +++ b/user-service/node_modules/aproba/CHANGELOG.md @@ -0,0 +1,4 @@ +2.0.0 + * Drop support for 0.10 and 0.12. They haven't been in travis but still, + since we _know_ we'll break with them now it's only polite to do a + major bump. diff --git a/user-service/node_modules/aproba/LICENSE b/user-service/node_modules/aproba/LICENSE new file mode 100644 index 0000000000..f4be44d881 --- /dev/null +++ b/user-service/node_modules/aproba/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/user-service/node_modules/aproba/README.md b/user-service/node_modules/aproba/README.md new file mode 100644 index 0000000000..0bfc594c56 --- /dev/null +++ b/user-service/node_modules/aproba/README.md @@ -0,0 +1,94 @@ +aproba +====== + +A ridiculously light-weight function argument validator + +``` +var validate = require("aproba") + +function myfunc(a, b, c) { + // `a` must be a string, `b` a number, `c` a function + validate('SNF', arguments) // [a,b,c] is also valid +} + +myfunc('test', 23, function () {}) // ok +myfunc(123, 23, function () {}) // type error +myfunc('test', 23) // missing arg error +myfunc('test', 23, function () {}, true) // too many args error + +``` + +Valid types are: + +| type | description +| :--: | :---------- +| * | matches any type +| A | `Array.isArray` OR an `arguments` object +| S | typeof == string +| N | typeof == number +| F | typeof == function +| O | typeof == object and not type A and not type E +| B | typeof == boolean +| E | `instanceof Error` OR `null` **(special: see below)** +| Z | == `null` + +Validation failures throw one of three exception types, distinguished by a +`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. + +If you pass in an invalid type then it will throw with a code of +`EUNKNOWNTYPE`. + +If an **error** argument is found and is not null then the remaining +arguments are optional. That is, if you say `ESO` then that's like using a +non-magical `E` in: `E|ESO|ZSO`. + +### But I have optional arguments?! + +You can provide more than one signature by separating them with pipes `|`. +If any signature matches the arguments then they'll be considered valid. + +So for example, say you wanted to write a signature for +`fs.createWriteStream`. The docs for it describe it thusly: + +``` +fs.createWriteStream(path[, options]) +``` + +This would be a signature of `SO|S`. That is, a string and and object, or +just a string. + +Now, if you read the full `fs` docs, you'll see that actually path can ALSO +be a buffer. And options can be a string, that is: +``` +path | +options | +``` + +To reproduce this you have to fully enumerate all of the possible +combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The +awkwardness is a feature: It reminds you of the complexity you're adding to +your API when you do this sort of thing. + + +### Browser support + +This has no dependencies and should work in browsers, though you'll have +noisier stack traces. + +### Why this exists + +I wanted a very simple argument validator. It needed to do two things: + +1. Be more concise and easier to use than assertions + +2. Not encourage an infinite bikeshed of DSLs + +This is why types are specified by a single character and there's no such +thing as an optional argument. + +This is not intended to validate user data. This is specifically about +asserting the interface of your functions. + +If you need greater validation, I encourage you to write them by hand or +look elsewhere. + diff --git a/user-service/node_modules/aproba/index.js b/user-service/node_modules/aproba/index.js new file mode 100644 index 0000000000..fd947481ba --- /dev/null +++ b/user-service/node_modules/aproba/index.js @@ -0,0 +1,105 @@ +'use strict' +module.exports = validate + +function isArguments (thingy) { + return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee') +} + +const types = { + '*': {label: 'any', check: () => true}, + A: {label: 'array', check: _ => Array.isArray(_) || isArguments(_)}, + S: {label: 'string', check: _ => typeof _ === 'string'}, + N: {label: 'number', check: _ => typeof _ === 'number'}, + F: {label: 'function', check: _ => typeof _ === 'function'}, + O: {label: 'object', check: _ => typeof _ === 'object' && _ != null && !types.A.check(_) && !types.E.check(_)}, + B: {label: 'boolean', check: _ => typeof _ === 'boolean'}, + E: {label: 'error', check: _ => _ instanceof Error}, + Z: {label: 'null', check: _ => _ == null} +} + +function addSchema (schema, arity) { + const group = arity[schema.length] = arity[schema.length] || [] + if (group.indexOf(schema) === -1) group.push(schema) +} + +function validate (rawSchemas, args) { + if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length) + if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas') + if (!args) throw missingRequiredArg(1, 'args') + if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas) + if (!types.A.check(args)) throw invalidType(1, ['array'], args) + const schemas = rawSchemas.split('|') + const arity = {} + + schemas.forEach(schema => { + for (let ii = 0; ii < schema.length; ++ii) { + const type = schema[ii] + if (!types[type]) throw unknownType(ii, type) + } + if (/E.*E/.test(schema)) throw moreThanOneError(schema) + addSchema(schema, arity) + if (/E/.test(schema)) { + addSchema(schema.replace(/E.*$/, 'E'), arity) + addSchema(schema.replace(/E/, 'Z'), arity) + if (schema.length === 1) addSchema('', arity) + } + }) + let matching = arity[args.length] + if (!matching) { + throw wrongNumberOfArgs(Object.keys(arity), args.length) + } + for (let ii = 0; ii < args.length; ++ii) { + let newMatching = matching.filter(schema => { + const type = schema[ii] + const typeCheck = types[type].check + return typeCheck(args[ii]) + }) + if (!newMatching.length) { + const labels = matching.map(_ => types[_[ii]].label).filter(_ => _ != null) + throw invalidType(ii, labels, args[ii]) + } + matching = newMatching + } +} + +function missingRequiredArg (num) { + return newException('EMISSINGARG', 'Missing required argument #' + (num + 1)) +} + +function unknownType (num, type) { + return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1)) +} + +function invalidType (num, expectedTypes, value) { + let valueType + Object.keys(types).forEach(typeCode => { + if (types[typeCode].check(value)) valueType = types[typeCode].label + }) + return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' + + englishList(expectedTypes) + ' but got ' + valueType) +} + +function englishList (list) { + return list.join(', ').replace(/, ([^,]+)$/, ' or $1') +} + +function wrongNumberOfArgs (expected, got) { + const english = englishList(expected) + const args = expected.every(ex => ex.length === 1) + ? 'argument' + : 'arguments' + return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got) +} + +function moreThanOneError (schema) { + return newException('ETOOMANYERRORTYPES', + 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"') +} + +function newException (code, msg) { + const err = new Error(msg) + err.code = code + /* istanbul ignore else */ + if (Error.captureStackTrace) Error.captureStackTrace(err, validate) + return err +} diff --git a/user-service/node_modules/aproba/package.json b/user-service/node_modules/aproba/package.json new file mode 100644 index 0000000000..d2212d30d8 --- /dev/null +++ b/user-service/node_modules/aproba/package.json @@ -0,0 +1,35 @@ +{ + "name": "aproba", + "version": "2.0.0", + "description": "A ridiculously light-weight argument validator (now browser friendly)", + "main": "index.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "standard": "^11.0.1", + "tap": "^12.0.1" + }, + "files": [ + "index.js" + ], + "scripts": { + "pretest": "standard", + "test": "tap --100 -J test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/iarna/aproba" + }, + "keywords": [ + "argument", + "validate" + ], + "author": "Rebecca Turner ", + "license": "ISC", + "bugs": { + "url": "https://github.com/iarna/aproba/issues" + }, + "homepage": "https://github.com/iarna/aproba" +} diff --git a/user-service/node_modules/are-we-there-yet/LICENSE.md b/user-service/node_modules/are-we-there-yet/LICENSE.md new file mode 100644 index 0000000000..845be76f64 --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/LICENSE.md @@ -0,0 +1,18 @@ +ISC License + +Copyright npm, Inc. + +Permission to use, copy, modify, and/or distribute this +software for any purpose with or without fee is hereby +granted, provided that the above copyright notice and this +permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO +EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/user-service/node_modules/are-we-there-yet/README.md b/user-service/node_modules/are-we-there-yet/README.md new file mode 100644 index 0000000000..caae19b0a8 --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/README.md @@ -0,0 +1,208 @@ +are-we-there-yet +---------------- + +Track complex hierarchies of asynchronous task completion statuses. This is +intended to give you a way of recording and reporting the progress of the big +recursive fan-out and gather type workflows that are so common in async. + +What you do with this completion data is up to you, but the most common use case is to +feed it to one of the many progress bar modules. + +Most progress bar modules include a rudimentary version of this, but my +needs were more complex. + +Usage +===== + +```javascript +var TrackerGroup = require("are-we-there-yet").TrackerGroup + +var top = new TrackerGroup("program") + +var single = top.newItem("one thing", 100) +single.completeWork(20) + +console.log(top.completed()) // 0.2 + +fs.stat("file", function(er, stat) { + if (er) throw er + var stream = top.newStream("file", stat.size) + console.log(top.completed()) // now 0.1 as single is 50% of the job and is 20% complete + // and 50% * 20% == 10% + fs.createReadStream("file").pipe(stream).on("data", function (chunk) { + // do stuff with chunk + }) + top.on("change", function (name) { + // called each time a chunk is read from "file" + // top.completed() will start at 0.1 and fill up to 0.6 as the file is read + }) +}) +``` + +Shared Methods +============== + +* var completed = tracker.completed() + +Implemented in: `Tracker`, `TrackerGroup`, `TrackerStream` + +Returns the ratio of completed work to work to be done. Range of 0 to 1. + +* tracker.finish() + +Implemented in: `Tracker`, `TrackerGroup` + +Marks the tracker as completed. With a TrackerGroup this marks all of its +components as completed. + +Marks all of the components of this tracker as finished, which in turn means +that `tracker.completed()` for this will now be 1. + +This will result in one or more `change` events being emitted. + +Events +====== + +All tracker objects emit `change` events with the following arguments: + +``` +function (name, completed, tracker) +``` + +`name` is the name of the tracker that originally emitted the event, +or if it didn't have one, the first containing tracker group that had one. + +`completed` is the percent complete (as returned by `tracker.completed()` method). + +`tracker` is the tracker object that you are listening for events on. + +TrackerGroup +============ + +* var tracker = new TrackerGroup(**name**) + + * **name** *(optional)* - The name of this tracker group, used in change + notifications if the component updating didn't have a name. Defaults to undefined. + +Creates a new empty tracker aggregation group. These are trackers whose +completion status is determined by the completion status of other trackers added to this aggregation group. + +Ex. + +```javascript +var tracker = new TrackerGroup("parent") +var foo = tracker.newItem("firstChild", 100) +var bar = tracker.newItem("secondChild", 100) + +foo.finish() +console.log(tracker.completed()) // 0.5 +bar.finish() +console.log(tracker.completed()) // 1 +``` + +* tracker.addUnit(**otherTracker**, **weight**) + + * **otherTracker** - Any of the other are-we-there-yet tracker objects + * **weight** *(optional)* - The weight to give the tracker, defaults to 1. + +Adds the **otherTracker** to this aggregation group. The weight determines +how long you expect this tracker to take to complete in proportion to other +units. So for instance, if you add one tracker with a weight of 1 and +another with a weight of 2, you're saying the second will take twice as long +to complete as the first. As such, the first will account for 33% of the +completion of this tracker and the second will account for the other 67%. + +Returns **otherTracker**. + +* var subGroup = tracker.newGroup(**name**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subGroup = tracker.addUnit(new TrackerGroup(name), weight) +``` + +* var subItem = tracker.newItem(**name**, **todo**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subItem = tracker.addUnit(new Tracker(name, todo), weight) +``` + +* var subStream = tracker.newStream(**name**, **todo**, **weight**) + +The above is exactly equivalent to: + +```javascript + var subStream = tracker.addUnit(new TrackerStream(name, todo), weight) +``` + +* console.log( tracker.debug() ) + +Returns a tree showing the completion of this tracker group and all of its +children, including recursively entering all of the children. + +Tracker +======= + +* var tracker = new Tracker(**name**, **todo**) + + * **name** *(optional)* The name of this counter to report in change + events. Defaults to undefined. + * **todo** *(optional)* The amount of work todo (a number). Defaults to 0. + +Ordinarily these are constructed as a part of a tracker group (via +`newItem`). + +* var completed = tracker.completed() + +Returns the ratio of completed work to work to be done. Range of 0 to 1. If +total work to be done is 0 then it will return 0. + +* tracker.addWork(**todo**) + + * **todo** A number to add to the amount of work to be done. + +Increases the amount of work to be done, thus decreasing the completion +percentage. Triggers a `change` event. + +* tracker.completeWork(**completed**) + + * **completed** A number to add to the work complete + +Increase the amount of work complete, thus increasing the completion percentage. +Will never increase the work completed past the amount of work todo. That is, +percentages > 100% are not allowed. Triggers a `change` event. + +* tracker.finish() + +Marks this tracker as finished, tracker.completed() will now be 1. Triggers +a `change` event. + +TrackerStream +============= + +* var tracker = new TrackerStream(**name**, **size**, **options**) + + * **name** *(optional)* The name of this counter to report in change + events. Defaults to undefined. + * **size** *(optional)* The number of bytes being sent through this stream. + * **options** *(optional)* A hash of stream options + +The tracker stream object is a pass through stream that updates an internal +tracker object each time a block passes through. It's intended to track +downloads, file extraction and other related activities. You use it by piping +your data source into it and then using it as your data source. + +If your data has a length attribute then that's used as the amount of work +completed when the chunk is passed through. If it does not (eg, object +streams) then each chunk counts as completing 1 unit of work, so your size +should be the total number of objects being streamed. + +* tracker.addWork(**todo**) + + * **todo** Increase the expected overall size by **todo** bytes. + +Increases the amount of work to be done, thus decreasing the completion +percentage. Triggers a `change` event. diff --git a/user-service/node_modules/are-we-there-yet/lib/index.js b/user-service/node_modules/are-we-there-yet/lib/index.js new file mode 100644 index 0000000000..57d8743fda --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/lib/index.js @@ -0,0 +1,4 @@ +'use strict' +exports.TrackerGroup = require('./tracker-group.js') +exports.Tracker = require('./tracker.js') +exports.TrackerStream = require('./tracker-stream.js') diff --git a/user-service/node_modules/are-we-there-yet/lib/tracker-base.js b/user-service/node_modules/are-we-there-yet/lib/tracker-base.js new file mode 100644 index 0000000000..6f43687557 --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/lib/tracker-base.js @@ -0,0 +1,11 @@ +'use strict' +var EventEmitter = require('events').EventEmitter +var util = require('util') + +var trackerId = 0 +var TrackerBase = module.exports = function (name) { + EventEmitter.call(this) + this.id = ++trackerId + this.name = name +} +util.inherits(TrackerBase, EventEmitter) diff --git a/user-service/node_modules/are-we-there-yet/lib/tracker-group.js b/user-service/node_modules/are-we-there-yet/lib/tracker-group.js new file mode 100644 index 0000000000..9da13f8a7e --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/lib/tracker-group.js @@ -0,0 +1,116 @@ +'use strict' +var util = require('util') +var TrackerBase = require('./tracker-base.js') +var Tracker = require('./tracker.js') +var TrackerStream = require('./tracker-stream.js') + +var TrackerGroup = module.exports = function (name) { + TrackerBase.call(this, name) + this.parentGroup = null + this.trackers = [] + this.completion = {} + this.weight = {} + this.totalWeight = 0 + this.finished = false + this.bubbleChange = bubbleChange(this) +} +util.inherits(TrackerGroup, TrackerBase) + +function bubbleChange (trackerGroup) { + return function (name, completed, tracker) { + trackerGroup.completion[tracker.id] = completed + if (trackerGroup.finished) { + return + } + trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup) + } +} + +TrackerGroup.prototype.nameInTree = function () { + var names = [] + var from = this + while (from) { + names.unshift(from.name) + from = from.parentGroup + } + return names.join('/') +} + +TrackerGroup.prototype.addUnit = function (unit, weight) { + if (unit.addUnit) { + var toTest = this + while (toTest) { + if (unit === toTest) { + throw new Error( + 'Attempted to add tracker group ' + + unit.name + ' to tree that already includes it ' + + this.nameInTree(this)) + } + toTest = toTest.parentGroup + } + unit.parentGroup = this + } + this.weight[unit.id] = weight || 1 + this.totalWeight += this.weight[unit.id] + this.trackers.push(unit) + this.completion[unit.id] = unit.completed() + unit.on('change', this.bubbleChange) + if (!this.finished) { + this.emit('change', unit.name, this.completion[unit.id], unit) + } + return unit +} + +TrackerGroup.prototype.completed = function () { + if (this.trackers.length === 0) { + return 0 + } + var valPerWeight = 1 / this.totalWeight + var completed = 0 + for (var ii = 0; ii < this.trackers.length; ii++) { + var trackerId = this.trackers[ii].id + completed += + valPerWeight * this.weight[trackerId] * this.completion[trackerId] + } + return completed +} + +TrackerGroup.prototype.newGroup = function (name, weight) { + return this.addUnit(new TrackerGroup(name), weight) +} + +TrackerGroup.prototype.newItem = function (name, todo, weight) { + return this.addUnit(new Tracker(name, todo), weight) +} + +TrackerGroup.prototype.newStream = function (name, todo, weight) { + return this.addUnit(new TrackerStream(name, todo), weight) +} + +TrackerGroup.prototype.finish = function () { + this.finished = true + if (!this.trackers.length) { + this.addUnit(new Tracker(), 1, true) + } + for (var ii = 0; ii < this.trackers.length; ii++) { + var tracker = this.trackers[ii] + tracker.finish() + tracker.removeListener('change', this.bubbleChange) + } + this.emit('change', this.name, 1, this) +} + +var buffer = ' ' +TrackerGroup.prototype.debug = function (depth) { + depth = depth || 0 + var indent = depth ? buffer.substr(0, depth) : '' + var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n' + this.trackers.forEach(function (tracker) { + if (tracker instanceof TrackerGroup) { + output += tracker.debug(depth + 1) + } else { + output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n' + } + }) + return output +} diff --git a/user-service/node_modules/are-we-there-yet/lib/tracker-stream.js b/user-service/node_modules/are-we-there-yet/lib/tracker-stream.js new file mode 100644 index 0000000000..e1cf850557 --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/lib/tracker-stream.js @@ -0,0 +1,36 @@ +'use strict' +var util = require('util') +var stream = require('readable-stream') +var delegate = require('delegates') +var Tracker = require('./tracker.js') + +var TrackerStream = module.exports = function (name, size, options) { + stream.Transform.call(this, options) + this.tracker = new Tracker(name, size) + this.name = name + this.id = this.tracker.id + this.tracker.on('change', delegateChange(this)) +} +util.inherits(TrackerStream, stream.Transform) + +function delegateChange (trackerStream) { + return function (name, completion, tracker) { + trackerStream.emit('change', name, completion, trackerStream) + } +} + +TrackerStream.prototype._transform = function (data, encoding, cb) { + this.tracker.completeWork(data.length ? data.length : 1) + this.push(data) + cb() +} + +TrackerStream.prototype._flush = function (cb) { + this.tracker.finish() + cb() +} + +delegate(TrackerStream.prototype, 'tracker') + .method('completed') + .method('addWork') + .method('finish') diff --git a/user-service/node_modules/are-we-there-yet/lib/tracker.js b/user-service/node_modules/are-we-there-yet/lib/tracker.js new file mode 100644 index 0000000000..a8f8b3ba01 --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/lib/tracker.js @@ -0,0 +1,32 @@ +'use strict' +var util = require('util') +var TrackerBase = require('./tracker-base.js') + +var Tracker = module.exports = function (name, todo) { + TrackerBase.call(this, name) + this.workDone = 0 + this.workTodo = todo || 0 +} +util.inherits(Tracker, TrackerBase) + +Tracker.prototype.completed = function () { + return this.workTodo === 0 ? 0 : this.workDone / this.workTodo +} + +Tracker.prototype.addWork = function (work) { + this.workTodo += work + this.emit('change', this.name, this.completed(), this) +} + +Tracker.prototype.completeWork = function (work) { + this.workDone += work + if (this.workDone > this.workTodo) { + this.workDone = this.workTodo + } + this.emit('change', this.name, this.completed(), this) +} + +Tracker.prototype.finish = function () { + this.workTodo = this.workDone = 1 + this.emit('change', this.name, 1, this) +} diff --git a/user-service/node_modules/are-we-there-yet/package.json b/user-service/node_modules/are-we-there-yet/package.json new file mode 100644 index 0000000000..5714e09c3b --- /dev/null +++ b/user-service/node_modules/are-we-there-yet/package.json @@ -0,0 +1,53 @@ +{ + "name": "are-we-there-yet", + "version": "2.0.0", + "description": "Keep track of the overall completion of many disparate processes", + "main": "lib/index.js", + "scripts": { + "test": "tap", + "npmclilint": "npmcli-lint", + "lint": "eslint '**/*.js'", + "lintfix": "npm run lint -- --fix", + "posttest": "npm run lint", + "postsnap": "npm run lintfix --", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "snap": "tap" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/are-we-there-yet.git" + }, + "author": "GitHub Inc.", + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/are-we-there-yet/issues" + }, + "homepage": "https://github.com/npm/are-we-there-yet", + "devDependencies": { + "@npmcli/eslint-config": "^1.0.0", + "@npmcli/template-oss": "^1.0.2", + "eslint": "^7.32.0", + "eslint-plugin-node": "^11.1.0", + "tap": "^15.0.9" + }, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "files": [ + "bin", + "lib" + ], + "engines": { + "node": ">=10" + }, + "tap": { + "branches": 68, + "statements": 92, + "functions": 86, + "lines": 92 + }, + "templateVersion": "1.0.2" +} diff --git a/user-service/node_modules/array-flatten/LICENSE b/user-service/node_modules/array-flatten/LICENSE new file mode 100644 index 0000000000..983fbe8aec --- /dev/null +++ b/user-service/node_modules/array-flatten/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/user-service/node_modules/array-flatten/README.md b/user-service/node_modules/array-flatten/README.md new file mode 100644 index 0000000000..91fa5b637e --- /dev/null +++ b/user-service/node_modules/array-flatten/README.md @@ -0,0 +1,43 @@ +# Array Flatten + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. + +## Installation + +``` +npm install array-flatten --save +``` + +## Usage + +```javascript +var flatten = require('array-flatten') + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) +//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) +//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] + +(function () { + flatten(arguments) //=> [1, 2, 3] +})(1, [2, 3]) +``` + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat +[npm-url]: https://npmjs.org/package/array-flatten +[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat +[downloads-url]: https://npmjs.org/package/array-flatten +[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat +[travis-url]: https://travis-ci.org/blakeembrey/array-flatten +[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat +[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/user-service/node_modules/array-flatten/array-flatten.js b/user-service/node_modules/array-flatten/array-flatten.js new file mode 100644 index 0000000000..089117b322 --- /dev/null +++ b/user-service/node_modules/array-flatten/array-flatten.js @@ -0,0 +1,64 @@ +'use strict' + +/** + * Expose `arrayFlatten`. + */ +module.exports = arrayFlatten + +/** + * Recursive flatten function with depth. + * + * @param {Array} array + * @param {Array} result + * @param {Number} depth + * @return {Array} + */ +function flattenWithDepth (array, result, depth) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (depth > 0 && Array.isArray(value)) { + flattenWithDepth(value, result, depth - 1) + } else { + result.push(value) + } + } + + return result +} + +/** + * Recursive flatten function. Omitting depth is slightly faster. + * + * @param {Array} array + * @param {Array} result + * @return {Array} + */ +function flattenForever (array, result) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (Array.isArray(value)) { + flattenForever(value, result) + } else { + result.push(value) + } + } + + return result +} + +/** + * Flatten an array, with the ability to define a depth. + * + * @param {Array} array + * @param {Number} depth + * @return {Array} + */ +function arrayFlatten (array, depth) { + if (depth == null) { + return flattenForever(array, []) + } + + return flattenWithDepth(array, [], depth) +} diff --git a/user-service/node_modules/array-flatten/package.json b/user-service/node_modules/array-flatten/package.json new file mode 100644 index 0000000000..1a24e2a1a1 --- /dev/null +++ b/user-service/node_modules/array-flatten/package.json @@ -0,0 +1,39 @@ +{ + "name": "array-flatten", + "version": "1.1.1", + "description": "Flatten an array of nested arrays into a single flat array", + "main": "array-flatten.js", + "files": [ + "array-flatten.js", + "LICENSE" + ], + "scripts": { + "test": "istanbul cover _mocha -- -R spec" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/array-flatten.git" + }, + "keywords": [ + "array", + "flatten", + "arguments", + "depth" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/array-flatten/issues" + }, + "homepage": "https://github.com/blakeembrey/array-flatten", + "devDependencies": { + "istanbul": "^0.3.13", + "mocha": "^2.2.4", + "pre-commit": "^1.0.7", + "standard": "^3.7.3" + } +} diff --git a/user-service/node_modules/balanced-match/.github/FUNDING.yml b/user-service/node_modules/balanced-match/.github/FUNDING.yml new file mode 100644 index 0000000000..cea8b16e9e --- /dev/null +++ b/user-service/node_modules/balanced-match/.github/FUNDING.yml @@ -0,0 +1,2 @@ +tidelift: "npm/balanced-match" +patreon: juliangruber diff --git a/user-service/node_modules/balanced-match/LICENSE.md b/user-service/node_modules/balanced-match/LICENSE.md new file mode 100644 index 0000000000..2cdc8e4148 --- /dev/null +++ b/user-service/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,21 @@ +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/balanced-match/README.md b/user-service/node_modules/balanced-match/README.md new file mode 100644 index 0000000000..d2a48b6b49 --- /dev/null +++ b/user-service/node_modules/balanced-match/README.md @@ -0,0 +1,97 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/balanced-match/index.js b/user-service/node_modules/balanced-match/index.js new file mode 100644 index 0000000000..c67a64608d --- /dev/null +++ b/user-service/node_modules/balanced-match/index.js @@ -0,0 +1,62 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + if(a===b) { + return [ai, bi]; + } + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/user-service/node_modules/balanced-match/package.json b/user-service/node_modules/balanced-match/package.json new file mode 100644 index 0000000000..ce6073e040 --- /dev/null +++ b/user-service/node_modules/balanced-match/package.json @@ -0,0 +1,48 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "1.0.2", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "tape test/test.js", + "bench": "matcha test/bench.js" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/user-service/node_modules/bcrypt/.editorconfig b/user-service/node_modules/bcrypt/.editorconfig new file mode 100644 index 0000000000..4e12f93be2 --- /dev/null +++ b/user-service/node_modules/bcrypt/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{package.json,*.yml}] +indent_style = space +indent_size = 2 + +[appveyor.yml] +end_of_line = crlf + +[*.md] +trim_trailing_whitespace = false diff --git a/user-service/node_modules/bcrypt/.github/workflows/ci.yaml b/user-service/node_modules/bcrypt/.github/workflows/ci.yaml new file mode 100644 index 0000000000..dc3f12f475 --- /dev/null +++ b/user-service/node_modules/bcrypt/.github/workflows/ci.yaml @@ -0,0 +1,59 @@ +name: ci + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build: + strategy: + matrix: + os: [ubuntu-20.04, macos-11.0, windows-2019] + nodeVersion: [14, 16, 18, 20] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.nodeVersion }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.nodeVersion }} + - name: Test + run: npm test + - name: Package + if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/master') + run: npx node-pre-gyp package + - name: Upload + uses: actions/upload-artifact@v3 + if: matrix.nodeVersion == '14' && (startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/master')) + with: + name: bcrypt-lib-${{ matrix.os }}-${{ matrix.nodeVersion }} + path: build/stage/**/bcrypt_lib*.tar.gz + + build-alpine: + runs-on: ubuntu-latest + strategy: + matrix: + nodeVersion: [14, 16, 18, 20] + container: + image: node:${{ matrix.nodeVersion }}-alpine + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + apk add make g++ python3 + - name: Test + run: | + npm test --unsafe-perm + - name: Package + if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/master') + run: npx node-pre-gyp package --unsafe-perm + - name: Upload + if: matrix.nodeVersion == '14' && (startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/master')) + uses: actions/upload-artifact@v3 + with: + name: bcrypt-lib-alpine-${{ matrix.nodeVersion }} + path: build/stage/**/bcrypt_lib*.tar.gz diff --git a/user-service/node_modules/bcrypt/.travis.yml b/user-service/node_modules/bcrypt/.travis.yml new file mode 100644 index 0000000000..ed78c2717c --- /dev/null +++ b/user-service/node_modules/bcrypt/.travis.yml @@ -0,0 +1,62 @@ +language: node_js + +services: +- docker + +env: +- LINUX_CXX=g++-4.8 + +os: +- linux +- osx + +arch: +- amd64 +- arm64 + +node_js: +- '14' +- '16' +- '17' +- '18' + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.8 + - bc + +before_install: +- echo Building for Node $TRAVIS_NODE_VERSION +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export CXX=$LINUX_CXX; $CXX --version; + fi; +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then c++ --version; fi; +- npm install -g npm@latest + +install: true + +script: +- npm test +- "./node_modules/.bin/node-pre-gyp configure" +- "./node_modules/.bin/node-pre-gyp build" +- "./node_modules/.bin/node-pre-gyp package" +- | + if [[ "$TRAVIS_OS_NAME" == "linux" ]] + then + docker image pull public.ecr.aws/docker/library/node:${TRAVIS_NODE_VERSION}-alpine + docker run -w /src --entrypoint /bin/sh -v`pwd`:/src "node:${TRAVIS_NODE_VERSION}-alpine" test_alpine.sh + fi + +deploy: + provider: releases + skip_cleanup: true + api_key: + secure: j4gQ+m02izaw56EOd0gEStHAjCRfSCkohDWvpABiPzh1YPM9MvfEMSIvzzjV/0oMqi3Sy7eGyFv47EgQHZvouW0I8BIUzxuTCE5wP8z2SjABXCa/rz4WTppTc9d9ABq8JSdz80JxEwjmuwnYeMwWgOd7sT/VDiMxLYaXj0JWO7w= + file_glob: true + file: build/stage/kelektiv/node.bcrypt.js/releases/download/*/* + on: + node_js: '14' + repo: kelektiv/node.bcrypt.js + tags: true diff --git a/user-service/node_modules/bcrypt/CHANGELOG.md b/user-service/node_modules/bcrypt/CHANGELOG.md new file mode 100644 index 0000000000..f2fcb47145 --- /dev/null +++ b/user-service/node_modules/bcrypt/CHANGELOG.md @@ -0,0 +1,178 @@ +# 5.1.0 (2022-10-06) + * Update `node-pre-gyp` to 1.0.11 + +# 5.1.0 (2022-10-06) + * Update `node-pre-gyp` to 1.0.10 + * Replace `nodeunit` with `jest` as the testing library + +# 5.0.1 (2021-02-22) + + * Update `node-pre-gyp` to 1.0.0 + +# 5.0.0 (2020-06-02) + + * Fix the bcrypt "wrap-around" bug. It affects passwords with lengths >= 255. + It is uncommon but it's a bug nevertheless. Previous attempts to fix the bug + was unsuccessful. + * Experimental support for z/OS + * Fix a bug related to NUL in password input + * Update `node-pre-gyp` to 0.15.0 + +# 4.0.1 (2020-02-27) + + * Fix compilation errors in Alpine linux + +# 4.0.0 (2020-02-17) + + * Switch to NAPI bcrypt + * Drop support for NodeJS 8 + +# 3.0.8 (2019-12-31) + + * Update `node-pre-gyp` to 0.14 + * Pre-built binaries for NodeJS 13 + +# 3.0.7 (2019-10-18) + + * Update `nan` to 2.14.0 + * Update `node-pre-gyp` to 0.13 + +# 3.0.6 (2019-04-11) + + * Update `nan` to 2.13.2 + +# 3.0.5 (2019-03-19) + + * Update `nan` to 2.13.1 + * NodeJS 12 compatibility + * Remove `node-pre-gyp` from bundled dependencies + +# 3.0.4-napi (2019-03-08) + + * Sync N-API bcrypt with NAN bcrypt + +# 3.0.4 (2019-02-07) + + * Fix GCC, NAN and V8 deprecation warnings + +# 3.0.3 (2018-12-19) + + * Update `nan` to 2.12.1 + +# 3.0.2 (2018-10-18) + + * Update `nan` to 2.11.1 + +# 3.0.1 (2018-09-20) + + * Update `nan` to 2.11.0 + +# 3.0.0 (2018-07-06) + + * Drop support for NodeJS <= 4 + +# 2.0.1 (2018-04-20) + + * Update `node-pre-gyp` to allow downloading prebuilt modules + +# 2.0.0 (2018-04-07) + + * Make `2b` the default bcrypt version + +# 1.1.0-napi (2018-01-21) + + * Initial support for [N-API](https://nodejs.org/api/n-api.html) + +# 1.0.3 (2016-08-23) + + * update to nan v2.6.2 for NodeJS 8 support + * Fix: use npm scripts instead of node-gyp directly. + +# 1.0.2 (2016-12-31) + + * Fix `compare` promise rejection with invalid arguments + +# 1.0.1 (2016-12-07) + + * Fix destructuring imports with promises + +# 1.0.0 (2016-12-04) + + * add Promise support (commit 2488473) + +# 0.8.7 (2016-06-09) + + * update nan to 2.3.5 for improved node v6 support + +# 0.8.6 (2016-04-20) + + * update nan for node v6 support + +# 0.8.5 (2015-08-12) + + * update to nan v2 (adds support for iojs 3) + +# 0.8.4 (2015-07-24) + + * fix deprecation warning for the Encode API + +# 0.8.3 (2015-05-06) + + * update nan to 1.8.4 for iojs 2.x support + +# 0.8.2 (2015-03-28) + + * always use callback for generating random bytes to avoid blocking + +# 0.8.1 (2015-01-18) + * update NaN to 1.5.0 for iojs support + +# 0.8.0 (2014-08-03) + * migrate to NAN for bindings + +# v0.5.0 + * Fix for issue around empty string params throwing Errors. + * Method deprecation. + * Upgrade from libeio/ev to libuv. (shtylman) + ** --- NOTE --- Breaks 0.4.x compatability + * EV_MULTIPLICITY compile flag. + +# v0.4.1 + * Thread safety fix around OpenSSL (GH-32). (bnoordhuis - through node) + * C++ code changes using delete and new instead of malloc and free. (shtylman) + * Compile options for speed, zoom. (shtylman) + * Move much of the type and variable checking to the JS. (shtylman) + +# v0.4.0 + * Added getRounds function that will tell you the number of rounds within a hash/salt + +# v0.3.2 + * Fix api issue with async salt gen first param + +# v0.3.1 + * Compile under node 0.5.x + +# v0.3.0 + * Internal Refactoring + * Remove pthread dependencies and locking + * Fix compiler warnings and a memory bug + +# v0.2.4 + * Use threadsafe functions instead of pthread mutexes + * salt validation to make sure the salt is of the correct size and format + +# v0.2.3 + * cygwin support + +# v0.2.2 + * Remove dependency on libbsd, use libssl instead + +# v0.2.0 + * Added async functionality + * API changes + * hashpw -> encrypt + * all old sync methods now end with _sync + * Removed libbsd(arc4random) dependency...now uses openssl which is more widely spread + +# v0.1.2 + * Security fix. Wasn't reading rounds in properly and was always only using 4 rounds diff --git a/user-service/node_modules/bcrypt/ISSUE_TEMPLATE.md b/user-service/node_modules/bcrypt/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..b4baa00867 --- /dev/null +++ b/user-service/node_modules/bcrypt/ISSUE_TEMPLATE.md @@ -0,0 +1,18 @@ +Thanks for reporting a new issue with the node bcrypt module! + +To help you resolve your issue faster please make sure you have done the following: + +* Searched existing issues (even closed ones) for your same problem +* Make sure you have installed the required dependencies listed on the readme +* Read your npm error log for lines telling you what failed, usually it is a problem with not having the correct dependencies installed to build the native module + +Once you have done the above and are still confident that the issue is with the module, please describe it below. Some things that really help get your issue resolved faster are: + +* What went wrong? +* What did you expect to happen? +* Which version of nodejs and OS? +* If you find a bug, please write a failing test. + +Thanks! + +P.S. If it doesn't look like you read the above then your issue will likely be closed without further explanation. Sorry, but there are just too many issues opened with no useful information or questions which have been previously addressed. diff --git a/user-service/node_modules/bcrypt/LICENSE b/user-service/node_modules/bcrypt/LICENSE new file mode 100644 index 0000000000..94e2ba5f90 --- /dev/null +++ b/user-service/node_modules/bcrypt/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Nicholas Campbell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/user-service/node_modules/bcrypt/Makefile b/user-service/node_modules/bcrypt/Makefile new file mode 100644 index 0000000000..0b49b3db71 --- /dev/null +++ b/user-service/node_modules/bcrypt/Makefile @@ -0,0 +1,19 @@ +TESTS = test/*.js + +all: test + +build: clean compile + +compile: + npm install . + npm run install + +test: build + @./node_modules/nodeunit/bin/nodeunit \ + $(TESTS) + +clean: + rm -Rf lib/bindings/ + + +.PHONY: clean test build diff --git a/user-service/node_modules/bcrypt/README.md b/user-service/node_modules/bcrypt/README.md new file mode 100644 index 0000000000..059aa3ac7c --- /dev/null +++ b/user-service/node_modules/bcrypt/README.md @@ -0,0 +1,388 @@ +# node.bcrypt.js + +[![ci](https://github.com/kelektiv/node.bcrypt.js/actions/workflows/ci.yaml/badge.svg)](https://github.com/kelektiv/node.bcrypt.js/actions/workflows/ci.yaml) + +[![Build Status](https://ci.appveyor.com/api/projects/status/github/kelektiv/node.bcrypt.js)](https://ci.appveyor.com/project/defunctzombie/node-bcrypt-js-pgo26/branch/master) + +A library to help you hash passwords. + +You can read about [bcrypt in Wikipedia][bcryptwiki] as well as in the following article: +[How To Safely Store A Password][codahale] + +## If You Are Submitting Bugs or Issues + +Please verify that the NodeJS version you are using is a _stable_ version; Unstable versions are currently not supported and issues created while using an unstable version will be closed. + +If you are on a stable version of NodeJS, please provide a sufficient code snippet or log files for installation issues. The code snippet does not require you to include confidential information. However, it must provide enough information so the problem can be replicable, or it may be closed without an explanation. + + +## Version Compatibility + +_Please upgrade to atleast v5.0.0 to avoid security issues mentioned below._ + +| Node Version | Bcrypt Version | +| -------------- | ------------------| +| 0.4 | <= 0.4 | +| 0.6, 0.8, 0.10 | >= 0.5 | +| 0.11 | >= 0.8 | +| 4 | <= 2.1.0 | +| 8 | >= 1.0.3 < 4.0.0 | +| 10, 11 | >= 3 | +| 12 onwards | >= 3.0.6 | + +`node-gyp` only works with stable/released versions of node. Since the `bcrypt` module uses `node-gyp` to build and install, you'll need a stable version of node to use bcrypt. If you do not, you'll likely see an error that starts with: + +``` +gyp ERR! stack Error: "pre" versions of node cannot be installed, use the --nodedir flag instead +``` + +## Security Issues And Concerns + +> Per bcrypt implementation, only the first 72 bytes of a string are used. Any extra bytes are ignored when matching passwords. Note that this is not the first 72 *characters*. It is possible for a string to contain less than 72 characters, while taking up more than 72 bytes (e.g. a UTF-8 encoded string containing emojis). + +As should be the case with any security tool, anyone using this library should scrutinise it. If you find or suspect an issue with the code, please bring it to the maintainers' attention. We will spend some time ensuring that this library is as secure as possible. + +Here is a list of BCrypt-related security issues/concerns that have come up over the years. + +* An [issue with passwords][jtr] was found with a version of the Blowfish algorithm developed for John the Ripper. This is not present in the OpenBSD version and is thus not a problem for this module. HT [zooko][zooko]. +* Versions `< 5.0.0` suffer from bcrypt wrap-around bug and _will truncate passwords >= 255 characters leading to severely weakened passwords_. Please upgrade at earliest. See [this wiki page][wrap-around-bug] for more details. +* Versions `< 5.0.0` _do not handle NUL characters inside passwords properly leading to all subsequent characters being dropped and thus resulting in severely weakened passwords_. Please upgrade at earliest. See [this wiki page][improper-nuls] for more details. + +## Compatibility Note + +This library supports `$2a$` and `$2b$` prefix bcrypt hashes. `$2x$` and `$2y$` hashes are specific to bcrypt implementation developed for John the Ripper. In theory, they should be compatible with `$2b$` prefix. + +Compatibility with hashes generated by other languages is not 100% guaranteed due to difference in character encodings. However, it should not be an issue for most cases. + +### Migrating from v1.0.x + +Hashes generated in earlier version of `bcrypt` remain 100% supported in `v2.x.x` and later versions. In most cases, the migration should be a bump in the `package.json`. + +Hashes generated in `v2.x.x` using the defaults parameters will not work in earlier versions. + +## Dependencies + +* NodeJS +* `node-gyp` + * Please check the dependencies for this tool at: https://github.com/nodejs/node-gyp + * Windows users will need the options for c# and c++ installed with their visual studio instance. + * Python 2.x/3.x +* `OpenSSL` - This is only required to build the `bcrypt` project if you are using versions <= 0.7.7. Otherwise, we're using the builtin node crypto bindings for seed data (which use the same OpenSSL code paths we were, but don't have the external dependency). + +## Install via NPM + +``` +npm install bcrypt +``` +***Note:*** OS X users using Xcode 4.3.1 or above may need to run the following command in their terminal prior to installing if errors occur regarding xcodebuild: ```sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer``` + +_Pre-built binaries for various NodeJS versions are made available on a best-effort basis._ + +Only the current stable and supported LTS releases are actively tested against. + +_There may be an interval between the release of the module and the availabilty of the compiled modules._ + +Currently, we have pre-built binaries that support the following platforms: + +1. Windows x32 and x64 +2. Linux x64 (GlibC and musl) +3. macOS + +If you face an error like this: + +``` +node-pre-gyp ERR! Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.2/bcrypt_lib-v1.0.2-node-v48-linux-x64.tar.gz +``` + +make sure you have the appropriate dependencies installed and configured for your platform. You can find installation instructions for the dependencies for some common platforms [in this page][depsinstall]. + +## Usage + +### async (recommended) + +```javascript +const bcrypt = require('bcrypt'); +const saltRounds = 10; +const myPlaintextPassword = 's0/\/\P4$$w0rD'; +const someOtherPlaintextPassword = 'not_bacon'; +``` + +#### To hash a password: + +Technique 1 (generate a salt and hash on separate function calls): + +```javascript +bcrypt.genSalt(saltRounds, function(err, salt) { + bcrypt.hash(myPlaintextPassword, salt, function(err, hash) { + // Store hash in your password DB. + }); +}); +``` + +Technique 2 (auto-gen a salt and hash): + +```javascript +bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) { + // Store hash in your password DB. +}); +``` + +Note that both techniques achieve the same end-result. + +#### To check a password: + +```javascript +// Load hash from your password DB. +bcrypt.compare(myPlaintextPassword, hash, function(err, result) { + // result == true +}); +bcrypt.compare(someOtherPlaintextPassword, hash, function(err, result) { + // result == false +}); +``` + +[A Note on Timing Attacks](#a-note-on-timing-attacks) + +### with promises + +bcrypt uses whatever `Promise` implementation is available in `global.Promise`. NodeJS >= 0.12 has a native `Promise` implementation built in. However, this should work in any Promises/A+ compliant implementation. + +Async methods that accept a callback, return a `Promise` when callback is not specified if Promise support is available. + +```javascript +bcrypt.hash(myPlaintextPassword, saltRounds).then(function(hash) { + // Store hash in your password DB. +}); +``` +```javascript +// Load hash from your password DB. +bcrypt.compare(myPlaintextPassword, hash).then(function(result) { + // result == true +}); +bcrypt.compare(someOtherPlaintextPassword, hash).then(function(result) { + // result == false +}); +``` + +This is also compatible with `async/await` + +```javascript +async function checkUser(username, password) { + //... fetch user from a db etc. + + const match = await bcrypt.compare(password, user.passwordHash); + + if(match) { + //login + } + + //... +} +``` + +### ESM import +```javascript +import bcrypt from "bcrypt"; + +// later +await bcrypt.compare(password, hash); +``` + +### sync + +```javascript +const bcrypt = require('bcrypt'); +const saltRounds = 10; +const myPlaintextPassword = 's0/\/\P4$$w0rD'; +const someOtherPlaintextPassword = 'not_bacon'; +``` + +#### To hash a password: + +Technique 1 (generate a salt and hash on separate function calls): + +```javascript +const salt = bcrypt.genSaltSync(saltRounds); +const hash = bcrypt.hashSync(myPlaintextPassword, salt); +// Store hash in your password DB. +``` + +Technique 2 (auto-gen a salt and hash): + +```javascript +const hash = bcrypt.hashSync(myPlaintextPassword, saltRounds); +// Store hash in your password DB. +``` + +As with async, both techniques achieve the same end-result. + +#### To check a password: + +```javascript +// Load hash from your password DB. +bcrypt.compareSync(myPlaintextPassword, hash); // true +bcrypt.compareSync(someOtherPlaintextPassword, hash); // false +``` + +[A Note on Timing Attacks](#a-note-on-timing-attacks) + +### Why is async mode recommended over sync mode? +We recommend using async API if you use `bcrypt` on a server. Bcrypt hashing is CPU intensive which will cause the sync APIs to block the event loop and prevent your application from servicing any inbound requests or events. The async version uses a thread pool which does not block the main event loop. + +## API + +`BCrypt.` + + * `genSaltSync(rounds, minor)` + * `rounds` - [OPTIONAL] - the cost of processing the data. (default - 10) + * `minor` - [OPTIONAL] - minor version of bcrypt to use. (default - b) + * `genSalt(rounds, minor, cb)` + * `rounds` - [OPTIONAL] - the cost of processing the data. (default - 10) + * `minor` - [OPTIONAL] - minor version of bcrypt to use. (default - b) + * `cb` - [OPTIONAL] - a callback to be fired once the salt has been generated. uses eio making it asynchronous. If `cb` is not specified, a `Promise` is returned if Promise support is available. + * `err` - First parameter to the callback detailing any errors. + * `salt` - Second parameter to the callback providing the generated salt. + * `hashSync(data, salt)` + * `data` - [REQUIRED] - the data to be encrypted. + * `salt` - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated with the specified number of rounds and used (see example under **Usage**). + * `hash(data, salt, cb)` + * `data` - [REQUIRED] - the data to be encrypted. + * `salt` - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated with the specified number of rounds and used (see example under **Usage**). + * `cb` - [OPTIONAL] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous. If `cb` is not specified, a `Promise` is returned if Promise support is available. + * `err` - First parameter to the callback detailing any errors. + * `encrypted` - Second parameter to the callback providing the encrypted form. + * `compareSync(data, encrypted)` + * `data` - [REQUIRED] - data to compare. + * `encrypted` - [REQUIRED] - data to be compared to. + * `compare(data, encrypted, cb)` + * `data` - [REQUIRED] - data to compare. + * `encrypted` - [REQUIRED] - data to be compared to. + * `cb` - [OPTIONAL] - a callback to be fired once the data has been compared. uses eio making it asynchronous. If `cb` is not specified, a `Promise` is returned if Promise support is available. + * `err` - First parameter to the callback detailing any errors. + * `same` - Second parameter to the callback providing whether the data and encrypted forms match [true | false]. + * `getRounds(encrypted)` - return the number of rounds used to encrypt a given hash + * `encrypted` - [REQUIRED] - hash from which the number of rounds used should be extracted. + +## A Note on Rounds + +A note about the cost: when you are hashing your data, the module will go through a series of rounds to give you a secure hash. The value you submit is not just the number of rounds the module will go through to hash your data. The module will use the value you enter and go through `2^rounds` hashing iterations. + +From @garthk, on a 2GHz core you can roughly expect: + + rounds=8 : ~40 hashes/sec + rounds=9 : ~20 hashes/sec + rounds=10: ~10 hashes/sec + rounds=11: ~5 hashes/sec + rounds=12: 2-3 hashes/sec + rounds=13: ~1 sec/hash + rounds=14: ~1.5 sec/hash + rounds=15: ~3 sec/hash + rounds=25: ~1 hour/hash + rounds=31: 2-3 days/hash + + +## A Note on Timing Attacks + +Because it's come up multiple times in this project and other bcrypt projects, it needs to be said. The `bcrypt` library is not susceptible to timing attacks. From codahale/bcrypt-ruby#42: + +> One of the desired properties of a cryptographic hash function is preimage attack resistance, which means there is no shortcut for generating a message which, when hashed, produces a specific digest. + +A great thread on this, in much more detail can be found @ codahale/bcrypt-ruby#43 + +If you're unfamiliar with timing attacks and want to learn more you can find a great writeup @ [A Lesson In Timing Attacks][timingatk] + +However, timing attacks are real. And the comparison function is _not_ time safe. That means that it may exit the function early in the comparison process. Timing attacks happen because of the above. We don't need to be careful that an attacker will learn anything, and our comparison function provides a comparison of hashes. It is a utility to the overall purpose of the library. If you end up using it for something else, we cannot guarantee the security of the comparator. Keep that in mind as you use the library. + +## Hash Info + +The characters that comprise the resultant hash are `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$`. + +Resultant hashes will be 60 characters long and they will include the salt among other parameters, as follows: + +`$[algorithm]$[cost]$[salt][hash]` + +- 2 chars hash algorithm identifier prefix. `"$2a$" or "$2b$"` indicates BCrypt +- Cost-factor (n). Represents the exponent used to determine how many iterations 2^n +- 16-byte (128-bit) salt, base64 encoded to 22 characters +- 24-byte (192-bit) hash, base64 encoded to 31 characters + +Example: +``` +$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa + | | | | + | | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa + | | | + | | salt = nOUIs5kJ7naTuTFkBy1veu + | | + | cost-factor => 10 = 2^10 rounds + | + hash-algorithm identifier => 2b = BCrypt +``` + +## Testing + +If you create a pull request, tests better pass :) + +``` +npm install +npm test +``` + +## Credits + +The code for this comes from a few sources: + +* blowfish.cc - OpenBSD +* bcrypt.cc - OpenBSD +* bcrypt::gen_salt - [gen_salt inclusion to bcrypt][bcryptgs] +* bcrypt_node.cc - me + +## Contributors + +* [Antonio Salazar Cardozo][shadowfiend] - Early MacOS X support (when we used libbsd) +* [Ben Glow][pixelglow] - Fixes for thread safety with async calls +* [Van Nguyen][thegoleffect] - Found a timing attack in the comparator +* [NewITFarmer][newitfarmer] - Initial Cygwin support +* [David Trejo][dtrejo] - packaging fixes +* [Alfred Westerveld][alfredwesterveld] - packaging fixes +* [Vincent Côté-Roy][vincentr] - Testing around concurrency issues +* [Lloyd Hilaiel][lloyd] - Documentation fixes +* [Roman Shtylman][shtylman] - Code refactoring, general rot reduction, compile options, better memory management with delete and new, and an upgrade to libuv over eio/ev. +* [Vadim Graboys][vadimg] - Code changes to support 0.5.5+ +* [Ben Noordhuis][bnoordhuis] - Fixed a thread safety issue in nodejs that was perfectly mappable to this module. +* [Nate Rajlich][tootallnate] - Bindings and build process. +* [Sean McArthur][seanmonstar] - Windows Support +* [Fanie Oosthuysen][weareu] - Windows Support +* [Amitosh Swain Mahapatra][recrsn] - $2b$ hash support, ES6 Promise support +* [Nicola Del Gobbo][NickNaso] - Initial implementation with N-API + +## License +Unless stated elsewhere, file headers or otherwise, the license as stated in the LICENSE file. + +[bcryptwiki]: https://en.wikipedia.org/wiki/Bcrypt +[bcryptgs]: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html +[codahale]: http://codahale.com/how-to-safely-store-a-password/ +[gh13]: https://github.com/ncb000gt/node.bcrypt.js/issues/13 +[jtr]: http://www.openwall.com/lists/oss-security/2011/06/20/2 +[depsinstall]: https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions +[timingatk]: https://codahale.com/a-lesson-in-timing-attacks/ +[wrap-around-bug]: https://github.com/kelektiv/node.bcrypt.js/wiki/Security-Issues-and-Concerns#bcrypt-wrap-around-bug-medium-severity +[improper-nuls]: https://github.com/kelektiv/node.bcrypt.js/wiki/Security-Issues-and-Concerns#improper-nul-handling-medium-severity + +[shadowfiend]:https://github.com/Shadowfiend +[thegoleffect]:https://github.com/thegoleffect +[pixelglow]:https://github.com/pixelglow +[dtrejo]:https://github.com/dtrejo +[alfredwesterveld]:https://github.com/alfredwesterveld +[newitfarmer]:https://github.com/newitfarmer +[zooko]:https://twitter.com/zooko +[vincentr]:https://twitter.com/vincentcr +[lloyd]:https://github.com/lloyd +[shtylman]:https://github.com/shtylman +[vadimg]:https://github.com/vadimg +[bnoordhuis]:https://github.com/bnoordhuis +[tootallnate]:https://github.com/tootallnate +[seanmonstar]:https://github.com/seanmonstar +[weareu]:https://github.com/weareu +[recrsn]:https://github.com/recrsn +[NickNaso]: https://github.com/NickNaso diff --git a/user-service/node_modules/bcrypt/SECURITY.md b/user-service/node_modules/bcrypt/SECURITY.md new file mode 100644 index 0000000000..c132dc869c --- /dev/null +++ b/user-service/node_modules/bcrypt/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +As with any software, `bcrypt` is likely to have bugs. Please report any security vulnerabilities responsibly + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 5.0.x | :white_check_mark: | +| < 5.0 | :x: | + +## Reporting a Vulnerability + +If you are reporting a security vulnerability, please refrain from opening a GitHub issue and instead mail it to +one of the maintainers listed in the README. diff --git a/user-service/node_modules/bcrypt/appveyor.yml b/user-service/node_modules/bcrypt/appveyor.yml new file mode 100644 index 0000000000..d9b4ebb46d --- /dev/null +++ b/user-service/node_modules/bcrypt/appveyor.yml @@ -0,0 +1,39 @@ +environment: + matrix: + - nodejs_version: "14" + platform: x64 + - nodejs_version: "14" + platform: x86 + - nodejs_version: "16" + platform: x64 + - nodejs_version: "16" + platform: x86 + - nodejs_version: "18" + platform: x64 + +install: + - where npm + - where node + - ps: Install-Product node $env:nodejs_version $env:platform + +build: off + +artifacts: + - path: 'build/stage/**/bcrypt*.tar.gz' + +test_script: + - node --version + - npm --version + - npm test + +after_test: + - .\node_modules\.bin\node-pre-gyp package + +on_success: + - ps: > + if ($env:NODE_PRE_GYP_GITHUB_TOKEN -ne $null -and $env:APPVEYOR_REPO_TAG_NAME -match '^v(0|[1-9]+)\.(0|[1-9]+)\.(0|[1-9]+)(-\w)?$') { + echo "Publishing $env:APPVEYOR_REPO_TAG_NAME" + npm install node-pre-gyp-github@1.4.3 + ./node_modules/.bin/node-pre-gyp-github publish --release + } + diff --git a/user-service/node_modules/bcrypt/bcrypt.js b/user-service/node_modules/bcrypt/bcrypt.js new file mode 100644 index 0000000000..612f9dcbf7 --- /dev/null +++ b/user-service/node_modules/bcrypt/bcrypt.js @@ -0,0 +1,236 @@ +'use strict'; + +var nodePreGyp = require('@mapbox/node-pre-gyp'); +var path = require('path'); +var binding_path = nodePreGyp.find(path.resolve(path.join(__dirname, './package.json'))); +var bindings = require(binding_path); + +var crypto = require('crypto'); + +var promises = require('./promises'); + +/// generate a salt (sync) +/// @param {Number} [rounds] number of rounds (default 10) +/// @return {String} salt +module.exports.genSaltSync = function genSaltSync(rounds, minor) { + // default 10 rounds + if (!rounds) { + rounds = 10; + } else if (typeof rounds !== 'number') { + throw new Error('rounds must be a number'); + } + + if(!minor) { + minor = 'b'; + } else if(minor !== 'b' && minor !== 'a') { + throw new Error('minor must be either "a" or "b"'); + } + + return bindings.gen_salt_sync(minor, rounds, crypto.randomBytes(16)); +}; + +/// generate a salt +/// @param {Number} [rounds] number of rounds (default 10) +/// @param {Function} cb callback(err, salt) +module.exports.genSalt = function genSalt(rounds, minor, cb) { + var error; + + // if callback is first argument, then use defaults for others + if (typeof arguments[0] === 'function') { + // have to set callback first otherwise arguments are overriden + cb = arguments[0]; + rounds = 10; + minor = 'b'; + // callback is second argument + } else if (typeof arguments[1] === 'function') { + // have to set callback first otherwise arguments are overriden + cb = arguments[1]; + minor = 'b'; + } + + if (!cb) { + return promises.promise(genSalt, this, [rounds, minor]); + } + + // default 10 rounds + if (!rounds) { + rounds = 10; + } else if (typeof rounds !== 'number') { + // callback error asynchronously + error = new Error('rounds must be a number'); + return process.nextTick(function() { + cb(error); + }); + } + + if(!minor) { + minor = 'b' + } else if(minor !== 'b' && minor !== 'a') { + error = new Error('minor must be either "a" or "b"'); + return process.nextTick(function() { + cb(error); + }); + } + + crypto.randomBytes(16, function(error, randomBytes) { + if (error) { + cb(error); + return; + } + + bindings.gen_salt(minor, rounds, randomBytes, cb); + }); +}; + +/// hash data using a salt +/// @param {String|Buffer} data the data to encrypt +/// @param {String} salt the salt to use when hashing +/// @return {String} hash +module.exports.hashSync = function hashSync(data, salt) { + if (data == null || salt == null) { + throw new Error('data and salt arguments required'); + } + + if (!(typeof data === 'string' || data instanceof Buffer) || (typeof salt !== 'string' && typeof salt !== 'number')) { + throw new Error('data must be a string or Buffer and salt must either be a salt string or a number of rounds'); + } + + if (typeof salt === 'number') { + salt = module.exports.genSaltSync(salt); + } + + return bindings.encrypt_sync(data, salt); +}; + +/// hash data using a salt +/// @param {String|Buffer} data the data to encrypt +/// @param {String} salt the salt to use when hashing +/// @param {Function} cb callback(err, hash) +module.exports.hash = function hash(data, salt, cb) { + var error; + + if (typeof data === 'function') { + error = new Error('data must be a string or Buffer and salt must either be a salt string or a number of rounds'); + return process.nextTick(function() { + data(error); + }); + } + + if (typeof salt === 'function') { + error = new Error('data must be a string or Buffer and salt must either be a salt string or a number of rounds'); + return process.nextTick(function() { + salt(error); + }); + } + + // cb exists but is not a function + // return a rejecting promise + if (cb && typeof cb !== 'function') { + return promises.reject(new Error('cb must be a function or null to return a Promise')); + } + + if (!cb) { + return promises.promise(hash, this, [data, salt]); + } + + if (data == null || salt == null) { + error = new Error('data and salt arguments required'); + return process.nextTick(function() { + cb(error); + }); + } + + if (!(typeof data === 'string' || data instanceof Buffer) || (typeof salt !== 'string' && typeof salt !== 'number')) { + error = new Error('data must be a string or Buffer and salt must either be a salt string or a number of rounds'); + return process.nextTick(function() { + cb(error); + }); + } + + + if (typeof salt === 'number') { + return module.exports.genSalt(salt, function(err, salt) { + return bindings.encrypt(data, salt, cb); + }); + } + + return bindings.encrypt(data, salt, cb); +}; + +/// compare raw data to hash +/// @param {String|Buffer} data the data to hash and compare +/// @param {String} hash expected hash +/// @return {bool} true if hashed data matches hash +module.exports.compareSync = function compareSync(data, hash) { + if (data == null || hash == null) { + throw new Error('data and hash arguments required'); + } + + if (!(typeof data === 'string' || data instanceof Buffer) || typeof hash !== 'string') { + throw new Error('data must be a string or Buffer and hash must be a string'); + } + + return bindings.compare_sync(data, hash); +}; + +/// compare raw data to hash +/// @param {String|Buffer} data the data to hash and compare +/// @param {String} hash expected hash +/// @param {Function} cb callback(err, matched) - matched is true if hashed data matches hash +module.exports.compare = function compare(data, hash, cb) { + var error; + + if (typeof data === 'function') { + error = new Error('data and hash arguments required'); + return process.nextTick(function() { + data(error); + }); + } + + if (typeof hash === 'function') { + error = new Error('data and hash arguments required'); + return process.nextTick(function() { + hash(error); + }); + } + + // cb exists but is not a function + // return a rejecting promise + if (cb && typeof cb !== 'function') { + return promises.reject(new Error('cb must be a function or null to return a Promise')); + } + + if (!cb) { + return promises.promise(compare, this, [data, hash]); + } + + if (data == null || hash == null) { + error = new Error('data and hash arguments required'); + return process.nextTick(function() { + cb(error); + }); + } + + if (!(typeof data === 'string' || data instanceof Buffer) || typeof hash !== 'string') { + error = new Error('data and hash must be strings'); + return process.nextTick(function() { + cb(error); + }); + } + + return bindings.compare(data, hash, cb); +}; + +/// @param {String} hash extract rounds from this hash +/// @return {Number} the number of rounds used to encrypt a given hash +module.exports.getRounds = function getRounds(hash) { + if (hash == null) { + throw new Error('hash argument required'); + } + + if (typeof hash !== 'string') { + throw new Error('hash must be a string'); + } + + return bindings.get_rounds(hash); +}; diff --git a/user-service/node_modules/bcrypt/binding.gyp b/user-service/node_modules/bcrypt/binding.gyp new file mode 100644 index 0000000000..181dca0f64 --- /dev/null +++ b/user-service/node_modules/bcrypt/binding.gyp @@ -0,0 +1,61 @@ +{ + "variables": { + "NODE_VERSION%":" { + const start = Date.now(); + + // genSalt + const salt = await bcrypt.genSalt(10) + console.log('salt: ' + salt); + console.log('salt cb end: ' + (Date.now() - start) + 'ms'); + + // hash + const crypted = await bcrypt.hash('test', salt) + console.log('crypted: ' + crypted); + console.log('crypted cb end: ' + (Date.now() - start) + 'ms'); + console.log('rounds used from hash:', bcrypt.getRounds(crypted)); + + // compare + const res = await bcrypt.compare('test', crypted) + console.log('compared true: ' + res); + console.log('compared true cb end: ' + (Date.now() - start) + 'ms'); + + // compare + const res = await bcrypt.compare('bacon', crypted) + console.log('compared false: ' + res); + console.log('compared false cb end: ' + (Date.now() - start) + 'ms'); + + console.log('end: ' + (Date.now() - start) + 'ms'); +})(); diff --git a/user-service/node_modules/bcrypt/examples/forever_gen_salt.js b/user-service/node_modules/bcrypt/examples/forever_gen_salt.js new file mode 100644 index 0000000000..761686a843 --- /dev/null +++ b/user-service/node_modules/bcrypt/examples/forever_gen_salt.js @@ -0,0 +1,8 @@ +var bcrypt = require('../bcrypt'); + +(function printSalt() { + bcrypt.genSalt(10, function(err, salt) { + console.log('salt: ' + salt); + printSalt(); + }); +})() diff --git a/user-service/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node b/user-service/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node new file mode 100755 index 0000000000000000000000000000000000000000..86af2ee00e3ca25c558f3c0c05b1f734a36af742 GIT binary patch literal 92560 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

    !|$@uA6HL}SebbHyu*d> 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 literal 0 HcmV?d00001 diff --git a/user-service/node_modules/bcrypt/package.json b/user-service/node_modules/bcrypt/package.json new file mode 100644 index 0000000000..621fc1be58 --- /dev/null +++ b/user-service/node_modules/bcrypt/package.json @@ -0,0 +1,67 @@ +{ + "name": "bcrypt", + "description": "A bcrypt library for NodeJS.", + "keywords": [ + "bcrypt", + "password", + "auth", + "authentication", + "encryption", + "crypt", + "crypto" + ], + "main": "./bcrypt", + "version": "5.1.1", + "author": "Nick Campbell (https://github.com/ncb000gt)", + "engines": { + "node": ">= 10.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/kelektiv/node.bcrypt.js.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/kelektiv/node.bcrypt.js/issues" + }, + "scripts": { + "test": "npm ci --build-from-source && jest", + "install": "node-pre-gyp install --fallback-to-build" + }, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "devDependencies": { + "jest": "^29.6.2" + }, + "contributors": [ + "Antonio Salazar Cardozo (https://github.com/Shadowfiend)", + "Van Nguyen (https://github.com/thegoleffect)", + "David Trejo (https://github.com/dtrejo)", + "Ben Glow (https://github.com/pixelglow)", + "NewITFarmer.com <> (https://github.com/newitfarmer)", + "Alfred Westerveld (https://github.com/alfredwesterveld)", + "Vincent Côté-Roy (https://github.com/vincentcr)", + "Lloyd Hilaiel (https://github.com/lloyd)", + "Roman Shtylman (https://github.com/shtylman)", + "Vadim Graboys (https://github.com/vadimg)", + "Ben Noorduis <> (https://github.com/bnoordhuis)", + "Nate Rajlich (https://github.com/tootallnate)", + "Sean McArthur (https://github.com/seanmonstar)", + "Fanie Oosthuysen (https://github.com/weareu)", + "Amitosh Swain Mahapatra (https://github.com/Agathver)", + "Corbin Crutchley (https://github.com/crutchcorn)", + "Nicola Del Gobbo (https://github.com/NickNaso)" + ], + "binary": { + "module_name": "bcrypt_lib", + "module_path": "./lib/binding/napi-v{napi_build_version}", + "package_name": "{module_name}-v{version}-napi-v{napi_build_version}-{platform}-{arch}-{libc}.tar.gz", + "host": "https://github.com", + "remote_path": "kelektiv/node.bcrypt.js/releases/download/v{version}", + "napi_versions": [ + 3 + ] + } +} diff --git a/user-service/node_modules/bcrypt/promises.js b/user-service/node_modules/bcrypt/promises.js new file mode 100644 index 0000000000..cd820142aa --- /dev/null +++ b/user-service/node_modules/bcrypt/promises.js @@ -0,0 +1,42 @@ +'use strict'; + +var Promise = global.Promise; + +/// encapsulate a method with a node-style callback in a Promise +/// @param {object} 'this' of the encapsulated function +/// @param {function} function to be encapsulated +/// @param {Array-like} args to be passed to the called function +/// @return {Promise} a Promise encapsulating the function +module.exports.promise = function (fn, context, args) { + + if (!Array.isArray(args)) { + args = Array.prototype.slice.call(args); + } + + if (typeof fn !== 'function') { + return Promise.reject(new Error('fn must be a function')); + } + + return new Promise(function(resolve, reject) { + args.push(function(err, data) { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + + fn.apply(context, args); + }); +}; + +/// @param {err} the error to be thrown +module.exports.reject = function (err) { + return Promise.reject(err); +}; + +/// changes the promise implementation that bcrypt uses +/// @param {Promise} the implementation to use +module.exports.use = function(promise) { + Promise = promise; +}; diff --git a/user-service/node_modules/bcrypt/src/bcrypt.cc b/user-service/node_modules/bcrypt/src/bcrypt.cc new file mode 100644 index 0000000000..bd8c573551 --- /dev/null +++ b/user-service/node_modules/bcrypt/src/bcrypt.cc @@ -0,0 +1,315 @@ +/* $OpenBSD: bcrypt.c,v 1.31 2014/03/22 23:02:03 tedu Exp $ */ + +/* + * Copyright (c) 1997 Niels Provos + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* This password hashing algorithm was designed by David Mazieres + * and works as follows: + * + * 1. state := InitState () + * 2. state := ExpandKey (state, salt, password) + * 3. REPEAT rounds: + * state := ExpandKey (state, 0, password) + * state := ExpandKey (state, 0, salt) + * 4. ctext := "OrpheanBeholderScryDoubt" + * 5. REPEAT 64: + * ctext := Encrypt_ECB (state, ctext); + * 6. RETURN Concatenate (salt, ctext); + * + */ + +#include +#include +#include +#include + +#include "node_blf.h" + +#ifdef _WIN32 +#define snprintf _snprintf +#endif + +//#if !defined(__APPLE__) && !defined(__MACH__) +//#include "bsd/stdlib.h" +//#endif + +/* This implementation is adaptable to current computing power. + * You can have up to 2^31 rounds which should be enough for some + * time to come. + */ + +static void encode_base64(u_int8_t *, u_int8_t *, u_int16_t); +static void decode_base64(u_int8_t *, u_int16_t, u_int8_t *); + +const static char* error = ":"; + +const static u_int8_t Base64Code[] = +"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + +const static u_int8_t index_64[128] = { + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 255, 255, + 255, 255, 255, 255, 255, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 255, 255, 255, 255, 255, 255, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 255, 255, 255, 255, 255 +}; +#define CHAR64(c) ( (c) > 127 ? 255 : index_64[(c)]) + +static void +decode_base64(u_int8_t *buffer, u_int16_t len, u_int8_t *data) +{ + u_int8_t *bp = buffer; + u_int8_t *p = data; + u_int8_t c1, c2, c3, c4; + while (bp < buffer + len) { + c1 = CHAR64(*p); + c2 = CHAR64(*(p + 1)); + + /* Invalid data */ + if (c1 == 255 || c2 == 255) + break; + + *bp++ = (c1 << 2) | ((c2 & 0x30) >> 4); + if (bp >= buffer + len) + break; + + c3 = CHAR64(*(p + 2)); + if (c3 == 255) + break; + + *bp++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); + if (bp >= buffer + len) + break; + + c4 = CHAR64(*(p + 3)); + if (c4 == 255) + break; + *bp++ = ((c3 & 0x03) << 6) | c4; + + p += 4; + } +} + +void +encode_salt(char *salt, u_int8_t *csalt, char minor, u_int16_t clen, u_int8_t logr) +{ + salt[0] = '$'; + salt[1] = BCRYPT_VERSION; + salt[2] = minor; + salt[3] = '$'; + + // Max rounds are 31 + snprintf(salt + 4, 4, "%2.2u$", logr & 0x001F); + + encode_base64((u_int8_t *) salt + 7, csalt, clen); +} + + +/* Generates a salt for this version of crypt. + Since versions may change. Keeping this here + seems sensible. + from: http://mail-index.netbsd.org/tech-crypto/2002/05/24/msg000204.html +*/ +void +bcrypt_gensalt(char minor, u_int8_t log_rounds, u_int8_t *seed, char *gsalt) +{ + if (log_rounds < 4) + log_rounds = 4; + else if (log_rounds > 31) + log_rounds = 31; + + encode_salt(gsalt, seed, minor, BCRYPT_MAXSALT, log_rounds); +} + +/* We handle $Vers$log2(NumRounds)$salt+passwd$ + i.e. $2$04$iwouldntknowwhattosayetKdJ6iFtacBqJdKe6aW7ou */ + +void +bcrypt(const char *key, size_t key_len, const char *salt, char *encrypted) +{ + blf_ctx state; + u_int32_t rounds, i, k; + u_int16_t j; + u_int8_t salt_len, logr, minor; + u_int8_t ciphertext[4 * BCRYPT_BLOCKS+1] = "OrpheanBeholderScryDoubt"; + u_int8_t csalt[BCRYPT_MAXSALT]; + u_int32_t cdata[BCRYPT_BLOCKS]; + int n; + + /* Discard "$" identifier */ + salt++; + + if (*salt > BCRYPT_VERSION) { + /* How do I handle errors ? Return ':' */ + strcpy(encrypted, error); + return; + } + + /* Check for minor versions */ + if (salt[1] != '$') { + switch (salt[1]) { + case 'a': /* 'ab' should not yield the same as 'abab' */ + case 'b': /* cap input length at 72 bytes */ + minor = salt[1]; + salt++; + break; + default: + strcpy(encrypted, error); + return; + } + } else + minor = 0; + + /* Discard version + "$" identifier */ + salt += 2; + + if (salt[2] != '$') { + /* Out of sync with passwd entry */ + strcpy(encrypted, error); + return; + } + + /* Computer power doesn't increase linear, 2^x should be fine */ + n = atoi(salt); + if (n > 31 || n < 0) { + strcpy(encrypted, error); + return; + } + logr = (u_int8_t)n; + if ((rounds = (u_int32_t) 1 << logr) < BCRYPT_MINROUNDS) { + strcpy(encrypted, error); + return; + } + + /* Discard num rounds + "$" identifier */ + salt += 3; + + if (strlen(salt) * 3 / 4 < BCRYPT_MAXSALT) { + strcpy(encrypted, error); + return; + } + + /* We dont want the base64 salt but the raw data */ + decode_base64(csalt, BCRYPT_MAXSALT, (u_int8_t *) salt); + salt_len = BCRYPT_MAXSALT; + if (minor <= 'a') + key_len = (u_int8_t)(key_len + (minor >= 'a' ? 1 : 0)); + else + { + /* cap key_len at the actual maximum supported + * length here to avoid integer wraparound */ + if (key_len > 72) + key_len = 72; + key_len++; /* include the NUL */ + } + + + /* Setting up S-Boxes and Subkeys */ + Blowfish_initstate(&state); + Blowfish_expandstate(&state, csalt, salt_len, + (u_int8_t *) key, key_len); + for (k = 0; k < rounds; k++) { + Blowfish_expand0state(&state, (u_int8_t *) key, key_len); + Blowfish_expand0state(&state, csalt, salt_len); + } + + /* This can be precomputed later */ + j = 0; + for (i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = Blowfish_stream2word(ciphertext, 4 * BCRYPT_BLOCKS, &j); + + /* Now do the encryption */ + for (k = 0; k < 64; k++) + blf_enc(&state, cdata, BCRYPT_BLOCKS / 2); + + for (i = 0; i < BCRYPT_BLOCKS; i++) { + ciphertext[4 * i + 3] = cdata[i] & 0xff; + cdata[i] = cdata[i] >> 8; + ciphertext[4 * i + 2] = cdata[i] & 0xff; + cdata[i] = cdata[i] >> 8; + ciphertext[4 * i + 1] = cdata[i] & 0xff; + cdata[i] = cdata[i] >> 8; + ciphertext[4 * i + 0] = cdata[i] & 0xff; + } + + i = 0; + encrypted[i++] = '$'; + encrypted[i++] = BCRYPT_VERSION; + if (minor) + encrypted[i++] = minor; + encrypted[i++] = '$'; + + snprintf(encrypted + i, 4, "%2.2u$", logr & 0x001F); + + encode_base64((u_int8_t *) encrypted + i + 3, csalt, BCRYPT_MAXSALT); + encode_base64((u_int8_t *) encrypted + strlen(encrypted), ciphertext, + 4 * BCRYPT_BLOCKS - 1); + memset(&state, 0, sizeof(state)); + memset(ciphertext, 0, sizeof(ciphertext)); + memset(csalt, 0, sizeof(csalt)); + memset(cdata, 0, sizeof(cdata)); +} + +u_int32_t bcrypt_get_rounds(const char * hash) +{ + /* skip past the leading "$" */ + if (!hash || *(hash++) != '$') return 0; + + /* skip past version */ + if (0 == (*hash++)) return 0; + if (*hash && *hash != '$') hash++; + if (*hash++ != '$') return 0; + + return atoi(hash); +} + +static void +encode_base64(u_int8_t *buffer, u_int8_t *data, u_int16_t len) +{ + u_int8_t *bp = buffer; + u_int8_t *p = data; + u_int8_t c1, c2; + while (p < data + len) { + c1 = *p++; + *bp++ = Base64Code[(c1 >> 2)]; + c1 = (c1 & 0x03) << 4; + if (p >= data + len) { + *bp++ = Base64Code[c1]; + break; + } + c2 = *p++; + c1 |= (c2 >> 4) & 0x0f; + *bp++ = Base64Code[c1]; + c1 = (c2 & 0x0f) << 2; + if (p >= data + len) { + *bp++ = Base64Code[c1]; + break; + } + c2 = *p++; + c1 |= (c2 >> 6) & 0x03; + *bp++ = Base64Code[c1]; + *bp++ = Base64Code[c2 & 0x3f]; + } + *bp = '\0'; +} diff --git a/user-service/node_modules/bcrypt/src/bcrypt_node.cc b/user-service/node_modules/bcrypt/src/bcrypt_node.cc new file mode 100644 index 0000000000..2f072a4f91 --- /dev/null +++ b/user-service/node_modules/bcrypt/src/bcrypt_node.cc @@ -0,0 +1,288 @@ +#define NAPI_VERSION 3 + +#include + +#include +#include +#include +#include // atoi + +#include "node_blf.h" + +#define NODE_LESS_THAN (!(NODE_VERSION_AT_LEAST(0, 5, 4))) + +namespace { + + bool ValidateSalt(const char* salt) { + + if (!salt || *salt != '$') { + return false; + } + + // discard $ + salt++; + + if (*salt > BCRYPT_VERSION) { + return false; + } + + if (salt[1] != '$') { + switch (salt[1]) { + case 'a': + case 'b': + salt++; + break; + default: + return false; + } + } + + // discard version + $ + salt += 2; + + if (salt[2] != '$') { + return false; + } + + int n = atoi(salt); + if (n > 31 || n < 0) { + return false; + } + + if (((uint8_t)1 << (uint8_t)n) < BCRYPT_MINROUNDS) { + return false; + } + + salt += 3; + if (strlen(salt) * 3 / 4 < BCRYPT_MAXSALT) { + return false; + } + + return true; + } + + inline char ToCharVersion(const std::string& str) { + return str[0]; + } + + /* SALT GENERATION */ + + class SaltAsyncWorker : public Napi::AsyncWorker { + public: + SaltAsyncWorker(const Napi::Function& callback, const std::string& seed, ssize_t rounds, char minor_ver) + : Napi::AsyncWorker(callback, "bcrypt:SaltAsyncWorker"), seed(seed), rounds(rounds), minor_ver(minor_ver) { + } + + ~SaltAsyncWorker() {} + + void Execute() { + bcrypt_gensalt(minor_ver, rounds, (u_int8_t *)&seed[0], salt); + } + + void OnOK() { + Napi::HandleScope scope(Env()); + Callback().Call({Env().Undefined(), Napi::String::New(Env(), salt)}); + } + + private: + std::string seed; + ssize_t rounds; + char minor_ver; + char salt[_SALT_LEN]; + }; + + Napi::Value GenerateSalt(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 4) { + throw Napi::TypeError::New(env, "4 arguments expected"); + } + if (!info[0].IsString()) { + throw Napi::TypeError::New(env, "First argument must be a string"); + } + if (!info[2].IsBuffer() || (info[2].As>()).Length() != 16) { + throw Napi::TypeError::New(env, "Second argument must be a 16 byte Buffer"); + } + + const char minor_ver = ToCharVersion(info[0].As()); + const int32_t rounds = info[1].As(); + Napi::Buffer seed = info[2].As>(); + Napi::Function callback = info[3].As(); + SaltAsyncWorker* saltWorker = new SaltAsyncWorker(callback, std::string(seed.Data(), 16), rounds, minor_ver); + saltWorker->Queue(); + return env.Undefined(); + } + + Napi::Value GenerateSaltSync(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 3) { + throw Napi::TypeError::New(env, "3 arguments expected"); + } + if (!info[0].IsString()) { + throw Napi::TypeError::New(env, "First argument must be a string"); + } + if (!info[2].IsBuffer() || (info[2].As>()).Length() != 16) { + throw Napi::TypeError::New(env, "Third argument must be a 16 byte Buffer"); + } + const char minor_ver = ToCharVersion(info[0].As()); + const int32_t rounds = info[1].As(); + Napi::Buffer buffer = info[2].As>(); + u_int8_t* seed = (u_int8_t*) buffer.Data(); + char salt[_SALT_LEN]; + bcrypt_gensalt(minor_ver, rounds, seed, salt); + return Napi::String::New(env, salt, strlen(salt)); + } + + inline std::string BufferToString(const Napi::Buffer &buf) { + return std::string(buf.Data(), buf.Length()); + } + + /* ENCRYPT DATA - USED TO BE HASHPW */ + + class EncryptAsyncWorker : public Napi::AsyncWorker { + public: + EncryptAsyncWorker(const Napi::Function& callback, const std::string& input, const std::string& salt) + : Napi::AsyncWorker(callback, "bcrypt:EncryptAsyncWorker"), input(input), salt(salt) { + } + + ~EncryptAsyncWorker() {} + + void Execute() { + if (!(ValidateSalt(salt.c_str()))) { + SetError("Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue"); + } + bcrypt(input.c_str(), input.length(), salt.c_str(), bcrypted); + } + + void OnOK() { + Napi::HandleScope scope(Env()); + Callback().Call({Env().Undefined(),Napi::String::New(Env(), bcrypted)}); + } + private: + std::string input; + std::string salt; + char bcrypted[_PASSWORD_LEN]; + }; + + Napi::Value Encrypt(const Napi::CallbackInfo& info) { + if (info.Length() < 3) { + throw Napi::TypeError::New(info.Env(), "3 arguments expected"); + } + std::string data = info[0].IsBuffer() + ? BufferToString(info[0].As>()) + : info[0].As(); + std::string salt = info[1].As(); + Napi::Function callback = info[2].As(); + EncryptAsyncWorker* encryptWorker = new EncryptAsyncWorker(callback, data, salt); + encryptWorker->Queue(); + return info.Env().Undefined(); + } + + Napi::Value EncryptSync(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 2) { + throw Napi::TypeError::New(info.Env(), "2 arguments expected"); + } + std::string data = info[0].IsBuffer() + ? BufferToString(info[0].As>()) + : info[0].As(); + std::string salt = info[1].As(); + if (!(ValidateSalt(salt.c_str()))) { + throw Napi::Error::New(env, "Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue"); + } + char bcrypted[_PASSWORD_LEN]; + bcrypt(data.c_str(), data.length(), salt.c_str(), bcrypted); + return Napi::String::New(env, bcrypted, strlen(bcrypted)); + } + + /* COMPARATOR */ + inline bool CompareStrings(const char* s1, const char* s2) { + return strcmp(s1, s2) == 0; + } + + class CompareAsyncWorker : public Napi::AsyncWorker { + public: + CompareAsyncWorker(const Napi::Function& callback, const std::string& input, const std::string& encrypted) + : Napi::AsyncWorker(callback, "bcrypt:CompareAsyncWorker"), input(input), encrypted(encrypted) { + result = false; + } + + ~CompareAsyncWorker() {} + + void Execute() { + char bcrypted[_PASSWORD_LEN]; + if (ValidateSalt(encrypted.c_str())) { + bcrypt(input.c_str(), input.length(), encrypted.c_str(), bcrypted); + result = CompareStrings(bcrypted, encrypted.c_str()); + } + } + + void OnOK() { + Napi::HandleScope scope(Env()); + Callback().Call({Env().Undefined(), Napi::Boolean::New(Env(), result)}); + } + + private: + std::string input; + std::string encrypted; + bool result; + }; + + Napi::Value Compare(const Napi::CallbackInfo& info) { + if (info.Length() < 3) { + throw Napi::TypeError::New(info.Env(), "3 arguments expected"); + } + std::string input = info[0].IsBuffer() + ? BufferToString(info[0].As>()) + : info[0].As(); + std::string encrypted = info[1].As(); + Napi::Function callback = info[2].As(); + CompareAsyncWorker* compareWorker = new CompareAsyncWorker(callback, input, encrypted); + compareWorker->Queue(); + return info.Env().Undefined(); + } + + Napi::Value CompareSync(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 2) { + throw Napi::TypeError::New(info.Env(), "2 arguments expected"); + } + std::string pw = info[0].IsBuffer() + ? BufferToString(info[0].As>()) + : info[0].As(); + std::string hash = info[1].As(); + char bcrypted[_PASSWORD_LEN]; + if (ValidateSalt(hash.c_str())) { + bcrypt(pw.c_str(), pw.length(), hash.c_str(), bcrypted); + return Napi::Boolean::New(env, CompareStrings(bcrypted, hash.c_str())); + } else { + return Napi::Boolean::New(env, false); + } + } + + Napi::Value GetRounds(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() < 1) { + throw Napi::TypeError::New(env, "1 argument expected"); + } + std::string hash = info[0].As(); + u_int32_t rounds; + if (!(rounds = bcrypt_get_rounds(hash.c_str()))) { + throw Napi::Error::New(env, "invalid hash provided"); + } + return Napi::Number::New(env, rounds); + } + +} // anonymous namespace + +Napi::Object init(Napi::Env env, Napi::Object exports) { + exports.Set(Napi::String::New(env, "gen_salt_sync"), Napi::Function::New(env, GenerateSaltSync)); + exports.Set(Napi::String::New(env, "encrypt_sync"), Napi::Function::New(env, EncryptSync)); + exports.Set(Napi::String::New(env, "compare_sync"), Napi::Function::New(env, CompareSync)); + exports.Set(Napi::String::New(env, "get_rounds"), Napi::Function::New(env, GetRounds)); + exports.Set(Napi::String::New(env, "gen_salt"), Napi::Function::New(env, GenerateSalt)); + exports.Set(Napi::String::New(env, "encrypt"), Napi::Function::New(env, Encrypt)); + exports.Set(Napi::String::New(env, "compare"), Napi::Function::New(env, Compare)); + return exports; +} + +NODE_API_MODULE(NODE_GYP_MODULE_NAME, init) diff --git a/user-service/node_modules/bcrypt/src/blowfish.cc b/user-service/node_modules/bcrypt/src/blowfish.cc new file mode 100644 index 0000000000..1fc6cf19e8 --- /dev/null +++ b/user-service/node_modules/bcrypt/src/blowfish.cc @@ -0,0 +1,679 @@ +/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */ +/* + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This code is derived from section 14.3 and the given source + * in section V of Applied Cryptography, second edition. + * Blowfish is an unpatented fast block cipher designed by + * Bruce Schneier. + */ + +#include "node_blf.h" + +#undef inline +#ifdef __GNUC__ +#define inline __inline +#else /* !__GNUC__ */ +#define inline +#endif /* !__GNUC__ */ + +/* Function for Feistel Networks */ + +#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ + + (s)[0x100 + (((x)>>16)&0xFF)]) \ + ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ + + (s)[0x300 + ( (x) &0xFF)]) + +#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) + +void +Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) +{ + u_int32_t Xl; + u_int32_t Xr; + u_int32_t *s = c->S[0]; + u_int32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[0]; + BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); + BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); + BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); + BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); + BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); + BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); + BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); + BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); + + *xl = Xr ^ p[17]; + *xr = Xl; +} + +void +Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) +{ + u_int32_t Xl; + u_int32_t Xr; + u_int32_t *s = c->S[0]; + u_int32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[17]; + BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); + BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); + BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); + BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); + BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); + BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); + BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); + BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); + + *xl = Xr ^ p[0]; + *xr = Xl; +} + +void +Blowfish_initstate(blf_ctx *c) +{ + /* P-box and S-box tables initialized with digits of Pi */ + + static const blf_ctx initstate = + { { + { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a}, + { + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7}, + { + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0}, + { + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6} + }, + { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + } }; + + *c = initstate; +} + +u_int32_t +Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, + u_int16_t *current) +{ + u_int8_t i; + u_int16_t j; + u_int32_t temp; + + temp = 0x00000000; + j = *current; + + for (i = 0; i < 4; i++, j++) { + if (j >= databytes) + j = 0; + temp = (temp << 8) | data[j]; + } + + *current = j; + return temp; +} + +void +Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes) +{ + u_int16_t i; + u_int16_t j; + u_int16_t k; + u_int32_t temp; + u_int32_t datal; + u_int32_t datar; + + j = 0; + for (i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for (i = 0; i < BLF_N + 2; i += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } +} + + +void +Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes, + const u_int8_t *key, u_int16_t keybytes) +{ + u_int16_t i; + u_int16_t j; + u_int16_t k; + u_int32_t temp; + u_int32_t datal; + u_int32_t datar; + + j = 0; + for (i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for (i = 0; i < BLF_N + 2; i += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } + +} + +void +blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len) +{ + /* Initialize S-boxes and subkeys with Pi */ + Blowfish_initstate(c); + + /* Transform S-boxes and subkeys with key */ + Blowfish_expand0state(c, k, len); +} + +void +blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks) +{ + u_int32_t *d; + u_int16_t i; + + d = data; + for (i = 0; i < blocks; i++) { + Blowfish_encipher(c, d, d + 1); + d += 2; + } +} + +void +blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks) +{ + u_int32_t *d; + u_int16_t i; + + d = data; + for (i = 0; i < blocks; i++) { + Blowfish_decipher(c, d, d + 1); + d += 2; + } +} + +void +blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i; + + for (i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i; + + for (i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i, j; + + for (i = 0; i < len; i += 8) { + for (j = 0; j < 8; j++) + data[j] ^= iv[j]; + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + iv = data; + data += 8; + } +} + +void +blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int8_t *iv; + u_int32_t i, j; + + iv = data + len - 16; + data = data + len - 8; + for (i = len - 8; i >= 8; i -= 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for (j = 0; j < 8; j++) + data[j] ^= iv[j]; + iv -= 8; + data -= 8; + } + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for (j = 0; j < 8; j++) + data[j] ^= iva[j]; +} + +#if 0 +void +report(u_int32_t data[], u_int16_t len) +{ + u_int16_t i; + for (i = 0; i < len; i += 2) + printf("Block %0hd: %08lx %08lx.\n", + i / 2, data[i], data[i + 1]); +} +void +main(void) +{ + + blf_ctx c; + char key[] = "AAAAA"; + char key2[] = "abcdefghijklmnopqrstuvwxyz"; + + u_int32_t data[10]; + u_int32_t data2[] = + {0x424c4f57l, 0x46495348l}; + + u_int16_t i; + + /* First test */ + for (i = 0; i < 10; i++) + data[i] = i; + + blf_key(&c, (u_int8_t *) key, 5); + blf_enc(&c, data, 5); + blf_dec(&c, data, 1); + blf_dec(&c, data + 2, 4); + printf("Should read as 0 - 9.\n"); + report(data, 10); + + /* Second test */ + blf_key(&c, (u_int8_t *) key2, strlen(key2)); + blf_enc(&c, data2, 1); + printf("\nShould read as: 0x324ed0fe 0xf413a203.\n"); + report(data2, 2); + blf_dec(&c, data2, 1); + report(data2, 2); +} +#endif diff --git a/user-service/node_modules/bcrypt/src/node_blf.h b/user-service/node_modules/bcrypt/src/node_blf.h new file mode 100644 index 0000000000..2d50a39bf1 --- /dev/null +++ b/user-service/node_modules/bcrypt/src/node_blf.h @@ -0,0 +1,132 @@ +/* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */ +/* + * Blowfish - a fast block cipher designed by Bruce Schneier + * + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _NODE_BLF_H_ +#define _NODE_BLF_H_ + +#include + +/* Solaris compatibility */ +#ifdef __sun +#define u_int8_t uint8_t +#define u_int16_t uint16_t +#define u_int32_t uint32_t +#define u_int64_t uint64_t +#endif + +#ifdef _WIN32 +#define u_int8_t unsigned __int8 +#define u_int16_t unsigned __int16 +#define u_int32_t unsigned __int32 +#define u_int64_t unsigned __int64 +#endif + +/* Windows ssize_t compatibility */ +#if defined(_WIN32) || defined(_WIN64) +# if defined(_WIN64) + typedef __int64 LONG_PTR; +# else + typedef long LONG_PTR; +# endif + typedef LONG_PTR SSIZE_T; + typedef SSIZE_T ssize_t; +#endif + +/* z/OS compatibility */ +#ifdef __MVS__ +typedef unsigned char u_int8_t; +typedef unsigned short u_int16_t; +typedef unsigned int u_int32_t; +typedef unsigned long long u_int64_t; +#endif + +#define BCRYPT_VERSION '2' +#define BCRYPT_MAXSALT 16 /* Precomputation is just so nice */ +#define BCRYPT_BLOCKS 6 /* Ciphertext blocks */ +#define BCRYPT_MINROUNDS 16 /* we have log2(rounds) in salt */ + +/* Schneier specifies a maximum key length of 56 bytes. + * This ensures that every key bit affects every cipher + * bit. However, the subkeys can hold up to 72 bytes. + * Warning: For normal blowfish encryption only 56 bytes + * of the key affect all cipherbits. + */ + +#define BLF_N 16 /* Number of Subkeys */ +#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */ +#define BLF_MAXUTILIZED ((BLF_N+2)*4) /* 576 bits */ + +#define _PASSWORD_LEN 128 /* max length, not counting NUL */ +#define _SALT_LEN 32 /* max length */ + +/* Blowfish context */ +typedef struct BlowfishContext { + u_int32_t S[4][256]; /* S-Boxes */ + u_int32_t P[BLF_N + 2]; /* Subkeys */ +} blf_ctx; + +/* Raw access to customized Blowfish + * blf_key is just: + * Blowfish_initstate( state ) + * Blowfish_expand0state( state, key, keylen ) + */ + +void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *); +void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *); +void Blowfish_initstate(blf_ctx *); +void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t); +void Blowfish_expandstate +(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t); + +/* Standard Blowfish */ + +void blf_key(blf_ctx *, const u_int8_t *, u_int16_t); +void blf_enc(blf_ctx *, u_int32_t *, u_int16_t); +void blf_dec(blf_ctx *, u_int32_t *, u_int16_t); + +void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t); +void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t); + +void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t); +void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t); + +/* Converts u_int8_t to u_int32_t */ +u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *); + +/* bcrypt functions*/ +void bcrypt_gensalt(char, u_int8_t, u_int8_t*, char *); +void bcrypt(const char *, size_t key_len, const char *, char *); +void encode_salt(char *, u_int8_t *, char, u_int16_t, u_int8_t); +u_int32_t bcrypt_get_rounds(const char *); + +#endif diff --git a/user-service/node_modules/bcrypt/test-docker.sh b/user-service/node_modules/bcrypt/test-docker.sh new file mode 100755 index 0000000000..7936cf7de1 --- /dev/null +++ b/user-service/node_modules/bcrypt/test-docker.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -xe + +echo "Running on $(node -v)" + +# Cleanup +rm -rf node_modules build-tmp-* lib/binding + +# Install build dependencies +if [ -f /etc/alpine-release ]; then + apk add --no-cache --virtual .build-deps make gcc g++ python3 +fi + +su node -c "npm test; npx node-pre-gyp package" diff --git a/user-service/node_modules/bcrypt/test/async.test.js b/user-service/node_modules/bcrypt/test/async.test.js new file mode 100644 index 0000000000..fb59367a36 --- /dev/null +++ b/user-service/node_modules/bcrypt/test/async.test.js @@ -0,0 +1,209 @@ +const bcrypt = require('../bcrypt'); + +test('salt_length', done => { + expect.assertions(1); + bcrypt.genSalt(10, function (err, salt) { + expect(salt).toHaveLength(29); + done(); + }); +}) + +test('salt_only_cb', () => { + expect.assertions(1); + expect(() => { + bcrypt.genSalt((err, salt) => { + }); + }).not.toThrow(); +}) + +test('salt_rounds_is_string_number', done => { + expect.assertions(2); + bcrypt.genSalt('10', void 0, function (err, salt) { + expect(err instanceof Error).toBe(true) + expect(err.message).toBe('rounds must be a number') + done(); + }); +}) + +test('salt_rounds_is_string_non_number', done => { + expect.assertions(2); + bcrypt.genSalt('z', function (err, salt) { + expect(err instanceof Error).toBe(true) + expect(err.message).toBe('rounds must be a number') + done(); + }); +}) + +test('salt_minor', done => { + expect.assertions(3); + bcrypt.genSalt(10, 'a', function (err, value) { + expect(value).toHaveLength(29); + const [_, minor, salt] = value.split('$'); + expect(minor).toEqual('2a'); + expect(salt).toEqual('10'); + done(); + }); +}) + +test('salt_minor_b', done => { + expect.assertions(3); + bcrypt.genSalt(10, 'b', function (err, value) { + expect(value).toHaveLength(29); + const [_, minor, salt] = value.split('$'); + expect(minor).toEqual('2b'); + expect(salt).toEqual('10'); + done(); + }); +}) + +test('hash', done => { + expect.assertions(2); + bcrypt.genSalt(10, function (err, salt) { + bcrypt.hash('password', salt, function (err, res) { + expect(res).toBeDefined(); + expect(err).toBeUndefined(); + done(); + }); + }); +}) + +test('hash_rounds', done => { + expect.assertions(1); + bcrypt.hash('bacon', 8, function (err, hash) { + expect(bcrypt.getRounds(hash)).toEqual(8); + done(); + }); +}) + +test('hash_empty_strings', done => { + expect.assertions(1); + bcrypt.genSalt(10, function (err, salt) { + bcrypt.hash('', salt, function (err, res) { + expect(res).toBeDefined(); + done(); + }); + }); +}) + +test('hash_fails_with_empty_salt', done => { + expect.assertions(1); + bcrypt.hash('', '', function (err, res) { + expect(err.message).toBe('Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue') + done(); + }); +}) + +test('hash_no_params', done => { + expect.assertions(1); + bcrypt.hash(function (err, hash) { + expect(err.message).toBe('data must be a string or Buffer and salt must either be a salt string or a number of rounds') + done(); + }); +}) + +test('hash_one_param', done => { + expect.assertions(1); + bcrypt.hash('password', function (err, hash) { + expect(err.message).toBe('data must be a string or Buffer and salt must either be a salt string or a number of rounds'); + done(); + }); +}) + +test('hash_salt_validity', done => { + expect.assertions(2); + bcrypt.hash('password', '$2a$10$somesaltyvaluertsetrse', function (err, enc) { + expect(err).toBeUndefined(); + bcrypt.hash('password', 'some$value', function (err, enc) { + expect(err.message).toBe("Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue"); + done(); + }); + }); +}) + +test('verify_salt', done => { + expect.assertions(2); + bcrypt.genSalt(10, function (err, value) { + const [_, version, rounds] = value.split('$'); + expect(version).toEqual('2b'); + expect(rounds).toEqual('10'); + done(); + }); +}) + +test('verify_salt_min_rounds', done => { + expect.assertions(2); + bcrypt.genSalt(1, function (err, value) { + const [_, version, rounds] = value.split('$'); + expect(version).toEqual('2b'); + expect(rounds).toEqual('04'); + done(); + }); +}) + +test('verify_salt_max_rounds', done => { + expect.assertions(2); + bcrypt.genSalt(100, function (err, value) { + const [_, version, rounds] = value.split('$'); + expect(version).toEqual('2b'); + expect(rounds).toEqual('31'); + done(); + }); +}) + +test('hash_compare', done => { + expect.assertions(2); + bcrypt.genSalt(10, function (err, salt) { + bcrypt.hash("test", salt, function (err, hash) { + bcrypt.compare("test", hash, function (err, res) { + expect(hash).toBeDefined(); + bcrypt.compare("blah", hash, function (err, res) { + expect(res).toBe(false); + done(); + }); + }); + }); + }); +}) + +test('hash_compare_empty_strings', done => { + expect.assertions(2); + const hash = bcrypt.hashSync("test", bcrypt.genSaltSync(10)); + + bcrypt.compare("", hash, function (err, res) { + expect(res).toEqual(false) + bcrypt.compare("", "", function (err, res) { + expect(res).toEqual(false); + done(); + }); + }); +}) + +test('hash_compare_invalid_strings', done => { + expect.assertions(2); + const fullString = 'envy1362987212538'; + const hash = '$2a$10$XOPbrlUPQdwdJUpSrIF6X.LbE14qsMmKGhM1A8W9iqaG3vv1BD7WC'; + const wut = ':'; + bcrypt.compare(fullString, hash, function (err, res) { + expect(res).toBe(true); + bcrypt.compare(fullString, wut, function (err, res) { + expect(res).toBe(false); + done(); + }); + }); +}) + +test('compare_no_params', done => { + expect.assertions(1); + bcrypt.compare(function (err, hash) { + expect(err.message).toBe('data and hash arguments required'); + done(); + }); +}) + +test('hash_compare_one_param', done => { + expect.assertions(1); + bcrypt.compare('password', function (err, hash) { + expect(err.message).toBe('data and hash arguments required'); + done(); + }); +}) diff --git a/user-service/node_modules/bcrypt/test/implementation.test.js b/user-service/node_modules/bcrypt/test/implementation.test.js new file mode 100644 index 0000000000..647f32a923 --- /dev/null +++ b/user-service/node_modules/bcrypt/test/implementation.test.js @@ -0,0 +1,48 @@ +const bcrypt = require('../bcrypt'); + +// some tests were adapted from https://github.com/riverrun/bcrypt_elixir/blob/master/test/base_test.exs +// which are under the BSD LICENSE + +test('openwall', () => { + expect(bcrypt.hashSync("U*U", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW"); + expect(bcrypt.hashSync("U*U*", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK"); + expect(bcrypt.hashSync("U*U*U", "$2a$05$XXXXXXXXXXXXXXXXXXXXXO")).toStrictEqual("$2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a"); + expect(bcrypt.hashSync("", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy"); + expect(bcrypt.hashSync("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", "$2a$05$abcdefghijklmnopqrstuu")).toStrictEqual("$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui"); +}) + +test('openbsd', () => { + expect(bcrypt.hashSync("000000000000000000000000000000000000000000000000000000000000000000000000", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.6.O1dLNbjod2uo0DVcW.jHucKbPDdHS") + expect(bcrypt.hashSync("000000000000000000000000000000000000000000000000000000000000000000000000", "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.6.O1dLNbjod2uo0DVcW.jHucKbPDdHS") +}) + +test('long_passwords', () => { + // bcrypt wrap-around bug in $2a$ + expect(bcrypt.hashSync("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.6.O1dLNbjod2uo0DVcW.jHucKbPDdHS") + expect(bcrypt.hashSync("01XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "$2a$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.6.O1dLNbjod2uo0DVcW.jHucKbPDdHS") + + // tests for $2b$ which fixes wrap-around bugs + expect(bcrypt.hashSync("012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.XxrQqgBi/5Sxuq9soXzDtjIZ7w5pMfK") + expect(bcrypt.hashSync("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345", "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.XxrQqgBi/5Sxuq9soXzDtjIZ7w5pMfK") +}) + +test('embedded_nulls', () => { + expect(bcrypt.hashSync("Passw\0rd123", "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.VHy/kzL4sCcX3Ib3wN5rNGiRt.TpfxS") + expect(bcrypt.hashSync("Passw\0 you can literally write anything after the NUL character", "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.4vJLJQ6nZ/70INTjjSZWQ0iyUek92tu") + expect(bcrypt.hashSync(Buffer.from("Passw\0 you can literally write anything after the NUL character"), "$2b$05$CCCCCCCCCCCCCCCCCCCCC.")).toStrictEqual("$2b$05$CCCCCCCCCCCCCCCCCCCCC.4vJLJQ6nZ/70INTjjSZWQ0iyUek92tu") +}) + +test('shorten_salt_to_128_bits', () => { + expect(bcrypt.hashSync("test", "$2a$10$1234567899123456789012")).toStrictEqual("$2a$10$123456789912345678901u.OtL1A1eGK5wmvBKUDYKvuVKI7h2XBu") + expect(bcrypt.hashSync("U*U*", "$2a$05$CCCCCCCCCCCCCCCCCCCCCh")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCCeUQ7VjYZ2hd4bLYZdhuPpZMUpEUJDw1S") + expect(bcrypt.hashSync("U*U*", "$2a$05$CCCCCCCCCCCCCCCCCCCCCM")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK") + expect(bcrypt.hashSync("U*U*", "$2a$05$CCCCCCCCCCCCCCCCCCCCCA")).toStrictEqual("$2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK") +}) + +test('consistency', () => { + expect(bcrypt.hashSync("ππππππππ", "$2a$10$.TtQJ4Jr6isd4Hp.mVfZeu")).toStrictEqual("$2a$10$.TtQJ4Jr6isd4Hp.mVfZeuh6Gws4rOQ/vdBczhDx.19NFK0Y84Dle") + expect(bcrypt.hashSync("p@5sw0rd", "$2b$12$zQ4CooEXdGqcwi0PHsgc8e")).toStrictEqual("$2b$12$zQ4CooEXdGqcwi0PHsgc8eAf0DLXE/XHoBE8kCSGQ97rXwuClaPam") + expect(bcrypt.hashSync("C'est bon, la vie!", "$2b$12$cbo7LZ.wxgW4yxAA5Vqlv.")).toStrictEqual("$2b$12$cbo7LZ.wxgW4yxAA5Vqlv.KR6QFPt4qCdc9RYJNXxa/rbUOp.1sw.") + expect(bcrypt.hashSync("ἓν οἶδα ὅτι οὐδὲν οἶδα", "$2b$12$LeHKWR2bmrazi/6P22Jpau")).toStrictEqual("$2b$12$LeHKWR2bmrazi/6P22JpauX5my/eKwwKpWqL7L5iEByBnxNc76FRW") + expect(bcrypt.hashSync(Buffer.from("ἓν οἶδα ὅτι οὐδὲν οἶδα"), "$2b$12$LeHKWR2bmrazi/6P22Jpau")).toStrictEqual("$2b$12$LeHKWR2bmrazi/6P22JpauX5my/eKwwKpWqL7L5iEByBnxNc76FRW") +}) diff --git a/user-service/node_modules/bcrypt/test/promise.test.js b/user-service/node_modules/bcrypt/test/promise.test.js new file mode 100644 index 0000000000..0103418250 --- /dev/null +++ b/user-service/node_modules/bcrypt/test/promise.test.js @@ -0,0 +1,168 @@ +const bcrypt = require('../bcrypt'); +const promises = require('../promises'); + +test('salt_returns_promise_on_no_args', () => { + // make sure test passes with non-native implementations such as bluebird + // http://stackoverflow.com/questions/27746304/how-do-i-tell-if-an-object-is-a-promise + expect(typeof bcrypt.genSalt().then).toEqual('function') +}) + +test('salt_returns_promise_on_null_callback', () => { + expect(typeof bcrypt.genSalt(13, null, null).then).toEqual('function') +}) + +test('salt_length', () => { + return expect(bcrypt.genSalt(10)).resolves.toHaveLength(29); +}) + +test('salt_rounds_is_string_number', () => { + return expect(bcrypt.genSalt('10')).rejects.toThrow('rounds must be a number'); +}) + +test('salt_rounds_is_string_non_number', () => { + return expect(bcrypt.genSalt('b')).rejects.toThrow('rounds must be a number'); +}) + +test('hash_returns_promise_on_null_callback', () => { + expect(typeof bcrypt.hash('password', 10, null).then).toStrictEqual('function') +}) + +test('hash', () => { + return expect(bcrypt.genSalt(10) + .then(salt => bcrypt.hash('password', salt))).resolves.toBeDefined() +}) + +test('hash_rounds', () => { + return bcrypt.hash('bacon', 8).then(hash => { + expect(bcrypt.getRounds(hash)).toStrictEqual(8) + }); +}) + +test('hash_empty_strings', () => { + expect.assertions(2); + return Promise.all([ + expect(bcrypt.genSalt(10) + .then(salt => bcrypt.hash('', salt))) + .resolves.toBeDefined(), + expect(bcrypt.hash('', '')).rejects.toThrow(''), + ]); +}) + +test('hash_no_params', () => { + expect.assertions(1); + return expect(bcrypt.hash()).rejects.toThrow('data and salt arguments required'); +}) + +test('hash_one_param', () => { + return expect(bcrypt.hash('password')).rejects.toThrow('data and salt arguments required'); +}) + +test('hash_salt_validity', () => { + expect.assertions(2); + return Promise.all( + [ + expect(bcrypt.hash('password', '$2a$10$somesaltyvaluertsetrse')).resolves.toBeDefined(), + expect(bcrypt.hash('password', 'some$value')).rejects.toThrow("Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue") + ]); +}) + +test('verify_salt', () => { + expect.assertions(2); + return bcrypt.genSalt(10).then(result => { + const [_, version, salt] = result.split('$'); + expect(version).toEqual('2b') + expect(salt).toEqual('10') + }); +}) + +test('verify_salt_min_rounds', () => { + expect.assertions(2); + return bcrypt.genSalt(1).then(value => { + const [_, version, rounds] = value.split('$'); + expect(version).toEqual('2b'); + expect(rounds).toEqual('04'); + }); +}) + +test('verify_salt_max_rounds', () => { + expect.assertions(2); + return bcrypt.genSalt(100).then(value => { + const [_, version, rounds] = value.split('$'); + expect(version).toEqual('2b'); + expect(rounds).toEqual('31'); + }); +}) + +test('hash_compare_returns_promise_on_null_callback', () => { + expect(typeof bcrypt.compare('password', 'something', null).then).toStrictEqual('function') +}) + +test('hash_compare', () => { + expect.assertions(3); + return bcrypt.genSalt(10).then(function (salt) { + expect(salt).toHaveLength(29); + return bcrypt.hash("test", salt); + }).then(hash => Promise.all( + [ + expect(bcrypt.compare("test", hash)).resolves.toEqual(true), + expect(bcrypt.compare("blah", hash)).resolves.toEqual(false) + ])); +}) + +test('hash_compare_empty_strings', () => { + expect.assertions(2); + const hash = bcrypt.hashSync("test", bcrypt.genSaltSync(10)); + return Promise.all([ + expect(bcrypt.compare("", hash)).resolves.toEqual(false), + expect(bcrypt.compare("", "")).resolves.toEqual(false) + ]); +}) + +test('hash_compare_invalid_strings', () => { + const fullString = 'envy1362987212538'; + const hash = '$2a$10$XOPbrlUPQdwdJUpSrIF6X.LbE14qsMmKGhM1A8W9iqaG3vv1BD7WC'; + const wut = ':'; + return Promise.all([ + expect(bcrypt.compare(fullString, hash)).resolves.toEqual(true), + expect(bcrypt.compare(fullString, wut)).resolves.toEqual(false), + ]); +}) + +test('hash_compare_no_params', () => { + expect.assertions(1); + return expect(bcrypt.compare()).rejects.toThrow('data and hash arguments required') +}) + +test('hash_compare_one_param', () => { + expect.assertions(1); + return expect(bcrypt.compare('password')).rejects.toThrow('data and hash arguments required') +}) + +test('change_promise_impl_reject', () => { + + promises.use({ + reject: function () { + return 'mock'; + } + }); + + expect(promises.reject()).toEqual('mock'); + + // need to reset the promise implementation because of require cache + promises.use(global.Promise); +}) + +test('change_promise_impl_promise', () => { + + promises.use({ + reject: function (err) { + expect(err.message).toEqual('fn must be a function'); + return 'mock'; + } + }); + + expect(promises.promise('', '', '')).toEqual('mock'); + + // need to reset the promise implementation because of require cache + promises.use(global.Promise); +}) diff --git a/user-service/node_modules/bcrypt/test/repetitions.test.js b/user-service/node_modules/bcrypt/test/repetitions.test.js new file mode 100644 index 0000000000..66807f3b83 --- /dev/null +++ b/user-service/node_modules/bcrypt/test/repetitions.test.js @@ -0,0 +1,46 @@ +const bcrypt = require('../bcrypt'); + +const EXPECTED = 2500; //number of times to iterate these tests.) + +test('salt_length', () => { + expect.assertions(EXPECTED); + + return Promise.all(Array.from({length: EXPECTED}, + () => bcrypt.genSalt(10) + .then(salt => expect(salt).toHaveLength(29)))); +}) + +test('test_hash_length', () => { + expect.assertions(EXPECTED); + const SALT = '$2a$04$TnjywYklQbbZjdjBgBoA4e'; + return Promise.all(Array.from({length: EXPECTED}, + () => bcrypt.hash('test', SALT) + .then(hash => expect(hash).toHaveLength(60)))); +}) + +test('test_compare', () => { + expect.assertions(EXPECTED); + const HASH = '$2a$04$TnjywYklQbbZjdjBgBoA4e9G7RJt9blgMgsCvUvus4Iv4TENB5nHy'; + return Promise.all(Array.from({length: EXPECTED}, + () => bcrypt.compare('test', HASH) + .then(match => expect(match).toEqual(true)))); +}) + +test('test_hash_and_compare', () => { + expect.assertions(EXPECTED * 3); + const salt = bcrypt.genSaltSync(4) + + return Promise.all(Array.from({length: EXPECTED}, + () => { + const password = 'secret' + Math.random(); + return bcrypt.hash(password, salt) + .then(hash => { + expect(hash).toHaveLength(60); + const goodCompare = bcrypt.compare(password, hash).then(res => expect(res).toEqual(true)); + const badCompare = bcrypt.compare('bad' + password, hash).then(res => expect(res).toEqual(false)); + + return Promise.all([goodCompare, badCompare]); + }); + })); +}, 10000); + diff --git a/user-service/node_modules/bcrypt/test/sync.test.js b/user-service/node_modules/bcrypt/test/sync.test.js new file mode 100644 index 0000000000..2e6809af40 --- /dev/null +++ b/user-service/node_modules/bcrypt/test/sync.test.js @@ -0,0 +1,125 @@ +const bcrypt = require('../bcrypt') + +test('salt_length', () => { + const salt = bcrypt.genSaltSync(13); + expect(salt).toHaveLength(29); + const [_, version, rounds] = salt.split('$'); + expect(version).toStrictEqual('2b') + expect(rounds).toStrictEqual('13') +}) + +test('salt_no_params', () => { + const salt = bcrypt.genSaltSync(); + const [_, version, rounds] = salt.split('$'); + expect(version).toStrictEqual('2b') + expect(rounds).toStrictEqual('10') +}) + +test('salt_rounds_is_string_number', () => { + expect(() => bcrypt.genSaltSync('10')).toThrowError('rounds must be a number'); +}) + +test('salt_rounds_is_NaN', () => { + expect(() => bcrypt.genSaltSync('b')).toThrowError("rounds must be a number"); +}) + +test('salt_minor_a', () => { + const salt = bcrypt.genSaltSync(10, 'a'); + const [_, version, rounds] = salt.split('$'); + expect(version).toStrictEqual('2a') + expect(rounds).toStrictEqual('10') +}) + +test('salt_minor_b', () => { + const salt = bcrypt.genSaltSync(10, 'b'); + const [_, version, rounds] = salt.split('$'); + expect(version).toStrictEqual('2b') + expect(rounds).toStrictEqual('10') +}) + +test('hash', () => { + expect(() => bcrypt.hashSync('password', bcrypt.genSaltSync(10))).not.toThrow() +}) + +test('hash_rounds', () => { + const hash = bcrypt.hashSync('password', 8); + expect(bcrypt.getRounds(hash)).toStrictEqual(8) +}) + +test('hash_empty_string', () => { + expect(() => bcrypt.hashSync('', bcrypt.genSaltSync(10))).not.toThrow(); + expect(() => bcrypt.hashSync('password', '')).toThrowError('Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue'); + expect(() => bcrypt.hashSync('', '')).toThrowError('Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue'); +}) + +test('hash_pw_no_params', () => { + expect(() => bcrypt.hashSync()).toThrow('data and salt arguments required'); +}) + +test('hash_pw_one_param', () => { + expect(() => bcrypt.hashSync('password')).toThrow('data and salt arguments required'); +}) + +test('hash_pw_not_hash_str', () => { + expect(() => bcrypt.hashSync('password', {})).toThrow("data must be a string or Buffer and salt must either be a salt string or a number of rounds") +}) + +test('hash_salt_validity', () => { + expect(2); + expect(bcrypt.hashSync('password', '$2a$10$somesaltyvaluertsetrse')).toBeDefined() + expect(() => bcrypt.hashSync('password', 'some$value')).toThrow('Invalid salt. Salt must be in the form of: $Vers$log2(NumRounds)$saltvalue') +}) + +test('verify_salt', () => { + const salt = bcrypt.genSaltSync(10); + const split_salt = salt.split('$'); + expect(split_salt[1]).toStrictEqual('2b') + expect(split_salt[2]).toStrictEqual('10') +}) + +test('verify_salt_min_rounds', () => { + const salt = bcrypt.genSaltSync(1); + const split_salt = salt.split('$'); + expect(split_salt[1]).toStrictEqual('2b') + expect(split_salt[2]).toStrictEqual('04') +}) + +test('verify_salt_max_rounds', () => { + const salt = bcrypt.genSaltSync(100); + const split_salt = salt.split('$'); + expect(split_salt[1]).toStrictEqual('2b') + expect(split_salt[2]).toStrictEqual('31') +}) + +test('hash_compare', () => { + const salt = bcrypt.genSaltSync(10); + expect(29).toStrictEqual(salt.length) + const hash = bcrypt.hashSync("test", salt); + expect(bcrypt.compareSync("test", hash)).toBeDefined() + expect(!(bcrypt.compareSync("blah", hash))).toBeDefined() +}) + +test('hash_compare_empty_strings', () => { + expect(!(bcrypt.compareSync("", "password"))).toBeDefined() + expect(!(bcrypt.compareSync("", ""))).toBeDefined() + expect(!(bcrypt.compareSync("password", ""))).toBeDefined() +}) + +test('hash_compare_invalid_strings', () => { + const fullString = 'envy1362987212538'; + const hash = '$2a$10$XOPbrlUPQdwdJUpSrIF6X.LbE14qsMmKGhM1A8W9iqaG3vv1BD7WC'; + const wut = ':'; + expect(bcrypt.compareSync(fullString, hash)).toBe(true); + expect(bcrypt.compareSync(fullString, wut)).toBe(false); +}) + +test('getRounds', () => { + const hash = bcrypt.hashSync("test", bcrypt.genSaltSync(9)); + expect(9).toStrictEqual(bcrypt.getRounds(hash)) +}) + +test('getRounds', () => { + const hash = bcrypt.hashSync("test", bcrypt.genSaltSync(9)); + expect(9).toStrictEqual(bcrypt.getRounds(hash)) + expect(() => bcrypt.getRounds('')).toThrow("invalid hash provided"); +}); diff --git a/user-service/node_modules/binary-extensions/binary-extensions.json b/user-service/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 0000000000..ac08048e40 --- /dev/null +++ b/user-service/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,263 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "afdesign", + "afphoto", + "afpub", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "appimage", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "flatpak", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "odp", + "ods", + "odt", + "oga", + "ogg", + "ogv", + "otf", + "ott", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rpm", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "snap", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/user-service/node_modules/binary-extensions/binary-extensions.json.d.ts b/user-service/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 0000000000..94a248c2bc --- /dev/null +++ b/user-service/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/user-service/node_modules/binary-extensions/index.d.ts b/user-service/node_modules/binary-extensions/index.d.ts new file mode 100644 index 0000000000..f469ac5fb0 --- /dev/null +++ b/user-service/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/user-service/node_modules/binary-extensions/index.js b/user-service/node_modules/binary-extensions/index.js new file mode 100644 index 0000000000..d46e468867 --- /dev/null +++ b/user-service/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/user-service/node_modules/binary-extensions/license b/user-service/node_modules/binary-extensions/license new file mode 100644 index 0000000000..5493a1a6e3 --- /dev/null +++ b/user-service/node_modules/binary-extensions/license @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/binary-extensions/package.json b/user-service/node_modules/binary-extensions/package.json new file mode 100644 index 0000000000..4710c339ae --- /dev/null +++ b/user-service/node_modules/binary-extensions/package.json @@ -0,0 +1,40 @@ +{ + "name": "binary-extensions", + "version": "2.3.0", + "description": "List of binary file extensions", + "license": "MIT", + "repository": "sindresorhus/binary-extensions", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "sideEffects": false, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/user-service/node_modules/binary-extensions/readme.md b/user-service/node_modules/binary-extensions/readme.md new file mode 100644 index 0000000000..88519b3a6d --- /dev/null +++ b/user-service/node_modules/binary-extensions/readme.md @@ -0,0 +1,25 @@ +# binary-extensions + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + +## Install + +```sh +npm install binary-extensions +``` + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions diff --git a/user-service/node_modules/body-parser/HISTORY.md b/user-service/node_modules/body-parser/HISTORY.md new file mode 100644 index 0000000000..b89249198a --- /dev/null +++ b/user-service/node_modules/body-parser/HISTORY.md @@ -0,0 +1,665 @@ +1.20.2 / 2023-02-21 +=================== + + * Fix strict json error message on Node.js 19+ + * deps: content-type@~1.0.5 + - perf: skip value escaping when unnecessary + * deps: raw-body@2.5.2 + +1.20.1 / 2022-10-06 +=================== + + * deps: qs@6.11.0 + * perf: remove unnecessary object clone + +1.20.0 / 2022-04-02 +=================== + + * Fix error message for json parse whitespace in `strict` + * Fix internal error when inflated body exceeds limit + * Prevent loss of async hooks context + * Prevent hanging when request already read + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: qs@6.10.3 + * deps: raw-body@2.5.1 + - deps: http-errors@2.0.0 + +1.19.2 / 2022-02-15 +=================== + + * deps: bytes@3.1.2 + * deps: qs@6.9.7 + * Fix handling of `__proto__` keys + * deps: raw-body@2.4.3 + - deps: bytes@3.1.2 + +1.19.1 / 2021-12-10 +=================== + + * deps: bytes@3.1.1 + * deps: http-errors@1.8.1 + - deps: inherits@2.0.4 + - deps: toidentifier@1.0.1 + - deps: setprototypeof@1.2.0 + * deps: qs@6.9.6 + * deps: raw-body@2.4.2 + - deps: bytes@3.1.1 + - deps: http-errors@1.8.1 + * deps: safe-buffer@5.2.1 + * deps: type-is@~1.6.18 + +1.19.0 / 2019-04-25 +=================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: raw-body@2.4.0 + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + * deps: type-is@~1.6.17 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +1.18.3 / 2018-05-14 +=================== + + * Fix stack trace for strict json parse error + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: http-errors@~1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + * deps: qs@6.5.2 + * deps: raw-body@2.3.3 + - deps: http-errors@1.6.3 + - deps: iconv-lite@0.4.23 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +1.18.2 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: remove argument reassignment + +1.18.1 / 2017-09-12 +=================== + + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: raw-body@2.3.2 + - deps: iconv-lite@0.4.19 + +1.18.0 / 2017-09-08 +=================== + + * Fix JSON strict violation error to match native parse error + * Include the `body` property on verify errors + * Include the `type` property on all generated errors + * Use `http-errors` to set status code on errors + * deps: bytes@3.0.0 + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + * deps: qs@6.5.0 + * deps: raw-body@2.3.1 + - Use `http-errors` for standard emitted errors + - deps: bytes@3.0.0 + - deps: iconv-lite@0.4.18 + - perf: skip buffer decoding on overage chunk + * perf: prevent internal `throw` when missing charset + +1.17.2 / 2017-05-17 +=================== + + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + +1.17.1 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +1.17.0 / 2017-03-01 +=================== + + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + * deps: qs@6.3.1 + - Fix compacting nested arrays + +1.16.1 / 2017-02-10 +=================== + + * deps: debug@2.6.1 + - Fix deprecation messages in WebStorm and other editors + - Undeprecate `DEBUG_FD` set to `1` or `2` + +1.16.0 / 2017-01-17 +=================== + + * deps: debug@2.6.0 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + * deps: qs@6.2.1 + - Fix array parsing from skipping empty values + * deps: raw-body@~2.2.0 + - deps: iconv-lite@0.4.15 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +1.15.2 / 2016-06-19 +=================== + + * deps: bytes@2.4.0 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: http-errors@~1.5.0 + - Use `setprototypeof` module to replace `__proto__` setting + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: qs@6.2.0 + * deps: raw-body@~2.1.7 + - deps: bytes@2.4.0 + - perf: remove double-cleanup on happy path + * deps: type-is@~1.6.13 + - deps: mime-types@~2.1.11 + +1.15.1 / 2016-05-05 +=================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + * deps: raw-body@~2.1.6 + - deps: bytes@2.3.0 + * deps: type-is@~1.6.12 + - deps: mime-types@~2.1.10 + +1.15.0 / 2016-02-10 +=================== + + * deps: http-errors@~1.4.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.2.1 < 2' + * deps: qs@6.1.0 + * deps: type-is@~1.6.11 + - deps: mime-types@~2.1.9 + +1.14.2 / 2015-12-16 +=================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + * deps: qs@5.2.0 + * deps: raw-body@~2.1.5 + - deps: bytes@2.2.0 + - deps: iconv-lite@0.4.13 + * deps: type-is@~1.6.10 + - deps: mime-types@~2.1.8 + +1.14.1 / 2015-09-27 +=================== + + * Fix issue where invalid charset results in 400 when `verify` used + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + * deps: raw-body@~2.1.4 + - Fix masking critical errors from `iconv-lite` + - deps: iconv-lite@0.4.12 + * deps: type-is@~1.6.9 + - deps: mime-types@~2.1.7 + +1.14.0 / 2015-09-16 +=================== + + * Fix JSON strict parse error to match syntax errors + * Provide static `require` analysis in `urlencoded` parser + * deps: depd@~1.1.0 + - Support web browser loading + * deps: qs@5.1.0 + * deps: raw-body@~2.1.3 + - Fix sync callback when attaching data listener causes sync read + * deps: type-is@~1.6.8 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.6 + +1.13.3 / 2015-07-31 +=================== + + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +1.13.2 / 2015-07-05 +=================== + + * deps: iconv-lite@0.4.11 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix user-visible incompatibilities from 3.1.0 + - Fix various parsing edge cases + * deps: raw-body@~2.1.2 + - Fix error stack traces to skip `makeError` + - deps: iconv-lite@0.4.11 + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +1.13.1 / 2015-06-16 +=================== + + * deps: qs@2.4.2 + - Downgraded from 3.1.0 because of user-visible incompatibilities + +1.13.0 / 2015-06-14 +=================== + + * Add `statusCode` property on `Error`s, in addition to `status` + * Change `type` default to `application/json` for JSON parser + * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser + * Provide static `require` analysis + * Use the `http-errors` module to generate errors + * deps: bytes@2.1.0 + - Slight optimizations + * deps: iconv-lite@0.4.10 + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + - Leading BOM is now removed when decoding + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: qs@3.1.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + - Parsed object now has `null` prototype + * deps: raw-body@~2.1.1 + - Use `unpipe` module for unpiping requests + - deps: iconv-lite@0.4.10 + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: remove argument reassignment + * perf: remove delete call + +1.12.4 / 2015-05-10 +=================== + + * deps: debug@~2.2.0 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: on-finished@~2.2.1 + * deps: raw-body@~2.0.1 + - Fix a false-positive when unpiping in Node.js 0.8 + - deps: bytes@2.0.1 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +1.12.3 / 2015-04-15 +=================== + + * Slight efficiency improvement when not debugging + * deps: depd@~1.0.1 + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + * deps: raw-body@1.3.4 + - Fix hanging callback if request aborts during read + - deps: iconv-lite@0.4.8 + +1.12.2 / 2015-03-16 +=================== + + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + +1.12.1 / 2015-03-15 +=================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +1.12.0 / 2015-02-13 +=================== + + * add `debug` messages + * accept a function for the `type` option + * use `content-type` to parse `Content-Type` headers + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + * deps: raw-body@1.3.3 + - deps: iconv-lite@0.4.7 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +1.11.0 / 2015-01-30 +=================== + + * make internal `extended: true` depth limit infinity + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +1.10.2 / 2015-01-20 +=================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + * deps: raw-body@1.3.2 + - deps: iconv-lite@0.4.6 + +1.10.1 / 2015-01-01 +=================== + + * deps: on-finished@~2.2.0 + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +1.10.0 / 2014-12-02 +=================== + + * make internal `extended: true` array limit dynamic + +1.9.3 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + * deps: raw-body@1.3.1 + - deps: iconv-lite@0.4.5 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +1.9.2 / 2014-10-27 +================== + + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +1.9.1 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +1.9.0 / 2014-09-24 +================== + + * include the charset in "unsupported charset" error message + * include the encoding in "unsupported content encoding" error message + * deps: depd@~1.0.0 + +1.8.4 / 2014-09-23 +================== + + * fix content encoding to be case-insensitive + +1.8.3 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +1.8.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + +1.8.1 / 2014-09-07 +================== + + * deps: media-typer@0.3.0 + * deps: type-is@~1.5.1 + +1.8.0 / 2014-09-05 +================== + + * make empty-body-handling consistent between chunked requests + - empty `json` produces `{}` + - empty `raw` produces `new Buffer(0)` + - empty `text` produces `''` + - empty `urlencoded` produces `{}` + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: type-is@~1.5.0 + - fix `hasbody` to be true for `content-length: 0` + +1.7.0 / 2014-09-01 +================== + + * add `parameterLimit` option to `urlencoded` parser + * change `urlencoded` extended array limit to 100 + * respond with 413 when over `parameterLimit` in `urlencoded` + +1.6.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +1.6.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +1.6.5 / 2014-08-16 +================== + + * deps: on-finished@2.1.0 + +1.6.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + +1.6.3 / 2014-08-10 +================== + + * deps: qs@1.2.1 + +1.6.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +1.6.1 / 2014-08-06 +================== + + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +1.6.0 / 2014-08-05 +================== + + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + +1.5.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +1.5.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +1.5.0 / 2014-07-20 +================== + + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + * deps: raw-body@1.3.0 + - deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + - Fix `Cannot switch to old mode now` error on Node.js 0.10+ + * deps: type-is@~1.3.2 + +1.4.3 / 2014-06-19 +================== + + * deps: type-is@1.3.1 + - fix global variable leak + +1.4.2 / 2014-06-19 +================== + + * deps: type-is@1.3.0 + - improve type parsing + +1.4.1 / 2014-06-19 +================== + + * fix urlencoded extended deprecation message + +1.4.0 / 2014-06-19 +================== + + * add `text` parser + * add `raw` parser + * check accepted charset in content-type (accepts utf-8) + * check accepted encoding in content-encoding (accepts identity) + * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed + * deprecate `urlencoded()` without provided `extended` option + * lazy-load urlencoded parsers + * parsers split into files for reduced mem usage + * support gzip and deflate bodies + - set `inflate: false` to turn off + * deps: raw-body@1.2.2 + - Support all encodings from `iconv-lite` + +1.3.1 / 2014-06-11 +================== + + * deps: type-is@1.2.1 + - Switch dependency from mime to mime-types@1.0.0 + +1.3.0 / 2014-05-31 +================== + + * add `extended` option to urlencoded parser + +1.2.2 / 2014-05-27 +================== + + * deps: raw-body@1.1.6 + - assert stream encoding on node.js 0.8 + - assert stream encoding on node.js < 0.10.6 + - deps: bytes@1 + +1.2.1 / 2014-05-26 +================== + + * invoke `next(err)` after request fully read + - prevents hung responses and socket hang ups + +1.2.0 / 2014-05-11 +================== + + * add `verify` option + * deps: type-is@1.2.0 + - support suffix matching + +1.1.2 / 2014-05-11 +================== + + * improve json parser speed + +1.1.1 / 2014-05-11 +================== + + * fix repeated limit parsing with every request + +1.1.0 / 2014-05-10 +================== + + * add `type` option + * deps: pin for safety and consistency + +1.0.2 / 2014-04-14 +================== + + * use `type-is` module + +1.0.1 / 2014-03-20 +================== + + * lower default limits to 100kb diff --git a/user-service/node_modules/body-parser/LICENSE b/user-service/node_modules/body-parser/LICENSE new file mode 100644 index 0000000000..386b7b6946 --- /dev/null +++ b/user-service/node_modules/body-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/body-parser/README.md b/user-service/node_modules/body-parser/README.md new file mode 100644 index 0000000000..38553bf798 --- /dev/null +++ b/user-service/node_modules/body-parser/README.md @@ -0,0 +1,465 @@ +# body-parser + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js body parsing middleware. + +Parse incoming request bodies in a middleware before your handlers, available +under the `req.body` property. + +**Note** As `req.body`'s shape is based on user-controlled input, all +properties and values in this object are untrusted and should be validated +before trusting. For example, `req.body.foo.toString()` may fail in multiple +ways, for example the `foo` property may not be there or may not be a string, +and `toString` may not be a function and instead a string or other user input. + +[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). + +_This does not handle multipart bodies_, due to their complex and typically +large nature. For multipart bodies, you may be interested in the following +modules: + + * [busboy](https://www.npmjs.org/package/busboy#readme) and + [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) + * [multiparty](https://www.npmjs.org/package/multiparty#readme) and + [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) + * [formidable](https://www.npmjs.org/package/formidable#readme) + * [multer](https://www.npmjs.org/package/multer#readme) + +This module provides the following parsers: + + * [JSON body parser](#bodyparserjsonoptions) + * [Raw body parser](#bodyparserrawoptions) + * [Text body parser](#bodyparsertextoptions) + * [URL-encoded form body parser](#bodyparserurlencodedoptions) + +Other body parsers you might be interested in: + +- [body](https://www.npmjs.org/package/body#readme) +- [co-body](https://www.npmjs.org/package/co-body#readme) + +## Installation + +```sh +$ npm install body-parser +``` + +## API + +```js +var bodyParser = require('body-parser') +``` + +The `bodyParser` object exposes various factories to create middlewares. All +middlewares will populate the `req.body` property with the parsed body when +the `Content-Type` request header matches the `type` option, or an empty +object (`{}`) if there was no body to parse, the `Content-Type` was not matched, +or an error occurred. + +The various errors returned by this module are described in the +[errors section](#errors). + +### bodyParser.json([options]) + +Returns middleware that only parses `json` and only looks at requests where +the `Content-Type` header matches the `type` option. This parser accepts any +Unicode encoding of the body and supports automatic inflation of `gzip` and +`deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). + +#### Options + +The `json` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### reviver + +The `reviver` option is passed directly to `JSON.parse` as the second +argument. You can find more information on this argument +[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). + +##### strict + +When set to `true`, will only accept arrays and objects; when `false` will +accept anything `JSON.parse` accepts. Defaults to `true`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not a +function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `json`), a mime type (like `application/json`), or +a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a truthy +value. Defaults to `application/json`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.raw([options]) + +Returns middleware that parses all bodies as a `Buffer` and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a `Buffer` object +of the body. + +#### Options + +The `raw` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. +If not a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this +can be an extension name (like `bin`), a mime type (like +`application/octet-stream`), or a mime type with a wildcard (like `*/*` or +`application/*`). If a function, the `type` option is called as `fn(req)` +and the request is parsed if it returns a truthy value. Defaults to +`application/octet-stream`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.text([options]) + +Returns middleware that parses all bodies as a string and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` string containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a string of the +body. + +#### Options + +The `text` function takes an optional `options` object that may contain any of +the following keys: + +##### defaultCharset + +Specify the default character set for the text content if the charset is not +specified in the `Content-Type` header of the request. Defaults to `utf-8`. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `txt`), a mime type (like `text/plain`), or a mime +type with a wildcard (like `*/*` or `text/*`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a +truthy value. Defaults to `text/plain`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.urlencoded([options]) + +Returns middleware that only parses `urlencoded` bodies and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser accepts only UTF-8 encoding of the body and supports automatic +inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This object will contain +key-value pairs, where the value can be a string or array (when `extended` is +`false`), or any type (when `extended` is `true`). + +#### Options + +The `urlencoded` function takes an optional `options` object that may contain +any of the following keys: + +##### extended + +The `extended` option allows to choose between parsing the URL-encoded data +with the `querystring` library (when `false`) or the `qs` library (when +`true`). The "extended" syntax allows for rich objects and arrays to be +encoded into the URL-encoded format, allowing for a JSON-like experience +with URL-encoded. For more information, please +[see the qs library](https://www.npmjs.org/package/qs#readme). + +Defaults to `true`, but using the default has been deprecated. Please +research into the difference between `qs` and `querystring` and choose the +appropriate setting. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### parameterLimit + +The `parameterLimit` option controls the maximum number of parameters that +are allowed in the URL-encoded data. If a request contains more parameters +than this value, a 413 will be returned to the client. Defaults to `1000`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `urlencoded`), a mime type (like +`application/x-www-form-urlencoded`), or a mime type with a wildcard (like +`*/x-www-form-urlencoded`). If a function, the `type` option is called as +`fn(req)` and the request is parsed if it returns a truthy value. Defaults +to `application/x-www-form-urlencoded`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +## Errors + +The middlewares provided by this module create errors using the +[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors +will typically have a `status`/`statusCode` property that contains the suggested +HTTP response code, an `expose` property to determine if the `message` property +should be displayed to the client, a `type` property to determine the type of +error without matching against the `message`, and a `body` property containing +the read body, if available. + +The following are the common errors created, though any error can come through +for various reasons. + +### content encoding unsupported + +This error will occur when the request had a `Content-Encoding` header that +contained an encoding but the "inflation" option was set to `false`. The +`status` property is set to `415`, the `type` property is set to +`'encoding.unsupported'`, and the `charset` property will be set to the +encoding that is unsupported. + +### entity parse failed + +This error will occur when the request contained an entity that could not be +parsed by the middleware. The `status` property is set to `400`, the `type` +property is set to `'entity.parse.failed'`, and the `body` property is set to +the entity value that failed parsing. + +### entity verify failed + +This error will occur when the request contained an entity that could not be +failed verification by the defined `verify` option. The `status` property is +set to `403`, the `type` property is set to `'entity.verify.failed'`, and the +`body` property is set to the entity value that failed verification. + +### request aborted + +This error will occur when the request is aborted by the client before reading +the body has finished. The `received` property will be set to the number of +bytes received before the request was aborted and the `expected` property is +set to the number of expected bytes. The `status` property is set to `400` +and `type` property is set to `'request.aborted'`. + +### request entity too large + +This error will occur when the request body's size is larger than the "limit" +option. The `limit` property will be set to the byte limit and the `length` +property will be set to the request body's length. The `status` property is +set to `413` and the `type` property is set to `'entity.too.large'`. + +### request size did not match content length + +This error will occur when the request's length did not match the length from +the `Content-Length` header. This typically occurs when the request is malformed, +typically when the `Content-Length` header was calculated based on characters +instead of bytes. The `status` property is set to `400` and the `type` property +is set to `'request.size.invalid'`. + +### stream encoding should not be set + +This error will occur when something called the `req.setEncoding` method prior +to this middleware. This module operates directly on bytes only and you cannot +call `req.setEncoding` when using this module. The `status` property is set to +`500` and the `type` property is set to `'stream.encoding.set'`. + +### stream is not readable + +This error will occur when the request is no longer readable when this middleware +attempts to read it. This typically means something other than a middleware from +this module read the request body already and the middleware was also configured to +read the same request. The `status` property is set to `500` and the `type` +property is set to `'stream.not.readable'`. + +### too many parameters + +This error will occur when the content of the request exceeds the configured +`parameterLimit` for the `urlencoded` parser. The `status` property is set to +`413` and the `type` property is set to `'parameters.too.many'`. + +### unsupported charset "BOGUS" + +This error will occur when the request had a charset parameter in the +`Content-Type` header, but the `iconv-lite` module does not support it OR the +parser does not support it. The charset is contained in the message as well +as in the `charset` property. The `status` property is set to `415`, the +`type` property is set to `'charset.unsupported'`, and the `charset` property +is set to the charset that is unsupported. + +### unsupported content encoding "bogus" + +This error will occur when the request had a `Content-Encoding` header that +contained an unsupported encoding. The encoding is contained in the message +as well as in the `encoding` property. The `status` property is set to `415`, +the `type` property is set to `'encoding.unsupported'`, and the `encoding` +property is set to the encoding that is unsupported. + +## Examples + +### Express/Connect top-level generic + +This example demonstrates adding a generic JSON and URL-encoded parser as a +top-level middleware, which will parse the bodies of all incoming requests. +This is the simplest setup. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: false })) + +// parse application/json +app.use(bodyParser.json()) + +app.use(function (req, res) { + res.setHeader('Content-Type', 'text/plain') + res.write('you posted:\n') + res.end(JSON.stringify(req.body, null, 2)) +}) +``` + +### Express route-specific + +This example demonstrates adding body parsers specifically to the routes that +need them. In general, this is the most recommended way to use body-parser with +Express. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// create application/json parser +var jsonParser = bodyParser.json() + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }) + +// POST /login gets urlencoded bodies +app.post('/login', urlencodedParser, function (req, res) { + res.send('welcome, ' + req.body.username) +}) + +// POST /api/users gets JSON bodies +app.post('/api/users', jsonParser, function (req, res) { + // create user in req.body +}) +``` + +### Change accepted type for parsers + +All the parsers accept a `type` option which allows you to change the +`Content-Type` that the middleware will parse. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse various different custom JSON types as JSON +app.use(bodyParser.json({ type: 'application/*+json' })) + +// parse some custom thing into a Buffer +app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) + +// parse an HTML body into a string +app.use(bodyParser.text({ type: 'text/html' })) +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci +[ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master +[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master +[node-version-image]: https://badgen.net/npm/node/body-parser +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/body-parser +[npm-url]: https://npmjs.org/package/body-parser +[npm-version-image]: https://badgen.net/npm/v/body-parser diff --git a/user-service/node_modules/body-parser/SECURITY.md b/user-service/node_modules/body-parser/SECURITY.md new file mode 100644 index 0000000000..9694d42961 --- /dev/null +++ b/user-service/node_modules/body-parser/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The Express team and community take all security bugs seriously. Thank you +for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `body-parser`. This +information can be found in the npm registry using the command +`npm owner ls body-parser`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/expressjs/body-parser/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/user-service/node_modules/body-parser/index.js b/user-service/node_modules/body-parser/index.js new file mode 100644 index 0000000000..bb24d739d9 --- /dev/null +++ b/user-service/node_modules/body-parser/index.js @@ -0,0 +1,156 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('body-parser') + +/** + * Cache of loaded parsers. + * @private + */ + +var parsers = Object.create(null) + +/** + * @typedef Parsers + * @type {function} + * @property {function} json + * @property {function} raw + * @property {function} text + * @property {function} urlencoded + */ + +/** + * Module exports. + * @type {Parsers} + */ + +exports = module.exports = deprecate.function(bodyParser, + 'bodyParser: use individual json/urlencoded middlewares') + +/** + * JSON parser. + * @public + */ + +Object.defineProperty(exports, 'json', { + configurable: true, + enumerable: true, + get: createParserGetter('json') +}) + +/** + * Raw parser. + * @public + */ + +Object.defineProperty(exports, 'raw', { + configurable: true, + enumerable: true, + get: createParserGetter('raw') +}) + +/** + * Text parser. + * @public + */ + +Object.defineProperty(exports, 'text', { + configurable: true, + enumerable: true, + get: createParserGetter('text') +}) + +/** + * URL-encoded parser. + * @public + */ + +Object.defineProperty(exports, 'urlencoded', { + configurable: true, + enumerable: true, + get: createParserGetter('urlencoded') +}) + +/** + * Create a middleware to parse json and urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @deprecated + * @public + */ + +function bodyParser (options) { + // use default type for parsers + var opts = Object.create(options || null, { + type: { + configurable: true, + enumerable: true, + value: undefined, + writable: true + } + }) + + var _urlencoded = exports.urlencoded(opts) + var _json = exports.json(opts) + + return function bodyParser (req, res, next) { + _json(req, res, function (err) { + if (err) return next(err) + _urlencoded(req, res, next) + }) + } +} + +/** + * Create a getter for loading a parser. + * @private + */ + +function createParserGetter (name) { + return function get () { + return loadParser(name) + } +} + +/** + * Load a parser module. + * @private + */ + +function loadParser (parserName) { + var parser = parsers[parserName] + + if (parser !== undefined) { + return parser + } + + // this uses a switch for static require analysis + switch (parserName) { + case 'json': + parser = require('./lib/types/json') + break + case 'raw': + parser = require('./lib/types/raw') + break + case 'text': + parser = require('./lib/types/text') + break + case 'urlencoded': + parser = require('./lib/types/urlencoded') + break + } + + // store to prevent invoking require() + return (parsers[parserName] = parser) +} diff --git a/user-service/node_modules/body-parser/lib/read.js b/user-service/node_modules/body-parser/lib/read.js new file mode 100644 index 0000000000..fce6283f50 --- /dev/null +++ b/user-service/node_modules/body-parser/lib/read.js @@ -0,0 +1,205 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var destroy = require('destroy') +var getBody = require('raw-body') +var iconv = require('iconv-lite') +var onFinished = require('on-finished') +var unpipe = require('unpipe') +var zlib = require('zlib') + +/** + * Module exports. + */ + +module.exports = read + +/** + * Read a request into a buffer and parse. + * + * @param {object} req + * @param {object} res + * @param {function} next + * @param {function} parse + * @param {function} debug + * @param {object} options + * @private + */ + +function read (req, res, next, parse, debug, options) { + var length + var opts = options + var stream + + // flag as parsed + req._body = true + + // read options + var encoding = opts.encoding !== null + ? opts.encoding + : null + var verify = opts.verify + + try { + // get the content stream + stream = contentstream(req, debug, opts.inflate) + length = stream.length + stream.length = undefined + } catch (err) { + return next(err) + } + + // set raw-body options + opts.length = length + opts.encoding = verify + ? null + : encoding + + // assert charset is supported + if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { + return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + })) + } + + // read body + debug('read body') + getBody(stream, opts, function (error, body) { + if (error) { + var _error + + if (error.type === 'encoding.unsupported') { + // echo back charset + _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + }) + } else { + // set status code on error + _error = createError(400, error) + } + + // unpipe from stream and destroy + if (stream !== req) { + unpipe(req) + destroy(stream, true) + } + + // read off entire request + dump(req, function onfinished () { + next(createError(400, _error)) + }) + return + } + + // verify + if (verify) { + try { + debug('verify body') + verify(req, res, body, encoding) + } catch (err) { + next(createError(403, err, { + body: body, + type: err.type || 'entity.verify.failed' + })) + return + } + } + + // parse + var str = body + try { + debug('parse body') + str = typeof body !== 'string' && encoding !== null + ? iconv.decode(body, encoding) + : body + req.body = parse(str) + } catch (err) { + next(createError(400, err, { + body: str, + type: err.type || 'entity.parse.failed' + })) + return + } + + next() + }) +} + +/** + * Get the content stream of the request. + * + * @param {object} req + * @param {function} debug + * @param {boolean} [inflate=true] + * @return {object} + * @api private + */ + +function contentstream (req, debug, inflate) { + var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() + var length = req.headers['content-length'] + var stream + + debug('content-encoding "%s"', encoding) + + if (inflate === false && encoding !== 'identity') { + throw createError(415, 'content encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + switch (encoding) { + case 'deflate': + stream = zlib.createInflate() + debug('inflate body') + req.pipe(stream) + break + case 'gzip': + stream = zlib.createGunzip() + debug('gunzip body') + req.pipe(stream) + break + case 'identity': + stream = req + stream.length = length + break + default: + throw createError(415, 'unsupported content encoding "' + encoding + '"', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + return stream +} + +/** + * Dump the contents of a request. + * + * @param {object} req + * @param {function} callback + * @api private + */ + +function dump (req, callback) { + if (onFinished.isFinished(req)) { + callback(null) + } else { + onFinished(req, callback) + req.resume() + } +} diff --git a/user-service/node_modules/body-parser/lib/types/json.js b/user-service/node_modules/body-parser/lib/types/json.js new file mode 100644 index 0000000000..59f3f7e28f --- /dev/null +++ b/user-service/node_modules/body-parser/lib/types/json.js @@ -0,0 +1,247 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:json') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = json + +/** + * RegExp to match the first non-space in a string. + * + * Allowed whitespace is defined in RFC 7159: + * + * ws = *( + * %x20 / ; Space + * %x09 / ; Horizontal tab + * %x0A / ; Line feed or New line + * %x0D ) ; Carriage return + */ + +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex + +var JSON_SYNTAX_CHAR = '#' +var JSON_SYNTAX_REGEXP = /#+/g + +/** + * Create a middleware to parse JSON bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function json (options) { + var opts = options || {} + + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var inflate = opts.inflate !== false + var reviver = opts.reviver + var strict = opts.strict !== false + var type = opts.type || 'application/json' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + if (body.length === 0) { + // special-case empty json body, as it's a common client-side mistake + // TODO: maybe make this configurable or part of "strict" option + return {} + } + + if (strict) { + var first = firstchar(body) + + if (first !== '{' && first !== '[') { + debug('strict violation') + throw createStrictSyntaxError(body, first) + } + } + + try { + debug('parse json') + return JSON.parse(body, reviver) + } catch (e) { + throw normalizeJsonSyntaxError(e, { + message: e.message, + stack: e.stack + }) + } + } + + return function jsonParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset per RFC 7159 sec 8.1 + var charset = getCharset(req) || 'utf-8' + if (charset.slice(0, 4) !== 'utf-') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Create strict violation syntax error matching native error. + * + * @param {string} str + * @param {string} char + * @return {Error} + * @private + */ + +function createStrictSyntaxError (str, char) { + var index = str.indexOf(char) + var partial = '' + + if (index !== -1) { + partial = str.substring(0, index) + JSON_SYNTAX_CHAR + + for (var i = index + 1; i < str.length; i++) { + partial += JSON_SYNTAX_CHAR + } + } + + try { + JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') + } catch (e) { + return normalizeJsonSyntaxError(e, { + message: e.message.replace(JSON_SYNTAX_REGEXP, function (placeholder) { + return str.substring(index, index + placeholder.length) + }), + stack: e.stack + }) + } +} + +/** + * Get the first non-whitespace character in a string. + * + * @param {string} str + * @return {function} + * @private + */ + +function firstchar (str) { + var match = FIRST_CHAR_REGEXP.exec(str) + + return match + ? match[1] + : undefined +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Normalize a SyntaxError for JSON.parse. + * + * @param {SyntaxError} error + * @param {object} obj + * @return {SyntaxError} + */ + +function normalizeJsonSyntaxError (error, obj) { + var keys = Object.getOwnPropertyNames(error) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key !== 'stack' && key !== 'message') { + delete error[key] + } + } + + // replace stack before message for Node.js 0.10 and below + error.stack = obj.stack.replace(error.message, obj.message) + error.message = obj.message + + return error +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/user-service/node_modules/body-parser/lib/types/raw.js b/user-service/node_modules/body-parser/lib/types/raw.js new file mode 100644 index 0000000000..f5d1b67475 --- /dev/null +++ b/user-service/node_modules/body-parser/lib/types/raw.js @@ -0,0 +1,101 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var debug = require('debug')('body-parser:raw') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = raw + +/** + * Create a middleware to parse raw bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function raw (options) { + var opts = options || {} + + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/octet-stream' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function rawParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // read + read(req, res, next, parse, debug, { + encoding: null, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/user-service/node_modules/body-parser/lib/types/text.js b/user-service/node_modules/body-parser/lib/types/text.js new file mode 100644 index 0000000000..083a00908a --- /dev/null +++ b/user-service/node_modules/body-parser/lib/types/text.js @@ -0,0 +1,121 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var debug = require('debug')('body-parser:text') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = text + +/** + * Create a middleware to parse text bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function text (options) { + var opts = options || {} + + var defaultCharset = opts.defaultCharset || 'utf-8' + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'text/plain' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function textParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // get charset + var charset = getCharset(req) || defaultCharset + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/user-service/node_modules/body-parser/lib/types/urlencoded.js b/user-service/node_modules/body-parser/lib/types/urlencoded.js new file mode 100644 index 0000000000..b2ca8f16d0 --- /dev/null +++ b/user-service/node_modules/body-parser/lib/types/urlencoded.js @@ -0,0 +1,284 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:urlencoded') +var deprecate = require('depd')('body-parser') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = urlencoded + +/** + * Cache of parser modules. + */ + +var parsers = Object.create(null) + +/** + * Create a middleware to parse urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function urlencoded (options) { + var opts = options || {} + + // notice because option default will flip in next major + if (opts.extended === undefined) { + deprecate('undefined extended: provide extended option') + } + + var extended = opts.extended !== false + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/x-www-form-urlencoded' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate query parser + var queryparse = extended + ? extendedparser(opts) + : simpleparser(opts) + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + return body.length + ? queryparse(body) + : {} + } + + return function urlencodedParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset + var charset = getCharset(req) || 'utf-8' + if (charset !== 'utf-8') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + debug: debug, + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the extended query parser. + * + * @param {object} options + */ + +function extendedparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('qs') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + var arrayLimit = Math.max(100, paramCount) + + debug('parse extended urlencoding') + return parse(body, { + allowPrototypes: true, + arrayLimit: arrayLimit, + depth: Infinity, + parameterLimit: parameterLimit + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Count the number of parameters, stopping once limit reached + * + * @param {string} body + * @param {number} limit + * @api private + */ + +function parameterCount (body, limit) { + var count = 0 + var index = 0 + + while ((index = body.indexOf('&', index)) !== -1) { + count++ + index++ + + if (count === limit) { + return undefined + } + } + + return count +} + +/** + * Get parser for module name dynamically. + * + * @param {string} name + * @return {function} + * @api private + */ + +function parser (name) { + var mod = parsers[name] + + if (mod !== undefined) { + return mod.parse + } + + // this uses a switch for static require analysis + switch (name) { + case 'qs': + mod = require('qs') + break + case 'querystring': + mod = require('querystring') + break + } + + // store to prevent invoking require() + parsers[name] = mod + + return mod.parse +} + +/** + * Get the simple query parser. + * + * @param {object} options + */ + +function simpleparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('querystring') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + debug('parse urlencoding') + return parse(body, undefined, undefined, { maxKeys: parameterLimit }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/user-service/node_modules/body-parser/package.json b/user-service/node_modules/body-parser/package.json new file mode 100644 index 0000000000..4637304389 --- /dev/null +++ b/user-service/node_modules/body-parser/package.json @@ -0,0 +1,56 @@ +{ + "name": "body-parser", + "description": "Node.js body parsing middleware", + "version": "1.20.2", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "expressjs/body-parser", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "devDependencies": { + "eslint": "8.34.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-markdown": "3.0.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-standard": "4.1.0", + "methods": "1.1.2", + "mocha": "10.2.0", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "supertest": "6.3.3" + }, + "files": [ + "lib/", + "LICENSE", + "HISTORY.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/user-service/node_modules/brace-expansion/LICENSE b/user-service/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000000..de3226673c --- /dev/null +++ b/user-service/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/brace-expansion/README.md b/user-service/node_modules/brace-expansion/README.md new file mode 100644 index 0000000000..6b4e0e1640 --- /dev/null +++ b/user-service/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/brace-expansion/index.js b/user-service/node_modules/brace-expansion/index.js new file mode 100644 index 0000000000..0478be81ea --- /dev/null +++ b/user-service/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/user-service/node_modules/brace-expansion/package.json b/user-service/node_modules/brace-expansion/package.json new file mode 100644 index 0000000000..a18faa8fd6 --- /dev/null +++ b/user-service/node_modules/brace-expansion/package.json @@ -0,0 +1,47 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.11", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/user-service/node_modules/braces/LICENSE b/user-service/node_modules/braces/LICENSE new file mode 100644 index 0000000000..9af4a67d20 --- /dev/null +++ b/user-service/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/user-service/node_modules/braces/README.md b/user-service/node_modules/braces/README.md new file mode 100644 index 0000000000..f59dd60456 --- /dev/null +++ b/user-service/node_modules/braces/README.md @@ -0,0 +1,586 @@ +# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## v3.0.0 Released!! + +See the [changelog](CHANGELOG.md) for details. + +## Why use braces? + +Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. + +- **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +- **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +- **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up. +- **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). +- **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). +- [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +- [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` +- [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` +- [Supports escaping](#escaping) - To prevent evaluation of special characters. + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +const braces = require('braces'); +// braces(patterns[, options]); + +console.log(braces(['{01..05}', '{a..e}'])); +//=> ['(0[1-5])', '([a-e])'] + +console.log(braces(['{01..05}', '{a..e}'], { expand: true })); +//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] +``` + +### Brace Expansion vs. Compilation + +By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. + +**Compiled** + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); +//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] +``` + +**Expanded** + +Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): + +```js +console.log(braces('a/{x,y,z}/b', { expand: true })); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] + +console.log(braces.expand('{01..10}')); +//=> ['01','02','03','04','05','06','07','08','09','10'] +``` + +### Lists + +Expand lists (like Bash "sets"): + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Expand ranges of characters (like Bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] +console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] +console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] + +// supports zero-padded ranges +console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b'] +console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b'] +``` + +See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. + +### Steppped ranges + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `10,000` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', { expand: true })); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Remove duplicates from the returned array. + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `1000` + +**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. + +You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +**Example: Transforming non-numeric values** + +```js +const alpha = braces.expand('x/{a..e}/y', { + transform(value, index) { + // When non-numeric values are passed, "value" is a character code. + return 'foo/' + String.fromCharCode(value) + '-' + index; + }, +}); +console.log(alpha); +//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] +``` + +**Example: Transforming numeric values** + +```js +const numeric = braces.expand('{1..5}', { + transform(value) { + // when numeric values are passed, "value" is a number + return 'foo/' + value * 2; + }, +}); +console.log(numeric); +//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +const braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true })); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true, expand: true })); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.keepEscaping + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Do not strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +- [brace expansion](#brace-expansion) is for generating new lists +- [brace matching](#brace-matching) is for filtering existing lists + +

    +More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +- brace expansion can eat up a huge amount of processing resources +- as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +- users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +- [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +- [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +- [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
    + +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch][]** | +| --------------------------- | ------------------- | ---------------------------- | +| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs) | N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch][]** | +| --------------- | --------------------------- | ---------------------------- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +Braces is more accurate, without sacrificing performance. + +```bash +● expand - range (expanded) + braces x 53,167 ops/sec ±0.12% (102 runs sampled) + minimatch x 11,378 ops/sec ±0.10% (102 runs sampled) +● expand - range (optimized for regex) + braces x 373,442 ops/sec ±0.04% (100 runs sampled) + minimatch x 3,262 ops/sec ±0.18% (100 runs sampled) +● expand - nested ranges (expanded) + braces x 33,921 ops/sec ±0.09% (99 runs sampled) + minimatch x 10,855 ops/sec ±0.28% (100 runs sampled) +● expand - nested ranges (optimized for regex) + braces x 287,479 ops/sec ±0.52% (98 runs sampled) + minimatch x 3,219 ops/sec ±0.28% (101 runs sampled) +● expand - set (expanded) + braces x 238,243 ops/sec ±0.19% (97 runs sampled) + minimatch x 538,268 ops/sec ±0.31% (96 runs sampled) +● expand - set (optimized for regex) + braces x 321,844 ops/sec ±0.10% (97 runs sampled) + minimatch x 140,600 ops/sec ±0.15% (100 runs sampled) +● expand - nested sets (expanded) + braces x 165,371 ops/sec ±0.42% (96 runs sampled) + minimatch x 337,720 ops/sec ±0.28% (100 runs sampled) +● expand - nested sets (optimized for regex) + braces x 242,948 ops/sec ±0.12% (99 runs sampled) + minimatch x 87,403 ops/sec ±0.79% (96 runs sampled) +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| ----------- | ------------------------------------------------------------- | +| 197 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +- [GitHub Profile](https://github.com/jonschlinkert) +- [Twitter Profile](https://twitter.com/jonschlinkert) +- [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +--- + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ diff --git a/user-service/node_modules/braces/index.js b/user-service/node_modules/braces/index.js new file mode 100644 index 0000000000..d222c13b57 --- /dev/null +++ b/user-service/node_modules/braces/index.js @@ -0,0 +1,170 @@ +'use strict'; + +const stringify = require('./lib/stringify'); +const compile = require('./lib/compile'); +const expand = require('./lib/expand'); +const parse = require('./lib/parse'); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (const pattern of input) { + const result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. + * + * ```js + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; diff --git a/user-service/node_modules/braces/lib/compile.js b/user-service/node_modules/braces/lib/compile.js new file mode 100644 index 0000000000..dce69beb90 --- /dev/null +++ b/user-service/node_modules/braces/lib/compile.js @@ -0,0 +1,60 @@ +'use strict'; + +const fill = require('fill-range'); +const utils = require('./utils'); + +const compile = (ast, options = {}) => { + const walk = (node, parent = {}) => { + const invalidBlock = utils.isInvalidBrace(parent); + const invalidNode = node.invalid === true && options.escapeInvalid === true; + const invalid = invalidBlock === true || invalidNode === true; + const prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; + + if (node.isOpen === true) { + return prefix + node.value; + } + + if (node.isClose === true) { + console.log('node.isClose', prefix, node.value); + return prefix + node.value; + } + + if (node.type === 'open') { + return invalid ? prefix + node.value : '('; + } + + if (node.type === 'close') { + return invalid ? prefix + node.value : ')'; + } + + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : invalid ? node.value : '|'; + } + + if (node.value) { + return node.value; + } + + if (node.nodes && node.ranges > 0) { + const args = utils.reduce(node.nodes); + const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true }); + + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (const child of node.nodes) { + output += walk(child, node); + } + } + + return output; + }; + + return walk(ast); +}; + +module.exports = compile; diff --git a/user-service/node_modules/braces/lib/constants.js b/user-service/node_modules/braces/lib/constants.js new file mode 100644 index 0000000000..2bb3b88403 --- /dev/null +++ b/user-service/node_modules/braces/lib/constants.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = { + MAX_LENGTH: 10000, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; diff --git a/user-service/node_modules/braces/lib/expand.js b/user-service/node_modules/braces/lib/expand.js new file mode 100644 index 0000000000..35b2c41d6a --- /dev/null +++ b/user-service/node_modules/braces/lib/expand.js @@ -0,0 +1,113 @@ +'use strict'; + +const fill = require('fill-range'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +const append = (queue = '', stash = '', enclose = false) => { + const result = []; + + queue = [].concat(queue); + stash = [].concat(stash); + + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } + + for (const item of queue) { + if (Array.isArray(item)) { + for (const value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele); + } + } + } + return utils.flatten(result); +}; + +const expand = (ast, options = {}) => { + const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit; + + const walk = (node, parent = {}) => { + node.queue = []; + + let p = parent; + let q = parent.queue; + + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } + + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } + + if (node.nodes && node.ranges > 0) { + const args = utils.reduce(node.nodes); + + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + + const enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } + + for (let i = 0; i < node.nodes.length; i++) { + const child = node.nodes[i]; + + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } + + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } + + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } + + if (child.nodes) { + walk(child, node); + } + } + + return queue; + }; + + return utils.flatten(walk(ast)); +}; + +module.exports = expand; diff --git a/user-service/node_modules/braces/lib/parse.js b/user-service/node_modules/braces/lib/parse.js new file mode 100644 index 0000000000..3a6988e629 --- /dev/null +++ b/user-service/node_modules/braces/lib/parse.js @@ -0,0 +1,331 @@ +'use strict'; + +const stringify = require('./stringify'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = require('./constants'); + +/** + * parse + */ + +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + const opts = options || {}; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + + const ast = { type: 'root', input, nodes: [] }; + const stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + const length = input.length; + let index = 0; + let depth = 0; + let value; + + /** + * Helpers + */ + + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } + + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; + } + + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + + push({ type: 'bos' }); + + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + + /** + * Invalid chars + */ + + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + + /** + * Escaped chars + */ + + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } + + /** + * Right square bracket (literal): ']' + */ + + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } + + /** + * Left square bracket: '[' + */ + + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + + let next; + + while (index < length && (next = advance())) { + value += next; + + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + const open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + const brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + const type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + const open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + const siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + const before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; + } + + /** + * Text + */ + + push({ type: 'text', value }); + } + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + const parent = stack[stack.length - 1]; + const index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; diff --git a/user-service/node_modules/braces/lib/stringify.js b/user-service/node_modules/braces/lib/stringify.js new file mode 100644 index 0000000000..8bcf872c31 --- /dev/null +++ b/user-service/node_modules/braces/lib/stringify.js @@ -0,0 +1,32 @@ +'use strict'; + +const utils = require('./utils'); + +module.exports = (ast, options = {}) => { + const stringify = (node, parent = {}) => { + const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + const invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; + } + + if (node.value) { + return node.value; + } + + if (node.nodes) { + for (const child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + diff --git a/user-service/node_modules/braces/lib/utils.js b/user-service/node_modules/braces/lib/utils.js new file mode 100644 index 0000000000..d19311fe04 --- /dev/null +++ b/user-service/node_modules/braces/lib/utils.js @@ -0,0 +1,122 @@ +'use strict'; + +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; + +/** + * Find a node of the given type + */ + +exports.find = (node, type) => node.nodes.find(node => node.type === type); + +/** + * Find a node of the given type + */ + +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; + +/** + * Escape the given node with '\\' before node.value + */ + +exports.escapeNode = (block, n = 0, type) => { + const node = block.nodes[n]; + if (!node) return; + + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; + +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; +}; + +/** + * Reduce an array of text nodes. + */ + +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); + +/** + * Flatten an array + */ + +exports.flatten = (...args) => { + const result = []; + + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + const ele = arr[i]; + + if (Array.isArray(ele)) { + flat(ele); + continue; + } + + if (ele !== undefined) { + result.push(ele); + } + } + return result; + }; + + flat(args); + return result; +}; diff --git a/user-service/node_modules/braces/package.json b/user-service/node_modules/braces/package.json new file mode 100644 index 0000000000..c3c056e469 --- /dev/null +++ b/user-service/node_modules/braces/package.json @@ -0,0 +1,77 @@ +{ + "name": "braces", + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "version": "3.0.3", + "homepage": "https://github.com/micromatch/braces", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Elan Shanker (https://github.com/es128)", + "Eugene Sharygin (https://github.com/eush77)", + "hemanth.hm (http://h3manth.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/braces", + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "fill-range": "^7.1.1" + }, + "devDependencies": { + "ansi-colors": "^3.2.4", + "bash-path": "^2.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ] + } +} diff --git a/user-service/node_modules/bson/LICENSE.md b/user-service/node_modules/bson/LICENSE.md new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/user-service/node_modules/bson/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/user-service/node_modules/bson/README.md b/user-service/node_modules/bson/README.md new file mode 100644 index 0000000000..c658e0924f --- /dev/null +++ b/user-service/node_modules/bson/README.md @@ -0,0 +1,280 @@ +# BSON parser + +BSON is short for "Binary JSON," and is the binary-encoded serialization of JSON-like documents. +You can learn more about it in [the specification](http://bsonspec.org). + +### Table of Contents + +- [Usage](#usage) +- [Bugs/Feature Requests](#bugs--feature-requests) +- [Installation](#installation) +- [Documentation](#documentation) +- [FAQ](#faq) + + +### Release Integrity + +Releases are created automatically and signed using the [Node team's GPG key](https://pgp.mongodb.com/node-driver.asc). This applies to the git tag as well as all release packages provided as part of a GitHub release. To verify the provided packages, download the key and import it using gpg: + +```shell +gpg --import node-driver.asc +``` + +The GitHub release contains a detached signature file for the NPM package (named +`bson-X.Y.Z.tgz.sig`). + +The following command returns the link npm package. +```shell +npm view bson@vX.Y.Z dist.tarball +``` + +Using the result of the above command, a `curl` command can return the official npm package for the release. + +To verify the integrity of the downloaded package, run the following command: +```shell +gpg --verify bson-X.Y.Z.tgz.sig bson-X.Y.Z.tgz +``` + +>[!Note] +No verification is done when using npm to install the package. The contents of the Github tarball and npm's tarball are identical. + +## Bugs / Feature Requests + +Think you've found a bug? Want to see a new feature in `bson`? Please open a case in our issue management tool, JIRA: + +1. Create an account and login: [jira.mongodb.org](https://jira.mongodb.org) +2. Navigate to the NODE project: [jira.mongodb.org/browse/NODE](https://jira.mongodb.org/browse/NODE) +3. Click **Create Issue** - Please provide as much information as possible about the issue and how to reproduce it. + +Bug reports in JIRA for the NODE driver project are **public**. + +## Usage + +To build a new version perform the following operations: + +``` +npm install +npm run build +``` + +### Node.js or Bundling Usage + +When using a bundler or Node.js you can import bson using the package name: + +```js +import { BSON, EJSON, ObjectId } from 'bson'; +// or: +// const { BSON, EJSON, ObjectId } = require('bson'); + +const bytes = BSON.serialize({ _id: new ObjectId() }); +console.log(bytes); +const doc = BSON.deserialize(bytes); +console.log(EJSON.stringify(doc)); +// {"_id":{"$oid":"..."}} +``` + +### Browser Usage + +If you are working directly in the browser without a bundler please use the `.mjs` bundle like so: + +```html + +``` + +## Installation + +```sh +npm install bson +``` + +### MongoDB Node.js Driver Version Compatibility + +Only the following version combinations with the [MongoDB Node.js Driver](https://github.com/mongodb/node-mongodb-native) are considered stable. + +| | `bson@1.x` | `bson@4.x` | `bson@5.x` | `bson@6.x` | +| ------------- | ---------- | ---------- | ---------- | ---------- | +| `mongodb@6.x` | N/A | N/A | N/A | ✓ | +| `mongodb@5.x` | N/A | N/A | ✓ | N/A | +| `mongodb@4.x` | N/A | ✓ | N/A | N/A | +| `mongodb@3.x` | ✓ | N/A | N/A | N/A | + +## Documentation + +### BSON + +[API documentation](https://mongodb.github.io/node-mongodb-native/Next/modules/BSON.html) + +
    + +### EJSON + +- [EJSON](#EJSON) + + - [.parse(text, [options])](#EJSON.parse) + + - [.stringify(value, [replacer], [space], [options])](#EJSON.stringify) + + - [.serialize(bson, [options])](#EJSON.serialize) + + - [.deserialize(ejson, [options])](#EJSON.deserialize) + + + +#### _EJSON_.parse(text, [options]) + +| Param | Type | Default | Description | +| ----------------- | -------------------- | ----------------- | ---------------------------------------------------------------------------------- | +| text | string | | | +| [options] | object | | Optional settings | +| [options.relaxed] | boolean | true | Attempt to return native JS types where possible, rather than BSON types (if true) | + +Parse an Extended JSON string, constructing the JavaScript value or object described by that +string. + +**Example** + +```js +const { EJSON } = require('bson'); +const text = '{ "int32": { "$numberInt": "10" } }'; + +// prints { int32: { [String: '10'] _bsontype: 'Int32', value: '10' } } +console.log(EJSON.parse(text, { relaxed: false })); + +// prints { int32: 10 } +console.log(EJSON.parse(text)); +``` + + + +#### _EJSON_.stringify(value, [replacer], [space], [options]) + +| Param | Type | Default | Description | +| ----------------- | ------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| value | object | | The value to convert to extended JSON | +| [replacer] | function \| array | | A function that alters the behavior of the stringification process, or an array of String and Number objects that serve as a whitelist for selecting/filtering the properties of the value object to be included in the JSON string. If this value is null or not provided, all properties of the object are included in the resulting JSON string | +| [space] | string \| number | | A String or Number object that's used to insert white space into the output JSON string for readability purposes. | +| [options] | object | | Optional settings | +| [options.relaxed] | boolean | true | Enabled Extended JSON's `relaxed` mode | +| [options.legacy] | boolean | true | Output in Extended JSON v1 | + +Converts a BSON document to an Extended JSON string, optionally replacing values if a replacer +function is specified or optionally including only the specified properties if a replacer array +is specified. + +**Example** + +```js +const { EJSON } = require('bson'); +const Int32 = require('mongodb').Int32; +const doc = { int32: new Int32(10) }; + +// prints '{"int32":{"$numberInt":"10"}}' +console.log(EJSON.stringify(doc, { relaxed: false })); + +// prints '{"int32":10}' +console.log(EJSON.stringify(doc)); +``` + + + +#### _EJSON_.serialize(bson, [options]) + +| Param | Type | Description | +| --------- | ------------------- | ---------------------------------------------------- | +| bson | object | The object to serialize | +| [options] | object | Optional settings passed to the `stringify` function | + +Serializes an object to an Extended JSON string, and reparse it as a JavaScript object. + + + +#### _EJSON_.deserialize(ejson, [options]) + +| Param | Type | Description | +| --------- | ------------------- | -------------------------------------------- | +| ejson | object | The Extended JSON object to deserialize | +| [options] | object | Optional settings passed to the parse method | + +Deserializes an Extended JSON object into a plain JavaScript object with native/BSON types + +## Error Handling + +It is our recommendation to use `BSONError.isBSONError()` checks on errors and to avoid relying on parsing `error.message` and `error.name` strings in your code. We guarantee `BSONError.isBSONError()` checks will pass according to semver guidelines, but errors may be sub-classed or their messages may change at any time, even patch releases, as we see fit to increase the helpfulness of the errors. + +Any new errors we add to the driver will directly extend an existing error class and no existing error will be moved to a different parent class outside of a major release. +This means `BSONError.isBSONError()` will always be able to accurately capture the errors that our BSON library throws. + +Hypothetical example: A collection in our Db has an issue with UTF-8 data: + +```ts +let documentCount = 0; +const cursor = collection.find({}, { utf8Validation: true }); +try { + for await (const doc of cursor) documentCount += 1; +} catch (error) { + if (BSONError.isBSONError(error)) { + console.log(`Found the troublemaker UTF-8!: ${documentCount} ${error.message}`); + return documentCount; + } + throw error; +} +``` + +## React Native + +BSON vendors the required polyfills for `TextEncoder`, `TextDecoder`, `atob`, `btoa` imported from React Native and therefore doesn't expect users to polyfill these. One additional polyfill, `crypto.getRandomValues` is recommended and can be installed with the following command: + +```sh +npm install --save react-native-get-random-values +``` + +The following snippet should be placed at the top of the entrypoint (by default this is the root `index.js` file) for React Native projects using the BSON library. These lines must be placed for any code that imports `BSON`. + +```typescript +// Required Polyfills For ReactNative +import 'react-native-get-random-values'; +``` + +Finally, import the `BSON` library like so: + +```typescript +import { BSON, EJSON } from 'bson'; +``` + +This will cause React Native to import the `node_modules/bson/lib/bson.rn.cjs` bundle (see the `"react-native"` setting we have in the `"exports"` section of our [package.json](./package.json).) + +### Technical Note about React Native module import + +The `"exports"` definition in our `package.json` will result in BSON's CommonJS bundle being imported in a React Native project instead of the ES module bundle. Importing the CommonJS bundle is necessary because BSON's ES module bundle of BSON uses top-level await, which is not supported syntax in [React Native's runtime hermes](https://hermesengine.dev/). + +## FAQ + +#### Why does `undefined` get converted to `null`? + +The `undefined` BSON type has been [deprecated for many years](http://bsonspec.org/spec.html), so this library has dropped support for it. Use the `ignoreUndefined` option (for example, from the [driver](http://mongodb.github.io/node-mongodb-native/2.2/api/MongoClient.html#connect) ) to instead remove `undefined` keys. + +#### How do I add custom serialization logic? + +This library looks for `toBSON()` functions on every path, and calls the `toBSON()` function to get the value to serialize. + +```javascript +const BSON = require('bson'); + +class CustomSerialize { + toBSON() { + return 42; + } +} + +const obj = { answer: new CustomSerialize() }; +// "{ answer: 42 }" +console.log(BSON.deserialize(BSON.serialize(obj))); +``` diff --git a/user-service/node_modules/bson/bson.d.ts b/user-service/node_modules/bson/bson.d.ts new file mode 100644 index 0000000000..69af3db0d6 --- /dev/null +++ b/user-service/node_modules/bson/bson.d.ts @@ -0,0 +1,1606 @@ +/** + * A class representation of the BSON Binary type. + * @public + * @category BSONType + */ +export declare class Binary extends BSONValue { + get _bsontype(): 'Binary'; + /* Excluded from this release type: BSON_BINARY_SUBTYPE_DEFAULT */ + /** Initial buffer default size */ + static readonly BUFFER_SIZE = 256; + /** Default BSON type */ + static readonly SUBTYPE_DEFAULT = 0; + /** Function BSON type */ + static readonly SUBTYPE_FUNCTION = 1; + /** Byte Array BSON type */ + static readonly SUBTYPE_BYTE_ARRAY = 2; + /** Deprecated UUID BSON type @deprecated Please use SUBTYPE_UUID */ + static readonly SUBTYPE_UUID_OLD = 3; + /** UUID BSON type */ + static readonly SUBTYPE_UUID = 4; + /** MD5 BSON type */ + static readonly SUBTYPE_MD5 = 5; + /** Encrypted BSON type */ + static readonly SUBTYPE_ENCRYPTED = 6; + /** Column BSON type */ + static readonly SUBTYPE_COLUMN = 7; + /** Sensitive BSON type */ + static readonly SUBTYPE_SENSITIVE = 8; + /** User BSON type */ + static readonly SUBTYPE_USER_DEFINED = 128; + buffer: Uint8Array; + sub_type: number; + position: number; + /** + * Create a new Binary instance. + * @param buffer - a buffer object containing the binary data. + * @param subType - the option binary type. + */ + constructor(buffer?: BinarySequence, subType?: number); + /** + * Updates this binary with byte_value. + * + * @param byteValue - a single byte we wish to write. + */ + put(byteValue: string | number | Uint8Array | number[]): void; + /** + * Writes a buffer to the binary. + * + * @param sequence - a string or buffer to be written to the Binary BSON object. + * @param offset - specify the binary of where to write the content. + */ + write(sequence: BinarySequence, offset: number): void; + /** + * Reads **length** bytes starting at **position**. + * + * @param position - read from the given position in the Binary. + * @param length - the number of bytes to read. + */ + read(position: number, length: number): BinarySequence; + /** returns a view of the binary value as a Uint8Array */ + value(): Uint8Array; + /** the length of the binary sequence */ + length(): number; + toJSON(): string; + toString(encoding?: 'hex' | 'base64' | 'utf8' | 'utf-8'): string; + /* Excluded from this release type: toExtendedJSON */ + toUUID(): UUID; + /** Creates an Binary instance from a hex digit string */ + static createFromHexString(hex: string, subType?: number): Binary; + /** Creates an Binary instance from a base64 string */ + static createFromBase64(base64: string, subType?: number): Binary; + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface BinaryExtended { + $binary: { + subType: string; + base64: string; + }; +} + +/** @public */ +export declare interface BinaryExtendedLegacy { + $type: string; + $binary: string; +} + +/** @public */ +export declare type BinarySequence = Uint8Array | number[]; + +declare namespace BSON { + export { + setInternalBufferSize, + serialize, + serializeWithBufferAndIndex, + deserialize, + calculateObjectSize, + deserializeStream, + UUIDExtended, + BinaryExtended, + BinaryExtendedLegacy, + BinarySequence, + CodeExtended, + DBRefLike, + Decimal128Extended, + DoubleExtended, + EJSONOptions, + Int32Extended, + LongExtended, + MaxKeyExtended, + MinKeyExtended, + ObjectIdExtended, + ObjectIdLike, + BSONRegExpExtended, + BSONRegExpExtendedLegacy, + BSONSymbolExtended, + LongWithoutOverrides, + TimestampExtended, + TimestampOverrides, + LongWithoutOverridesClass, + SerializeOptions, + DeserializeOptions, + Code, + BSONSymbol, + DBRef, + Binary, + ObjectId, + UUID, + Long, + Timestamp, + Double, + Int32, + MinKey, + MaxKey, + BSONRegExp, + Decimal128, + BSONValue, + BSONError, + BSONVersionError, + BSONRuntimeError, + BSONOffsetError, + BSONType, + EJSON, + onDemand, + OnDemand, + Document, + CalculateObjectSizeOptions + } +} +export { BSON } + +/** + * @public + * @experimental + */ +declare type BSONElement = [ +type: number, +nameOffset: number, +nameLength: number, +offset: number, +length: number +]; + +/** + * @public + * @category Error + * + * `BSONError` objects are thrown when BSON encounters an error. + * + * This is the parent class for all the other errors thrown by this library. + */ +export declare class BSONError extends Error { + /* Excluded from this release type: bsonError */ + get name(): string; + constructor(message: string, options?: { + cause?: unknown; + }); + /** + * @public + * + * All errors thrown from the BSON library inherit from `BSONError`. + * This method can assist with determining if an error originates from the BSON library + * even if it does not pass an `instanceof` check against this class' constructor. + * + * @param value - any javascript value that needs type checking + */ + static isBSONError(value: unknown): value is BSONError; +} + +/** + * @public + * @category Error + * + * @experimental + * + * An error generated when BSON bytes are invalid. + * Reports the offset the parser was able to reach before encountering the error. + */ +export declare class BSONOffsetError extends BSONError { + get name(): 'BSONOffsetError'; + offset: number; + constructor(message: string, offset: number, options?: { + cause?: unknown; + }); +} + +/** + * A class representation of the BSON RegExp type. + * @public + * @category BSONType + */ +export declare class BSONRegExp extends BSONValue { + get _bsontype(): 'BSONRegExp'; + pattern: string; + options: string; + /** + * @param pattern - The regular expression pattern to match + * @param options - The regular expression options + */ + constructor(pattern: string, options?: string); + static parseOptions(options?: string): string; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface BSONRegExpExtended { + $regularExpression: { + pattern: string; + options: string; + }; +} + +/** @public */ +export declare interface BSONRegExpExtendedLegacy { + $regex: string | BSONRegExp; + $options: string; +} + +/** + * @public + * @category Error + * + * An error generated when BSON functions encounter an unexpected input + * or reaches an unexpected/invalid internal state + * + */ +export declare class BSONRuntimeError extends BSONError { + get name(): 'BSONRuntimeError'; + constructor(message: string); +} + +/** + * A class representation of the BSON Symbol type. + * @public + * @category BSONType + */ +export declare class BSONSymbol extends BSONValue { + get _bsontype(): 'BSONSymbol'; + value: string; + /** + * @param value - the string representing the symbol. + */ + constructor(value: string); + /** Access the wrapped string value. */ + valueOf(): string; + toString(): string; + toJSON(): string; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface BSONSymbolExtended { + $symbol: string; +} + +/** @public */ +export declare const BSONType: Readonly<{ + readonly double: 1; + readonly string: 2; + readonly object: 3; + readonly array: 4; + readonly binData: 5; + readonly undefined: 6; + readonly objectId: 7; + readonly bool: 8; + readonly date: 9; + readonly null: 10; + readonly regex: 11; + readonly dbPointer: 12; + readonly javascript: 13; + readonly symbol: 14; + readonly javascriptWithScope: 15; + readonly int: 16; + readonly timestamp: 17; + readonly long: 18; + readonly decimal: 19; + readonly minKey: -1; + readonly maxKey: 127; +}>; + +/** @public */ +export declare type BSONType = (typeof BSONType)[keyof typeof BSONType]; + +/** @public */ +export declare abstract class BSONValue { + /** @public */ + abstract get _bsontype(): string; + /** + * @public + * Prints a human-readable string of BSON value information + * If invoked manually without node.js.inspect function, this will default to a modified JSON.stringify + */ + abstract inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; + /* Excluded from this release type: toExtendedJSON */ +} + +/** + * @public + * @category Error + */ +export declare class BSONVersionError extends BSONError { + get name(): 'BSONVersionError'; + constructor(); +} + +/** + * @public + * @experimental + * + * A collection of functions that help work with data in a Uint8Array. + * ByteUtils is configured at load time to use Node.js or Web based APIs for the internal implementations. + */ +declare type ByteUtils = { + /** Transforms the input to an instance of Buffer if running on node, otherwise Uint8Array */ + toLocalBufferType: (buffer: Uint8Array | ArrayBufferView | ArrayBuffer) => Uint8Array; + /** Create empty space of size */ + allocate: (size: number) => Uint8Array; + /** Create empty space of size, use pooled memory when available */ + allocateUnsafe: (size: number) => Uint8Array; + /** Check if two Uint8Arrays are deep equal */ + equals: (a: Uint8Array, b: Uint8Array) => boolean; + /** Check if two Uint8Arrays are deep equal */ + fromNumberArray: (array: number[]) => Uint8Array; + /** Create a Uint8Array from a base64 string */ + fromBase64: (base64: string) => Uint8Array; + /** Create a base64 string from bytes */ + toBase64: (buffer: Uint8Array) => string; + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + fromISO88591: (codePoints: string) => Uint8Array; + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + toISO88591: (buffer: Uint8Array) => string; + /** Create a Uint8Array from a hex string */ + fromHex: (hex: string) => Uint8Array; + /** Create a lowercase hex string from bytes */ + toHex: (buffer: Uint8Array) => string; + /** Create a string from utf8 code units, fatal=true will throw an error if UTF-8 bytes are invalid, fatal=false will insert replacement characters */ + toUTF8: (buffer: Uint8Array, start: number, end: number, fatal: boolean) => string; + /** Get the utf8 code unit count from a string if it were to be transformed to utf8 */ + utf8ByteLength: (input: string) => number; + /** Encode UTF8 bytes generated from `source` string into `destination` at byteOffset. Returns the number of bytes encoded. */ + encodeUTF8Into: (destination: Uint8Array, source: string, byteOffset: number) => number; + /** Generate a Uint8Array filled with random bytes with byteLength */ + randomBytes: (byteLength: number) => Uint8Array; +}; + +/* Excluded declaration from this release type: ByteUtils */ + +/** + * Calculate the bson size for a passed in Javascript object. + * + * @param object - the Javascript object to calculate the BSON byte size for + * @returns size of BSON object in bytes + * @public + */ +export declare function calculateObjectSize(object: Document, options?: CalculateObjectSizeOptions): number; + +/** @public */ +export declare type CalculateObjectSizeOptions = Pick; + +/** + * A class representation of the BSON Code type. + * @public + * @category BSONType + */ +export declare class Code extends BSONValue { + get _bsontype(): 'Code'; + code: string; + scope: Document | null; + /** + * @param code - a string or function. + * @param scope - an optional scope for the function. + */ + constructor(code: string | Function, scope?: Document | null); + toJSON(): { + code: string; + scope?: Document; + }; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface CodeExtended { + $code: string; + $scope?: Document; +} + +/** + * A class representation of the BSON DBRef type. + * @public + * @category BSONType + */ +export declare class DBRef extends BSONValue { + get _bsontype(): 'DBRef'; + collection: string; + oid: ObjectId; + db?: string; + fields: Document; + /** + * @param collection - the collection name. + * @param oid - the reference ObjectId. + * @param db - optional db name, if omitted the reference is local to the current db. + */ + constructor(collection: string, oid: ObjectId, db?: string, fields?: Document); + /* Excluded from this release type: namespace */ + /* Excluded from this release type: namespace */ + toJSON(): DBRefLike & Document; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface DBRefLike { + $ref: string; + $id: ObjectId; + $db?: string; +} + +/** + * A class representation of the BSON Decimal128 type. + * @public + * @category BSONType + */ +export declare class Decimal128 extends BSONValue { + get _bsontype(): 'Decimal128'; + readonly bytes: Uint8Array; + /** + * @param bytes - a buffer containing the raw Decimal128 bytes in little endian order, + * or a string representation as returned by .toString() + */ + constructor(bytes: Uint8Array | string); + /** + * Create a Decimal128 instance from a string representation + * + * @param representation - a numeric string representation. + */ + static fromString(representation: string): Decimal128; + /** + * Create a Decimal128 instance from a string representation, allowing for rounding to 34 + * significant digits + * + * @example Example of a number that will be rounded + * ```ts + * > let d = Decimal128.fromString('37.499999999999999196428571428571375') + * Uncaught: + * BSONError: "37.499999999999999196428571428571375" is not a valid Decimal128 string - inexact rounding + * at invalidErr (/home/wajames/js-bson/lib/bson.cjs:1402:11) + * at Decimal128.fromStringInternal (/home/wajames/js-bson/lib/bson.cjs:1633:25) + * at Decimal128.fromString (/home/wajames/js-bson/lib/bson.cjs:1424:27) + * + * > d = Decimal128.fromStringWithRounding('37.499999999999999196428571428571375') + * new Decimal128("37.49999999999999919642857142857138") + * ``` + * @param representation - a numeric string representation. + */ + static fromStringWithRounding(representation: string): Decimal128; + private static _fromString; + /** Create a string representation of the raw Decimal128 value */ + toString(): string; + toJSON(): Decimal128Extended; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface Decimal128Extended { + $numberDecimal: string; +} + +/** + * Deserialize data as BSON. + * + * @param buffer - the buffer containing the serialized set of BSON documents. + * @returns returns the deserialized Javascript Object. + * @public + */ +export declare function deserialize(buffer: Uint8Array, options?: DeserializeOptions): Document; + +/** @public */ +export declare interface DeserializeOptions { + /** + * when deserializing a Long return as a BigInt. + * @defaultValue `false` + */ + useBigInt64?: boolean; + /** + * when deserializing a Long will fit it into a Number if it's smaller than 53 bits. + * @defaultValue `true` + */ + promoteLongs?: boolean; + /** + * when deserializing a Binary will return it as a node.js Buffer instance. + * @defaultValue `false` + */ + promoteBuffers?: boolean; + /** + * when deserializing will promote BSON values to their Node.js closest equivalent types. + * @defaultValue `true` + */ + promoteValues?: boolean; + /** + * allow to specify if there what fields we wish to return as unserialized raw buffer. + * @defaultValue `null` + */ + fieldsAsRaw?: Document; + /** + * return BSON regular expressions as BSONRegExp instances. + * @defaultValue `false` + */ + bsonRegExp?: boolean; + /** + * allows the buffer to be larger than the parsed BSON object. + * @defaultValue `false` + */ + allowObjectSmallerThanBufferSize?: boolean; + /** + * Offset into buffer to begin reading document from + * @defaultValue `0` + */ + index?: number; + raw?: boolean; + /** Allows for opt-out utf-8 validation for all keys or + * specified keys. Must be all true or all false. + * + * @example + * ```js + * // disables validation on all keys + * validation: { utf8: false } + * + * // enables validation only on specified keys a, b, and c + * validation: { utf8: { a: true, b: true, c: true } } + * + * // disables validation only on specified keys a, b + * validation: { utf8: { a: false, b: false } } + * ``` + */ + validation?: { + utf8: boolean | Record | Record; + }; +} + +/** + * Deserialize stream data as BSON documents. + * + * @param data - the buffer containing the serialized set of BSON documents. + * @param startIndex - the start index in the data Buffer where the deserialization is to start. + * @param numberOfDocuments - number of documents to deserialize. + * @param documents - an array where to store the deserialized documents. + * @param docStartIndex - the index in the documents array from where to start inserting documents. + * @param options - additional options used for the deserialization. + * @returns next index in the buffer after deserialization **x** numbers of documents. + * @public + */ +export declare function deserializeStream(data: Uint8Array | ArrayBuffer, startIndex: number, numberOfDocuments: number, documents: Document[], docStartIndex: number, options: DeserializeOptions): number; + +/** @public */ +export declare interface Document { + [key: string]: any; +} + +/** + * A class representation of the BSON Double type. + * @public + * @category BSONType + */ +export declare class Double extends BSONValue { + get _bsontype(): 'Double'; + value: number; + /** + * Create a Double type + * + * @param value - the number we want to represent as a double. + */ + constructor(value: number); + /** + * Attempt to create an double type from string. + * + * This method will throw a BSONError on any string input that is not representable as a IEEE-754 64-bit double. + * Notably, this method will also throw on the following string formats: + * - Strings in non-decimal and non-exponential formats (binary, hex, or octal digits) + * - Strings with characters other than numeric, floating point, or leading sign characters (Note: 'Infinity', '-Infinity', and 'NaN' input strings are still allowed) + * - Strings with leading and/or trailing whitespace + * + * Strings with leading zeros, however, are also allowed + * + * @param value - the string we want to represent as a double. + */ + static fromString(value: string): Double; + /** + * Access the number value. + * + * @returns returns the wrapped double number. + */ + valueOf(): number; + toJSON(): number; + toString(radix?: number): string; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface DoubleExtended { + $numberDouble: string; +} + +/** @public */ +export declare const EJSON: { + parse: typeof parse; + stringify: typeof stringify; + serialize: typeof EJSONserialize; + deserialize: typeof EJSONdeserialize; +}; + +/** + * Deserializes an Extended JSON object into a plain JavaScript object with native/BSON types + * + * @param ejson - The Extended JSON object to deserialize + * @param options - Optional settings passed to the parse method + */ +declare function EJSONdeserialize(ejson: Document, options?: EJSONOptions): any; + +/** @public */ +export declare type EJSONOptions = { + /** + * Output using the Extended JSON v1 spec + * @defaultValue `false` + */ + legacy?: boolean; + /** + * Enable Extended JSON's `relaxed` mode, which attempts to return native JS types where possible, rather than BSON types + * @defaultValue `false` */ + relaxed?: boolean; + /** + * Enable native bigint support + * @defaultValue `false` + */ + useBigInt64?: boolean; +}; + +/** + * Serializes an object to an Extended JSON string, and reparse it as a JavaScript object. + * + * @param value - The object to serialize + * @param options - Optional settings passed to the `stringify` function + */ +declare function EJSONserialize(value: any, options?: EJSONOptions): Document; + +declare type InspectFn = (x: unknown, options?: unknown) => string; + +/** + * A class representation of a BSON Int32 type. + * @public + * @category BSONType + */ +export declare class Int32 extends BSONValue { + get _bsontype(): 'Int32'; + value: number; + /** + * Create an Int32 type + * + * @param value - the number we want to represent as an int32. + */ + constructor(value: number | string); + /** + * Attempt to create an Int32 type from string. + * + * This method will throw a BSONError on any string input that is not representable as an Int32. + * Notably, this method will also throw on the following string formats: + * - Strings in non-decimal formats (exponent notation, binary, hex, or octal digits) + * - Strings non-numeric and non-leading sign characters (ex: '2.0', '24,000') + * - Strings with leading and/or trailing whitespace + * + * Strings with leading zeros, however, are allowed. + * + * @param value - the string we want to represent as an int32. + */ + static fromString(value: string): Int32; + /** + * Access the number value. + * + * @returns returns the wrapped int32 number. + */ + valueOf(): number; + toString(radix?: number): string; + toJSON(): number; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface Int32Extended { + $numberInt: string; +} + +/** + * A class representing a 64-bit integer + * @public + * @category BSONType + * @remarks + * The internal representation of a long is the two given signed, 32-bit values. + * We use 32-bit pieces because these are the size of integers on which + * Javascript performs bit-operations. For operations like addition and + * multiplication, we split each number into 16 bit pieces, which can easily be + * multiplied within Javascript's floating-point representation without overflow + * or change in sign. + * In the algorithms below, we frequently reduce the negative case to the + * positive case by negating the input(s) and then post-processing the result. + * Note that we must ALWAYS check specially whether those values are MIN_VALUE + * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as + * a positive number, it overflows back into a negative). Not handling this + * case would often result in infinite recursion. + * Common constant values ZERO, ONE, NEG_ONE, etc. are found as static properties on this class. + */ +export declare class Long extends BSONValue { + get _bsontype(): 'Long'; + /** An indicator used to reliably determine if an object is a Long or not. */ + get __isLong__(): boolean; + /** + * The high 32 bits as a signed value. + */ + high: number; + /** + * The low 32 bits as a signed value. + */ + low: number; + /** + * Whether unsigned or not. + */ + unsigned: boolean; + /** + * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. + * + * @param low - The low (signed) 32 bits of the long + * @param high - The high (signed) 32 bits of the long + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(low: number, high?: number, unsigned?: boolean); + /** + * Constructs a 64 bit two's-complement integer, given a bigint representation. + * + * @param value - BigInt representation of the long value + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(value: bigint, unsigned?: boolean); + /** + * Constructs a 64 bit two's-complement integer, given a string representation. + * + * @param value - String representation of the long value + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(value: string, unsigned?: boolean); + static TWO_PWR_24: Long; + /** Maximum unsigned value. */ + static MAX_UNSIGNED_VALUE: Long; + /** Signed zero */ + static ZERO: Long; + /** Unsigned zero. */ + static UZERO: Long; + /** Signed one. */ + static ONE: Long; + /** Unsigned one. */ + static UONE: Long; + /** Signed negative one. */ + static NEG_ONE: Long; + /** Maximum signed value. */ + static MAX_VALUE: Long; + /** Minimum signed value. */ + static MIN_VALUE: Long; + /** + * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. + * Each is assumed to use 32 bits. + * @param lowBits - The low 32 bits + * @param highBits - The high 32 bits + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBits(lowBits: number, highBits: number, unsigned?: boolean): Long; + /** + * Returns a Long representing the given 32 bit integer value. + * @param value - The 32 bit integer in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromInt(value: number, unsigned?: boolean): Long; + /** + * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. + * @param value - The number in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromNumber(value: number, unsigned?: boolean): Long; + /** + * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. + * @param value - The number in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBigInt(value: bigint, unsigned?: boolean): Long; + /* Excluded from this release type: _fromString */ + /** + * Returns a signed Long representation of the given string, written using radix 10. + * Will throw an error if the given text is not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the radix 10 + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @returns The corresponding Long value + */ + static fromStringStrict(str: string): Long; + /** + * Returns a Long representation of the given string, written using the radix 10. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, unsigned?: boolean): Long; + /** + * Returns a signed Long representation of the given string, written using the specified radix. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, radix?: boolean): Long; + /** + * Returns a Long representation of the given string, written using the specified radix. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, unsigned?: boolean, radix?: number): Long; + /** + * Returns a signed Long representation of the given string, written using radix 10. + * + * If the input string is empty, this function will throw a BSONError. + * + * If input string does not have valid signed 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit signed long will be coerced to Long.MAX_VALUE and Long.MIN_VALUE respectively + * - 'NaN' or '+/-Infinity' are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * + * @param str - The textual representation of the Long + * @returns The corresponding Long value + */ + static fromString(str: string): Long; + /** + * Returns a signed Long representation of the given string, written using the provided radix. + * + * If the input string is empty or a provided radix is not within (2-36), this function will throw a BSONError. + * + * If input parameters do not have valid signed 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit signed long will be coerced to Long.MAX_VALUE and Long.MIN_VALUE respectively + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromString(str: string, radix?: number): Long; + /** + * Returns a Long representation of the given string, written using radix 10. + * + * If the input string is empty, this function will throw a BSONError. + * + * If input parameters do not have a valid 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit long will be coerced to max or min (if signed) values + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromString(str: string, unsigned?: boolean): Long; + /** + * Returns a Long representation of the given string, written using the specified radix. + * + * If the input string is empty or a provided radix is not within (2-36), this function will throw a BSONError. + * + * If input parameters do not have a valid 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit long will be coerced to max or min (if signed) values + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromString(str: string, unsigned?: boolean, radix?: number): Long; + /** + * Creates a Long from its byte representation. + * @param bytes - Byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @param le - Whether little or big endian, defaults to big endian + * @returns The corresponding Long value + */ + static fromBytes(bytes: number[], unsigned?: boolean, le?: boolean): Long; + /** + * Creates a Long from its little endian byte representation. + * @param bytes - Little endian byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBytesLE(bytes: number[], unsigned?: boolean): Long; + /** + * Creates a Long from its big endian byte representation. + * @param bytes - Big endian byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBytesBE(bytes: number[], unsigned?: boolean): Long; + /** + * Tests if the specified object is a Long. + */ + static isLong(value: unknown): value is Long; + /** + * Converts the specified value to a Long. + * @param unsigned - Whether unsigned or not, defaults to signed + */ + static fromValue(val: number | string | { + low: number; + high: number; + unsigned?: boolean; + }, unsigned?: boolean): Long; + /** Returns the sum of this and the specified Long. */ + add(addend: string | number | Long | Timestamp): Long; + /** + * Returns the sum of this and the specified Long. + * @returns Sum + */ + and(other: string | number | Long | Timestamp): Long; + /** + * Compares this Long's value with the specified's. + * @returns 0 if they are the same, 1 if the this is greater and -1 if the given one is greater + */ + compare(other: string | number | Long | Timestamp): 0 | 1 | -1; + /** This is an alias of {@link Long.compare} */ + comp(other: string | number | Long | Timestamp): 0 | 1 | -1; + /** + * Returns this Long divided by the specified. The result is signed if this Long is signed or unsigned if this Long is unsigned. + * @returns Quotient + */ + divide(divisor: string | number | Long | Timestamp): Long; + /**This is an alias of {@link Long.divide} */ + div(divisor: string | number | Long | Timestamp): Long; + /** + * Tests if this Long's value equals the specified's. + * @param other - Other value + */ + equals(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.equals} */ + eq(other: string | number | Long | Timestamp): boolean; + /** Gets the high 32 bits as a signed integer. */ + getHighBits(): number; + /** Gets the high 32 bits as an unsigned integer. */ + getHighBitsUnsigned(): number; + /** Gets the low 32 bits as a signed integer. */ + getLowBits(): number; + /** Gets the low 32 bits as an unsigned integer. */ + getLowBitsUnsigned(): number; + /** Gets the number of bits needed to represent the absolute value of this Long. */ + getNumBitsAbs(): number; + /** Tests if this Long's value is greater than the specified's. */ + greaterThan(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.greaterThan} */ + gt(other: string | number | Long | Timestamp): boolean; + /** Tests if this Long's value is greater than or equal the specified's. */ + greaterThanOrEqual(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.greaterThanOrEqual} */ + gte(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.greaterThanOrEqual} */ + ge(other: string | number | Long | Timestamp): boolean; + /** Tests if this Long's value is even. */ + isEven(): boolean; + /** Tests if this Long's value is negative. */ + isNegative(): boolean; + /** Tests if this Long's value is odd. */ + isOdd(): boolean; + /** Tests if this Long's value is positive. */ + isPositive(): boolean; + /** Tests if this Long's value equals zero. */ + isZero(): boolean; + /** Tests if this Long's value is less than the specified's. */ + lessThan(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long#lessThan}. */ + lt(other: string | number | Long | Timestamp): boolean; + /** Tests if this Long's value is less than or equal the specified's. */ + lessThanOrEqual(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.lessThanOrEqual} */ + lte(other: string | number | Long | Timestamp): boolean; + /** Returns this Long modulo the specified. */ + modulo(divisor: string | number | Long | Timestamp): Long; + /** This is an alias of {@link Long.modulo} */ + mod(divisor: string | number | Long | Timestamp): Long; + /** This is an alias of {@link Long.modulo} */ + rem(divisor: string | number | Long | Timestamp): Long; + /** + * Returns the product of this and the specified Long. + * @param multiplier - Multiplier + * @returns Product + */ + multiply(multiplier: string | number | Long | Timestamp): Long; + /** This is an alias of {@link Long.multiply} */ + mul(multiplier: string | number | Long | Timestamp): Long; + /** Returns the Negation of this Long's value. */ + negate(): Long; + /** This is an alias of {@link Long.negate} */ + neg(): Long; + /** Returns the bitwise NOT of this Long. */ + not(): Long; + /** Tests if this Long's value differs from the specified's. */ + notEquals(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.notEquals} */ + neq(other: string | number | Long | Timestamp): boolean; + /** This is an alias of {@link Long.notEquals} */ + ne(other: string | number | Long | Timestamp): boolean; + /** + * Returns the bitwise OR of this Long and the specified. + */ + or(other: number | string | Long): Long; + /** + * Returns this Long with bits shifted to the left by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftLeft(numBits: number | Long): Long; + /** This is an alias of {@link Long.shiftLeft} */ + shl(numBits: number | Long): Long; + /** + * Returns this Long with bits arithmetically shifted to the right by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftRight(numBits: number | Long): Long; + /** This is an alias of {@link Long.shiftRight} */ + shr(numBits: number | Long): Long; + /** + * Returns this Long with bits logically shifted to the right by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftRightUnsigned(numBits: Long | number): Long; + /** This is an alias of {@link Long.shiftRightUnsigned} */ + shr_u(numBits: number | Long): Long; + /** This is an alias of {@link Long.shiftRightUnsigned} */ + shru(numBits: number | Long): Long; + /** + * Returns the difference of this and the specified Long. + * @param subtrahend - Subtrahend + * @returns Difference + */ + subtract(subtrahend: string | number | Long | Timestamp): Long; + /** This is an alias of {@link Long.subtract} */ + sub(subtrahend: string | number | Long | Timestamp): Long; + /** Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. */ + toInt(): number; + /** Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). */ + toNumber(): number; + /** Converts the Long to a BigInt (arbitrary precision). */ + toBigInt(): bigint; + /** + * Converts this Long to its byte representation. + * @param le - Whether little or big endian, defaults to big endian + * @returns Byte representation + */ + toBytes(le?: boolean): number[]; + /** + * Converts this Long to its little endian byte representation. + * @returns Little endian byte representation + */ + toBytesLE(): number[]; + /** + * Converts this Long to its big endian byte representation. + * @returns Big endian byte representation + */ + toBytesBE(): number[]; + /** + * Converts this Long to signed. + */ + toSigned(): Long; + /** + * Converts the Long to a string written in the specified radix. + * @param radix - Radix (2-36), defaults to 10 + * @throws RangeError If `radix` is out of range + */ + toString(radix?: number): string; + /** Converts this Long to unsigned. */ + toUnsigned(): Long; + /** Returns the bitwise XOR of this Long and the given one. */ + xor(other: Long | number | string): Long; + /** This is an alias of {@link Long.isZero} */ + eqz(): boolean; + /** This is an alias of {@link Long.lessThanOrEqual} */ + le(other: string | number | Long | Timestamp): boolean; + toExtendedJSON(options?: EJSONOptions): number | LongExtended; + static fromExtendedJSON(doc: { + $numberLong: string; + }, options?: EJSONOptions): number | Long | bigint; + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface LongExtended { + $numberLong: string; +} + +/** @public */ +export declare type LongWithoutOverrides = new (low: unknown, high?: number | boolean, unsigned?: boolean) => { + [P in Exclude]: Long[P]; +}; + +/** @public */ +export declare const LongWithoutOverridesClass: LongWithoutOverrides; + +/** + * A class representation of the BSON MaxKey type. + * @public + * @category BSONType + */ +export declare class MaxKey extends BSONValue { + get _bsontype(): 'MaxKey'; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(): string; +} + +/** @public */ +export declare interface MaxKeyExtended { + $maxKey: 1; +} + +/** + * A class representation of the BSON MinKey type. + * @public + * @category BSONType + */ +export declare class MinKey extends BSONValue { + get _bsontype(): 'MinKey'; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(): string; +} + +/** @public */ +export declare interface MinKeyExtended { + $minKey: 1; +} + +/** + * @experimental + * @public + * + * A collection of functions that get or set various numeric types and bit widths from a Uint8Array. + */ +declare type NumberUtils = { + /** + * Parses a signed int32 at offset. Throws a `RangeError` if value is negative. + */ + getNonnegativeInt32LE: (source: Uint8Array, offset: number) => number; + getInt32LE: (source: Uint8Array, offset: number) => number; + getUint32LE: (source: Uint8Array, offset: number) => number; + getUint32BE: (source: Uint8Array, offset: number) => number; + getBigInt64LE: (source: Uint8Array, offset: number) => bigint; + getFloat64LE: (source: Uint8Array, offset: number) => number; + setInt32BE: (destination: Uint8Array, offset: number, value: number) => 4; + setInt32LE: (destination: Uint8Array, offset: number, value: number) => 4; + setBigInt64LE: (destination: Uint8Array, offset: number, value: bigint) => 8; + setFloat64LE: (destination: Uint8Array, offset: number, value: number) => 8; +}; + +/** + * Number parsing and serializing utilities. + * + * @experimental + * @public + */ +declare const NumberUtils: NumberUtils; + +/** + * A class representation of the BSON ObjectId type. + * @public + * @category BSONType + */ +export declare class ObjectId extends BSONValue { + get _bsontype(): 'ObjectId'; + /* Excluded from this release type: index */ + static cacheHexString: boolean; + /* Excluded from this release type: buffer */ + /* Excluded from this release type: __id */ + /** + * Create ObjectId from a number. + * + * @param inputId - A number. + * @deprecated Instead, use `static createFromTime()` to set a numeric value for the new ObjectId. + */ + constructor(inputId: number); + /** + * Create ObjectId from a 24 character hex string. + * + * @param inputId - A 24 character hex string. + */ + constructor(inputId: string); + /** + * Create ObjectId from the BSON ObjectId type. + * + * @param inputId - The BSON ObjectId type. + */ + constructor(inputId: ObjectId); + /** + * Create ObjectId from the object type that has the toHexString method. + * + * @param inputId - The ObjectIdLike type. + */ + constructor(inputId: ObjectIdLike); + /** + * Create ObjectId from a 12 byte binary Buffer. + * + * @param inputId - A 12 byte binary Buffer. + */ + constructor(inputId: Uint8Array); + /** To generate a new ObjectId, use ObjectId() with no argument. */ + constructor(); + /** + * Implementation overload. + * + * @param inputId - All input types that are used in the constructor implementation. + */ + constructor(inputId?: string | number | ObjectId | ObjectIdLike | Uint8Array); + /** + * The ObjectId bytes + * @readonly + */ + get id(): Uint8Array; + set id(value: Uint8Array); + /** Returns the ObjectId id as a 24 lowercase character hex string representation */ + toHexString(): string; + /* Excluded from this release type: getInc */ + /** + * Generate a 12 byte id buffer used in ObjectId's + * + * @param time - pass in a second based timestamp. + */ + static generate(time?: number): Uint8Array; + /** + * Converts the id into a 24 character hex string for printing, unless encoding is provided. + * @param encoding - hex or base64 + */ + toString(encoding?: 'hex' | 'base64'): string; + /** Converts to its JSON the 24 character hex string representation. */ + toJSON(): string; + /* Excluded from this release type: is */ + /** + * Compares the equality of this ObjectId with `otherID`. + * + * @param otherId - ObjectId instance to compare against. + */ + equals(otherId: string | ObjectId | ObjectIdLike | undefined | null): boolean; + /** Returns the generation date (accurate up to the second) that this ID was generated. */ + getTimestamp(): Date; + /* Excluded from this release type: createPk */ + /* Excluded from this release type: serializeInto */ + /** + * Creates an ObjectId from a second based number, with the rest of the ObjectId zeroed out. Used for comparisons or sorting the ObjectId. + * + * @param time - an integer number representing a number of seconds. + */ + static createFromTime(time: number): ObjectId; + /** + * Creates an ObjectId from a hex string representation of an ObjectId. + * + * @param hexString - create a ObjectId from a passed in 24 character hexstring. + */ + static createFromHexString(hexString: string): ObjectId; + /** Creates an ObjectId instance from a base64 string */ + static createFromBase64(base64: string): ObjectId; + /** + * Checks if a value can be used to create a valid bson ObjectId + * @param id - any JS value + */ + static isValid(id: string | number | ObjectId | ObjectIdLike | Uint8Array): boolean; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + /** + * Converts to a string representation of this Id. + * + * @returns return the 24 character hex string representation. + */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface ObjectIdExtended { + $oid: string; +} + +/** @public */ +export declare interface ObjectIdLike { + id: string | Uint8Array; + __id?: string; + toHexString(): string; +} + +/** + * @experimental + * @public + * + * A new set of BSON APIs that are currently experimental and not intended for production use. + */ +export declare type OnDemand = { + parseToElements: (this: void, bytes: Uint8Array, startOffset?: number) => Iterable; + BSONElement: BSONElement; + ByteUtils: ByteUtils; + NumberUtils: NumberUtils; +}; + +/** + * @experimental + * @public + */ +export declare const onDemand: OnDemand; + +/** + * Parse an Extended JSON string, constructing the JavaScript value or object described by that + * string. + * + * @example + * ```js + * const { EJSON } = require('bson'); + * const text = '{ "int32": { "$numberInt": "10" } }'; + * + * // prints { int32: { [String: '10'] _bsontype: 'Int32', value: '10' } } + * console.log(EJSON.parse(text, { relaxed: false })); + * + * // prints { int32: 10 } + * console.log(EJSON.parse(text)); + * ``` + */ +declare function parse(text: string, options?: EJSONOptions): any; + +/** + * Serialize a Javascript object. + * + * @param object - the Javascript object to serialize. + * @returns Buffer object containing the serialized object. + * @public + */ +export declare function serialize(object: Document, options?: SerializeOptions): Uint8Array; + +/** @public */ +export declare interface SerializeOptions { + /** + * the serializer will check if keys are valid. + * @defaultValue `false` + */ + checkKeys?: boolean; + /** + * serialize the javascript functions + * @defaultValue `false` + */ + serializeFunctions?: boolean; + /** + * serialize will not emit undefined fields + * note that the driver sets this to `false` + * @defaultValue `true` + */ + ignoreUndefined?: boolean; + /* Excluded from this release type: minInternalBufferSize */ + /** + * the index in the buffer where we wish to start serializing into + * @defaultValue `0` + */ + index?: number; +} + +/** + * Serialize a Javascript object using a predefined Buffer and index into the buffer, + * useful when pre-allocating the space for serialization. + * + * @param object - the Javascript object to serialize. + * @param finalBuffer - the Buffer you pre-allocated to store the serialized BSON object. + * @returns the index pointing to the last written byte in the buffer. + * @public + */ +export declare function serializeWithBufferAndIndex(object: Document, finalBuffer: Uint8Array, options?: SerializeOptions): number; + +/** + * Sets the size of the internal serialization buffer. + * + * @param size - The desired size for the internal serialization buffer in bytes + * @public + */ +export declare function setInternalBufferSize(size: number): void; + +/** + * Converts a BSON document to an Extended JSON string, optionally replacing values if a replacer + * function is specified or optionally including only the specified properties if a replacer array + * is specified. + * + * @param value - The value to convert to extended JSON + * @param replacer - A function that alters the behavior of the stringification process, or an array of String and Number objects that serve as a whitelist for selecting/filtering the properties of the value object to be included in the JSON string. If this value is null or not provided, all properties of the object are included in the resulting JSON string + * @param space - A String or Number object that's used to insert white space into the output JSON string for readability purposes. + * @param options - Optional settings + * + * @example + * ```js + * const { EJSON } = require('bson'); + * const Int32 = require('mongodb').Int32; + * const doc = { int32: new Int32(10) }; + * + * // prints '{"int32":{"$numberInt":"10"}}' + * console.log(EJSON.stringify(doc, { relaxed: false })); + * + * // prints '{"int32":10}' + * console.log(EJSON.stringify(doc)); + * ``` + */ +declare function stringify(value: any, replacer?: (number | string)[] | ((this: any, key: string, value: any) => any) | EJSONOptions, space?: string | number, options?: EJSONOptions): string; + +/** + * @public + * @category BSONType + */ +export declare class Timestamp extends LongWithoutOverridesClass { + get _bsontype(): 'Timestamp'; + static readonly MAX_VALUE: Long; + /** + * @param int - A 64-bit bigint representing the Timestamp. + */ + constructor(int: bigint); + /** + * @param long - A 64-bit Long representing the Timestamp. + */ + constructor(long: Long); + /** + * @param value - A pair of two values indicating timestamp and increment. + */ + constructor(value: { + t: number; + i: number; + }); + toJSON(): { + $timestamp: string; + }; + /** Returns a Timestamp represented by the given (32-bit) integer value. */ + static fromInt(value: number): Timestamp; + /** Returns a Timestamp representing the given number value, provided that it is a finite number. Otherwise, zero is returned. */ + static fromNumber(value: number): Timestamp; + /** + * Returns a Timestamp for the given high and low bits. Each is assumed to use 32 bits. + * + * @param lowBits - the low 32-bits. + * @param highBits - the high 32-bits. + */ + static fromBits(lowBits: number, highBits: number): Timestamp; + /** + * Returns a Timestamp from the given string, optionally using the given radix. + * + * @param str - the textual representation of the Timestamp. + * @param optRadix - the radix in which the text is written. + */ + static fromString(str: string, optRadix: number): Timestamp; + /* Excluded from this release type: toExtendedJSON */ + /* Excluded from this release type: fromExtendedJSON */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare interface TimestampExtended { + $timestamp: { + t: number; + i: number; + }; +} + +/** @public */ +export declare type TimestampOverrides = '_bsontype' | 'toExtendedJSON' | 'fromExtendedJSON' | 'inspect'; + +/** + * A class representation of the BSON UUID type. + * @public + */ +export declare class UUID extends Binary { + /** + * Create a UUID type + * + * When the argument to the constructor is omitted a random v4 UUID will be generated. + * + * @param input - Can be a 32 or 36 character hex string (dashes excluded/included) or a 16 byte binary Buffer. + */ + constructor(input?: string | Uint8Array | UUID); + /** + * The UUID bytes + * @readonly + */ + get id(): Uint8Array; + set id(value: Uint8Array); + /** + * Returns the UUID id as a 32 or 36 character hex string representation, excluding/including dashes (defaults to 36 character dash separated) + * @param includeDashes - should the string exclude dash-separators. + */ + toHexString(includeDashes?: boolean): string; + /** + * Converts the id into a 36 character (dashes included) hex string, unless a encoding is specified. + */ + toString(encoding?: 'hex' | 'base64'): string; + /** + * Converts the id into its JSON string representation. + * A 36 character (dashes included) hex string in the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + */ + toJSON(): string; + /** + * Compares the equality of this UUID with `otherID`. + * + * @param otherId - UUID instance to compare against. + */ + equals(otherId: string | Uint8Array | UUID): boolean; + /** + * Creates a Binary instance from the current UUID. + */ + toBinary(): Binary; + /** + * Generates a populated buffer containing a v4 uuid + */ + static generate(): Uint8Array; + /** + * Checks if a value is a valid bson UUID + * @param input - UUID, string or Buffer to validate. + */ + static isValid(input: string | Uint8Array | UUID | Binary): boolean; + /** + * Creates an UUID from a hex string representation of an UUID. + * @param hexString - 32 or 36 character hex string (dashes excluded/included). + */ + static createFromHexString(hexString: string): UUID; + /** Creates an UUID from a base64 string representation of an UUID. */ + static createFromBase64(base64: string): UUID; + /* Excluded from this release type: bytesFromString */ + /* Excluded from this release type: isValidUUIDString */ + /** + * Converts to a string representation of this Id. + * + * @returns return the 36 character hex string representation. + * + */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; +} + +/** @public */ +export declare type UUIDExtended = { + $uuid: string; +}; + +export { } diff --git a/user-service/node_modules/bson/etc/prepare.js b/user-service/node_modules/bson/etc/prepare.js new file mode 100755 index 0000000000..91e6f3a976 --- /dev/null +++ b/user-service/node_modules/bson/etc/prepare.js @@ -0,0 +1,19 @@ +#! /usr/bin/env node +var cp = require('child_process'); +var fs = require('fs'); + +var nodeMajorVersion = +process.version.match(/^v(\d+)\.\d+/)[1]; + +if (fs.existsSync('src') && nodeMajorVersion >= 10) { + cp.spawnSync('npm', ['run', 'build'], { stdio: 'inherit', shell: true }); +} else { + if (!fs.existsSync('lib')) { + console.warn('BSON: No compiled javascript present, the library is not installed correctly.'); + if (nodeMajorVersion < 10) { + console.warn( + 'This library can only be compiled in nodejs version 10 or later, currently running: ' + + nodeMajorVersion + ); + } + } +} diff --git a/user-service/node_modules/bson/lib/bson.bundle.js b/user-service/node_modules/bson/lib/bson.bundle.js new file mode 100644 index 0000000000..efbaa38d73 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.bundle.js @@ -0,0 +1,4422 @@ +var BSON = (function (exports) { +'use strict'; + +function isAnyArrayBuffer(value) { + return ['[object ArrayBuffer]', '[object SharedArrayBuffer]'].includes(Object.prototype.toString.call(value)); +} +function isUint8Array(value) { + return Object.prototype.toString.call(value) === '[object Uint8Array]'; +} +function isRegExp(d) { + return Object.prototype.toString.call(d) === '[object RegExp]'; +} +function isMap(d) { + return Object.prototype.toString.call(d) === '[object Map]'; +} +function isDate(d) { + return Object.prototype.toString.call(d) === '[object Date]'; +} +function defaultInspect(x, _options) { + return JSON.stringify(x, (k, v) => { + if (typeof v === 'bigint') { + return { $numberLong: `${v}` }; + } + else if (isMap(v)) { + return Object.fromEntries(v); + } + return v; + }); +} +function getStylizeFunction(options) { + const stylizeExists = options != null && + typeof options === 'object' && + 'stylize' in options && + typeof options.stylize === 'function'; + if (stylizeExists) { + return options.stylize; + } +} + +const BSON_MAJOR_VERSION = 6; +const BSON_INT32_MAX = 0x7fffffff; +const BSON_INT32_MIN = -0x80000000; +const BSON_INT64_MAX = Math.pow(2, 63) - 1; +const BSON_INT64_MIN = -Math.pow(2, 63); +const JS_INT_MAX = Math.pow(2, 53); +const JS_INT_MIN = -Math.pow(2, 53); +const BSON_DATA_NUMBER = 1; +const BSON_DATA_STRING = 2; +const BSON_DATA_OBJECT = 3; +const BSON_DATA_ARRAY = 4; +const BSON_DATA_BINARY = 5; +const BSON_DATA_UNDEFINED = 6; +const BSON_DATA_OID = 7; +const BSON_DATA_BOOLEAN = 8; +const BSON_DATA_DATE = 9; +const BSON_DATA_NULL = 10; +const BSON_DATA_REGEXP = 11; +const BSON_DATA_DBPOINTER = 12; +const BSON_DATA_CODE = 13; +const BSON_DATA_SYMBOL = 14; +const BSON_DATA_CODE_W_SCOPE = 15; +const BSON_DATA_INT = 16; +const BSON_DATA_TIMESTAMP = 17; +const BSON_DATA_LONG = 18; +const BSON_DATA_DECIMAL128 = 19; +const BSON_DATA_MIN_KEY = 0xff; +const BSON_DATA_MAX_KEY = 0x7f; +const BSON_BINARY_SUBTYPE_DEFAULT = 0; +const BSON_BINARY_SUBTYPE_UUID_NEW = 4; +const BSONType = Object.freeze({ + double: 1, + string: 2, + object: 3, + array: 4, + binData: 5, + undefined: 6, + objectId: 7, + bool: 8, + date: 9, + null: 10, + regex: 11, + dbPointer: 12, + javascript: 13, + symbol: 14, + javascriptWithScope: 15, + int: 16, + timestamp: 17, + long: 18, + decimal: 19, + minKey: -1, + maxKey: 127 +}); + +class BSONError extends Error { + get bsonError() { + return true; + } + get name() { + return 'BSONError'; + } + constructor(message, options) { + super(message, options); + } + static isBSONError(value) { + return (value != null && + typeof value === 'object' && + 'bsonError' in value && + value.bsonError === true && + 'name' in value && + 'message' in value && + 'stack' in value); + } +} +class BSONVersionError extends BSONError { + get name() { + return 'BSONVersionError'; + } + constructor() { + super(`Unsupported BSON version, bson types must be from bson ${BSON_MAJOR_VERSION}.x.x`); + } +} +class BSONRuntimeError extends BSONError { + get name() { + return 'BSONRuntimeError'; + } + constructor(message) { + super(message); + } +} +class BSONOffsetError extends BSONError { + get name() { + return 'BSONOffsetError'; + } + constructor(message, offset, options) { + super(`${message}. offset: ${offset}`, options); + this.offset = offset; + } +} + +let TextDecoderFatal; +let TextDecoderNonFatal; +function parseUtf8(buffer, start, end, fatal) { + if (fatal) { + TextDecoderFatal ??= new TextDecoder('utf8', { fatal: true }); + try { + return TextDecoderFatal.decode(buffer.subarray(start, end)); + } + catch (cause) { + throw new BSONError('Invalid UTF-8 string in BSON document', { cause }); + } + } + TextDecoderNonFatal ??= new TextDecoder('utf8', { fatal: false }); + return TextDecoderNonFatal.decode(buffer.subarray(start, end)); +} + +function tryReadBasicLatin(uint8array, start, end) { + if (uint8array.length === 0) { + return ''; + } + const stringByteLength = end - start; + if (stringByteLength === 0) { + return ''; + } + if (stringByteLength > 20) { + return null; + } + if (stringByteLength === 1 && uint8array[start] < 128) { + return String.fromCharCode(uint8array[start]); + } + if (stringByteLength === 2 && uint8array[start] < 128 && uint8array[start + 1] < 128) { + return String.fromCharCode(uint8array[start]) + String.fromCharCode(uint8array[start + 1]); + } + if (stringByteLength === 3 && + uint8array[start] < 128 && + uint8array[start + 1] < 128 && + uint8array[start + 2] < 128) { + return (String.fromCharCode(uint8array[start]) + + String.fromCharCode(uint8array[start + 1]) + + String.fromCharCode(uint8array[start + 2])); + } + const latinBytes = []; + for (let i = start; i < end; i++) { + const byte = uint8array[i]; + if (byte > 127) { + return null; + } + latinBytes.push(byte); + } + return String.fromCharCode(...latinBytes); +} +function tryWriteBasicLatin(destination, source, offset) { + if (source.length === 0) + return 0; + if (source.length > 25) + return null; + if (destination.length - offset < source.length) + return null; + for (let charOffset = 0, destinationOffset = offset; charOffset < source.length; charOffset++, destinationOffset++) { + const char = source.charCodeAt(charOffset); + if (char > 127) + return null; + destination[destinationOffset] = char; + } + return source.length; +} + +function nodejsMathRandomBytes(byteLength) { + return nodeJsByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const nodejsRandomBytes = (() => { + try { + return require('crypto').randomBytes; + } + catch { + return nodejsMathRandomBytes; + } +})(); +const nodeJsByteUtils = { + toLocalBufferType(potentialBuffer) { + if (Buffer.isBuffer(potentialBuffer)) { + return potentialBuffer; + } + if (ArrayBuffer.isView(potentialBuffer)) { + return Buffer.from(potentialBuffer.buffer, potentialBuffer.byteOffset, potentialBuffer.byteLength); + } + const stringTag = potentialBuffer?.[Symbol.toStringTag] ?? Object.prototype.toString.call(potentialBuffer); + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return Buffer.from(potentialBuffer); + } + throw new BSONError(`Cannot create Buffer from ${String(potentialBuffer)}`); + }, + allocate(size) { + return Buffer.alloc(size); + }, + allocateUnsafe(size) { + return Buffer.allocUnsafe(size); + }, + equals(a, b) { + return nodeJsByteUtils.toLocalBufferType(a).equals(b); + }, + fromNumberArray(array) { + return Buffer.from(array); + }, + fromBase64(base64) { + return Buffer.from(base64, 'base64'); + }, + toBase64(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('base64'); + }, + fromISO88591(codePoints) { + return Buffer.from(codePoints, 'binary'); + }, + toISO88591(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('binary'); + }, + fromHex(hex) { + return Buffer.from(hex, 'hex'); + }, + toHex(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('hex'); + }, + toUTF8(buffer, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(buffer, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + const string = nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end); + if (fatal) { + for (let i = 0; i < string.length; i++) { + if (string.charCodeAt(i) === 0xfffd) { + parseUtf8(buffer, start, end, true); + break; + } + } + } + return string; + }, + utf8ByteLength(input) { + return Buffer.byteLength(input, 'utf8'); + }, + encodeUTF8Into(buffer, source, byteOffset) { + const latinBytesWritten = tryWriteBasicLatin(buffer, source, byteOffset); + if (latinBytesWritten != null) { + return latinBytesWritten; + } + return nodeJsByteUtils.toLocalBufferType(buffer).write(source, byteOffset, undefined, 'utf8'); + }, + randomBytes: nodejsRandomBytes +}; + +function isReactNative() { + const { navigator } = globalThis; + return typeof navigator === 'object' && navigator.product === 'ReactNative'; +} +function webMathRandomBytes(byteLength) { + if (byteLength < 0) { + throw new RangeError(`The argument 'byteLength' is invalid. Received ${byteLength}`); + } + return webByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const webRandomBytes = (() => { + const { crypto } = globalThis; + if (crypto != null && typeof crypto.getRandomValues === 'function') { + return (byteLength) => { + return crypto.getRandomValues(webByteUtils.allocate(byteLength)); + }; + } + else { + if (isReactNative()) { + const { console } = globalThis; + console?.warn?.('BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.'); + } + return webMathRandomBytes; + } +})(); +const HEX_DIGIT = /(\d|[a-f])/i; +const webByteUtils = { + toLocalBufferType(potentialUint8array) { + const stringTag = potentialUint8array?.[Symbol.toStringTag] ?? + Object.prototype.toString.call(potentialUint8array); + if (stringTag === 'Uint8Array') { + return potentialUint8array; + } + if (ArrayBuffer.isView(potentialUint8array)) { + return new Uint8Array(potentialUint8array.buffer.slice(potentialUint8array.byteOffset, potentialUint8array.byteOffset + potentialUint8array.byteLength)); + } + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return new Uint8Array(potentialUint8array); + } + throw new BSONError(`Cannot make a Uint8Array from ${String(potentialUint8array)}`); + }, + allocate(size) { + if (typeof size !== 'number') { + throw new TypeError(`The "size" argument must be of type number. Received ${String(size)}`); + } + return new Uint8Array(size); + }, + allocateUnsafe(size) { + return webByteUtils.allocate(size); + }, + equals(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }, + fromNumberArray(array) { + return Uint8Array.from(array); + }, + fromBase64(base64) { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + }, + toBase64(uint8array) { + return btoa(webByteUtils.toISO88591(uint8array)); + }, + fromISO88591(codePoints) { + return Uint8Array.from(codePoints, c => c.charCodeAt(0) & 0xff); + }, + toISO88591(uint8array) { + return Array.from(Uint16Array.from(uint8array), b => String.fromCharCode(b)).join(''); + }, + fromHex(hex) { + const evenLengthHex = hex.length % 2 === 0 ? hex : hex.slice(0, hex.length - 1); + const buffer = []; + for (let i = 0; i < evenLengthHex.length; i += 2) { + const firstDigit = evenLengthHex[i]; + const secondDigit = evenLengthHex[i + 1]; + if (!HEX_DIGIT.test(firstDigit)) { + break; + } + if (!HEX_DIGIT.test(secondDigit)) { + break; + } + const hexDigit = Number.parseInt(`${firstDigit}${secondDigit}`, 16); + buffer.push(hexDigit); + } + return Uint8Array.from(buffer); + }, + toHex(uint8array) { + return Array.from(uint8array, byte => byte.toString(16).padStart(2, '0')).join(''); + }, + toUTF8(uint8array, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(uint8array, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + return parseUtf8(uint8array, start, end, fatal); + }, + utf8ByteLength(input) { + return new TextEncoder().encode(input).byteLength; + }, + encodeUTF8Into(uint8array, source, byteOffset) { + const bytes = new TextEncoder().encode(source); + uint8array.set(bytes, byteOffset); + return bytes.byteLength; + }, + randomBytes: webRandomBytes +}; + +const hasGlobalBuffer = typeof Buffer === 'function' && Buffer.prototype?._isBuffer !== true; +const ByteUtils = hasGlobalBuffer ? nodeJsByteUtils : webByteUtils; + +class BSONValue { + get [Symbol.for('@@mdb.bson.version')]() { + return BSON_MAJOR_VERSION; + } + [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) { + return this.inspect(depth, options, inspect); + } +} + +class Binary extends BSONValue { + get _bsontype() { + return 'Binary'; + } + constructor(buffer, subType) { + super(); + if (!(buffer == null) && + typeof buffer === 'string' && + !ArrayBuffer.isView(buffer) && + !isAnyArrayBuffer(buffer) && + !Array.isArray(buffer)) { + throw new BSONError('Binary can only be constructed from Uint8Array or number[]'); + } + this.sub_type = subType ?? Binary.BSON_BINARY_SUBTYPE_DEFAULT; + if (buffer == null) { + this.buffer = ByteUtils.allocate(Binary.BUFFER_SIZE); + this.position = 0; + } + else { + this.buffer = Array.isArray(buffer) + ? ByteUtils.fromNumberArray(buffer) + : ByteUtils.toLocalBufferType(buffer); + this.position = this.buffer.byteLength; + } + } + put(byteValue) { + if (typeof byteValue === 'string' && byteValue.length !== 1) { + throw new BSONError('only accepts single character String'); + } + else if (typeof byteValue !== 'number' && byteValue.length !== 1) + throw new BSONError('only accepts single character Uint8Array or Array'); + let decodedByte; + if (typeof byteValue === 'string') { + decodedByte = byteValue.charCodeAt(0); + } + else if (typeof byteValue === 'number') { + decodedByte = byteValue; + } + else { + decodedByte = byteValue[0]; + } + if (decodedByte < 0 || decodedByte > 255) { + throw new BSONError('only accepts number in a valid unsigned byte range 0-255'); + } + if (this.buffer.byteLength > this.position) { + this.buffer[this.position++] = decodedByte; + } + else { + const newSpace = ByteUtils.allocate(Binary.BUFFER_SIZE + this.buffer.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + this.buffer[this.position++] = decodedByte; + } + } + write(sequence, offset) { + offset = typeof offset === 'number' ? offset : this.position; + if (this.buffer.byteLength < offset + sequence.length) { + const newSpace = ByteUtils.allocate(this.buffer.byteLength + sequence.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + } + if (ArrayBuffer.isView(sequence)) { + this.buffer.set(ByteUtils.toLocalBufferType(sequence), offset); + this.position = + offset + sequence.byteLength > this.position ? offset + sequence.length : this.position; + } + else if (typeof sequence === 'string') { + throw new BSONError('input cannot be string'); + } + } + read(position, length) { + length = length && length > 0 ? length : this.position; + return this.buffer.slice(position, position + length); + } + value() { + return this.buffer.length === this.position + ? this.buffer + : this.buffer.subarray(0, this.position); + } + length() { + return this.position; + } + toJSON() { + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.buffer.subarray(0, this.position)); + if (encoding === 'base64') + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + if (encoding === 'utf8' || encoding === 'utf-8') + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + } + toExtendedJSON(options) { + options = options || {}; + const base64String = ByteUtils.toBase64(this.buffer); + const subType = Number(this.sub_type).toString(16); + if (options.legacy) { + return { + $binary: base64String, + $type: subType.length === 1 ? '0' + subType : subType + }; + } + return { + $binary: { + base64: base64String, + subType: subType.length === 1 ? '0' + subType : subType + } + }; + } + toUUID() { + if (this.sub_type === Binary.SUBTYPE_UUID) { + return new UUID(this.buffer.slice(0, this.position)); + } + throw new BSONError(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Binary.SUBTYPE_UUID}" is currently supported.`); + } + static createFromHexString(hex, subType) { + return new Binary(ByteUtils.fromHex(hex), subType); + } + static createFromBase64(base64, subType) { + return new Binary(ByteUtils.fromBase64(base64), subType); + } + static fromExtendedJSON(doc, options) { + options = options || {}; + let data; + let type; + if ('$binary' in doc) { + if (options.legacy && typeof doc.$binary === 'string' && '$type' in doc) { + type = doc.$type ? parseInt(doc.$type, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary); + } + else { + if (typeof doc.$binary !== 'string') { + type = doc.$binary.subType ? parseInt(doc.$binary.subType, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary.base64); + } + } + } + else if ('$uuid' in doc) { + type = 4; + data = UUID.bytesFromString(doc.$uuid); + } + if (!data) { + throw new BSONError(`Unexpected Binary Extended JSON format ${JSON.stringify(doc)}`); + } + return type === BSON_BINARY_SUBTYPE_UUID_NEW ? new UUID(data) : new Binary(data, type); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const base64 = ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + const base64Arg = inspect(base64, options); + const subTypeArg = inspect(this.sub_type, options); + return `Binary.createFromBase64(${base64Arg}, ${subTypeArg})`; + } +} +Binary.BSON_BINARY_SUBTYPE_DEFAULT = 0; +Binary.BUFFER_SIZE = 256; +Binary.SUBTYPE_DEFAULT = 0; +Binary.SUBTYPE_FUNCTION = 1; +Binary.SUBTYPE_BYTE_ARRAY = 2; +Binary.SUBTYPE_UUID_OLD = 3; +Binary.SUBTYPE_UUID = 4; +Binary.SUBTYPE_MD5 = 5; +Binary.SUBTYPE_ENCRYPTED = 6; +Binary.SUBTYPE_COLUMN = 7; +Binary.SUBTYPE_SENSITIVE = 8; +Binary.SUBTYPE_USER_DEFINED = 128; +const UUID_BYTE_LENGTH = 16; +const UUID_WITHOUT_DASHES = /^[0-9A-F]{32}$/i; +const UUID_WITH_DASHES = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; +class UUID extends Binary { + constructor(input) { + let bytes; + if (input == null) { + bytes = UUID.generate(); + } + else if (input instanceof UUID) { + bytes = ByteUtils.toLocalBufferType(new Uint8Array(input.buffer)); + } + else if (ArrayBuffer.isView(input) && input.byteLength === UUID_BYTE_LENGTH) { + bytes = ByteUtils.toLocalBufferType(input); + } + else if (typeof input === 'string') { + bytes = UUID.bytesFromString(input); + } + else { + throw new BSONError('Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).'); + } + super(bytes, BSON_BINARY_SUBTYPE_UUID_NEW); + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + } + toHexString(includeDashes = true) { + if (includeDashes) { + return [ + ByteUtils.toHex(this.buffer.subarray(0, 4)), + ByteUtils.toHex(this.buffer.subarray(4, 6)), + ByteUtils.toHex(this.buffer.subarray(6, 8)), + ByteUtils.toHex(this.buffer.subarray(8, 10)), + ByteUtils.toHex(this.buffer.subarray(10, 16)) + ].join('-'); + } + return ByteUtils.toHex(this.buffer); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.id); + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + equals(otherId) { + if (!otherId) { + return false; + } + if (otherId instanceof UUID) { + return ByteUtils.equals(otherId.id, this.id); + } + try { + return ByteUtils.equals(new UUID(otherId).id, this.id); + } + catch { + return false; + } + } + toBinary() { + return new Binary(this.id, Binary.SUBTYPE_UUID); + } + static generate() { + const bytes = ByteUtils.randomBytes(UUID_BYTE_LENGTH); + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + return bytes; + } + static isValid(input) { + if (!input) { + return false; + } + if (typeof input === 'string') { + return UUID.isValidUUIDString(input); + } + if (isUint8Array(input)) { + return input.byteLength === UUID_BYTE_LENGTH; + } + return (input._bsontype === 'Binary' && + input.sub_type === this.SUBTYPE_UUID && + input.buffer.byteLength === 16); + } + static createFromHexString(hexString) { + const buffer = UUID.bytesFromString(hexString); + return new UUID(buffer); + } + static createFromBase64(base64) { + return new UUID(ByteUtils.fromBase64(base64)); + } + static bytesFromString(representation) { + if (!UUID.isValidUUIDString(representation)) { + throw new BSONError('UUID string representation must be 32 hex digits or canonical hyphenated representation'); + } + return ByteUtils.fromHex(representation.replace(/-/g, '')); + } + static isValidUUIDString(representation) { + return UUID_WITHOUT_DASHES.test(representation) || UUID_WITH_DASHES.test(representation); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new UUID(${inspect(this.toHexString(), options)})`; + } +} + +class Code extends BSONValue { + get _bsontype() { + return 'Code'; + } + constructor(code, scope) { + super(); + this.code = code.toString(); + this.scope = scope ?? null; + } + toJSON() { + if (this.scope != null) { + return { code: this.code, scope: this.scope }; + } + return { code: this.code }; + } + toExtendedJSON() { + if (this.scope) { + return { $code: this.code, $scope: this.scope }; + } + return { $code: this.code }; + } + static fromExtendedJSON(doc) { + return new Code(doc.$code, doc.$scope); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + let parametersString = inspect(this.code, options); + const multiLineFn = parametersString.includes('\n'); + if (this.scope != null) { + parametersString += `,${multiLineFn ? '\n' : ' '}${inspect(this.scope, options)}`; + } + const endingNewline = multiLineFn && this.scope === null; + return `new Code(${multiLineFn ? '\n' : ''}${parametersString}${endingNewline ? '\n' : ''})`; + } +} + +function isDBRefLike(value) { + return (value != null && + typeof value === 'object' && + '$id' in value && + value.$id != null && + '$ref' in value && + typeof value.$ref === 'string' && + (!('$db' in value) || ('$db' in value && typeof value.$db === 'string'))); +} +class DBRef extends BSONValue { + get _bsontype() { + return 'DBRef'; + } + constructor(collection, oid, db, fields) { + super(); + const parts = collection.split('.'); + if (parts.length === 2) { + db = parts.shift(); + collection = parts.shift(); + } + this.collection = collection; + this.oid = oid; + this.db = db; + this.fields = fields || {}; + } + get namespace() { + return this.collection; + } + set namespace(value) { + this.collection = value; + } + toJSON() { + const o = Object.assign({ + $ref: this.collection, + $id: this.oid + }, this.fields); + if (this.db != null) + o.$db = this.db; + return o; + } + toExtendedJSON(options) { + options = options || {}; + let o = { + $ref: this.collection, + $id: this.oid + }; + if (options.legacy) { + return o; + } + if (this.db) + o.$db = this.db; + o = Object.assign(o, this.fields); + return o; + } + static fromExtendedJSON(doc) { + const copy = Object.assign({}, doc); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(doc.$ref, doc.$id, doc.$db, copy); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const args = [ + inspect(this.namespace, options), + inspect(this.oid, options), + ...(this.db ? [inspect(this.db, options)] : []), + ...(Object.keys(this.fields).length > 0 ? [inspect(this.fields, options)] : []) + ]; + args[1] = inspect === defaultInspect ? `new ObjectId(${args[1]})` : args[1]; + return `new DBRef(${args.join(', ')})`; + } +} + +function removeLeadingZerosAndExplicitPlus(str) { + if (str === '') { + return str; + } + let startIndex = 0; + const isNegative = str[startIndex] === '-'; + const isExplicitlyPositive = str[startIndex] === '+'; + if (isExplicitlyPositive || isNegative) { + startIndex += 1; + } + let foundInsignificantZero = false; + for (; startIndex < str.length && str[startIndex] === '0'; ++startIndex) { + foundInsignificantZero = true; + } + if (!foundInsignificantZero) { + return isExplicitlyPositive ? str.slice(1) : str; + } + return `${isNegative ? '-' : ''}${str.length === startIndex ? '0' : str.slice(startIndex)}`; +} +function validateStringCharacters(str, radix) { + radix = radix ?? 10; + const validCharacters = '0123456789abcdefghijklmnopqrstuvwxyz'.slice(0, radix); + const regex = new RegExp(`[^-+${validCharacters}]`, 'i'); + return regex.test(str) ? false : str; +} + +let wasm = undefined; +try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; +} +catch { +} +const TWO_PWR_16_DBL = 1 << 16; +const TWO_PWR_24_DBL = 1 << 24; +const TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +const TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +const TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; +const INT_CACHE = {}; +const UINT_CACHE = {}; +const MAX_INT64_STRING_LENGTH = 20; +const DECIMAL_REG_EX = /^(\+?0|(\+|-)?[1-9][0-9]*)$/; +class Long extends BSONValue { + get _bsontype() { + return 'Long'; + } + get __isLong__() { + return true; + } + constructor(lowOrValue = 0, highOrUnsigned, unsigned) { + super(); + const unsignedBool = typeof highOrUnsigned === 'boolean' ? highOrUnsigned : Boolean(unsigned); + const high = typeof highOrUnsigned === 'number' ? highOrUnsigned : 0; + const res = typeof lowOrValue === 'string' + ? Long.fromString(lowOrValue, unsignedBool) + : typeof lowOrValue === 'bigint' + ? Long.fromBigInt(lowOrValue, unsignedBool) + : { low: lowOrValue | 0, high: high | 0, unsigned: unsignedBool }; + this.low = res.low; + this.high = res.high; + this.unsigned = res.unsigned; + } + static fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); + } + static fromInt(value, unsigned) { + let obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if ((cache = 0 <= value && value < 256)) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } + else { + value |= 0; + if ((cache = -128 <= value && value < 128)) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + static fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? Long.UZERO : Long.ZERO; + if (unsigned) { + if (value < 0) + return Long.UZERO; + if (value >= TWO_PWR_64_DBL) + return Long.MAX_UNSIGNED_VALUE; + } + else { + if (value <= -TWO_PWR_63_DBL) + return Long.MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return Long.MAX_VALUE; + } + if (value < 0) + return Long.fromNumber(-value, unsigned).neg(); + return Long.fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); + } + static fromBigInt(value, unsigned) { + const FROM_BIGINT_BIT_MASK = BigInt(0xffffffff); + const FROM_BIGINT_BIT_SHIFT = BigInt(32); + return new Long(Number(value & FROM_BIGINT_BIT_MASK), Number((value >> FROM_BIGINT_BIT_SHIFT) & FROM_BIGINT_BIT_MASK), unsigned); + } + static _fromString(str, unsigned, radix) { + if (str.length === 0) + throw new BSONError('empty string'); + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + let p; + if ((p = str.indexOf('-')) > 0) + throw new BSONError('interior hyphen'); + else if (p === 0) { + return Long._fromString(str.substring(1), unsigned, radix).neg(); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 8)); + let result = Long.ZERO; + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + const power = Long.fromNumber(Math.pow(radix, size)); + result = result.mul(power).add(Long.fromNumber(value)); + } + else { + result = result.mul(radixToPower); + result = result.add(Long.fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + static fromStringStrict(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str.trim() !== str) { + throw new BSONError(`Input: '${str}' contains leading and/or trailing whitespace`); + } + if (!validateStringCharacters(str, radix)) { + throw new BSONError(`Input: '${str}' contains invalid characters for radix: ${radix}`); + } + const cleanedStr = removeLeadingZerosAndExplicitPlus(str); + const result = Long._fromString(cleanedStr, unsigned, radix); + if (result.toString(radix).toLowerCase() !== cleanedStr.toLowerCase()) { + throw new BSONError(`Input: ${str} is not representable as ${result.unsigned ? 'an unsigned' : 'a signed'} 64-bit Long ${radix != null ? `with radix: ${radix}` : ''}`); + } + return result; + } + static fromString(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str === 'NaN' && radix < 24) { + return Long.ZERO; + } + else if ((str === 'Infinity' || str === '+Infinity' || str === '-Infinity') && radix < 35) { + return Long.ZERO; + } + return Long._fromString(str, unsigned, radix); + } + static fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + } + static fromBytesLE(bytes, unsigned) { + return new Long(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24), bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24), unsigned); + } + static fromBytesBE(bytes, unsigned) { + return new Long((bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7], (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3], unsigned); + } + static isLong(value) { + return (value != null && + typeof value === 'object' && + '__isLong__' in value && + value.__isLong__ === true); + } + static fromValue(val, unsigned) { + if (typeof val === 'number') + return Long.fromNumber(val, unsigned); + if (typeof val === 'string') + return Long.fromString(val, unsigned); + return Long.fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned); + } + add(addend) { + if (!Long.isLong(addend)) + addend = Long.fromValue(addend); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = addend.high >>> 16; + const b32 = addend.high & 0xffff; + const b16 = addend.low >>> 16; + const b00 = addend.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + and(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned); + } + compare(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.eq(other)) + return 0; + const thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || + (other.high === this.high && other.low >>> 0 > this.low >>> 0) + ? -1 + : 1; + } + comp(other) { + return this.compare(other); + } + divide(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (divisor.isZero()) + throw new BSONError('division by zero'); + if (wasm) { + if (!this.unsigned && + this.high === -0x80000000 && + divisor.low === -1 && + divisor.high === -1) { + return this; + } + const low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? Long.UZERO : Long.ZERO; + let approx, rem, res; + if (!this.unsigned) { + if (this.eq(Long.MIN_VALUE)) { + if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE)) + return Long.MIN_VALUE; + else if (divisor.eq(Long.MIN_VALUE)) + return Long.ONE; + else { + const halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(Long.ZERO)) { + return divisor.isNegative() ? Long.ONE : Long.NEG_ONE; + } + else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } + else if (divisor.eq(Long.MIN_VALUE)) + return this.unsigned ? Long.UZERO : Long.ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } + else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = Long.ZERO; + } + else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return Long.UZERO; + if (divisor.gt(this.shru(1))) + return Long.UONE; + res = Long.UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + const log2 = Math.ceil(Math.log(approx) / Math.LN2); + const delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); + let approxRes = Long.fromNumber(approx); + let approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = Long.fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = Long.ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + } + div(divisor) { + return this.divide(divisor); + } + equals(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + } + eq(other) { + return this.equals(other); + } + getHighBits() { + return this.high; + } + getHighBitsUnsigned() { + return this.high >>> 0; + } + getLowBits() { + return this.low; + } + getLowBitsUnsigned() { + return this.low >>> 0; + } + getNumBitsAbs() { + if (this.isNegative()) { + return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + } + const val = this.high !== 0 ? this.high : this.low; + let bit; + for (bit = 31; bit > 0; bit--) + if ((val & (1 << bit)) !== 0) + break; + return this.high !== 0 ? bit + 33 : bit + 1; + } + greaterThan(other) { + return this.comp(other) > 0; + } + gt(other) { + return this.greaterThan(other); + } + greaterThanOrEqual(other) { + return this.comp(other) >= 0; + } + gte(other) { + return this.greaterThanOrEqual(other); + } + ge(other) { + return this.greaterThanOrEqual(other); + } + isEven() { + return (this.low & 1) === 0; + } + isNegative() { + return !this.unsigned && this.high < 0; + } + isOdd() { + return (this.low & 1) === 1; + } + isPositive() { + return this.unsigned || this.high >= 0; + } + isZero() { + return this.high === 0 && this.low === 0; + } + lessThan(other) { + return this.comp(other) < 0; + } + lt(other) { + return this.lessThan(other); + } + lessThanOrEqual(other) { + return this.comp(other) <= 0; + } + lte(other) { + return this.lessThanOrEqual(other); + } + modulo(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (wasm) { + const low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + } + mod(divisor) { + return this.modulo(divisor); + } + rem(divisor) { + return this.modulo(divisor); + } + multiply(multiplier) { + if (this.isZero()) + return Long.ZERO; + if (!Long.isLong(multiplier)) + multiplier = Long.fromValue(multiplier); + if (wasm) { + const low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return Long.ZERO; + if (this.eq(Long.MIN_VALUE)) + return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (multiplier.eq(Long.MIN_VALUE)) + return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } + else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24)) + return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = multiplier.high >>> 16; + const b32 = multiplier.high & 0xffff; + const b16 = multiplier.low >>> 16; + const b00 = multiplier.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + mul(multiplier) { + return this.multiply(multiplier); + } + negate() { + if (!this.unsigned && this.eq(Long.MIN_VALUE)) + return Long.MIN_VALUE; + return this.not().add(Long.ONE); + } + neg() { + return this.negate(); + } + not() { + return Long.fromBits(~this.low, ~this.high, this.unsigned); + } + notEquals(other) { + return !this.equals(other); + } + neq(other) { + return this.notEquals(other); + } + ne(other) { + return this.notEquals(other); + } + or(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned); + } + shiftLeft(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); + else + return Long.fromBits(0, this.low << (numBits - 32), this.unsigned); + } + shl(numBits) { + return this.shiftLeft(numBits); + } + shiftRight(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); + else + return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); + } + shr(numBits) { + return this.shiftRight(numBits); + } + shiftRightUnsigned(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + const high = this.high; + if (numBits < 32) { + const low = this.low; + return Long.fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); + } + else if (numBits === 32) + return Long.fromBits(high, 0, this.unsigned); + else + return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned); + } + } + shr_u(numBits) { + return this.shiftRightUnsigned(numBits); + } + shru(numBits) { + return this.shiftRightUnsigned(numBits); + } + subtract(subtrahend) { + if (!Long.isLong(subtrahend)) + subtrahend = Long.fromValue(subtrahend); + return this.add(subtrahend.neg()); + } + sub(subtrahend) { + return this.subtract(subtrahend); + } + toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + } + toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + } + toBigInt() { + return BigInt(this.toString()); + } + toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + } + toBytesLE() { + const hi = this.high, lo = this.low; + return [ + lo & 0xff, + (lo >>> 8) & 0xff, + (lo >>> 16) & 0xff, + lo >>> 24, + hi & 0xff, + (hi >>> 8) & 0xff, + (hi >>> 16) & 0xff, + hi >>> 24 + ]; + } + toBytesBE() { + const hi = this.high, lo = this.low; + return [ + hi >>> 24, + (hi >>> 16) & 0xff, + (hi >>> 8) & 0xff, + hi & 0xff, + lo >>> 24, + (lo >>> 16) & 0xff, + (lo >>> 8) & 0xff, + lo & 0xff + ]; + } + toSigned() { + if (!this.unsigned) + return this; + return Long.fromBits(this.low, this.high, false); + } + toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + if (this.isZero()) + return '0'; + if (this.isNegative()) { + if (this.eq(Long.MIN_VALUE)) { + const radixLong = Long.fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } + else + return '-' + this.neg().toString(radix); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 6), this.unsigned); + let rem = this; + let result = ''; + while (true) { + const remDiv = rem.div(radixToPower); + const intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0; + let digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) { + return digits + result; + } + else { + while (digits.length < 6) + digits = '0' + digits; + result = '' + digits + result; + } + } + } + toUnsigned() { + if (this.unsigned) + return this; + return Long.fromBits(this.low, this.high, true); + } + xor(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + } + eqz() { + return this.isZero(); + } + le(other) { + return this.lessThanOrEqual(other); + } + toExtendedJSON(options) { + if (options && options.relaxed) + return this.toNumber(); + return { $numberLong: this.toString() }; + } + static fromExtendedJSON(doc, options) { + const { useBigInt64 = false, relaxed = true } = { ...options }; + if (doc.$numberLong.length > MAX_INT64_STRING_LENGTH) { + throw new BSONError('$numberLong string is too long'); + } + if (!DECIMAL_REG_EX.test(doc.$numberLong)) { + throw new BSONError(`$numberLong string "${doc.$numberLong}" is in an invalid format`); + } + if (useBigInt64) { + const bigIntResult = BigInt(doc.$numberLong); + return BigInt.asIntN(64, bigIntResult); + } + const longResult = Long.fromString(doc.$numberLong); + if (relaxed) { + return longResult.toNumber(); + } + return longResult; + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const longVal = inspect(this.toString(), options); + const unsignedVal = this.unsigned ? `, ${inspect(this.unsigned, options)}` : ''; + return `new Long(${longVal}${unsignedVal})`; + } +} +Long.TWO_PWR_24 = Long.fromInt(TWO_PWR_24_DBL); +Long.MAX_UNSIGNED_VALUE = Long.fromBits(0xffffffff | 0, 0xffffffff | 0, true); +Long.ZERO = Long.fromInt(0); +Long.UZERO = Long.fromInt(0, true); +Long.ONE = Long.fromInt(1); +Long.UONE = Long.fromInt(1, true); +Long.NEG_ONE = Long.fromInt(-1); +Long.MAX_VALUE = Long.fromBits(0xffffffff | 0, 0x7fffffff | 0, false); +Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0, false); + +const PARSE_STRING_REGEXP = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/; +const PARSE_INF_REGEXP = /^(\+|-)?(Infinity|inf)$/i; +const PARSE_NAN_REGEXP = /^(\+|-)?NaN$/i; +const EXPONENT_MAX = 6111; +const EXPONENT_MIN = -6176; +const EXPONENT_BIAS = 6176; +const MAX_DIGITS = 34; +const NAN_BUFFER = ByteUtils.fromNumberArray([ + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_NEGATIVE_BUFFER = ByteUtils.fromNumberArray([ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_POSITIVE_BUFFER = ByteUtils.fromNumberArray([ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const EXPONENT_REGEX = /^([-+])?(\d+)?$/; +const COMBINATION_MASK = 0x1f; +const EXPONENT_MASK = 0x3fff; +const COMBINATION_INFINITY = 30; +const COMBINATION_NAN = 31; +function isDigit(value) { + return !isNaN(parseInt(value, 10)); +} +function divideu128(value) { + const DIVISOR = Long.fromNumber(1000 * 1000 * 1000); + let _rem = Long.fromNumber(0); + if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { + return { quotient: value, rem: _rem }; + } + for (let i = 0; i <= 3; i++) { + _rem = _rem.shiftLeft(32); + _rem = _rem.add(new Long(value.parts[i], 0)); + value.parts[i] = _rem.div(DIVISOR).low; + _rem = _rem.modulo(DIVISOR); + } + return { quotient: value, rem: _rem }; +} +function multiply64x2(left, right) { + if (!left && !right) { + return { high: Long.fromNumber(0), low: Long.fromNumber(0) }; + } + const leftHigh = left.shiftRightUnsigned(32); + const leftLow = new Long(left.getLowBits(), 0); + const rightHigh = right.shiftRightUnsigned(32); + const rightLow = new Long(right.getLowBits(), 0); + let productHigh = leftHigh.multiply(rightHigh); + let productMid = leftHigh.multiply(rightLow); + const productMid2 = leftLow.multiply(rightHigh); + let productLow = leftLow.multiply(rightLow); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productMid = new Long(productMid.getLowBits(), 0) + .add(productMid2) + .add(productLow.shiftRightUnsigned(32)); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productLow = productMid.shiftLeft(32).add(new Long(productLow.getLowBits(), 0)); + return { high: productHigh, low: productLow }; +} +function lessThan(left, right) { + const uhleft = left.high >>> 0; + const uhright = right.high >>> 0; + if (uhleft < uhright) { + return true; + } + else if (uhleft === uhright) { + const ulleft = left.low >>> 0; + const ulright = right.low >>> 0; + if (ulleft < ulright) + return true; + } + return false; +} +function invalidErr(string, message) { + throw new BSONError(`"${string}" is not a valid Decimal128 string - ${message}`); +} +class Decimal128 extends BSONValue { + get _bsontype() { + return 'Decimal128'; + } + constructor(bytes) { + super(); + if (typeof bytes === 'string') { + this.bytes = Decimal128.fromString(bytes).bytes; + } + else if (isUint8Array(bytes)) { + if (bytes.byteLength !== 16) { + throw new BSONError('Decimal128 must take a Buffer of 16 bytes'); + } + this.bytes = bytes; + } + else { + throw new BSONError('Decimal128 must take a Buffer or string'); + } + } + static fromString(representation) { + return Decimal128._fromString(representation, { allowRounding: false }); + } + static fromStringWithRounding(representation) { + return Decimal128._fromString(representation, { allowRounding: true }); + } + static _fromString(representation, options) { + let isNegative = false; + let sawSign = false; + let sawRadix = false; + let foundNonZero = false; + let significantDigits = 0; + let nDigitsRead = 0; + let nDigits = 0; + let radixPosition = 0; + let firstNonZero = 0; + const digits = [0]; + let nDigitsStored = 0; + let digitsInsert = 0; + let lastDigit = 0; + let exponent = 0; + let significandHigh = new Long(0, 0); + let significandLow = new Long(0, 0); + let biasedExponent = 0; + let index = 0; + if (representation.length >= 7000) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + const stringMatch = representation.match(PARSE_STRING_REGEXP); + const infMatch = representation.match(PARSE_INF_REGEXP); + const nanMatch = representation.match(PARSE_NAN_REGEXP); + if ((!stringMatch && !infMatch && !nanMatch) || representation.length === 0) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + if (stringMatch) { + const unsignedNumber = stringMatch[2]; + const e = stringMatch[4]; + const expSign = stringMatch[5]; + const expNumber = stringMatch[6]; + if (e && expNumber === undefined) + invalidErr(representation, 'missing exponent power'); + if (e && unsignedNumber === undefined) + invalidErr(representation, 'missing exponent base'); + if (e === undefined && (expSign || expNumber)) { + invalidErr(representation, 'missing e before exponent'); + } + } + if (representation[index] === '+' || representation[index] === '-') { + sawSign = true; + isNegative = representation[index++] === '-'; + } + if (!isDigit(representation[index]) && representation[index] !== '.') { + if (representation[index] === 'i' || representation[index] === 'I') { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + else if (representation[index] === 'N') { + return new Decimal128(NAN_BUFFER); + } + } + while (isDigit(representation[index]) || representation[index] === '.') { + if (representation[index] === '.') { + if (sawRadix) + invalidErr(representation, 'contains multiple periods'); + sawRadix = true; + index = index + 1; + continue; + } + if (nDigitsStored < MAX_DIGITS) { + if (representation[index] !== '0' || foundNonZero) { + if (!foundNonZero) { + firstNonZero = nDigitsRead; + } + foundNonZero = true; + digits[digitsInsert++] = parseInt(representation[index], 10); + nDigitsStored = nDigitsStored + 1; + } + } + if (foundNonZero) + nDigits = nDigits + 1; + if (sawRadix) + radixPosition = radixPosition + 1; + nDigitsRead = nDigitsRead + 1; + index = index + 1; + } + if (sawRadix && !nDigitsRead) + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + if (representation[index] === 'e' || representation[index] === 'E') { + const match = representation.substr(++index).match(EXPONENT_REGEX); + if (!match || !match[2]) + return new Decimal128(NAN_BUFFER); + exponent = parseInt(match[0], 10); + index = index + match[0].length; + } + if (representation[index]) + return new Decimal128(NAN_BUFFER); + if (!nDigitsStored) { + digits[0] = 0; + nDigits = 1; + nDigitsStored = 1; + significantDigits = 0; + } + else { + lastDigit = nDigitsStored - 1; + significantDigits = nDigits; + if (significantDigits !== 1) { + while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') { + significantDigits = significantDigits - 1; + } + } + } + if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) { + exponent = EXPONENT_MIN; + } + else { + exponent = exponent - radixPosition; + } + while (exponent > EXPONENT_MAX) { + lastDigit = lastDigit + 1; + if (lastDigit >= MAX_DIGITS) { + if (significantDigits === 0) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + exponent = exponent - 1; + } + if (options.allowRounding) { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0 && significantDigits < nDigitsStored) { + exponent = EXPONENT_MIN; + significantDigits = 0; + break; + } + if (nDigitsStored < nDigits) { + nDigits = nDigits - 1; + } + else { + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + const digitsString = digits.join(''); + if (digitsString.match(/^0+$/)) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + let endOfString = nDigitsRead; + if (sawRadix) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + let roundBit = 0; + if (roundDigit >= 5) { + roundBit = 1; + if (roundDigit === 5) { + roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0; + for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) { + if (parseInt(representation[i], 10)) { + roundBit = 1; + break; + } + } + } + } + if (roundBit) { + let dIdx = lastDigit; + for (; dIdx >= 0; dIdx--) { + if (++digits[dIdx] > 9) { + digits[dIdx] = 0; + if (dIdx === 0) { + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + digits[dIdx] = 1; + } + else { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + } + } + else { + break; + } + } + } + } + } + else { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0) { + if (significantDigits === 0) { + exponent = EXPONENT_MIN; + break; + } + invalidErr(representation, 'exponent underflow'); + } + if (nDigitsStored < nDigits) { + if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' && + significantDigits !== 0) { + invalidErr(representation, 'inexact rounding'); + } + nDigits = nDigits - 1; + } + else { + if (digits[lastDigit] !== 0) { + invalidErr(representation, 'inexact rounding'); + } + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + if (sawRadix) { + firstNonZero = firstNonZero + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + if (roundDigit !== 0) { + invalidErr(representation, 'inexact rounding'); + } + } + } + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + if (significantDigits === 0) { + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + } + else if (lastDigit < 17) { + let dIdx = 0; + significandLow = Long.fromNumber(digits[dIdx++]); + significandHigh = new Long(0, 0); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + else { + let dIdx = 0; + significandHigh = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit - 17; dIdx++) { + significandHigh = significandHigh.multiply(Long.fromNumber(10)); + significandHigh = significandHigh.add(Long.fromNumber(digits[dIdx])); + } + significandLow = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + const significand = multiply64x2(significandHigh, Long.fromString('100000000000000000')); + significand.low = significand.low.add(significandLow); + if (lessThan(significand.low, significandLow)) { + significand.high = significand.high.add(Long.fromNumber(1)); + } + biasedExponent = exponent + EXPONENT_BIAS; + const dec = { low: Long.fromNumber(0), high: Long.fromNumber(0) }; + if (significand.high.shiftRightUnsigned(49).and(Long.fromNumber(1)).equals(Long.fromNumber(1))) { + dec.high = dec.high.or(Long.fromNumber(0x3).shiftLeft(61)); + dec.high = dec.high.or(Long.fromNumber(biasedExponent).and(Long.fromNumber(0x3fff).shiftLeft(47))); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x7fffffffffff))); + } + else { + dec.high = dec.high.or(Long.fromNumber(biasedExponent & 0x3fff).shiftLeft(49)); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x1ffffffffffff))); + } + dec.low = significand.low; + if (isNegative) { + dec.high = dec.high.or(Long.fromString('9223372036854775808')); + } + const buffer = ByteUtils.allocateUnsafe(16); + index = 0; + buffer[index++] = dec.low.low & 0xff; + buffer[index++] = (dec.low.low >> 8) & 0xff; + buffer[index++] = (dec.low.low >> 16) & 0xff; + buffer[index++] = (dec.low.low >> 24) & 0xff; + buffer[index++] = dec.low.high & 0xff; + buffer[index++] = (dec.low.high >> 8) & 0xff; + buffer[index++] = (dec.low.high >> 16) & 0xff; + buffer[index++] = (dec.low.high >> 24) & 0xff; + buffer[index++] = dec.high.low & 0xff; + buffer[index++] = (dec.high.low >> 8) & 0xff; + buffer[index++] = (dec.high.low >> 16) & 0xff; + buffer[index++] = (dec.high.low >> 24) & 0xff; + buffer[index++] = dec.high.high & 0xff; + buffer[index++] = (dec.high.high >> 8) & 0xff; + buffer[index++] = (dec.high.high >> 16) & 0xff; + buffer[index++] = (dec.high.high >> 24) & 0xff; + return new Decimal128(buffer); + } + toString() { + let biased_exponent; + let significand_digits = 0; + const significand = new Array(36); + for (let i = 0; i < significand.length; i++) + significand[i] = 0; + let index = 0; + let is_zero = false; + let significand_msb; + let significand128 = { parts: [0, 0, 0, 0] }; + let j, k; + const string = []; + index = 0; + const buffer = this.bytes; + const low = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midl = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midh = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const high = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + index = 0; + const dec = { + low: new Long(low, midl), + high: new Long(midh, high) + }; + if (dec.high.lessThan(Long.ZERO)) { + string.push('-'); + } + const combination = (high >> 26) & COMBINATION_MASK; + if (combination >> 3 === 3) { + if (combination === COMBINATION_INFINITY) { + return string.join('') + 'Infinity'; + } + else if (combination === COMBINATION_NAN) { + return 'NaN'; + } + else { + biased_exponent = (high >> 15) & EXPONENT_MASK; + significand_msb = 0x08 + ((high >> 14) & 0x01); + } + } + else { + significand_msb = (high >> 14) & 0x07; + biased_exponent = (high >> 17) & EXPONENT_MASK; + } + const exponent = biased_exponent - EXPONENT_BIAS; + significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); + significand128.parts[1] = midh; + significand128.parts[2] = midl; + significand128.parts[3] = low; + if (significand128.parts[0] === 0 && + significand128.parts[1] === 0 && + significand128.parts[2] === 0 && + significand128.parts[3] === 0) { + is_zero = true; + } + else { + for (k = 3; k >= 0; k--) { + let least_digits = 0; + const result = divideu128(significand128); + significand128 = result.quotient; + least_digits = result.rem.low; + if (!least_digits) + continue; + for (j = 8; j >= 0; j--) { + significand[k * 9 + j] = least_digits % 10; + least_digits = Math.floor(least_digits / 10); + } + } + } + if (is_zero) { + significand_digits = 1; + significand[index] = 0; + } + else { + significand_digits = 36; + while (!significand[index]) { + significand_digits = significand_digits - 1; + index = index + 1; + } + } + const scientific_exponent = significand_digits - 1 + exponent; + if (scientific_exponent >= 34 || scientific_exponent <= -7 || exponent > 0) { + if (significand_digits > 34) { + string.push(`${0}`); + if (exponent > 0) + string.push(`E+${exponent}`); + else if (exponent < 0) + string.push(`E${exponent}`); + return string.join(''); + } + string.push(`${significand[index++]}`); + significand_digits = significand_digits - 1; + if (significand_digits) { + string.push('.'); + } + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + string.push('E'); + if (scientific_exponent > 0) { + string.push(`+${scientific_exponent}`); + } + else { + string.push(`${scientific_exponent}`); + } + } + else { + if (exponent >= 0) { + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + } + else { + let radix_position = significand_digits + exponent; + if (radix_position > 0) { + for (let i = 0; i < radix_position; i++) { + string.push(`${significand[index++]}`); + } + } + else { + string.push('0'); + } + string.push('.'); + while (radix_position++ < 0) { + string.push('0'); + } + for (let i = 0; i < significand_digits - Math.max(radix_position - 1, 0); i++) { + string.push(`${significand[index++]}`); + } + } + } + return string.join(''); + } + toJSON() { + return { $numberDecimal: this.toString() }; + } + toExtendedJSON() { + return { $numberDecimal: this.toString() }; + } + static fromExtendedJSON(doc) { + return Decimal128.fromString(doc.$numberDecimal); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const d128string = inspect(this.toString(), options); + return `new Decimal128(${d128string})`; + } +} + +class Double extends BSONValue { + get _bsontype() { + return 'Double'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value; + } + static fromString(value) { + const coercedValue = Number(value); + if (value === 'NaN') + return new Double(NaN); + if (value === 'Infinity') + return new Double(Infinity); + if (value === '-Infinity') + return new Double(-Infinity); + if (!Number.isFinite(coercedValue)) { + throw new BSONError(`Input: ${value} is not representable as a Double`); + } + if (value.trim() !== value) { + throw new BSONError(`Input: '${value}' contains whitespace`); + } + if (value === '') { + throw new BSONError(`Input is an empty string`); + } + if (/[^-0-9.+eE]/.test(value)) { + throw new BSONError(`Input: '${value}' is not in decimal or exponential notation`); + } + return new Double(coercedValue); + } + valueOf() { + return this.value; + } + toJSON() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toExtendedJSON(options) { + if (options && (options.legacy || (options.relaxed && isFinite(this.value)))) { + return this.value; + } + if (Object.is(Math.sign(this.value), -0)) { + return { $numberDouble: '-0.0' }; + } + return { + $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() + }; + } + static fromExtendedJSON(doc, options) { + const doubleValue = parseFloat(doc.$numberDouble); + return options && options.relaxed ? doubleValue : new Double(doubleValue); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Double(${inspect(this.value, options)})`; + } +} + +class Int32 extends BSONValue { + get _bsontype() { + return 'Int32'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value | 0; + } + static fromString(value) { + const cleanedValue = removeLeadingZerosAndExplicitPlus(value); + const coercedValue = Number(value); + if (BSON_INT32_MAX < coercedValue) { + throw new BSONError(`Input: '${value}' is larger than the maximum value for Int32`); + } + else if (BSON_INT32_MIN > coercedValue) { + throw new BSONError(`Input: '${value}' is smaller than the minimum value for Int32`); + } + else if (!Number.isSafeInteger(coercedValue)) { + throw new BSONError(`Input: '${value}' is not a safe integer`); + } + else if (coercedValue.toString() !== cleanedValue) { + throw new BSONError(`Input: '${value}' is not a valid Int32 string`); + } + return new Int32(coercedValue); + } + valueOf() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toJSON() { + return this.value; + } + toExtendedJSON(options) { + if (options && (options.relaxed || options.legacy)) + return this.value; + return { $numberInt: this.value.toString() }; + } + static fromExtendedJSON(doc, options) { + return options && options.relaxed ? parseInt(doc.$numberInt, 10) : new Int32(doc.$numberInt); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Int32(${inspect(this.value, options)})`; + } +} + +class MaxKey extends BSONValue { + get _bsontype() { + return 'MaxKey'; + } + toExtendedJSON() { + return { $maxKey: 1 }; + } + static fromExtendedJSON() { + return new MaxKey(); + } + inspect() { + return 'new MaxKey()'; + } +} + +class MinKey extends BSONValue { + get _bsontype() { + return 'MinKey'; + } + toExtendedJSON() { + return { $minKey: 1 }; + } + static fromExtendedJSON() { + return new MinKey(); + } + inspect() { + return 'new MinKey()'; + } +} + +const FLOAT = new Float64Array(1); +const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8); +FLOAT[0] = -1; +const isBigEndian = FLOAT_BYTES[7] === 0; +const NumberUtils = { + getNonnegativeInt32LE(source, offset) { + if (source[offset + 3] > 127) { + throw new RangeError(`Size cannot be negative at offset: ${offset}`); + } + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getInt32LE(source, offset) { + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getUint32LE(source, offset) { + return (source[offset] + + source[offset + 1] * 256 + + source[offset + 2] * 65536 + + source[offset + 3] * 16777216); + }, + getUint32BE(source, offset) { + return (source[offset + 3] + + source[offset + 2] * 256 + + source[offset + 1] * 65536 + + source[offset] * 16777216); + }, + getBigInt64LE(source, offset) { + const lo = NumberUtils.getUint32LE(source, offset); + const hi = NumberUtils.getUint32LE(source, offset + 4); + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }, + getFloat64LE: isBigEndian + ? (source, offset) => { + FLOAT_BYTES[7] = source[offset]; + FLOAT_BYTES[6] = source[offset + 1]; + FLOAT_BYTES[5] = source[offset + 2]; + FLOAT_BYTES[4] = source[offset + 3]; + FLOAT_BYTES[3] = source[offset + 4]; + FLOAT_BYTES[2] = source[offset + 5]; + FLOAT_BYTES[1] = source[offset + 6]; + FLOAT_BYTES[0] = source[offset + 7]; + return FLOAT[0]; + } + : (source, offset) => { + FLOAT_BYTES[0] = source[offset]; + FLOAT_BYTES[1] = source[offset + 1]; + FLOAT_BYTES[2] = source[offset + 2]; + FLOAT_BYTES[3] = source[offset + 3]; + FLOAT_BYTES[4] = source[offset + 4]; + FLOAT_BYTES[5] = source[offset + 5]; + FLOAT_BYTES[6] = source[offset + 6]; + FLOAT_BYTES[7] = source[offset + 7]; + return FLOAT[0]; + }, + setInt32BE(destination, offset, value) { + destination[offset + 3] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset] = value; + return 4; + }, + setInt32LE(destination, offset, value) { + destination[offset] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 3] = value; + return 4; + }, + setBigInt64LE(destination, offset, value) { + const mask32bits = BigInt(4294967295); + let lo = Number(value & mask32bits); + destination[offset] = lo; + lo >>= 8; + destination[offset + 1] = lo; + lo >>= 8; + destination[offset + 2] = lo; + lo >>= 8; + destination[offset + 3] = lo; + let hi = Number((value >> BigInt(32)) & mask32bits); + destination[offset + 4] = hi; + hi >>= 8; + destination[offset + 5] = hi; + hi >>= 8; + destination[offset + 6] = hi; + hi >>= 8; + destination[offset + 7] = hi; + return 8; + }, + setFloat64LE: isBigEndian + ? (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[7]; + destination[offset + 1] = FLOAT_BYTES[6]; + destination[offset + 2] = FLOAT_BYTES[5]; + destination[offset + 3] = FLOAT_BYTES[4]; + destination[offset + 4] = FLOAT_BYTES[3]; + destination[offset + 5] = FLOAT_BYTES[2]; + destination[offset + 6] = FLOAT_BYTES[1]; + destination[offset + 7] = FLOAT_BYTES[0]; + return 8; + } + : (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[0]; + destination[offset + 1] = FLOAT_BYTES[1]; + destination[offset + 2] = FLOAT_BYTES[2]; + destination[offset + 3] = FLOAT_BYTES[3]; + destination[offset + 4] = FLOAT_BYTES[4]; + destination[offset + 5] = FLOAT_BYTES[5]; + destination[offset + 6] = FLOAT_BYTES[6]; + destination[offset + 7] = FLOAT_BYTES[7]; + return 8; + } +}; + +const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$'); +let PROCESS_UNIQUE = null; +class ObjectId extends BSONValue { + get _bsontype() { + return 'ObjectId'; + } + constructor(inputId) { + super(); + let workingId; + if (typeof inputId === 'object' && inputId && 'id' in inputId) { + if (typeof inputId.id !== 'string' && !ArrayBuffer.isView(inputId.id)) { + throw new BSONError('Argument passed in must have an id that is of type string or Buffer'); + } + if ('toHexString' in inputId && typeof inputId.toHexString === 'function') { + workingId = ByteUtils.fromHex(inputId.toHexString()); + } + else { + workingId = inputId.id; + } + } + else { + workingId = inputId; + } + if (workingId == null || typeof workingId === 'number') { + this.buffer = ObjectId.generate(typeof workingId === 'number' ? workingId : undefined); + } + else if (ArrayBuffer.isView(workingId) && workingId.byteLength === 12) { + this.buffer = ByteUtils.toLocalBufferType(workingId); + } + else if (typeof workingId === 'string') { + if (workingId.length === 24 && checkForHexRegExp.test(workingId)) { + this.buffer = ByteUtils.fromHex(workingId); + } + else { + throw new BSONError('input must be a 24 character hex string, 12 byte Uint8Array, or an integer'); + } + } + else { + throw new BSONError('Argument passed in does not match the accepted types'); + } + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(this.id); + } + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(value); + } + } + toHexString() { + if (ObjectId.cacheHexString && this.__id) { + return this.__id; + } + const hexString = ByteUtils.toHex(this.id); + if (ObjectId.cacheHexString && !this.__id) { + this.__id = hexString; + } + return hexString; + } + static getInc() { + return (ObjectId.index = (ObjectId.index + 1) % 0xffffff); + } + static generate(time) { + if ('number' !== typeof time) { + time = Math.floor(Date.now() / 1000); + } + const inc = ObjectId.getInc(); + const buffer = ByteUtils.allocateUnsafe(12); + NumberUtils.setInt32BE(buffer, 0, time); + if (PROCESS_UNIQUE === null) { + PROCESS_UNIQUE = ByteUtils.randomBytes(5); + } + buffer[4] = PROCESS_UNIQUE[0]; + buffer[5] = PROCESS_UNIQUE[1]; + buffer[6] = PROCESS_UNIQUE[2]; + buffer[7] = PROCESS_UNIQUE[3]; + buffer[8] = PROCESS_UNIQUE[4]; + buffer[11] = inc & 0xff; + buffer[10] = (inc >> 8) & 0xff; + buffer[9] = (inc >> 16) & 0xff; + return buffer; + } + toString(encoding) { + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + if (encoding === 'hex') + return this.toHexString(); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + static is(variable) { + return (variable != null && + typeof variable === 'object' && + '_bsontype' in variable && + variable._bsontype === 'ObjectId'); + } + equals(otherId) { + if (otherId === undefined || otherId === null) { + return false; + } + if (ObjectId.is(otherId)) { + return (this.buffer[11] === otherId.buffer[11] && ByteUtils.equals(this.buffer, otherId.buffer)); + } + if (typeof otherId === 'string') { + return otherId.toLowerCase() === this.toHexString(); + } + if (typeof otherId === 'object' && typeof otherId.toHexString === 'function') { + const otherIdString = otherId.toHexString(); + const thisIdString = this.toHexString(); + return typeof otherIdString === 'string' && otherIdString.toLowerCase() === thisIdString; + } + return false; + } + getTimestamp() { + const timestamp = new Date(); + const time = NumberUtils.getUint32BE(this.buffer, 0); + timestamp.setTime(Math.floor(time) * 1000); + return timestamp; + } + static createPk() { + return new ObjectId(); + } + serializeInto(uint8array, index) { + uint8array[index] = this.buffer[0]; + uint8array[index + 1] = this.buffer[1]; + uint8array[index + 2] = this.buffer[2]; + uint8array[index + 3] = this.buffer[3]; + uint8array[index + 4] = this.buffer[4]; + uint8array[index + 5] = this.buffer[5]; + uint8array[index + 6] = this.buffer[6]; + uint8array[index + 7] = this.buffer[7]; + uint8array[index + 8] = this.buffer[8]; + uint8array[index + 9] = this.buffer[9]; + uint8array[index + 10] = this.buffer[10]; + uint8array[index + 11] = this.buffer[11]; + return 12; + } + static createFromTime(time) { + const buffer = ByteUtils.allocate(12); + for (let i = 11; i >= 4; i--) + buffer[i] = 0; + NumberUtils.setInt32BE(buffer, 0, time); + return new ObjectId(buffer); + } + static createFromHexString(hexString) { + if (hexString?.length !== 24) { + throw new BSONError('hex string must be 24 characters'); + } + return new ObjectId(ByteUtils.fromHex(hexString)); + } + static createFromBase64(base64) { + if (base64?.length !== 16) { + throw new BSONError('base64 string must be 16 characters'); + } + return new ObjectId(ByteUtils.fromBase64(base64)); + } + static isValid(id) { + if (id == null) + return false; + try { + new ObjectId(id); + return true; + } + catch { + return false; + } + } + toExtendedJSON() { + if (this.toHexString) + return { $oid: this.toHexString() }; + return { $oid: this.toString('hex') }; + } + static fromExtendedJSON(doc) { + return new ObjectId(doc.$oid); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new ObjectId(${inspect(this.toHexString(), options)})`; + } +} +ObjectId.index = Math.floor(Math.random() * 0xffffff); + +function internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined) { + let totalLength = 4 + 1; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + totalLength += calculateElement(i.toString(), object[i], serializeFunctions, true, ignoreUndefined); + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + } + for (const key of Object.keys(object)) { + totalLength += calculateElement(key, object[key], serializeFunctions, false, ignoreUndefined); + } + } + return totalLength; +} +function calculateElement(name, value, serializeFunctions = false, isArray = false, ignoreUndefined = false) { + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + switch (typeof value) { + case 'string': + return 1 + ByteUtils.utf8ByteLength(name) + 1 + 4 + ByteUtils.utf8ByteLength(value) + 1; + case 'number': + if (Math.floor(value) === value && + value >= JS_INT_MIN && + value <= JS_INT_MAX) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (4 + 1); + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + case 'undefined': + if (isArray || !ignoreUndefined) + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + return 0; + case 'boolean': + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 1); + case 'object': + if (value != null && + typeof value._bsontype === 'string' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value == null || value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + } + else if (value._bsontype === 'ObjectId') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (12 + 1); + } + else if (value instanceof Date || isDate(value)) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (ArrayBuffer.isView(value) || + value instanceof ArrayBuffer || + isAnyArrayBuffer(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 4 + 1) + value.byteLength); + } + else if (value._bsontype === 'Long' || + value._bsontype === 'Double' || + value._bsontype === 'Timestamp') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (value._bsontype === 'Decimal128') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (16 + 1); + } + else if (value._bsontype === 'Code') { + if (value.scope != null && Object.keys(value.scope).length > 0) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + + internalCalculateObjectSize(value.scope, serializeFunctions, ignoreUndefined)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1); + } + } + else if (value._bsontype === 'Binary') { + const binary = value; + if (binary.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + (binary.position + 1 + 4 + 1 + 4)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (binary.position + 1 + 4 + 1)); + } + } + else if (value._bsontype === 'Symbol') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + ByteUtils.utf8ByteLength(value.value) + + 4 + + 1 + + 1); + } + else if (value._bsontype === 'DBRef') { + const ordered_values = Object.assign({ + $ref: value.collection, + $id: value.oid + }, value.fields); + if (value.db != null) { + ordered_values['$db'] = value.db; + } + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + internalCalculateObjectSize(ordered_values, serializeFunctions, ignoreUndefined)); + } + else if (value instanceof RegExp || isRegExp(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.source) + + 1 + + (value.global ? 1 : 0) + + (value.ignoreCase ? 1 : 0) + + (value.multiline ? 1 : 0) + + 1); + } + else if (value._bsontype === 'BSONRegExp') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.pattern) + + 1 + + ByteUtils.utf8ByteLength(value.options) + + 1); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + internalCalculateObjectSize(value, serializeFunctions, ignoreUndefined) + + 1); + } + case 'function': + if (serializeFunctions) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.toString()) + + 1); + } + } + return 0; +} + +function alphabetize(str) { + return str.split('').sort().join(''); +} +class BSONRegExp extends BSONValue { + get _bsontype() { + return 'BSONRegExp'; + } + constructor(pattern, options) { + super(); + this.pattern = pattern; + this.options = alphabetize(options ?? ''); + if (this.pattern.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`); + } + if (this.options.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`); + } + for (let i = 0; i < this.options.length; i++) { + if (!(this.options[i] === 'i' || + this.options[i] === 'm' || + this.options[i] === 'x' || + this.options[i] === 'l' || + this.options[i] === 's' || + this.options[i] === 'u')) { + throw new BSONError(`The regular expression option [${this.options[i]}] is not supported`); + } + } + } + static parseOptions(options) { + return options ? options.split('').sort().join('') : ''; + } + toExtendedJSON(options) { + options = options || {}; + if (options.legacy) { + return { $regex: this.pattern, $options: this.options }; + } + return { $regularExpression: { pattern: this.pattern, options: this.options } }; + } + static fromExtendedJSON(doc) { + if ('$regex' in doc) { + if (typeof doc.$regex !== 'string') { + if (doc.$regex._bsontype === 'BSONRegExp') { + return doc; + } + } + else { + return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options)); + } + } + if ('$regularExpression' in doc) { + return new BSONRegExp(doc.$regularExpression.pattern, BSONRegExp.parseOptions(doc.$regularExpression.options)); + } + throw new BSONError(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(doc)}`); + } + inspect(depth, options, inspect) { + const stylize = getStylizeFunction(options) ?? (v => v); + inspect ??= defaultInspect; + const pattern = stylize(inspect(this.pattern), 'regexp'); + const flags = stylize(inspect(this.options), 'regexp'); + return `new BSONRegExp(${pattern}, ${flags})`; + } +} + +class BSONSymbol extends BSONValue { + get _bsontype() { + return 'BSONSymbol'; + } + constructor(value) { + super(); + this.value = value; + } + valueOf() { + return this.value; + } + toString() { + return this.value; + } + toJSON() { + return this.value; + } + toExtendedJSON() { + return { $symbol: this.value }; + } + static fromExtendedJSON(doc) { + return new BSONSymbol(doc.$symbol); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new BSONSymbol(${inspect(this.value, options)})`; + } +} + +const LongWithoutOverridesClass = Long; +class Timestamp extends LongWithoutOverridesClass { + get _bsontype() { + return 'Timestamp'; + } + constructor(low) { + if (low == null) { + super(0, 0, true); + } + else if (typeof low === 'bigint') { + super(low, true); + } + else if (Long.isLong(low)) { + super(low.low, low.high, true); + } + else if (typeof low === 'object' && 't' in low && 'i' in low) { + if (typeof low.t !== 'number' && (typeof low.t !== 'object' || low.t._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide t as a number'); + } + if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide i as a number'); + } + const t = Number(low.t); + const i = Number(low.i); + if (t < 0 || Number.isNaN(t)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive t'); + } + if (i < 0 || Number.isNaN(i)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive i'); + } + if (t > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max'); + } + if (i > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max'); + } + super(i, t, true); + } + else { + throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }'); + } + } + toJSON() { + return { + $timestamp: this.toString() + }; + } + static fromInt(value) { + return new Timestamp(Long.fromInt(value, true)); + } + static fromNumber(value) { + return new Timestamp(Long.fromNumber(value, true)); + } + static fromBits(lowBits, highBits) { + return new Timestamp({ i: lowBits, t: highBits }); + } + static fromString(str, optRadix) { + return new Timestamp(Long.fromString(str, true, optRadix)); + } + toExtendedJSON() { + return { $timestamp: { t: this.high >>> 0, i: this.low >>> 0 } }; + } + static fromExtendedJSON(doc) { + const i = Long.isLong(doc.$timestamp.i) + ? doc.$timestamp.i.getLowBitsUnsigned() + : doc.$timestamp.i; + const t = Long.isLong(doc.$timestamp.t) + ? doc.$timestamp.t.getLowBitsUnsigned() + : doc.$timestamp.t; + return new Timestamp({ t, i }); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const t = inspect(this.high >>> 0, options); + const i = inspect(this.low >>> 0, options); + return `new Timestamp({ t: ${t}, i: ${i} })`; + } +} +Timestamp.MAX_VALUE = Long.MAX_UNSIGNED_VALUE; + +const JS_INT_MAX_LONG = Long.fromNumber(JS_INT_MAX); +const JS_INT_MIN_LONG = Long.fromNumber(JS_INT_MIN); +function internalDeserialize(buffer, options, isArray) { + options = options == null ? {} : options; + const index = options && options.index ? options.index : 0; + const size = NumberUtils.getInt32LE(buffer, index); + if (size < 5) { + throw new BSONError(`bson size must be >= 5, is ${size}`); + } + if (options.allowObjectSmallerThanBufferSize && buffer.length < size) { + throw new BSONError(`buffer length ${buffer.length} must be >= bson size ${size}`); + } + if (!options.allowObjectSmallerThanBufferSize && buffer.length !== size) { + throw new BSONError(`buffer length ${buffer.length} must === bson size ${size}`); + } + if (size + index > buffer.byteLength) { + throw new BSONError(`(bson size ${size} + options.index ${index} must be <= buffer length ${buffer.byteLength})`); + } + if (buffer[index + size - 1] !== 0) { + throw new BSONError("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00"); + } + return deserializeObject(buffer, index, options, isArray); +} +const allowedDBRefKeys = /^\$ref$|^\$id$|^\$db$/; +function deserializeObject(buffer, index, options, isArray = false) { + const fieldsAsRaw = options['fieldsAsRaw'] == null ? null : options['fieldsAsRaw']; + const raw = options['raw'] == null ? false : options['raw']; + const bsonRegExp = typeof options['bsonRegExp'] === 'boolean' ? options['bsonRegExp'] : false; + const promoteBuffers = options.promoteBuffers ?? false; + const promoteLongs = options.promoteLongs ?? true; + const promoteValues = options.promoteValues ?? true; + const useBigInt64 = options.useBigInt64 ?? false; + if (useBigInt64 && !promoteValues) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + if (useBigInt64 && !promoteLongs) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + const validation = options.validation == null ? { utf8: true } : options.validation; + let globalUTFValidation = true; + let validationSetting; + let utf8KeysSet; + const utf8ValidatedKeys = validation.utf8; + if (typeof utf8ValidatedKeys === 'boolean') { + validationSetting = utf8ValidatedKeys; + } + else { + globalUTFValidation = false; + const utf8ValidationValues = Object.keys(utf8ValidatedKeys).map(function (key) { + return utf8ValidatedKeys[key]; + }); + if (utf8ValidationValues.length === 0) { + throw new BSONError('UTF-8 validation setting cannot be empty'); + } + if (typeof utf8ValidationValues[0] !== 'boolean') { + throw new BSONError('Invalid UTF-8 validation option, must specify boolean values'); + } + validationSetting = utf8ValidationValues[0]; + if (!utf8ValidationValues.every(item => item === validationSetting)) { + throw new BSONError('Invalid UTF-8 validation option - keys must be all true or all false'); + } + } + if (!globalUTFValidation) { + utf8KeysSet = new Set(); + for (const key of Object.keys(utf8ValidatedKeys)) { + utf8KeysSet.add(key); + } + } + const startIndex = index; + if (buffer.length < 5) + throw new BSONError('corrupt bson message < 5 bytes long'); + const size = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (size < 5 || size > buffer.length) + throw new BSONError('corrupt bson message'); + const object = isArray ? [] : {}; + let arrayIndex = 0; + const done = false; + let isPossibleDBRef = isArray ? false : null; + while (!done) { + const elementType = buffer[index++]; + if (elementType === 0) + break; + let i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.byteLength) + throw new BSONError('Bad BSON Document: illegal CString'); + const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i, false); + let shouldValidateKey = true; + if (globalUTFValidation || utf8KeysSet?.has(name)) { + shouldValidateKey = validationSetting; + } + else { + shouldValidateKey = !validationSetting; + } + if (isPossibleDBRef !== false && name[0] === '$') { + isPossibleDBRef = allowedDBRefKeys.test(name); + } + let value; + index = i + 1; + if (elementType === BSON_DATA_STRING) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + value = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + } + else if (elementType === BSON_DATA_OID) { + const oid = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oid[i] = buffer[index + i]; + value = new ObjectId(oid); + index = index + 12; + } + else if (elementType === BSON_DATA_INT && promoteValues === false) { + value = new Int32(NumberUtils.getInt32LE(buffer, index)); + index += 4; + } + else if (elementType === BSON_DATA_INT) { + value = NumberUtils.getInt32LE(buffer, index); + index += 4; + } + else if (elementType === BSON_DATA_NUMBER) { + value = NumberUtils.getFloat64LE(buffer, index); + index += 8; + if (promoteValues === false) + value = new Double(value); + } + else if (elementType === BSON_DATA_DATE) { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + value = new Date(new Long(lowBits, highBits).toNumber()); + } + else if (elementType === BSON_DATA_BOOLEAN) { + if (buffer[index] !== 0 && buffer[index] !== 1) + throw new BSONError('illegal boolean type value'); + value = buffer[index++] === 1; + } + else if (elementType === BSON_DATA_OBJECT) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + if (objectSize <= 0 || objectSize > buffer.length - index) + throw new BSONError('bad embedded document length in bson'); + if (raw) { + value = buffer.slice(index, index + objectSize); + } + else { + let objectOptions = options; + if (!globalUTFValidation) { + objectOptions = { ...options, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, objectOptions, false); + } + index = index + objectSize; + } + else if (elementType === BSON_DATA_ARRAY) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + let arrayOptions = options; + const stopIndex = index + objectSize; + if (fieldsAsRaw && fieldsAsRaw[name]) { + arrayOptions = { ...options, raw: true }; + } + if (!globalUTFValidation) { + arrayOptions = { ...arrayOptions, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, arrayOptions, true); + index = index + objectSize; + if (buffer[index - 1] !== 0) + throw new BSONError('invalid array terminator byte'); + if (index !== stopIndex) + throw new BSONError('corrupted array bson'); + } + else if (elementType === BSON_DATA_UNDEFINED) { + value = undefined; + } + else if (elementType === BSON_DATA_NULL) { + value = null; + } + else if (elementType === BSON_DATA_LONG) { + if (useBigInt64) { + value = NumberUtils.getBigInt64LE(buffer, index); + index += 8; + } + else { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + const long = new Long(lowBits, highBits); + if (promoteLongs && promoteValues === true) { + value = + long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) + ? long.toNumber() + : long; + } + else { + value = long; + } + } + } + else if (elementType === BSON_DATA_DECIMAL128) { + const bytes = ByteUtils.allocateUnsafe(16); + for (let i = 0; i < 16; i++) + bytes[i] = buffer[index + i]; + index = index + 16; + value = new Decimal128(bytes); + } + else if (elementType === BSON_DATA_BINARY) { + let binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + const totalBinarySize = binarySize; + const subType = buffer[index++]; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found'); + if (binarySize > buffer.byteLength) + throw new BSONError('Binary type size larger than document size'); + if (buffer['slice'] != null) { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.toLocalBufferType(buffer.slice(index, index + binarySize)); + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + else { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.allocateUnsafe(binarySize); + for (i = 0; i < binarySize; i++) { + value[i] = buffer[index + i]; + } + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + index = index + binarySize; + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === false) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + const optionsArray = new Array(regExpOptions.length); + for (i = 0; i < regExpOptions.length; i++) { + switch (regExpOptions[i]) { + case 'm': + optionsArray[i] = 'm'; + break; + case 's': + optionsArray[i] = 'g'; + break; + case 'i': + optionsArray[i] = 'i'; + break; + } + } + value = new RegExp(source, optionsArray.join('')); + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === true) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + value = new BSONRegExp(source, regExpOptions); + } + else if (elementType === BSON_DATA_SYMBOL) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const symbol = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = promoteValues ? symbol : new BSONSymbol(symbol); + index = index + stringSize; + } + else if (elementType === BSON_DATA_TIMESTAMP) { + value = new Timestamp({ + i: NumberUtils.getUint32LE(buffer, index), + t: NumberUtils.getUint32LE(buffer, index + 4) + }); + index += 8; + } + else if (elementType === BSON_DATA_MIN_KEY) { + value = new MinKey(); + } + else if (elementType === BSON_DATA_MAX_KEY) { + value = new MaxKey(); + } + else if (elementType === BSON_DATA_CODE) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = new Code(functionString); + index = index + stringSize; + } + else if (elementType === BSON_DATA_CODE_W_SCOPE) { + const totalSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (totalSize < 4 + 4 + 4 + 1) { + throw new BSONError('code_w_scope total size shorter minimum expected length'); + } + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + const scopeObject = deserializeObject(buffer, _index, options, false); + index = index + objectSize; + if (totalSize < 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too short, truncating scope'); + } + if (totalSize > 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too long, clips outer document'); + } + value = new Code(functionString, scopeObject); + } + else if (elementType === BSON_DATA_DBPOINTER) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) + throw new BSONError('bad string length in bson'); + const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const oidBuffer = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oidBuffer[i] = buffer[index + i]; + const oid = new ObjectId(oidBuffer); + index = index + 12; + value = new DBRef(namespace, oid); + } + else { + throw new BSONError(`Detected unknown BSON type ${elementType.toString(16)} for fieldname "${name}"`); + } + if (name === '__proto__') { + Object.defineProperty(object, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + object[name] = value; + } + } + if (size !== index - startIndex) { + if (isArray) + throw new BSONError('corrupt array bson'); + throw new BSONError('corrupt object bson'); + } + if (!isPossibleDBRef) + return object; + if (isDBRefLike(object)) { + const copy = Object.assign({}, object); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(object.$ref, object.$id, object.$db, copy); + } + return object; +} + +const regexp = /\x00/; +const ignoreKeys = new Set(['$db', '$ref', '$id', '$clusterTime']); +function serializeString(buffer, key, value, index) { + buffer[index++] = BSON_DATA_STRING; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes + 1; + buffer[index - 1] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value, index + 4); + NumberUtils.setInt32LE(buffer, index, size + 1); + index = index + 4 + size; + buffer[index++] = 0; + return index; +} +function serializeNumber(buffer, key, value, index) { + const isNegativeZero = Object.is(value, -0); + const type = !isNegativeZero && + Number.isSafeInteger(value) && + value <= BSON_INT32_MAX && + value >= BSON_INT32_MIN + ? BSON_DATA_INT + : BSON_DATA_NUMBER; + buffer[index++] = type; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0x00; + if (type === BSON_DATA_INT) { + index += NumberUtils.setInt32LE(buffer, index, value); + } + else { + index += NumberUtils.setFloat64LE(buffer, index, value); + } + return index; +} +function serializeBigInt(buffer, key, value, index) { + buffer[index++] = BSON_DATA_LONG; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index += numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setBigInt64LE(buffer, index, value); + return index; +} +function serializeNull(buffer, key, _, index) { + buffer[index++] = BSON_DATA_NULL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeBoolean(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BOOLEAN; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + buffer[index++] = value ? 1 : 0; + return index; +} +function serializeDate(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DATE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const dateInMilis = Long.fromNumber(value.getTime()); + const lowBits = dateInMilis.getLowBits(); + const highBits = dateInMilis.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.source && value.source.match(regexp) != null) { + throw new BSONError('value ' + value.source + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.source, index); + buffer[index++] = 0x00; + if (value.ignoreCase) + buffer[index++] = 0x69; + if (value.global) + buffer[index++] = 0x73; + if (value.multiline) + buffer[index++] = 0x6d; + buffer[index++] = 0x00; + return index; +} +function serializeBSONRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.pattern.match(regexp) != null) { + throw new BSONError('pattern ' + value.pattern + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.pattern, index); + buffer[index++] = 0x00; + const sortedOptions = value.options.split('').sort().join(''); + index = index + ByteUtils.encodeUTF8Into(buffer, sortedOptions, index); + buffer[index++] = 0x00; + return index; +} +function serializeMinMax(buffer, key, value, index) { + if (value === null) { + buffer[index++] = BSON_DATA_NULL; + } + else if (value._bsontype === 'MinKey') { + buffer[index++] = BSON_DATA_MIN_KEY; + } + else { + buffer[index++] = BSON_DATA_MAX_KEY; + } + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeObjectId(buffer, key, value, index) { + buffer[index++] = BSON_DATA_OID; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += value.serializeInto(buffer, index); + return index; +} +function serializeBuffer(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = value.length; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = BSON_BINARY_SUBTYPE_DEFAULT; + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = value[i]; + } + else { + buffer.set(value, index); + } + index = index + size; + return index; +} +function serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path) { + if (path.has(value)) { + throw new BSONError('Cannot convert circular structure to BSON'); + } + path.add(value); + buffer[index++] = Array.isArray(value) ? BSON_DATA_ARRAY : BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const endIndex = serializeInto(buffer, value, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + path.delete(value); + return endIndex; +} +function serializeDecimal128(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DECIMAL128; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + for (let i = 0; i < 16; i++) + buffer[index + i] = value.bytes[i]; + return index + 16; +} +function serializeLong(buffer, key, value, index) { + buffer[index++] = + value._bsontype === 'Long' ? BSON_DATA_LONG : BSON_DATA_TIMESTAMP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const lowBits = value.getLowBits(); + const highBits = value.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeInt32(buffer, key, value, index) { + value = value.valueOf(); + buffer[index++] = BSON_DATA_INT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setInt32LE(buffer, index, value); + return index; +} +function serializeDouble(buffer, key, value, index) { + buffer[index++] = BSON_DATA_NUMBER; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setFloat64LE(buffer, index, value.value); + return index; +} +function serializeFunction(buffer, key, value, index) { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeCode(buffer, key, value, index, checkKeys = false, depth = 0, serializeFunctions = false, ignoreUndefined = true, path) { + if (value.scope && typeof value.scope === 'object') { + buffer[index++] = BSON_DATA_CODE_W_SCOPE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + const functionString = value.code; + index = index + 4; + const codeSize = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, codeSize); + buffer[index + 4 + codeSize - 1] = 0; + index = index + codeSize + 4; + const endIndex = serializeInto(buffer, value.scope, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + index = endIndex - 1; + const totalSize = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, startIndex, totalSize); + buffer[index++] = 0; + } + else { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.code.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + } + return index; +} +function serializeBinary(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const data = value.buffer; + let size = value.position; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) + size = size + 4; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = value.sub_type; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + size = size - 4; + index += NumberUtils.setInt32LE(buffer, index, size); + } + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = data[i]; + } + else { + buffer.set(data, index); + } + index = index + value.position; + return index; +} +function serializeSymbol(buffer, key, value, index) { + buffer[index++] = BSON_DATA_SYMBOL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value.value, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path) { + buffer[index++] = BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + let output = { + $ref: value.collection || value.namespace, + $id: value.oid + }; + if (value.db != null) { + output.$db = value.db; + } + output = Object.assign(output, value.fields); + const endIndex = serializeInto(buffer, output, false, index, depth + 1, serializeFunctions, true, path); + const size = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, index, size); + return endIndex; +} +function serializeInto(buffer, object, checkKeys, startingIndex, depth, serializeFunctions, ignoreUndefined, path) { + if (path == null) { + if (object == null) { + buffer[0] = 0x05; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + buffer[4] = 0x00; + return 5; + } + if (Array.isArray(object)) { + throw new BSONError('serialize does not support an array as the root input'); + } + if (typeof object !== 'object') { + throw new BSONError('serialize does not support non-object as the root input'); + } + else if ('_bsontype' in object && typeof object._bsontype === 'string') { + throw new BSONError(`BSON types cannot be serialized as a document`); + } + else if (isDate(object) || + isRegExp(object) || + isUint8Array(object) || + isAnyArrayBuffer(object)) { + throw new BSONError(`date, regexp, typedarray, and arraybuffer cannot be BSON documents`); + } + path = new Set(); + } + path.add(object); + let index = startingIndex + 4; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + const key = `${i}`; + let value = object[i]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + if (typeof value === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (typeof value === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (typeof value === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (typeof value === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (typeof value === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else if (object instanceof Map || isMap(object)) { + const iterator = object.entries(); + let done = false; + while (!done) { + const entry = iterator.next(); + done = !!entry.done; + if (done) + continue; + const key = entry.value[0]; + let value = entry.value[1]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === null || (value === undefined && ignoreUndefined === false)) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + if (object != null && typeof object !== 'object') { + throw new BSONError('toBSON function did not return an object'); + } + } + for (const key of Object.keys(object)) { + let value = object[key]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + if (ignoreUndefined === false) + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + path.delete(object); + buffer[index++] = 0x00; + const size = index - startingIndex; + startingIndex += NumberUtils.setInt32LE(buffer, startingIndex, size); + return index; +} + +function isBSONType(value) { + return (value != null && + typeof value === 'object' && + '_bsontype' in value && + typeof value._bsontype === 'string'); +} +const keysToCodecs = { + $oid: ObjectId, + $binary: Binary, + $uuid: Binary, + $symbol: BSONSymbol, + $numberInt: Int32, + $numberDecimal: Decimal128, + $numberDouble: Double, + $numberLong: Long, + $minKey: MinKey, + $maxKey: MaxKey, + $regex: BSONRegExp, + $regularExpression: BSONRegExp, + $timestamp: Timestamp +}; +function deserializeValue(value, options = {}) { + if (typeof value === 'number') { + const in32BitRange = value <= BSON_INT32_MAX && value >= BSON_INT32_MIN; + const in64BitRange = value <= BSON_INT64_MAX && value >= BSON_INT64_MIN; + if (options.relaxed || options.legacy) { + return value; + } + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (in32BitRange) { + return new Int32(value); + } + if (in64BitRange) { + if (options.useBigInt64) { + return BigInt(value); + } + return Long.fromNumber(value); + } + } + return new Double(value); + } + if (value == null || typeof value !== 'object') + return value; + if (value.$undefined) + return null; + const keys = Object.keys(value).filter(k => k.startsWith('$') && value[k] != null); + for (let i = 0; i < keys.length; i++) { + const c = keysToCodecs[keys[i]]; + if (c) + return c.fromExtendedJSON(value, options); + } + if (value.$date != null) { + const d = value.$date; + const date = new Date(); + if (options.legacy) { + if (typeof d === 'number') + date.setTime(d); + else if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + else { + if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (Long.isLong(d)) + date.setTime(d.toNumber()); + else if (typeof d === 'number' && options.relaxed) + date.setTime(d); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + return date; + } + if (value.$code != null) { + const copy = Object.assign({}, value); + if (value.$scope) { + copy.$scope = deserializeValue(value.$scope); + } + return Code.fromExtendedJSON(value); + } + if (isDBRefLike(value) || value.$dbPointer) { + const v = value.$ref ? value : value.$dbPointer; + if (v instanceof DBRef) + return v; + const dollarKeys = Object.keys(v).filter(k => k.startsWith('$')); + let valid = true; + dollarKeys.forEach(k => { + if (['$ref', '$id', '$db'].indexOf(k) === -1) + valid = false; + }); + if (valid) + return DBRef.fromExtendedJSON(v); + } + return value; +} +function serializeArray(array, options) { + return array.map((v, index) => { + options.seenObjects.push({ propertyName: `index ${index}`, obj: null }); + try { + return serializeValue(v, options); + } + finally { + options.seenObjects.pop(); + } + }); +} +function getISOString(date) { + const isoStr = date.toISOString(); + return date.getUTCMilliseconds() !== 0 ? isoStr : isoStr.slice(0, -5) + 'Z'; +} +function serializeValue(value, options) { + if (value instanceof Map || isMap(value)) { + const obj = Object.create(null); + for (const [k, v] of value) { + if (typeof k !== 'string') { + throw new BSONError('Can only serialize maps with string keys'); + } + obj[k] = v; + } + return serializeValue(obj, options); + } + if ((typeof value === 'object' || typeof value === 'function') && value !== null) { + const index = options.seenObjects.findIndex(entry => entry.obj === value); + if (index !== -1) { + const props = options.seenObjects.map(entry => entry.propertyName); + const leadingPart = props + .slice(0, index) + .map(prop => `${prop} -> `) + .join(''); + const alreadySeen = props[index]; + const circularPart = ' -> ' + + props + .slice(index + 1, props.length - 1) + .map(prop => `${prop} -> `) + .join(''); + const current = props[props.length - 1]; + const leadingSpace = ' '.repeat(leadingPart.length + alreadySeen.length / 2); + const dashes = '-'.repeat(circularPart.length + (alreadySeen.length + current.length) / 2 - 1); + throw new BSONError('Converting circular structure to EJSON:\n' + + ` ${leadingPart}${alreadySeen}${circularPart}${current}\n` + + ` ${leadingSpace}\\${dashes}/`); + } + options.seenObjects[options.seenObjects.length - 1].obj = value; + } + if (Array.isArray(value)) + return serializeArray(value, options); + if (value === undefined) + return null; + if (value instanceof Date || isDate(value)) { + const dateNum = value.getTime(), inRange = dateNum > -1 && dateNum < 253402318800000; + if (options.legacy) { + return options.relaxed && inRange + ? { $date: value.getTime() } + : { $date: getISOString(value) }; + } + return options.relaxed && inRange + ? { $date: getISOString(value) } + : { $date: { $numberLong: value.getTime().toString() } }; + } + if (typeof value === 'number' && (!options.relaxed || !isFinite(value))) { + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return { $numberInt: value.toString() }; + } + if (value >= BSON_INT64_MIN && value <= BSON_INT64_MAX) { + return { $numberLong: value.toString() }; + } + } + return { $numberDouble: Object.is(value, -0) ? '-0.0' : value.toString() }; + } + if (typeof value === 'bigint') { + if (!options.relaxed) { + return { $numberLong: BigInt.asIntN(64, value).toString() }; + } + return Number(BigInt.asIntN(64, value)); + } + if (value instanceof RegExp || isRegExp(value)) { + let flags = value.flags; + if (flags === undefined) { + const match = value.toString().match(/[gimuy]*$/); + if (match) { + flags = match[0]; + } + } + const rx = new BSONRegExp(value.source, flags); + return rx.toExtendedJSON(options); + } + if (value != null && typeof value === 'object') + return serializeDocument(value, options); + return value; +} +const BSON_TYPE_MAPPINGS = { + Binary: (o) => new Binary(o.value(), o.sub_type), + Code: (o) => new Code(o.code, o.scope), + DBRef: (o) => new DBRef(o.collection || o.namespace, o.oid, o.db, o.fields), + Decimal128: (o) => new Decimal128(o.bytes), + Double: (o) => new Double(o.value), + Int32: (o) => new Int32(o.value), + Long: (o) => Long.fromBits(o.low != null ? o.low : o.low_, o.low != null ? o.high : o.high_, o.low != null ? o.unsigned : o.unsigned_), + MaxKey: () => new MaxKey(), + MinKey: () => new MinKey(), + ObjectId: (o) => new ObjectId(o), + BSONRegExp: (o) => new BSONRegExp(o.pattern, o.options), + BSONSymbol: (o) => new BSONSymbol(o.value), + Timestamp: (o) => Timestamp.fromBits(o.low, o.high) +}; +function serializeDocument(doc, options) { + if (doc == null || typeof doc !== 'object') + throw new BSONError('not an object instance'); + const bsontype = doc._bsontype; + if (typeof bsontype === 'undefined') { + const _doc = {}; + for (const name of Object.keys(doc)) { + options.seenObjects.push({ propertyName: name, obj: null }); + try { + const value = serializeValue(doc[name], options); + if (name === '__proto__') { + Object.defineProperty(_doc, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + _doc[name] = value; + } + } + finally { + options.seenObjects.pop(); + } + } + return _doc; + } + else if (doc != null && + typeof doc === 'object' && + typeof doc._bsontype === 'string' && + doc[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (isBSONType(doc)) { + let outDoc = doc; + if (typeof outDoc.toExtendedJSON !== 'function') { + const mapper = BSON_TYPE_MAPPINGS[doc._bsontype]; + if (!mapper) { + throw new BSONError('Unrecognized or invalid _bsontype: ' + doc._bsontype); + } + outDoc = mapper(outDoc); + } + if (bsontype === 'Code' && outDoc.scope) { + outDoc = new Code(outDoc.code, serializeValue(outDoc.scope, options)); + } + else if (bsontype === 'DBRef' && outDoc.oid) { + outDoc = new DBRef(serializeValue(outDoc.collection, options), serializeValue(outDoc.oid, options), serializeValue(outDoc.db, options), serializeValue(outDoc.fields, options)); + } + return outDoc.toExtendedJSON(options); + } + else { + throw new BSONError('_bsontype must be a string, but was: ' + typeof bsontype); + } +} +function parse(text, options) { + const ejsonOptions = { + useBigInt64: options?.useBigInt64 ?? false, + relaxed: options?.relaxed ?? true, + legacy: options?.legacy ?? false + }; + return JSON.parse(text, (key, value) => { + if (key.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(key)}`); + } + return deserializeValue(value, ejsonOptions); + }); +} +function stringify(value, replacer, space, options) { + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = undefined; + space = 0; + } + const serializeOptions = Object.assign({ relaxed: true, legacy: false }, options, { + seenObjects: [{ propertyName: '(root)', obj: null }] + }); + const doc = serializeValue(value, serializeOptions); + return JSON.stringify(doc, replacer, space); +} +function EJSONserialize(value, options) { + options = options || {}; + return JSON.parse(stringify(value, options)); +} +function EJSONdeserialize(ejson, options) { + options = options || {}; + return parse(JSON.stringify(ejson), options); +} +const EJSON = Object.create(null); +EJSON.parse = parse; +EJSON.stringify = stringify; +EJSON.serialize = EJSONserialize; +EJSON.deserialize = EJSONdeserialize; +Object.freeze(EJSON); + +function getSize(source, offset) { + try { + return NumberUtils.getNonnegativeInt32LE(source, offset); + } + catch (cause) { + throw new BSONOffsetError('BSON size cannot be negative', offset, { cause }); + } +} +function findNull(bytes, offset) { + let nullTerminatorOffset = offset; + for (; bytes[nullTerminatorOffset] !== 0x00; nullTerminatorOffset++) + ; + if (nullTerminatorOffset === bytes.length - 1) { + throw new BSONOffsetError('Null terminator not found', offset); + } + return nullTerminatorOffset; +} +function parseToElements(bytes, startOffset = 0) { + startOffset ??= 0; + if (bytes.length < 5) { + throw new BSONOffsetError(`Input must be at least 5 bytes, got ${bytes.length} bytes`, startOffset); + } + const documentSize = getSize(bytes, startOffset); + if (documentSize > bytes.length - startOffset) { + throw new BSONOffsetError(`Parsed documentSize (${documentSize} bytes) does not match input length (${bytes.length} bytes)`, startOffset); + } + if (bytes[startOffset + documentSize - 1] !== 0x00) { + throw new BSONOffsetError('BSON documents must end in 0x00', startOffset + documentSize); + } + const elements = []; + let offset = startOffset + 4; + while (offset <= documentSize + startOffset) { + const type = bytes[offset]; + offset += 1; + if (type === 0) { + if (offset - startOffset !== documentSize) { + throw new BSONOffsetError(`Invalid 0x00 type byte`, offset); + } + break; + } + const nameOffset = offset; + const nameLength = findNull(bytes, offset) - nameOffset; + offset += nameLength + 1; + let length; + if (type === 1 || + type === 18 || + type === 9 || + type === 17) { + length = 8; + } + else if (type === 16) { + length = 4; + } + else if (type === 7) { + length = 12; + } + else if (type === 19) { + length = 16; + } + else if (type === 8) { + length = 1; + } + else if (type === 10 || + type === 6 || + type === 127 || + type === 255) { + length = 0; + } + else if (type === 11) { + length = findNull(bytes, findNull(bytes, offset) + 1) + 1 - offset; + } + else if (type === 3 || + type === 4 || + type === 15) { + length = getSize(bytes, offset); + } + else if (type === 2 || + type === 5 || + type === 12 || + type === 13 || + type === 14) { + length = getSize(bytes, offset) + 4; + if (type === 5) { + length += 1; + } + if (type === 12) { + length += 12; + } + } + else { + throw new BSONOffsetError(`Invalid 0x${type.toString(16).padStart(2, '0')} type byte`, offset); + } + if (length > documentSize) { + throw new BSONOffsetError('value reports length larger than document', offset); + } + elements.push([type, nameOffset, nameLength, offset, length]); + offset += length; + } + return elements; +} + +const onDemand = Object.create(null); +onDemand.parseToElements = parseToElements; +onDemand.ByteUtils = ByteUtils; +onDemand.NumberUtils = NumberUtils; +Object.freeze(onDemand); + +const MAXSIZE = 1024 * 1024 * 17; +let buffer = ByteUtils.allocate(MAXSIZE); +function setInternalBufferSize(size) { + if (buffer.length < size) { + buffer = ByteUtils.allocate(size); + } +} +function serialize(object, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const minInternalBufferSize = typeof options.minInternalBufferSize === 'number' ? options.minInternalBufferSize : MAXSIZE; + if (buffer.length < minInternalBufferSize) { + buffer = ByteUtils.allocate(minInternalBufferSize); + } + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + const finishedBuffer = ByteUtils.allocateUnsafe(serializationIndex); + finishedBuffer.set(buffer.subarray(0, serializationIndex), 0); + return finishedBuffer; +} +function serializeWithBufferAndIndex(object, finalBuffer, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const startIndex = typeof options.index === 'number' ? options.index : 0; + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + finalBuffer.set(buffer.subarray(0, serializationIndex), startIndex); + return startIndex + serializationIndex - 1; +} +function deserialize(buffer, options = {}) { + return internalDeserialize(ByteUtils.toLocalBufferType(buffer), options); +} +function calculateObjectSize(object, options = {}) { + options = options || {}; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + return internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined); +} +function deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { + const internalOptions = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, options); + const bufferData = ByteUtils.toLocalBufferType(data); + let index = startIndex; + for (let i = 0; i < numberOfDocuments; i++) { + const size = NumberUtils.getInt32LE(bufferData, index); + internalOptions.index = index; + documents[docStartIndex + i] = internalDeserialize(bufferData, internalOptions); + index = index + size; + } + return index; +} + +var bson = /*#__PURE__*/Object.freeze({ +__proto__: null, +BSONError: BSONError, +BSONOffsetError: BSONOffsetError, +BSONRegExp: BSONRegExp, +BSONRuntimeError: BSONRuntimeError, +BSONSymbol: BSONSymbol, +BSONType: BSONType, +BSONValue: BSONValue, +BSONVersionError: BSONVersionError, +Binary: Binary, +Code: Code, +DBRef: DBRef, +Decimal128: Decimal128, +Double: Double, +EJSON: EJSON, +Int32: Int32, +Long: Long, +MaxKey: MaxKey, +MinKey: MinKey, +ObjectId: ObjectId, +Timestamp: Timestamp, +UUID: UUID, +calculateObjectSize: calculateObjectSize, +deserialize: deserialize, +deserializeStream: deserializeStream, +onDemand: onDemand, +serialize: serialize, +serializeWithBufferAndIndex: serializeWithBufferAndIndex, +setInternalBufferSize: setInternalBufferSize +}); + +exports.BSON = bson; +exports.BSONError = BSONError; +exports.BSONOffsetError = BSONOffsetError; +exports.BSONRegExp = BSONRegExp; +exports.BSONRuntimeError = BSONRuntimeError; +exports.BSONSymbol = BSONSymbol; +exports.BSONType = BSONType; +exports.BSONValue = BSONValue; +exports.BSONVersionError = BSONVersionError; +exports.Binary = Binary; +exports.Code = Code; +exports.DBRef = DBRef; +exports.Decimal128 = Decimal128; +exports.Double = Double; +exports.EJSON = EJSON; +exports.Int32 = Int32; +exports.Long = Long; +exports.MaxKey = MaxKey; +exports.MinKey = MinKey; +exports.ObjectId = ObjectId; +exports.Timestamp = Timestamp; +exports.UUID = UUID; +exports.calculateObjectSize = calculateObjectSize; +exports.deserialize = deserialize; +exports.deserializeStream = deserializeStream; +exports.onDemand = onDemand; +exports.serialize = serialize; +exports.serializeWithBufferAndIndex = serializeWithBufferAndIndex; +exports.setInternalBufferSize = setInternalBufferSize; + +return exports; + +})({}); +//# sourceMappingURL=bson.bundle.js.map diff --git a/user-service/node_modules/bson/lib/bson.bundle.js.map b/user-service/node_modules/bson/lib/bson.bundle.js.map new file mode 100644 index 0000000000..d04c169615 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bson.bundle.js","sources":["../src/parser/utils.ts","../src/constants.ts","../src/error.ts","../src/parse_utf8.ts","../src/utils/latin.ts","../src/utils/node_byte_utils.ts","../src/utils/web_byte_utils.ts","../src/utils/byte_utils.ts","../src/bson_value.ts","../src/binary.ts","../src/code.ts","../src/db_ref.ts","../src/utils/string_utils.ts","../src/long.ts","../src/decimal128.ts","../src/double.ts","../src/int_32.ts","../src/max_key.ts","../src/min_key.ts","../src/utils/number_utils.ts","../src/objectid.ts","../src/parser/calculate_size.ts","../src/regexp.ts","../src/symbol.ts","../src/timestamp.ts","../src/parser/deserializer.ts","../src/parser/serializer.ts","../src/extended_json.ts","../src/parser/on_demand/parse_to_elements.ts","../src/parser/on_demand/index.ts","../src/bson.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["StringUtils.validateStringCharacters","StringUtils.removeLeadingZerosAndExplicitPlus","constants.JS_INT_MIN","constants.JS_INT_MAX","constants.BSON_INT32_MIN","constants.BSON_INT32_MAX","constants.BSON_MAJOR_VERSION","constants.BSON_DATA_STRING","constants.BSON_DATA_OID","constants.BSON_DATA_INT","constants.BSON_DATA_NUMBER","constants.BSON_DATA_DATE","constants.BSON_DATA_BOOLEAN","constants.BSON_DATA_OBJECT","constants.BSON_DATA_ARRAY","constants.BSON_DATA_UNDEFINED","constants.BSON_DATA_NULL","constants.BSON_DATA_LONG","constants.BSON_DATA_DECIMAL128","constants.BSON_DATA_BINARY","constants.BSON_BINARY_SUBTYPE_UUID_NEW","constants.BSON_DATA_REGEXP","constants.BSON_DATA_SYMBOL","constants.BSON_DATA_TIMESTAMP","constants.BSON_DATA_MIN_KEY","constants.BSON_DATA_MAX_KEY","constants.BSON_DATA_CODE","constants.BSON_DATA_CODE_W_SCOPE","constants.BSON_DATA_DBPOINTER","constants.BSON_BINARY_SUBTYPE_DEFAULT"],"mappings":"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E,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAA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"} \ No newline at end of file diff --git a/user-service/node_modules/bson/lib/bson.cjs b/user-service/node_modules/bson/lib/bson.cjs new file mode 100644 index 0000000000..51988db3b6 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.cjs @@ -0,0 +1,4417 @@ +'use strict'; + +function isAnyArrayBuffer(value) { + return ['[object ArrayBuffer]', '[object SharedArrayBuffer]'].includes(Object.prototype.toString.call(value)); +} +function isUint8Array(value) { + return Object.prototype.toString.call(value) === '[object Uint8Array]'; +} +function isRegExp(d) { + return Object.prototype.toString.call(d) === '[object RegExp]'; +} +function isMap(d) { + return Object.prototype.toString.call(d) === '[object Map]'; +} +function isDate(d) { + return Object.prototype.toString.call(d) === '[object Date]'; +} +function defaultInspect(x, _options) { + return JSON.stringify(x, (k, v) => { + if (typeof v === 'bigint') { + return { $numberLong: `${v}` }; + } + else if (isMap(v)) { + return Object.fromEntries(v); + } + return v; + }); +} +function getStylizeFunction(options) { + const stylizeExists = options != null && + typeof options === 'object' && + 'stylize' in options && + typeof options.stylize === 'function'; + if (stylizeExists) { + return options.stylize; + } +} + +const BSON_MAJOR_VERSION = 6; +const BSON_INT32_MAX = 0x7fffffff; +const BSON_INT32_MIN = -0x80000000; +const BSON_INT64_MAX = Math.pow(2, 63) - 1; +const BSON_INT64_MIN = -Math.pow(2, 63); +const JS_INT_MAX = Math.pow(2, 53); +const JS_INT_MIN = -Math.pow(2, 53); +const BSON_DATA_NUMBER = 1; +const BSON_DATA_STRING = 2; +const BSON_DATA_OBJECT = 3; +const BSON_DATA_ARRAY = 4; +const BSON_DATA_BINARY = 5; +const BSON_DATA_UNDEFINED = 6; +const BSON_DATA_OID = 7; +const BSON_DATA_BOOLEAN = 8; +const BSON_DATA_DATE = 9; +const BSON_DATA_NULL = 10; +const BSON_DATA_REGEXP = 11; +const BSON_DATA_DBPOINTER = 12; +const BSON_DATA_CODE = 13; +const BSON_DATA_SYMBOL = 14; +const BSON_DATA_CODE_W_SCOPE = 15; +const BSON_DATA_INT = 16; +const BSON_DATA_TIMESTAMP = 17; +const BSON_DATA_LONG = 18; +const BSON_DATA_DECIMAL128 = 19; +const BSON_DATA_MIN_KEY = 0xff; +const BSON_DATA_MAX_KEY = 0x7f; +const BSON_BINARY_SUBTYPE_DEFAULT = 0; +const BSON_BINARY_SUBTYPE_UUID_NEW = 4; +const BSONType = Object.freeze({ + double: 1, + string: 2, + object: 3, + array: 4, + binData: 5, + undefined: 6, + objectId: 7, + bool: 8, + date: 9, + null: 10, + regex: 11, + dbPointer: 12, + javascript: 13, + symbol: 14, + javascriptWithScope: 15, + int: 16, + timestamp: 17, + long: 18, + decimal: 19, + minKey: -1, + maxKey: 127 +}); + +class BSONError extends Error { + get bsonError() { + return true; + } + get name() { + return 'BSONError'; + } + constructor(message, options) { + super(message, options); + } + static isBSONError(value) { + return (value != null && + typeof value === 'object' && + 'bsonError' in value && + value.bsonError === true && + 'name' in value && + 'message' in value && + 'stack' in value); + } +} +class BSONVersionError extends BSONError { + get name() { + return 'BSONVersionError'; + } + constructor() { + super(`Unsupported BSON version, bson types must be from bson ${BSON_MAJOR_VERSION}.x.x`); + } +} +class BSONRuntimeError extends BSONError { + get name() { + return 'BSONRuntimeError'; + } + constructor(message) { + super(message); + } +} +class BSONOffsetError extends BSONError { + get name() { + return 'BSONOffsetError'; + } + constructor(message, offset, options) { + super(`${message}. offset: ${offset}`, options); + this.offset = offset; + } +} + +let TextDecoderFatal; +let TextDecoderNonFatal; +function parseUtf8(buffer, start, end, fatal) { + if (fatal) { + TextDecoderFatal ??= new TextDecoder('utf8', { fatal: true }); + try { + return TextDecoderFatal.decode(buffer.subarray(start, end)); + } + catch (cause) { + throw new BSONError('Invalid UTF-8 string in BSON document', { cause }); + } + } + TextDecoderNonFatal ??= new TextDecoder('utf8', { fatal: false }); + return TextDecoderNonFatal.decode(buffer.subarray(start, end)); +} + +function tryReadBasicLatin(uint8array, start, end) { + if (uint8array.length === 0) { + return ''; + } + const stringByteLength = end - start; + if (stringByteLength === 0) { + return ''; + } + if (stringByteLength > 20) { + return null; + } + if (stringByteLength === 1 && uint8array[start] < 128) { + return String.fromCharCode(uint8array[start]); + } + if (stringByteLength === 2 && uint8array[start] < 128 && uint8array[start + 1] < 128) { + return String.fromCharCode(uint8array[start]) + String.fromCharCode(uint8array[start + 1]); + } + if (stringByteLength === 3 && + uint8array[start] < 128 && + uint8array[start + 1] < 128 && + uint8array[start + 2] < 128) { + return (String.fromCharCode(uint8array[start]) + + String.fromCharCode(uint8array[start + 1]) + + String.fromCharCode(uint8array[start + 2])); + } + const latinBytes = []; + for (let i = start; i < end; i++) { + const byte = uint8array[i]; + if (byte > 127) { + return null; + } + latinBytes.push(byte); + } + return String.fromCharCode(...latinBytes); +} +function tryWriteBasicLatin(destination, source, offset) { + if (source.length === 0) + return 0; + if (source.length > 25) + return null; + if (destination.length - offset < source.length) + return null; + for (let charOffset = 0, destinationOffset = offset; charOffset < source.length; charOffset++, destinationOffset++) { + const char = source.charCodeAt(charOffset); + if (char > 127) + return null; + destination[destinationOffset] = char; + } + return source.length; +} + +function nodejsMathRandomBytes(byteLength) { + return nodeJsByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const nodejsRandomBytes = (() => { + try { + return require('crypto').randomBytes; + } + catch { + return nodejsMathRandomBytes; + } +})(); +const nodeJsByteUtils = { + toLocalBufferType(potentialBuffer) { + if (Buffer.isBuffer(potentialBuffer)) { + return potentialBuffer; + } + if (ArrayBuffer.isView(potentialBuffer)) { + return Buffer.from(potentialBuffer.buffer, potentialBuffer.byteOffset, potentialBuffer.byteLength); + } + const stringTag = potentialBuffer?.[Symbol.toStringTag] ?? Object.prototype.toString.call(potentialBuffer); + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return Buffer.from(potentialBuffer); + } + throw new BSONError(`Cannot create Buffer from ${String(potentialBuffer)}`); + }, + allocate(size) { + return Buffer.alloc(size); + }, + allocateUnsafe(size) { + return Buffer.allocUnsafe(size); + }, + equals(a, b) { + return nodeJsByteUtils.toLocalBufferType(a).equals(b); + }, + fromNumberArray(array) { + return Buffer.from(array); + }, + fromBase64(base64) { + return Buffer.from(base64, 'base64'); + }, + toBase64(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('base64'); + }, + fromISO88591(codePoints) { + return Buffer.from(codePoints, 'binary'); + }, + toISO88591(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('binary'); + }, + fromHex(hex) { + return Buffer.from(hex, 'hex'); + }, + toHex(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('hex'); + }, + toUTF8(buffer, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(buffer, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + const string = nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end); + if (fatal) { + for (let i = 0; i < string.length; i++) { + if (string.charCodeAt(i) === 0xfffd) { + parseUtf8(buffer, start, end, true); + break; + } + } + } + return string; + }, + utf8ByteLength(input) { + return Buffer.byteLength(input, 'utf8'); + }, + encodeUTF8Into(buffer, source, byteOffset) { + const latinBytesWritten = tryWriteBasicLatin(buffer, source, byteOffset); + if (latinBytesWritten != null) { + return latinBytesWritten; + } + return nodeJsByteUtils.toLocalBufferType(buffer).write(source, byteOffset, undefined, 'utf8'); + }, + randomBytes: nodejsRandomBytes +}; + +function isReactNative() { + const { navigator } = globalThis; + return typeof navigator === 'object' && navigator.product === 'ReactNative'; +} +function webMathRandomBytes(byteLength) { + if (byteLength < 0) { + throw new RangeError(`The argument 'byteLength' is invalid. Received ${byteLength}`); + } + return webByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const webRandomBytes = (() => { + const { crypto } = globalThis; + if (crypto != null && typeof crypto.getRandomValues === 'function') { + return (byteLength) => { + return crypto.getRandomValues(webByteUtils.allocate(byteLength)); + }; + } + else { + if (isReactNative()) { + const { console } = globalThis; + console?.warn?.('BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.'); + } + return webMathRandomBytes; + } +})(); +const HEX_DIGIT = /(\d|[a-f])/i; +const webByteUtils = { + toLocalBufferType(potentialUint8array) { + const stringTag = potentialUint8array?.[Symbol.toStringTag] ?? + Object.prototype.toString.call(potentialUint8array); + if (stringTag === 'Uint8Array') { + return potentialUint8array; + } + if (ArrayBuffer.isView(potentialUint8array)) { + return new Uint8Array(potentialUint8array.buffer.slice(potentialUint8array.byteOffset, potentialUint8array.byteOffset + potentialUint8array.byteLength)); + } + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return new Uint8Array(potentialUint8array); + } + throw new BSONError(`Cannot make a Uint8Array from ${String(potentialUint8array)}`); + }, + allocate(size) { + if (typeof size !== 'number') { + throw new TypeError(`The "size" argument must be of type number. Received ${String(size)}`); + } + return new Uint8Array(size); + }, + allocateUnsafe(size) { + return webByteUtils.allocate(size); + }, + equals(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }, + fromNumberArray(array) { + return Uint8Array.from(array); + }, + fromBase64(base64) { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + }, + toBase64(uint8array) { + return btoa(webByteUtils.toISO88591(uint8array)); + }, + fromISO88591(codePoints) { + return Uint8Array.from(codePoints, c => c.charCodeAt(0) & 0xff); + }, + toISO88591(uint8array) { + return Array.from(Uint16Array.from(uint8array), b => String.fromCharCode(b)).join(''); + }, + fromHex(hex) { + const evenLengthHex = hex.length % 2 === 0 ? hex : hex.slice(0, hex.length - 1); + const buffer = []; + for (let i = 0; i < evenLengthHex.length; i += 2) { + const firstDigit = evenLengthHex[i]; + const secondDigit = evenLengthHex[i + 1]; + if (!HEX_DIGIT.test(firstDigit)) { + break; + } + if (!HEX_DIGIT.test(secondDigit)) { + break; + } + const hexDigit = Number.parseInt(`${firstDigit}${secondDigit}`, 16); + buffer.push(hexDigit); + } + return Uint8Array.from(buffer); + }, + toHex(uint8array) { + return Array.from(uint8array, byte => byte.toString(16).padStart(2, '0')).join(''); + }, + toUTF8(uint8array, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(uint8array, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + return parseUtf8(uint8array, start, end, fatal); + }, + utf8ByteLength(input) { + return new TextEncoder().encode(input).byteLength; + }, + encodeUTF8Into(uint8array, source, byteOffset) { + const bytes = new TextEncoder().encode(source); + uint8array.set(bytes, byteOffset); + return bytes.byteLength; + }, + randomBytes: webRandomBytes +}; + +const hasGlobalBuffer = typeof Buffer === 'function' && Buffer.prototype?._isBuffer !== true; +const ByteUtils = hasGlobalBuffer ? nodeJsByteUtils : webByteUtils; + +class BSONValue { + get [Symbol.for('@@mdb.bson.version')]() { + return BSON_MAJOR_VERSION; + } + [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) { + return this.inspect(depth, options, inspect); + } +} + +class Binary extends BSONValue { + get _bsontype() { + return 'Binary'; + } + constructor(buffer, subType) { + super(); + if (!(buffer == null) && + typeof buffer === 'string' && + !ArrayBuffer.isView(buffer) && + !isAnyArrayBuffer(buffer) && + !Array.isArray(buffer)) { + throw new BSONError('Binary can only be constructed from Uint8Array or number[]'); + } + this.sub_type = subType ?? Binary.BSON_BINARY_SUBTYPE_DEFAULT; + if (buffer == null) { + this.buffer = ByteUtils.allocate(Binary.BUFFER_SIZE); + this.position = 0; + } + else { + this.buffer = Array.isArray(buffer) + ? ByteUtils.fromNumberArray(buffer) + : ByteUtils.toLocalBufferType(buffer); + this.position = this.buffer.byteLength; + } + } + put(byteValue) { + if (typeof byteValue === 'string' && byteValue.length !== 1) { + throw new BSONError('only accepts single character String'); + } + else if (typeof byteValue !== 'number' && byteValue.length !== 1) + throw new BSONError('only accepts single character Uint8Array or Array'); + let decodedByte; + if (typeof byteValue === 'string') { + decodedByte = byteValue.charCodeAt(0); + } + else if (typeof byteValue === 'number') { + decodedByte = byteValue; + } + else { + decodedByte = byteValue[0]; + } + if (decodedByte < 0 || decodedByte > 255) { + throw new BSONError('only accepts number in a valid unsigned byte range 0-255'); + } + if (this.buffer.byteLength > this.position) { + this.buffer[this.position++] = decodedByte; + } + else { + const newSpace = ByteUtils.allocate(Binary.BUFFER_SIZE + this.buffer.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + this.buffer[this.position++] = decodedByte; + } + } + write(sequence, offset) { + offset = typeof offset === 'number' ? offset : this.position; + if (this.buffer.byteLength < offset + sequence.length) { + const newSpace = ByteUtils.allocate(this.buffer.byteLength + sequence.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + } + if (ArrayBuffer.isView(sequence)) { + this.buffer.set(ByteUtils.toLocalBufferType(sequence), offset); + this.position = + offset + sequence.byteLength > this.position ? offset + sequence.length : this.position; + } + else if (typeof sequence === 'string') { + throw new BSONError('input cannot be string'); + } + } + read(position, length) { + length = length && length > 0 ? length : this.position; + return this.buffer.slice(position, position + length); + } + value() { + return this.buffer.length === this.position + ? this.buffer + : this.buffer.subarray(0, this.position); + } + length() { + return this.position; + } + toJSON() { + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.buffer.subarray(0, this.position)); + if (encoding === 'base64') + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + if (encoding === 'utf8' || encoding === 'utf-8') + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + } + toExtendedJSON(options) { + options = options || {}; + const base64String = ByteUtils.toBase64(this.buffer); + const subType = Number(this.sub_type).toString(16); + if (options.legacy) { + return { + $binary: base64String, + $type: subType.length === 1 ? '0' + subType : subType + }; + } + return { + $binary: { + base64: base64String, + subType: subType.length === 1 ? '0' + subType : subType + } + }; + } + toUUID() { + if (this.sub_type === Binary.SUBTYPE_UUID) { + return new UUID(this.buffer.slice(0, this.position)); + } + throw new BSONError(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Binary.SUBTYPE_UUID}" is currently supported.`); + } + static createFromHexString(hex, subType) { + return new Binary(ByteUtils.fromHex(hex), subType); + } + static createFromBase64(base64, subType) { + return new Binary(ByteUtils.fromBase64(base64), subType); + } + static fromExtendedJSON(doc, options) { + options = options || {}; + let data; + let type; + if ('$binary' in doc) { + if (options.legacy && typeof doc.$binary === 'string' && '$type' in doc) { + type = doc.$type ? parseInt(doc.$type, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary); + } + else { + if (typeof doc.$binary !== 'string') { + type = doc.$binary.subType ? parseInt(doc.$binary.subType, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary.base64); + } + } + } + else if ('$uuid' in doc) { + type = 4; + data = UUID.bytesFromString(doc.$uuid); + } + if (!data) { + throw new BSONError(`Unexpected Binary Extended JSON format ${JSON.stringify(doc)}`); + } + return type === BSON_BINARY_SUBTYPE_UUID_NEW ? new UUID(data) : new Binary(data, type); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const base64 = ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + const base64Arg = inspect(base64, options); + const subTypeArg = inspect(this.sub_type, options); + return `Binary.createFromBase64(${base64Arg}, ${subTypeArg})`; + } +} +Binary.BSON_BINARY_SUBTYPE_DEFAULT = 0; +Binary.BUFFER_SIZE = 256; +Binary.SUBTYPE_DEFAULT = 0; +Binary.SUBTYPE_FUNCTION = 1; +Binary.SUBTYPE_BYTE_ARRAY = 2; +Binary.SUBTYPE_UUID_OLD = 3; +Binary.SUBTYPE_UUID = 4; +Binary.SUBTYPE_MD5 = 5; +Binary.SUBTYPE_ENCRYPTED = 6; +Binary.SUBTYPE_COLUMN = 7; +Binary.SUBTYPE_SENSITIVE = 8; +Binary.SUBTYPE_USER_DEFINED = 128; +const UUID_BYTE_LENGTH = 16; +const UUID_WITHOUT_DASHES = /^[0-9A-F]{32}$/i; +const UUID_WITH_DASHES = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; +class UUID extends Binary { + constructor(input) { + let bytes; + if (input == null) { + bytes = UUID.generate(); + } + else if (input instanceof UUID) { + bytes = ByteUtils.toLocalBufferType(new Uint8Array(input.buffer)); + } + else if (ArrayBuffer.isView(input) && input.byteLength === UUID_BYTE_LENGTH) { + bytes = ByteUtils.toLocalBufferType(input); + } + else if (typeof input === 'string') { + bytes = UUID.bytesFromString(input); + } + else { + throw new BSONError('Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).'); + } + super(bytes, BSON_BINARY_SUBTYPE_UUID_NEW); + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + } + toHexString(includeDashes = true) { + if (includeDashes) { + return [ + ByteUtils.toHex(this.buffer.subarray(0, 4)), + ByteUtils.toHex(this.buffer.subarray(4, 6)), + ByteUtils.toHex(this.buffer.subarray(6, 8)), + ByteUtils.toHex(this.buffer.subarray(8, 10)), + ByteUtils.toHex(this.buffer.subarray(10, 16)) + ].join('-'); + } + return ByteUtils.toHex(this.buffer); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.id); + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + equals(otherId) { + if (!otherId) { + return false; + } + if (otherId instanceof UUID) { + return ByteUtils.equals(otherId.id, this.id); + } + try { + return ByteUtils.equals(new UUID(otherId).id, this.id); + } + catch { + return false; + } + } + toBinary() { + return new Binary(this.id, Binary.SUBTYPE_UUID); + } + static generate() { + const bytes = ByteUtils.randomBytes(UUID_BYTE_LENGTH); + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + return bytes; + } + static isValid(input) { + if (!input) { + return false; + } + if (typeof input === 'string') { + return UUID.isValidUUIDString(input); + } + if (isUint8Array(input)) { + return input.byteLength === UUID_BYTE_LENGTH; + } + return (input._bsontype === 'Binary' && + input.sub_type === this.SUBTYPE_UUID && + input.buffer.byteLength === 16); + } + static createFromHexString(hexString) { + const buffer = UUID.bytesFromString(hexString); + return new UUID(buffer); + } + static createFromBase64(base64) { + return new UUID(ByteUtils.fromBase64(base64)); + } + static bytesFromString(representation) { + if (!UUID.isValidUUIDString(representation)) { + throw new BSONError('UUID string representation must be 32 hex digits or canonical hyphenated representation'); + } + return ByteUtils.fromHex(representation.replace(/-/g, '')); + } + static isValidUUIDString(representation) { + return UUID_WITHOUT_DASHES.test(representation) || UUID_WITH_DASHES.test(representation); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new UUID(${inspect(this.toHexString(), options)})`; + } +} + +class Code extends BSONValue { + get _bsontype() { + return 'Code'; + } + constructor(code, scope) { + super(); + this.code = code.toString(); + this.scope = scope ?? null; + } + toJSON() { + if (this.scope != null) { + return { code: this.code, scope: this.scope }; + } + return { code: this.code }; + } + toExtendedJSON() { + if (this.scope) { + return { $code: this.code, $scope: this.scope }; + } + return { $code: this.code }; + } + static fromExtendedJSON(doc) { + return new Code(doc.$code, doc.$scope); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + let parametersString = inspect(this.code, options); + const multiLineFn = parametersString.includes('\n'); + if (this.scope != null) { + parametersString += `,${multiLineFn ? '\n' : ' '}${inspect(this.scope, options)}`; + } + const endingNewline = multiLineFn && this.scope === null; + return `new Code(${multiLineFn ? '\n' : ''}${parametersString}${endingNewline ? '\n' : ''})`; + } +} + +function isDBRefLike(value) { + return (value != null && + typeof value === 'object' && + '$id' in value && + value.$id != null && + '$ref' in value && + typeof value.$ref === 'string' && + (!('$db' in value) || ('$db' in value && typeof value.$db === 'string'))); +} +class DBRef extends BSONValue { + get _bsontype() { + return 'DBRef'; + } + constructor(collection, oid, db, fields) { + super(); + const parts = collection.split('.'); + if (parts.length === 2) { + db = parts.shift(); + collection = parts.shift(); + } + this.collection = collection; + this.oid = oid; + this.db = db; + this.fields = fields || {}; + } + get namespace() { + return this.collection; + } + set namespace(value) { + this.collection = value; + } + toJSON() { + const o = Object.assign({ + $ref: this.collection, + $id: this.oid + }, this.fields); + if (this.db != null) + o.$db = this.db; + return o; + } + toExtendedJSON(options) { + options = options || {}; + let o = { + $ref: this.collection, + $id: this.oid + }; + if (options.legacy) { + return o; + } + if (this.db) + o.$db = this.db; + o = Object.assign(o, this.fields); + return o; + } + static fromExtendedJSON(doc) { + const copy = Object.assign({}, doc); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(doc.$ref, doc.$id, doc.$db, copy); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const args = [ + inspect(this.namespace, options), + inspect(this.oid, options), + ...(this.db ? [inspect(this.db, options)] : []), + ...(Object.keys(this.fields).length > 0 ? [inspect(this.fields, options)] : []) + ]; + args[1] = inspect === defaultInspect ? `new ObjectId(${args[1]})` : args[1]; + return `new DBRef(${args.join(', ')})`; + } +} + +function removeLeadingZerosAndExplicitPlus(str) { + if (str === '') { + return str; + } + let startIndex = 0; + const isNegative = str[startIndex] === '-'; + const isExplicitlyPositive = str[startIndex] === '+'; + if (isExplicitlyPositive || isNegative) { + startIndex += 1; + } + let foundInsignificantZero = false; + for (; startIndex < str.length && str[startIndex] === '0'; ++startIndex) { + foundInsignificantZero = true; + } + if (!foundInsignificantZero) { + return isExplicitlyPositive ? str.slice(1) : str; + } + return `${isNegative ? '-' : ''}${str.length === startIndex ? '0' : str.slice(startIndex)}`; +} +function validateStringCharacters(str, radix) { + radix = radix ?? 10; + const validCharacters = '0123456789abcdefghijklmnopqrstuvwxyz'.slice(0, radix); + const regex = new RegExp(`[^-+${validCharacters}]`, 'i'); + return regex.test(str) ? false : str; +} + +let wasm = undefined; +try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; +} +catch { +} +const TWO_PWR_16_DBL = 1 << 16; +const TWO_PWR_24_DBL = 1 << 24; +const TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +const TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +const TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; +const INT_CACHE = {}; +const UINT_CACHE = {}; +const MAX_INT64_STRING_LENGTH = 20; +const DECIMAL_REG_EX = /^(\+?0|(\+|-)?[1-9][0-9]*)$/; +class Long extends BSONValue { + get _bsontype() { + return 'Long'; + } + get __isLong__() { + return true; + } + constructor(lowOrValue = 0, highOrUnsigned, unsigned) { + super(); + const unsignedBool = typeof highOrUnsigned === 'boolean' ? highOrUnsigned : Boolean(unsigned); + const high = typeof highOrUnsigned === 'number' ? highOrUnsigned : 0; + const res = typeof lowOrValue === 'string' + ? Long.fromString(lowOrValue, unsignedBool) + : typeof lowOrValue === 'bigint' + ? Long.fromBigInt(lowOrValue, unsignedBool) + : { low: lowOrValue | 0, high: high | 0, unsigned: unsignedBool }; + this.low = res.low; + this.high = res.high; + this.unsigned = res.unsigned; + } + static fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); + } + static fromInt(value, unsigned) { + let obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if ((cache = 0 <= value && value < 256)) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } + else { + value |= 0; + if ((cache = -128 <= value && value < 128)) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + static fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? Long.UZERO : Long.ZERO; + if (unsigned) { + if (value < 0) + return Long.UZERO; + if (value >= TWO_PWR_64_DBL) + return Long.MAX_UNSIGNED_VALUE; + } + else { + if (value <= -TWO_PWR_63_DBL) + return Long.MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return Long.MAX_VALUE; + } + if (value < 0) + return Long.fromNumber(-value, unsigned).neg(); + return Long.fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); + } + static fromBigInt(value, unsigned) { + const FROM_BIGINT_BIT_MASK = BigInt(0xffffffff); + const FROM_BIGINT_BIT_SHIFT = BigInt(32); + return new Long(Number(value & FROM_BIGINT_BIT_MASK), Number((value >> FROM_BIGINT_BIT_SHIFT) & FROM_BIGINT_BIT_MASK), unsigned); + } + static _fromString(str, unsigned, radix) { + if (str.length === 0) + throw new BSONError('empty string'); + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + let p; + if ((p = str.indexOf('-')) > 0) + throw new BSONError('interior hyphen'); + else if (p === 0) { + return Long._fromString(str.substring(1), unsigned, radix).neg(); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 8)); + let result = Long.ZERO; + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + const power = Long.fromNumber(Math.pow(radix, size)); + result = result.mul(power).add(Long.fromNumber(value)); + } + else { + result = result.mul(radixToPower); + result = result.add(Long.fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + static fromStringStrict(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str.trim() !== str) { + throw new BSONError(`Input: '${str}' contains leading and/or trailing whitespace`); + } + if (!validateStringCharacters(str, radix)) { + throw new BSONError(`Input: '${str}' contains invalid characters for radix: ${radix}`); + } + const cleanedStr = removeLeadingZerosAndExplicitPlus(str); + const result = Long._fromString(cleanedStr, unsigned, radix); + if (result.toString(radix).toLowerCase() !== cleanedStr.toLowerCase()) { + throw new BSONError(`Input: ${str} is not representable as ${result.unsigned ? 'an unsigned' : 'a signed'} 64-bit Long ${radix != null ? `with radix: ${radix}` : ''}`); + } + return result; + } + static fromString(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str === 'NaN' && radix < 24) { + return Long.ZERO; + } + else if ((str === 'Infinity' || str === '+Infinity' || str === '-Infinity') && radix < 35) { + return Long.ZERO; + } + return Long._fromString(str, unsigned, radix); + } + static fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + } + static fromBytesLE(bytes, unsigned) { + return new Long(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24), bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24), unsigned); + } + static fromBytesBE(bytes, unsigned) { + return new Long((bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7], (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3], unsigned); + } + static isLong(value) { + return (value != null && + typeof value === 'object' && + '__isLong__' in value && + value.__isLong__ === true); + } + static fromValue(val, unsigned) { + if (typeof val === 'number') + return Long.fromNumber(val, unsigned); + if (typeof val === 'string') + return Long.fromString(val, unsigned); + return Long.fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned); + } + add(addend) { + if (!Long.isLong(addend)) + addend = Long.fromValue(addend); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = addend.high >>> 16; + const b32 = addend.high & 0xffff; + const b16 = addend.low >>> 16; + const b00 = addend.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + and(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned); + } + compare(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.eq(other)) + return 0; + const thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || + (other.high === this.high && other.low >>> 0 > this.low >>> 0) + ? -1 + : 1; + } + comp(other) { + return this.compare(other); + } + divide(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (divisor.isZero()) + throw new BSONError('division by zero'); + if (wasm) { + if (!this.unsigned && + this.high === -0x80000000 && + divisor.low === -1 && + divisor.high === -1) { + return this; + } + const low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? Long.UZERO : Long.ZERO; + let approx, rem, res; + if (!this.unsigned) { + if (this.eq(Long.MIN_VALUE)) { + if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE)) + return Long.MIN_VALUE; + else if (divisor.eq(Long.MIN_VALUE)) + return Long.ONE; + else { + const halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(Long.ZERO)) { + return divisor.isNegative() ? Long.ONE : Long.NEG_ONE; + } + else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } + else if (divisor.eq(Long.MIN_VALUE)) + return this.unsigned ? Long.UZERO : Long.ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } + else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = Long.ZERO; + } + else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return Long.UZERO; + if (divisor.gt(this.shru(1))) + return Long.UONE; + res = Long.UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + const log2 = Math.ceil(Math.log(approx) / Math.LN2); + const delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); + let approxRes = Long.fromNumber(approx); + let approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = Long.fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = Long.ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + } + div(divisor) { + return this.divide(divisor); + } + equals(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + } + eq(other) { + return this.equals(other); + } + getHighBits() { + return this.high; + } + getHighBitsUnsigned() { + return this.high >>> 0; + } + getLowBits() { + return this.low; + } + getLowBitsUnsigned() { + return this.low >>> 0; + } + getNumBitsAbs() { + if (this.isNegative()) { + return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + } + const val = this.high !== 0 ? this.high : this.low; + let bit; + for (bit = 31; bit > 0; bit--) + if ((val & (1 << bit)) !== 0) + break; + return this.high !== 0 ? bit + 33 : bit + 1; + } + greaterThan(other) { + return this.comp(other) > 0; + } + gt(other) { + return this.greaterThan(other); + } + greaterThanOrEqual(other) { + return this.comp(other) >= 0; + } + gte(other) { + return this.greaterThanOrEqual(other); + } + ge(other) { + return this.greaterThanOrEqual(other); + } + isEven() { + return (this.low & 1) === 0; + } + isNegative() { + return !this.unsigned && this.high < 0; + } + isOdd() { + return (this.low & 1) === 1; + } + isPositive() { + return this.unsigned || this.high >= 0; + } + isZero() { + return this.high === 0 && this.low === 0; + } + lessThan(other) { + return this.comp(other) < 0; + } + lt(other) { + return this.lessThan(other); + } + lessThanOrEqual(other) { + return this.comp(other) <= 0; + } + lte(other) { + return this.lessThanOrEqual(other); + } + modulo(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (wasm) { + const low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + } + mod(divisor) { + return this.modulo(divisor); + } + rem(divisor) { + return this.modulo(divisor); + } + multiply(multiplier) { + if (this.isZero()) + return Long.ZERO; + if (!Long.isLong(multiplier)) + multiplier = Long.fromValue(multiplier); + if (wasm) { + const low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return Long.ZERO; + if (this.eq(Long.MIN_VALUE)) + return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (multiplier.eq(Long.MIN_VALUE)) + return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } + else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24)) + return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = multiplier.high >>> 16; + const b32 = multiplier.high & 0xffff; + const b16 = multiplier.low >>> 16; + const b00 = multiplier.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + mul(multiplier) { + return this.multiply(multiplier); + } + negate() { + if (!this.unsigned && this.eq(Long.MIN_VALUE)) + return Long.MIN_VALUE; + return this.not().add(Long.ONE); + } + neg() { + return this.negate(); + } + not() { + return Long.fromBits(~this.low, ~this.high, this.unsigned); + } + notEquals(other) { + return !this.equals(other); + } + neq(other) { + return this.notEquals(other); + } + ne(other) { + return this.notEquals(other); + } + or(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned); + } + shiftLeft(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); + else + return Long.fromBits(0, this.low << (numBits - 32), this.unsigned); + } + shl(numBits) { + return this.shiftLeft(numBits); + } + shiftRight(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); + else + return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); + } + shr(numBits) { + return this.shiftRight(numBits); + } + shiftRightUnsigned(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + const high = this.high; + if (numBits < 32) { + const low = this.low; + return Long.fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); + } + else if (numBits === 32) + return Long.fromBits(high, 0, this.unsigned); + else + return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned); + } + } + shr_u(numBits) { + return this.shiftRightUnsigned(numBits); + } + shru(numBits) { + return this.shiftRightUnsigned(numBits); + } + subtract(subtrahend) { + if (!Long.isLong(subtrahend)) + subtrahend = Long.fromValue(subtrahend); + return this.add(subtrahend.neg()); + } + sub(subtrahend) { + return this.subtract(subtrahend); + } + toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + } + toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + } + toBigInt() { + return BigInt(this.toString()); + } + toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + } + toBytesLE() { + const hi = this.high, lo = this.low; + return [ + lo & 0xff, + (lo >>> 8) & 0xff, + (lo >>> 16) & 0xff, + lo >>> 24, + hi & 0xff, + (hi >>> 8) & 0xff, + (hi >>> 16) & 0xff, + hi >>> 24 + ]; + } + toBytesBE() { + const hi = this.high, lo = this.low; + return [ + hi >>> 24, + (hi >>> 16) & 0xff, + (hi >>> 8) & 0xff, + hi & 0xff, + lo >>> 24, + (lo >>> 16) & 0xff, + (lo >>> 8) & 0xff, + lo & 0xff + ]; + } + toSigned() { + if (!this.unsigned) + return this; + return Long.fromBits(this.low, this.high, false); + } + toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + if (this.isZero()) + return '0'; + if (this.isNegative()) { + if (this.eq(Long.MIN_VALUE)) { + const radixLong = Long.fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } + else + return '-' + this.neg().toString(radix); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 6), this.unsigned); + let rem = this; + let result = ''; + while (true) { + const remDiv = rem.div(radixToPower); + const intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0; + let digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) { + return digits + result; + } + else { + while (digits.length < 6) + digits = '0' + digits; + result = '' + digits + result; + } + } + } + toUnsigned() { + if (this.unsigned) + return this; + return Long.fromBits(this.low, this.high, true); + } + xor(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + } + eqz() { + return this.isZero(); + } + le(other) { + return this.lessThanOrEqual(other); + } + toExtendedJSON(options) { + if (options && options.relaxed) + return this.toNumber(); + return { $numberLong: this.toString() }; + } + static fromExtendedJSON(doc, options) { + const { useBigInt64 = false, relaxed = true } = { ...options }; + if (doc.$numberLong.length > MAX_INT64_STRING_LENGTH) { + throw new BSONError('$numberLong string is too long'); + } + if (!DECIMAL_REG_EX.test(doc.$numberLong)) { + throw new BSONError(`$numberLong string "${doc.$numberLong}" is in an invalid format`); + } + if (useBigInt64) { + const bigIntResult = BigInt(doc.$numberLong); + return BigInt.asIntN(64, bigIntResult); + } + const longResult = Long.fromString(doc.$numberLong); + if (relaxed) { + return longResult.toNumber(); + } + return longResult; + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const longVal = inspect(this.toString(), options); + const unsignedVal = this.unsigned ? `, ${inspect(this.unsigned, options)}` : ''; + return `new Long(${longVal}${unsignedVal})`; + } +} +Long.TWO_PWR_24 = Long.fromInt(TWO_PWR_24_DBL); +Long.MAX_UNSIGNED_VALUE = Long.fromBits(0xffffffff | 0, 0xffffffff | 0, true); +Long.ZERO = Long.fromInt(0); +Long.UZERO = Long.fromInt(0, true); +Long.ONE = Long.fromInt(1); +Long.UONE = Long.fromInt(1, true); +Long.NEG_ONE = Long.fromInt(-1); +Long.MAX_VALUE = Long.fromBits(0xffffffff | 0, 0x7fffffff | 0, false); +Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0, false); + +const PARSE_STRING_REGEXP = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/; +const PARSE_INF_REGEXP = /^(\+|-)?(Infinity|inf)$/i; +const PARSE_NAN_REGEXP = /^(\+|-)?NaN$/i; +const EXPONENT_MAX = 6111; +const EXPONENT_MIN = -6176; +const EXPONENT_BIAS = 6176; +const MAX_DIGITS = 34; +const NAN_BUFFER = ByteUtils.fromNumberArray([ + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_NEGATIVE_BUFFER = ByteUtils.fromNumberArray([ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_POSITIVE_BUFFER = ByteUtils.fromNumberArray([ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const EXPONENT_REGEX = /^([-+])?(\d+)?$/; +const COMBINATION_MASK = 0x1f; +const EXPONENT_MASK = 0x3fff; +const COMBINATION_INFINITY = 30; +const COMBINATION_NAN = 31; +function isDigit(value) { + return !isNaN(parseInt(value, 10)); +} +function divideu128(value) { + const DIVISOR = Long.fromNumber(1000 * 1000 * 1000); + let _rem = Long.fromNumber(0); + if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { + return { quotient: value, rem: _rem }; + } + for (let i = 0; i <= 3; i++) { + _rem = _rem.shiftLeft(32); + _rem = _rem.add(new Long(value.parts[i], 0)); + value.parts[i] = _rem.div(DIVISOR).low; + _rem = _rem.modulo(DIVISOR); + } + return { quotient: value, rem: _rem }; +} +function multiply64x2(left, right) { + if (!left && !right) { + return { high: Long.fromNumber(0), low: Long.fromNumber(0) }; + } + const leftHigh = left.shiftRightUnsigned(32); + const leftLow = new Long(left.getLowBits(), 0); + const rightHigh = right.shiftRightUnsigned(32); + const rightLow = new Long(right.getLowBits(), 0); + let productHigh = leftHigh.multiply(rightHigh); + let productMid = leftHigh.multiply(rightLow); + const productMid2 = leftLow.multiply(rightHigh); + let productLow = leftLow.multiply(rightLow); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productMid = new Long(productMid.getLowBits(), 0) + .add(productMid2) + .add(productLow.shiftRightUnsigned(32)); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productLow = productMid.shiftLeft(32).add(new Long(productLow.getLowBits(), 0)); + return { high: productHigh, low: productLow }; +} +function lessThan(left, right) { + const uhleft = left.high >>> 0; + const uhright = right.high >>> 0; + if (uhleft < uhright) { + return true; + } + else if (uhleft === uhright) { + const ulleft = left.low >>> 0; + const ulright = right.low >>> 0; + if (ulleft < ulright) + return true; + } + return false; +} +function invalidErr(string, message) { + throw new BSONError(`"${string}" is not a valid Decimal128 string - ${message}`); +} +class Decimal128 extends BSONValue { + get _bsontype() { + return 'Decimal128'; + } + constructor(bytes) { + super(); + if (typeof bytes === 'string') { + this.bytes = Decimal128.fromString(bytes).bytes; + } + else if (isUint8Array(bytes)) { + if (bytes.byteLength !== 16) { + throw new BSONError('Decimal128 must take a Buffer of 16 bytes'); + } + this.bytes = bytes; + } + else { + throw new BSONError('Decimal128 must take a Buffer or string'); + } + } + static fromString(representation) { + return Decimal128._fromString(representation, { allowRounding: false }); + } + static fromStringWithRounding(representation) { + return Decimal128._fromString(representation, { allowRounding: true }); + } + static _fromString(representation, options) { + let isNegative = false; + let sawSign = false; + let sawRadix = false; + let foundNonZero = false; + let significantDigits = 0; + let nDigitsRead = 0; + let nDigits = 0; + let radixPosition = 0; + let firstNonZero = 0; + const digits = [0]; + let nDigitsStored = 0; + let digitsInsert = 0; + let lastDigit = 0; + let exponent = 0; + let significandHigh = new Long(0, 0); + let significandLow = new Long(0, 0); + let biasedExponent = 0; + let index = 0; + if (representation.length >= 7000) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + const stringMatch = representation.match(PARSE_STRING_REGEXP); + const infMatch = representation.match(PARSE_INF_REGEXP); + const nanMatch = representation.match(PARSE_NAN_REGEXP); + if ((!stringMatch && !infMatch && !nanMatch) || representation.length === 0) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + if (stringMatch) { + const unsignedNumber = stringMatch[2]; + const e = stringMatch[4]; + const expSign = stringMatch[5]; + const expNumber = stringMatch[6]; + if (e && expNumber === undefined) + invalidErr(representation, 'missing exponent power'); + if (e && unsignedNumber === undefined) + invalidErr(representation, 'missing exponent base'); + if (e === undefined && (expSign || expNumber)) { + invalidErr(representation, 'missing e before exponent'); + } + } + if (representation[index] === '+' || representation[index] === '-') { + sawSign = true; + isNegative = representation[index++] === '-'; + } + if (!isDigit(representation[index]) && representation[index] !== '.') { + if (representation[index] === 'i' || representation[index] === 'I') { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + else if (representation[index] === 'N') { + return new Decimal128(NAN_BUFFER); + } + } + while (isDigit(representation[index]) || representation[index] === '.') { + if (representation[index] === '.') { + if (sawRadix) + invalidErr(representation, 'contains multiple periods'); + sawRadix = true; + index = index + 1; + continue; + } + if (nDigitsStored < MAX_DIGITS) { + if (representation[index] !== '0' || foundNonZero) { + if (!foundNonZero) { + firstNonZero = nDigitsRead; + } + foundNonZero = true; + digits[digitsInsert++] = parseInt(representation[index], 10); + nDigitsStored = nDigitsStored + 1; + } + } + if (foundNonZero) + nDigits = nDigits + 1; + if (sawRadix) + radixPosition = radixPosition + 1; + nDigitsRead = nDigitsRead + 1; + index = index + 1; + } + if (sawRadix && !nDigitsRead) + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + if (representation[index] === 'e' || representation[index] === 'E') { + const match = representation.substr(++index).match(EXPONENT_REGEX); + if (!match || !match[2]) + return new Decimal128(NAN_BUFFER); + exponent = parseInt(match[0], 10); + index = index + match[0].length; + } + if (representation[index]) + return new Decimal128(NAN_BUFFER); + if (!nDigitsStored) { + digits[0] = 0; + nDigits = 1; + nDigitsStored = 1; + significantDigits = 0; + } + else { + lastDigit = nDigitsStored - 1; + significantDigits = nDigits; + if (significantDigits !== 1) { + while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') { + significantDigits = significantDigits - 1; + } + } + } + if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) { + exponent = EXPONENT_MIN; + } + else { + exponent = exponent - radixPosition; + } + while (exponent > EXPONENT_MAX) { + lastDigit = lastDigit + 1; + if (lastDigit >= MAX_DIGITS) { + if (significantDigits === 0) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + exponent = exponent - 1; + } + if (options.allowRounding) { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0 && significantDigits < nDigitsStored) { + exponent = EXPONENT_MIN; + significantDigits = 0; + break; + } + if (nDigitsStored < nDigits) { + nDigits = nDigits - 1; + } + else { + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + const digitsString = digits.join(''); + if (digitsString.match(/^0+$/)) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + let endOfString = nDigitsRead; + if (sawRadix) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + let roundBit = 0; + if (roundDigit >= 5) { + roundBit = 1; + if (roundDigit === 5) { + roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0; + for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) { + if (parseInt(representation[i], 10)) { + roundBit = 1; + break; + } + } + } + } + if (roundBit) { + let dIdx = lastDigit; + for (; dIdx >= 0; dIdx--) { + if (++digits[dIdx] > 9) { + digits[dIdx] = 0; + if (dIdx === 0) { + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + digits[dIdx] = 1; + } + else { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + } + } + else { + break; + } + } + } + } + } + else { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0) { + if (significantDigits === 0) { + exponent = EXPONENT_MIN; + break; + } + invalidErr(representation, 'exponent underflow'); + } + if (nDigitsStored < nDigits) { + if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' && + significantDigits !== 0) { + invalidErr(representation, 'inexact rounding'); + } + nDigits = nDigits - 1; + } + else { + if (digits[lastDigit] !== 0) { + invalidErr(representation, 'inexact rounding'); + } + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + if (sawRadix) { + firstNonZero = firstNonZero + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + if (roundDigit !== 0) { + invalidErr(representation, 'inexact rounding'); + } + } + } + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + if (significantDigits === 0) { + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + } + else if (lastDigit < 17) { + let dIdx = 0; + significandLow = Long.fromNumber(digits[dIdx++]); + significandHigh = new Long(0, 0); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + else { + let dIdx = 0; + significandHigh = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit - 17; dIdx++) { + significandHigh = significandHigh.multiply(Long.fromNumber(10)); + significandHigh = significandHigh.add(Long.fromNumber(digits[dIdx])); + } + significandLow = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + const significand = multiply64x2(significandHigh, Long.fromString('100000000000000000')); + significand.low = significand.low.add(significandLow); + if (lessThan(significand.low, significandLow)) { + significand.high = significand.high.add(Long.fromNumber(1)); + } + biasedExponent = exponent + EXPONENT_BIAS; + const dec = { low: Long.fromNumber(0), high: Long.fromNumber(0) }; + if (significand.high.shiftRightUnsigned(49).and(Long.fromNumber(1)).equals(Long.fromNumber(1))) { + dec.high = dec.high.or(Long.fromNumber(0x3).shiftLeft(61)); + dec.high = dec.high.or(Long.fromNumber(biasedExponent).and(Long.fromNumber(0x3fff).shiftLeft(47))); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x7fffffffffff))); + } + else { + dec.high = dec.high.or(Long.fromNumber(biasedExponent & 0x3fff).shiftLeft(49)); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x1ffffffffffff))); + } + dec.low = significand.low; + if (isNegative) { + dec.high = dec.high.or(Long.fromString('9223372036854775808')); + } + const buffer = ByteUtils.allocateUnsafe(16); + index = 0; + buffer[index++] = dec.low.low & 0xff; + buffer[index++] = (dec.low.low >> 8) & 0xff; + buffer[index++] = (dec.low.low >> 16) & 0xff; + buffer[index++] = (dec.low.low >> 24) & 0xff; + buffer[index++] = dec.low.high & 0xff; + buffer[index++] = (dec.low.high >> 8) & 0xff; + buffer[index++] = (dec.low.high >> 16) & 0xff; + buffer[index++] = (dec.low.high >> 24) & 0xff; + buffer[index++] = dec.high.low & 0xff; + buffer[index++] = (dec.high.low >> 8) & 0xff; + buffer[index++] = (dec.high.low >> 16) & 0xff; + buffer[index++] = (dec.high.low >> 24) & 0xff; + buffer[index++] = dec.high.high & 0xff; + buffer[index++] = (dec.high.high >> 8) & 0xff; + buffer[index++] = (dec.high.high >> 16) & 0xff; + buffer[index++] = (dec.high.high >> 24) & 0xff; + return new Decimal128(buffer); + } + toString() { + let biased_exponent; + let significand_digits = 0; + const significand = new Array(36); + for (let i = 0; i < significand.length; i++) + significand[i] = 0; + let index = 0; + let is_zero = false; + let significand_msb; + let significand128 = { parts: [0, 0, 0, 0] }; + let j, k; + const string = []; + index = 0; + const buffer = this.bytes; + const low = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midl = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midh = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const high = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + index = 0; + const dec = { + low: new Long(low, midl), + high: new Long(midh, high) + }; + if (dec.high.lessThan(Long.ZERO)) { + string.push('-'); + } + const combination = (high >> 26) & COMBINATION_MASK; + if (combination >> 3 === 3) { + if (combination === COMBINATION_INFINITY) { + return string.join('') + 'Infinity'; + } + else if (combination === COMBINATION_NAN) { + return 'NaN'; + } + else { + biased_exponent = (high >> 15) & EXPONENT_MASK; + significand_msb = 0x08 + ((high >> 14) & 0x01); + } + } + else { + significand_msb = (high >> 14) & 0x07; + biased_exponent = (high >> 17) & EXPONENT_MASK; + } + const exponent = biased_exponent - EXPONENT_BIAS; + significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); + significand128.parts[1] = midh; + significand128.parts[2] = midl; + significand128.parts[3] = low; + if (significand128.parts[0] === 0 && + significand128.parts[1] === 0 && + significand128.parts[2] === 0 && + significand128.parts[3] === 0) { + is_zero = true; + } + else { + for (k = 3; k >= 0; k--) { + let least_digits = 0; + const result = divideu128(significand128); + significand128 = result.quotient; + least_digits = result.rem.low; + if (!least_digits) + continue; + for (j = 8; j >= 0; j--) { + significand[k * 9 + j] = least_digits % 10; + least_digits = Math.floor(least_digits / 10); + } + } + } + if (is_zero) { + significand_digits = 1; + significand[index] = 0; + } + else { + significand_digits = 36; + while (!significand[index]) { + significand_digits = significand_digits - 1; + index = index + 1; + } + } + const scientific_exponent = significand_digits - 1 + exponent; + if (scientific_exponent >= 34 || scientific_exponent <= -7 || exponent > 0) { + if (significand_digits > 34) { + string.push(`${0}`); + if (exponent > 0) + string.push(`E+${exponent}`); + else if (exponent < 0) + string.push(`E${exponent}`); + return string.join(''); + } + string.push(`${significand[index++]}`); + significand_digits = significand_digits - 1; + if (significand_digits) { + string.push('.'); + } + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + string.push('E'); + if (scientific_exponent > 0) { + string.push(`+${scientific_exponent}`); + } + else { + string.push(`${scientific_exponent}`); + } + } + else { + if (exponent >= 0) { + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + } + else { + let radix_position = significand_digits + exponent; + if (radix_position > 0) { + for (let i = 0; i < radix_position; i++) { + string.push(`${significand[index++]}`); + } + } + else { + string.push('0'); + } + string.push('.'); + while (radix_position++ < 0) { + string.push('0'); + } + for (let i = 0; i < significand_digits - Math.max(radix_position - 1, 0); i++) { + string.push(`${significand[index++]}`); + } + } + } + return string.join(''); + } + toJSON() { + return { $numberDecimal: this.toString() }; + } + toExtendedJSON() { + return { $numberDecimal: this.toString() }; + } + static fromExtendedJSON(doc) { + return Decimal128.fromString(doc.$numberDecimal); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const d128string = inspect(this.toString(), options); + return `new Decimal128(${d128string})`; + } +} + +class Double extends BSONValue { + get _bsontype() { + return 'Double'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value; + } + static fromString(value) { + const coercedValue = Number(value); + if (value === 'NaN') + return new Double(NaN); + if (value === 'Infinity') + return new Double(Infinity); + if (value === '-Infinity') + return new Double(-Infinity); + if (!Number.isFinite(coercedValue)) { + throw new BSONError(`Input: ${value} is not representable as a Double`); + } + if (value.trim() !== value) { + throw new BSONError(`Input: '${value}' contains whitespace`); + } + if (value === '') { + throw new BSONError(`Input is an empty string`); + } + if (/[^-0-9.+eE]/.test(value)) { + throw new BSONError(`Input: '${value}' is not in decimal or exponential notation`); + } + return new Double(coercedValue); + } + valueOf() { + return this.value; + } + toJSON() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toExtendedJSON(options) { + if (options && (options.legacy || (options.relaxed && isFinite(this.value)))) { + return this.value; + } + if (Object.is(Math.sign(this.value), -0)) { + return { $numberDouble: '-0.0' }; + } + return { + $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() + }; + } + static fromExtendedJSON(doc, options) { + const doubleValue = parseFloat(doc.$numberDouble); + return options && options.relaxed ? doubleValue : new Double(doubleValue); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Double(${inspect(this.value, options)})`; + } +} + +class Int32 extends BSONValue { + get _bsontype() { + return 'Int32'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value | 0; + } + static fromString(value) { + const cleanedValue = removeLeadingZerosAndExplicitPlus(value); + const coercedValue = Number(value); + if (BSON_INT32_MAX < coercedValue) { + throw new BSONError(`Input: '${value}' is larger than the maximum value for Int32`); + } + else if (BSON_INT32_MIN > coercedValue) { + throw new BSONError(`Input: '${value}' is smaller than the minimum value for Int32`); + } + else if (!Number.isSafeInteger(coercedValue)) { + throw new BSONError(`Input: '${value}' is not a safe integer`); + } + else if (coercedValue.toString() !== cleanedValue) { + throw new BSONError(`Input: '${value}' is not a valid Int32 string`); + } + return new Int32(coercedValue); + } + valueOf() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toJSON() { + return this.value; + } + toExtendedJSON(options) { + if (options && (options.relaxed || options.legacy)) + return this.value; + return { $numberInt: this.value.toString() }; + } + static fromExtendedJSON(doc, options) { + return options && options.relaxed ? parseInt(doc.$numberInt, 10) : new Int32(doc.$numberInt); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Int32(${inspect(this.value, options)})`; + } +} + +class MaxKey extends BSONValue { + get _bsontype() { + return 'MaxKey'; + } + toExtendedJSON() { + return { $maxKey: 1 }; + } + static fromExtendedJSON() { + return new MaxKey(); + } + inspect() { + return 'new MaxKey()'; + } +} + +class MinKey extends BSONValue { + get _bsontype() { + return 'MinKey'; + } + toExtendedJSON() { + return { $minKey: 1 }; + } + static fromExtendedJSON() { + return new MinKey(); + } + inspect() { + return 'new MinKey()'; + } +} + +const FLOAT = new Float64Array(1); +const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8); +FLOAT[0] = -1; +const isBigEndian = FLOAT_BYTES[7] === 0; +const NumberUtils = { + getNonnegativeInt32LE(source, offset) { + if (source[offset + 3] > 127) { + throw new RangeError(`Size cannot be negative at offset: ${offset}`); + } + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getInt32LE(source, offset) { + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getUint32LE(source, offset) { + return (source[offset] + + source[offset + 1] * 256 + + source[offset + 2] * 65536 + + source[offset + 3] * 16777216); + }, + getUint32BE(source, offset) { + return (source[offset + 3] + + source[offset + 2] * 256 + + source[offset + 1] * 65536 + + source[offset] * 16777216); + }, + getBigInt64LE(source, offset) { + const lo = NumberUtils.getUint32LE(source, offset); + const hi = NumberUtils.getUint32LE(source, offset + 4); + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }, + getFloat64LE: isBigEndian + ? (source, offset) => { + FLOAT_BYTES[7] = source[offset]; + FLOAT_BYTES[6] = source[offset + 1]; + FLOAT_BYTES[5] = source[offset + 2]; + FLOAT_BYTES[4] = source[offset + 3]; + FLOAT_BYTES[3] = source[offset + 4]; + FLOAT_BYTES[2] = source[offset + 5]; + FLOAT_BYTES[1] = source[offset + 6]; + FLOAT_BYTES[0] = source[offset + 7]; + return FLOAT[0]; + } + : (source, offset) => { + FLOAT_BYTES[0] = source[offset]; + FLOAT_BYTES[1] = source[offset + 1]; + FLOAT_BYTES[2] = source[offset + 2]; + FLOAT_BYTES[3] = source[offset + 3]; + FLOAT_BYTES[4] = source[offset + 4]; + FLOAT_BYTES[5] = source[offset + 5]; + FLOAT_BYTES[6] = source[offset + 6]; + FLOAT_BYTES[7] = source[offset + 7]; + return FLOAT[0]; + }, + setInt32BE(destination, offset, value) { + destination[offset + 3] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset] = value; + return 4; + }, + setInt32LE(destination, offset, value) { + destination[offset] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 3] = value; + return 4; + }, + setBigInt64LE(destination, offset, value) { + const mask32bits = BigInt(4294967295); + let lo = Number(value & mask32bits); + destination[offset] = lo; + lo >>= 8; + destination[offset + 1] = lo; + lo >>= 8; + destination[offset + 2] = lo; + lo >>= 8; + destination[offset + 3] = lo; + let hi = Number((value >> BigInt(32)) & mask32bits); + destination[offset + 4] = hi; + hi >>= 8; + destination[offset + 5] = hi; + hi >>= 8; + destination[offset + 6] = hi; + hi >>= 8; + destination[offset + 7] = hi; + return 8; + }, + setFloat64LE: isBigEndian + ? (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[7]; + destination[offset + 1] = FLOAT_BYTES[6]; + destination[offset + 2] = FLOAT_BYTES[5]; + destination[offset + 3] = FLOAT_BYTES[4]; + destination[offset + 4] = FLOAT_BYTES[3]; + destination[offset + 5] = FLOAT_BYTES[2]; + destination[offset + 6] = FLOAT_BYTES[1]; + destination[offset + 7] = FLOAT_BYTES[0]; + return 8; + } + : (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[0]; + destination[offset + 1] = FLOAT_BYTES[1]; + destination[offset + 2] = FLOAT_BYTES[2]; + destination[offset + 3] = FLOAT_BYTES[3]; + destination[offset + 4] = FLOAT_BYTES[4]; + destination[offset + 5] = FLOAT_BYTES[5]; + destination[offset + 6] = FLOAT_BYTES[6]; + destination[offset + 7] = FLOAT_BYTES[7]; + return 8; + } +}; + +const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$'); +let PROCESS_UNIQUE = null; +class ObjectId extends BSONValue { + get _bsontype() { + return 'ObjectId'; + } + constructor(inputId) { + super(); + let workingId; + if (typeof inputId === 'object' && inputId && 'id' in inputId) { + if (typeof inputId.id !== 'string' && !ArrayBuffer.isView(inputId.id)) { + throw new BSONError('Argument passed in must have an id that is of type string or Buffer'); + } + if ('toHexString' in inputId && typeof inputId.toHexString === 'function') { + workingId = ByteUtils.fromHex(inputId.toHexString()); + } + else { + workingId = inputId.id; + } + } + else { + workingId = inputId; + } + if (workingId == null || typeof workingId === 'number') { + this.buffer = ObjectId.generate(typeof workingId === 'number' ? workingId : undefined); + } + else if (ArrayBuffer.isView(workingId) && workingId.byteLength === 12) { + this.buffer = ByteUtils.toLocalBufferType(workingId); + } + else if (typeof workingId === 'string') { + if (workingId.length === 24 && checkForHexRegExp.test(workingId)) { + this.buffer = ByteUtils.fromHex(workingId); + } + else { + throw new BSONError('input must be a 24 character hex string, 12 byte Uint8Array, or an integer'); + } + } + else { + throw new BSONError('Argument passed in does not match the accepted types'); + } + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(this.id); + } + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(value); + } + } + toHexString() { + if (ObjectId.cacheHexString && this.__id) { + return this.__id; + } + const hexString = ByteUtils.toHex(this.id); + if (ObjectId.cacheHexString && !this.__id) { + this.__id = hexString; + } + return hexString; + } + static getInc() { + return (ObjectId.index = (ObjectId.index + 1) % 0xffffff); + } + static generate(time) { + if ('number' !== typeof time) { + time = Math.floor(Date.now() / 1000); + } + const inc = ObjectId.getInc(); + const buffer = ByteUtils.allocateUnsafe(12); + NumberUtils.setInt32BE(buffer, 0, time); + if (PROCESS_UNIQUE === null) { + PROCESS_UNIQUE = ByteUtils.randomBytes(5); + } + buffer[4] = PROCESS_UNIQUE[0]; + buffer[5] = PROCESS_UNIQUE[1]; + buffer[6] = PROCESS_UNIQUE[2]; + buffer[7] = PROCESS_UNIQUE[3]; + buffer[8] = PROCESS_UNIQUE[4]; + buffer[11] = inc & 0xff; + buffer[10] = (inc >> 8) & 0xff; + buffer[9] = (inc >> 16) & 0xff; + return buffer; + } + toString(encoding) { + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + if (encoding === 'hex') + return this.toHexString(); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + static is(variable) { + return (variable != null && + typeof variable === 'object' && + '_bsontype' in variable && + variable._bsontype === 'ObjectId'); + } + equals(otherId) { + if (otherId === undefined || otherId === null) { + return false; + } + if (ObjectId.is(otherId)) { + return (this.buffer[11] === otherId.buffer[11] && ByteUtils.equals(this.buffer, otherId.buffer)); + } + if (typeof otherId === 'string') { + return otherId.toLowerCase() === this.toHexString(); + } + if (typeof otherId === 'object' && typeof otherId.toHexString === 'function') { + const otherIdString = otherId.toHexString(); + const thisIdString = this.toHexString(); + return typeof otherIdString === 'string' && otherIdString.toLowerCase() === thisIdString; + } + return false; + } + getTimestamp() { + const timestamp = new Date(); + const time = NumberUtils.getUint32BE(this.buffer, 0); + timestamp.setTime(Math.floor(time) * 1000); + return timestamp; + } + static createPk() { + return new ObjectId(); + } + serializeInto(uint8array, index) { + uint8array[index] = this.buffer[0]; + uint8array[index + 1] = this.buffer[1]; + uint8array[index + 2] = this.buffer[2]; + uint8array[index + 3] = this.buffer[3]; + uint8array[index + 4] = this.buffer[4]; + uint8array[index + 5] = this.buffer[5]; + uint8array[index + 6] = this.buffer[6]; + uint8array[index + 7] = this.buffer[7]; + uint8array[index + 8] = this.buffer[8]; + uint8array[index + 9] = this.buffer[9]; + uint8array[index + 10] = this.buffer[10]; + uint8array[index + 11] = this.buffer[11]; + return 12; + } + static createFromTime(time) { + const buffer = ByteUtils.allocate(12); + for (let i = 11; i >= 4; i--) + buffer[i] = 0; + NumberUtils.setInt32BE(buffer, 0, time); + return new ObjectId(buffer); + } + static createFromHexString(hexString) { + if (hexString?.length !== 24) { + throw new BSONError('hex string must be 24 characters'); + } + return new ObjectId(ByteUtils.fromHex(hexString)); + } + static createFromBase64(base64) { + if (base64?.length !== 16) { + throw new BSONError('base64 string must be 16 characters'); + } + return new ObjectId(ByteUtils.fromBase64(base64)); + } + static isValid(id) { + if (id == null) + return false; + try { + new ObjectId(id); + return true; + } + catch { + return false; + } + } + toExtendedJSON() { + if (this.toHexString) + return { $oid: this.toHexString() }; + return { $oid: this.toString('hex') }; + } + static fromExtendedJSON(doc) { + return new ObjectId(doc.$oid); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new ObjectId(${inspect(this.toHexString(), options)})`; + } +} +ObjectId.index = Math.floor(Math.random() * 0xffffff); + +function internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined) { + let totalLength = 4 + 1; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + totalLength += calculateElement(i.toString(), object[i], serializeFunctions, true, ignoreUndefined); + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + } + for (const key of Object.keys(object)) { + totalLength += calculateElement(key, object[key], serializeFunctions, false, ignoreUndefined); + } + } + return totalLength; +} +function calculateElement(name, value, serializeFunctions = false, isArray = false, ignoreUndefined = false) { + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + switch (typeof value) { + case 'string': + return 1 + ByteUtils.utf8ByteLength(name) + 1 + 4 + ByteUtils.utf8ByteLength(value) + 1; + case 'number': + if (Math.floor(value) === value && + value >= JS_INT_MIN && + value <= JS_INT_MAX) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (4 + 1); + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + case 'undefined': + if (isArray || !ignoreUndefined) + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + return 0; + case 'boolean': + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 1); + case 'object': + if (value != null && + typeof value._bsontype === 'string' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value == null || value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + } + else if (value._bsontype === 'ObjectId') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (12 + 1); + } + else if (value instanceof Date || isDate(value)) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (ArrayBuffer.isView(value) || + value instanceof ArrayBuffer || + isAnyArrayBuffer(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 4 + 1) + value.byteLength); + } + else if (value._bsontype === 'Long' || + value._bsontype === 'Double' || + value._bsontype === 'Timestamp') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (value._bsontype === 'Decimal128') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (16 + 1); + } + else if (value._bsontype === 'Code') { + if (value.scope != null && Object.keys(value.scope).length > 0) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + + internalCalculateObjectSize(value.scope, serializeFunctions, ignoreUndefined)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1); + } + } + else if (value._bsontype === 'Binary') { + const binary = value; + if (binary.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + (binary.position + 1 + 4 + 1 + 4)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (binary.position + 1 + 4 + 1)); + } + } + else if (value._bsontype === 'Symbol') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + ByteUtils.utf8ByteLength(value.value) + + 4 + + 1 + + 1); + } + else if (value._bsontype === 'DBRef') { + const ordered_values = Object.assign({ + $ref: value.collection, + $id: value.oid + }, value.fields); + if (value.db != null) { + ordered_values['$db'] = value.db; + } + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + internalCalculateObjectSize(ordered_values, serializeFunctions, ignoreUndefined)); + } + else if (value instanceof RegExp || isRegExp(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.source) + + 1 + + (value.global ? 1 : 0) + + (value.ignoreCase ? 1 : 0) + + (value.multiline ? 1 : 0) + + 1); + } + else if (value._bsontype === 'BSONRegExp') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.pattern) + + 1 + + ByteUtils.utf8ByteLength(value.options) + + 1); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + internalCalculateObjectSize(value, serializeFunctions, ignoreUndefined) + + 1); + } + case 'function': + if (serializeFunctions) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.toString()) + + 1); + } + } + return 0; +} + +function alphabetize(str) { + return str.split('').sort().join(''); +} +class BSONRegExp extends BSONValue { + get _bsontype() { + return 'BSONRegExp'; + } + constructor(pattern, options) { + super(); + this.pattern = pattern; + this.options = alphabetize(options ?? ''); + if (this.pattern.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`); + } + if (this.options.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`); + } + for (let i = 0; i < this.options.length; i++) { + if (!(this.options[i] === 'i' || + this.options[i] === 'm' || + this.options[i] === 'x' || + this.options[i] === 'l' || + this.options[i] === 's' || + this.options[i] === 'u')) { + throw new BSONError(`The regular expression option [${this.options[i]}] is not supported`); + } + } + } + static parseOptions(options) { + return options ? options.split('').sort().join('') : ''; + } + toExtendedJSON(options) { + options = options || {}; + if (options.legacy) { + return { $regex: this.pattern, $options: this.options }; + } + return { $regularExpression: { pattern: this.pattern, options: this.options } }; + } + static fromExtendedJSON(doc) { + if ('$regex' in doc) { + if (typeof doc.$regex !== 'string') { + if (doc.$regex._bsontype === 'BSONRegExp') { + return doc; + } + } + else { + return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options)); + } + } + if ('$regularExpression' in doc) { + return new BSONRegExp(doc.$regularExpression.pattern, BSONRegExp.parseOptions(doc.$regularExpression.options)); + } + throw new BSONError(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(doc)}`); + } + inspect(depth, options, inspect) { + const stylize = getStylizeFunction(options) ?? (v => v); + inspect ??= defaultInspect; + const pattern = stylize(inspect(this.pattern), 'regexp'); + const flags = stylize(inspect(this.options), 'regexp'); + return `new BSONRegExp(${pattern}, ${flags})`; + } +} + +class BSONSymbol extends BSONValue { + get _bsontype() { + return 'BSONSymbol'; + } + constructor(value) { + super(); + this.value = value; + } + valueOf() { + return this.value; + } + toString() { + return this.value; + } + toJSON() { + return this.value; + } + toExtendedJSON() { + return { $symbol: this.value }; + } + static fromExtendedJSON(doc) { + return new BSONSymbol(doc.$symbol); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new BSONSymbol(${inspect(this.value, options)})`; + } +} + +const LongWithoutOverridesClass = Long; +class Timestamp extends LongWithoutOverridesClass { + get _bsontype() { + return 'Timestamp'; + } + constructor(low) { + if (low == null) { + super(0, 0, true); + } + else if (typeof low === 'bigint') { + super(low, true); + } + else if (Long.isLong(low)) { + super(low.low, low.high, true); + } + else if (typeof low === 'object' && 't' in low && 'i' in low) { + if (typeof low.t !== 'number' && (typeof low.t !== 'object' || low.t._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide t as a number'); + } + if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide i as a number'); + } + const t = Number(low.t); + const i = Number(low.i); + if (t < 0 || Number.isNaN(t)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive t'); + } + if (i < 0 || Number.isNaN(i)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive i'); + } + if (t > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max'); + } + if (i > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max'); + } + super(i, t, true); + } + else { + throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }'); + } + } + toJSON() { + return { + $timestamp: this.toString() + }; + } + static fromInt(value) { + return new Timestamp(Long.fromInt(value, true)); + } + static fromNumber(value) { + return new Timestamp(Long.fromNumber(value, true)); + } + static fromBits(lowBits, highBits) { + return new Timestamp({ i: lowBits, t: highBits }); + } + static fromString(str, optRadix) { + return new Timestamp(Long.fromString(str, true, optRadix)); + } + toExtendedJSON() { + return { $timestamp: { t: this.high >>> 0, i: this.low >>> 0 } }; + } + static fromExtendedJSON(doc) { + const i = Long.isLong(doc.$timestamp.i) + ? doc.$timestamp.i.getLowBitsUnsigned() + : doc.$timestamp.i; + const t = Long.isLong(doc.$timestamp.t) + ? doc.$timestamp.t.getLowBitsUnsigned() + : doc.$timestamp.t; + return new Timestamp({ t, i }); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const t = inspect(this.high >>> 0, options); + const i = inspect(this.low >>> 0, options); + return `new Timestamp({ t: ${t}, i: ${i} })`; + } +} +Timestamp.MAX_VALUE = Long.MAX_UNSIGNED_VALUE; + +const JS_INT_MAX_LONG = Long.fromNumber(JS_INT_MAX); +const JS_INT_MIN_LONG = Long.fromNumber(JS_INT_MIN); +function internalDeserialize(buffer, options, isArray) { + options = options == null ? {} : options; + const index = options && options.index ? options.index : 0; + const size = NumberUtils.getInt32LE(buffer, index); + if (size < 5) { + throw new BSONError(`bson size must be >= 5, is ${size}`); + } + if (options.allowObjectSmallerThanBufferSize && buffer.length < size) { + throw new BSONError(`buffer length ${buffer.length} must be >= bson size ${size}`); + } + if (!options.allowObjectSmallerThanBufferSize && buffer.length !== size) { + throw new BSONError(`buffer length ${buffer.length} must === bson size ${size}`); + } + if (size + index > buffer.byteLength) { + throw new BSONError(`(bson size ${size} + options.index ${index} must be <= buffer length ${buffer.byteLength})`); + } + if (buffer[index + size - 1] !== 0) { + throw new BSONError("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00"); + } + return deserializeObject(buffer, index, options, isArray); +} +const allowedDBRefKeys = /^\$ref$|^\$id$|^\$db$/; +function deserializeObject(buffer, index, options, isArray = false) { + const fieldsAsRaw = options['fieldsAsRaw'] == null ? null : options['fieldsAsRaw']; + const raw = options['raw'] == null ? false : options['raw']; + const bsonRegExp = typeof options['bsonRegExp'] === 'boolean' ? options['bsonRegExp'] : false; + const promoteBuffers = options.promoteBuffers ?? false; + const promoteLongs = options.promoteLongs ?? true; + const promoteValues = options.promoteValues ?? true; + const useBigInt64 = options.useBigInt64 ?? false; + if (useBigInt64 && !promoteValues) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + if (useBigInt64 && !promoteLongs) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + const validation = options.validation == null ? { utf8: true } : options.validation; + let globalUTFValidation = true; + let validationSetting; + let utf8KeysSet; + const utf8ValidatedKeys = validation.utf8; + if (typeof utf8ValidatedKeys === 'boolean') { + validationSetting = utf8ValidatedKeys; + } + else { + globalUTFValidation = false; + const utf8ValidationValues = Object.keys(utf8ValidatedKeys).map(function (key) { + return utf8ValidatedKeys[key]; + }); + if (utf8ValidationValues.length === 0) { + throw new BSONError('UTF-8 validation setting cannot be empty'); + } + if (typeof utf8ValidationValues[0] !== 'boolean') { + throw new BSONError('Invalid UTF-8 validation option, must specify boolean values'); + } + validationSetting = utf8ValidationValues[0]; + if (!utf8ValidationValues.every(item => item === validationSetting)) { + throw new BSONError('Invalid UTF-8 validation option - keys must be all true or all false'); + } + } + if (!globalUTFValidation) { + utf8KeysSet = new Set(); + for (const key of Object.keys(utf8ValidatedKeys)) { + utf8KeysSet.add(key); + } + } + const startIndex = index; + if (buffer.length < 5) + throw new BSONError('corrupt bson message < 5 bytes long'); + const size = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (size < 5 || size > buffer.length) + throw new BSONError('corrupt bson message'); + const object = isArray ? [] : {}; + let arrayIndex = 0; + const done = false; + let isPossibleDBRef = isArray ? false : null; + while (!done) { + const elementType = buffer[index++]; + if (elementType === 0) + break; + let i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.byteLength) + throw new BSONError('Bad BSON Document: illegal CString'); + const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i, false); + let shouldValidateKey = true; + if (globalUTFValidation || utf8KeysSet?.has(name)) { + shouldValidateKey = validationSetting; + } + else { + shouldValidateKey = !validationSetting; + } + if (isPossibleDBRef !== false && name[0] === '$') { + isPossibleDBRef = allowedDBRefKeys.test(name); + } + let value; + index = i + 1; + if (elementType === BSON_DATA_STRING) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + value = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + } + else if (elementType === BSON_DATA_OID) { + const oid = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oid[i] = buffer[index + i]; + value = new ObjectId(oid); + index = index + 12; + } + else if (elementType === BSON_DATA_INT && promoteValues === false) { + value = new Int32(NumberUtils.getInt32LE(buffer, index)); + index += 4; + } + else if (elementType === BSON_DATA_INT) { + value = NumberUtils.getInt32LE(buffer, index); + index += 4; + } + else if (elementType === BSON_DATA_NUMBER) { + value = NumberUtils.getFloat64LE(buffer, index); + index += 8; + if (promoteValues === false) + value = new Double(value); + } + else if (elementType === BSON_DATA_DATE) { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + value = new Date(new Long(lowBits, highBits).toNumber()); + } + else if (elementType === BSON_DATA_BOOLEAN) { + if (buffer[index] !== 0 && buffer[index] !== 1) + throw new BSONError('illegal boolean type value'); + value = buffer[index++] === 1; + } + else if (elementType === BSON_DATA_OBJECT) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + if (objectSize <= 0 || objectSize > buffer.length - index) + throw new BSONError('bad embedded document length in bson'); + if (raw) { + value = buffer.slice(index, index + objectSize); + } + else { + let objectOptions = options; + if (!globalUTFValidation) { + objectOptions = { ...options, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, objectOptions, false); + } + index = index + objectSize; + } + else if (elementType === BSON_DATA_ARRAY) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + let arrayOptions = options; + const stopIndex = index + objectSize; + if (fieldsAsRaw && fieldsAsRaw[name]) { + arrayOptions = { ...options, raw: true }; + } + if (!globalUTFValidation) { + arrayOptions = { ...arrayOptions, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, arrayOptions, true); + index = index + objectSize; + if (buffer[index - 1] !== 0) + throw new BSONError('invalid array terminator byte'); + if (index !== stopIndex) + throw new BSONError('corrupted array bson'); + } + else if (elementType === BSON_DATA_UNDEFINED) { + value = undefined; + } + else if (elementType === BSON_DATA_NULL) { + value = null; + } + else if (elementType === BSON_DATA_LONG) { + if (useBigInt64) { + value = NumberUtils.getBigInt64LE(buffer, index); + index += 8; + } + else { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + const long = new Long(lowBits, highBits); + if (promoteLongs && promoteValues === true) { + value = + long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) + ? long.toNumber() + : long; + } + else { + value = long; + } + } + } + else if (elementType === BSON_DATA_DECIMAL128) { + const bytes = ByteUtils.allocateUnsafe(16); + for (let i = 0; i < 16; i++) + bytes[i] = buffer[index + i]; + index = index + 16; + value = new Decimal128(bytes); + } + else if (elementType === BSON_DATA_BINARY) { + let binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + const totalBinarySize = binarySize; + const subType = buffer[index++]; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found'); + if (binarySize > buffer.byteLength) + throw new BSONError('Binary type size larger than document size'); + if (buffer['slice'] != null) { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.toLocalBufferType(buffer.slice(index, index + binarySize)); + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + else { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.allocateUnsafe(binarySize); + for (i = 0; i < binarySize; i++) { + value[i] = buffer[index + i]; + } + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + index = index + binarySize; + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === false) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + const optionsArray = new Array(regExpOptions.length); + for (i = 0; i < regExpOptions.length; i++) { + switch (regExpOptions[i]) { + case 'm': + optionsArray[i] = 'm'; + break; + case 's': + optionsArray[i] = 'g'; + break; + case 'i': + optionsArray[i] = 'i'; + break; + } + } + value = new RegExp(source, optionsArray.join('')); + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === true) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + value = new BSONRegExp(source, regExpOptions); + } + else if (elementType === BSON_DATA_SYMBOL) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const symbol = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = promoteValues ? symbol : new BSONSymbol(symbol); + index = index + stringSize; + } + else if (elementType === BSON_DATA_TIMESTAMP) { + value = new Timestamp({ + i: NumberUtils.getUint32LE(buffer, index), + t: NumberUtils.getUint32LE(buffer, index + 4) + }); + index += 8; + } + else if (elementType === BSON_DATA_MIN_KEY) { + value = new MinKey(); + } + else if (elementType === BSON_DATA_MAX_KEY) { + value = new MaxKey(); + } + else if (elementType === BSON_DATA_CODE) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = new Code(functionString); + index = index + stringSize; + } + else if (elementType === BSON_DATA_CODE_W_SCOPE) { + const totalSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (totalSize < 4 + 4 + 4 + 1) { + throw new BSONError('code_w_scope total size shorter minimum expected length'); + } + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + const scopeObject = deserializeObject(buffer, _index, options, false); + index = index + objectSize; + if (totalSize < 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too short, truncating scope'); + } + if (totalSize > 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too long, clips outer document'); + } + value = new Code(functionString, scopeObject); + } + else if (elementType === BSON_DATA_DBPOINTER) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) + throw new BSONError('bad string length in bson'); + const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const oidBuffer = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oidBuffer[i] = buffer[index + i]; + const oid = new ObjectId(oidBuffer); + index = index + 12; + value = new DBRef(namespace, oid); + } + else { + throw new BSONError(`Detected unknown BSON type ${elementType.toString(16)} for fieldname "${name}"`); + } + if (name === '__proto__') { + Object.defineProperty(object, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + object[name] = value; + } + } + if (size !== index - startIndex) { + if (isArray) + throw new BSONError('corrupt array bson'); + throw new BSONError('corrupt object bson'); + } + if (!isPossibleDBRef) + return object; + if (isDBRefLike(object)) { + const copy = Object.assign({}, object); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(object.$ref, object.$id, object.$db, copy); + } + return object; +} + +const regexp = /\x00/; +const ignoreKeys = new Set(['$db', '$ref', '$id', '$clusterTime']); +function serializeString(buffer, key, value, index) { + buffer[index++] = BSON_DATA_STRING; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes + 1; + buffer[index - 1] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value, index + 4); + NumberUtils.setInt32LE(buffer, index, size + 1); + index = index + 4 + size; + buffer[index++] = 0; + return index; +} +function serializeNumber(buffer, key, value, index) { + const isNegativeZero = Object.is(value, -0); + const type = !isNegativeZero && + Number.isSafeInteger(value) && + value <= BSON_INT32_MAX && + value >= BSON_INT32_MIN + ? BSON_DATA_INT + : BSON_DATA_NUMBER; + buffer[index++] = type; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0x00; + if (type === BSON_DATA_INT) { + index += NumberUtils.setInt32LE(buffer, index, value); + } + else { + index += NumberUtils.setFloat64LE(buffer, index, value); + } + return index; +} +function serializeBigInt(buffer, key, value, index) { + buffer[index++] = BSON_DATA_LONG; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index += numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setBigInt64LE(buffer, index, value); + return index; +} +function serializeNull(buffer, key, _, index) { + buffer[index++] = BSON_DATA_NULL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeBoolean(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BOOLEAN; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + buffer[index++] = value ? 1 : 0; + return index; +} +function serializeDate(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DATE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const dateInMilis = Long.fromNumber(value.getTime()); + const lowBits = dateInMilis.getLowBits(); + const highBits = dateInMilis.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.source && value.source.match(regexp) != null) { + throw new BSONError('value ' + value.source + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.source, index); + buffer[index++] = 0x00; + if (value.ignoreCase) + buffer[index++] = 0x69; + if (value.global) + buffer[index++] = 0x73; + if (value.multiline) + buffer[index++] = 0x6d; + buffer[index++] = 0x00; + return index; +} +function serializeBSONRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.pattern.match(regexp) != null) { + throw new BSONError('pattern ' + value.pattern + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.pattern, index); + buffer[index++] = 0x00; + const sortedOptions = value.options.split('').sort().join(''); + index = index + ByteUtils.encodeUTF8Into(buffer, sortedOptions, index); + buffer[index++] = 0x00; + return index; +} +function serializeMinMax(buffer, key, value, index) { + if (value === null) { + buffer[index++] = BSON_DATA_NULL; + } + else if (value._bsontype === 'MinKey') { + buffer[index++] = BSON_DATA_MIN_KEY; + } + else { + buffer[index++] = BSON_DATA_MAX_KEY; + } + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeObjectId(buffer, key, value, index) { + buffer[index++] = BSON_DATA_OID; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += value.serializeInto(buffer, index); + return index; +} +function serializeBuffer(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = value.length; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = BSON_BINARY_SUBTYPE_DEFAULT; + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = value[i]; + } + else { + buffer.set(value, index); + } + index = index + size; + return index; +} +function serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path) { + if (path.has(value)) { + throw new BSONError('Cannot convert circular structure to BSON'); + } + path.add(value); + buffer[index++] = Array.isArray(value) ? BSON_DATA_ARRAY : BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const endIndex = serializeInto(buffer, value, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + path.delete(value); + return endIndex; +} +function serializeDecimal128(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DECIMAL128; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + for (let i = 0; i < 16; i++) + buffer[index + i] = value.bytes[i]; + return index + 16; +} +function serializeLong(buffer, key, value, index) { + buffer[index++] = + value._bsontype === 'Long' ? BSON_DATA_LONG : BSON_DATA_TIMESTAMP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const lowBits = value.getLowBits(); + const highBits = value.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeInt32(buffer, key, value, index) { + value = value.valueOf(); + buffer[index++] = BSON_DATA_INT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setInt32LE(buffer, index, value); + return index; +} +function serializeDouble(buffer, key, value, index) { + buffer[index++] = BSON_DATA_NUMBER; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setFloat64LE(buffer, index, value.value); + return index; +} +function serializeFunction(buffer, key, value, index) { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeCode(buffer, key, value, index, checkKeys = false, depth = 0, serializeFunctions = false, ignoreUndefined = true, path) { + if (value.scope && typeof value.scope === 'object') { + buffer[index++] = BSON_DATA_CODE_W_SCOPE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + const functionString = value.code; + index = index + 4; + const codeSize = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, codeSize); + buffer[index + 4 + codeSize - 1] = 0; + index = index + codeSize + 4; + const endIndex = serializeInto(buffer, value.scope, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + index = endIndex - 1; + const totalSize = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, startIndex, totalSize); + buffer[index++] = 0; + } + else { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.code.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + } + return index; +} +function serializeBinary(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const data = value.buffer; + let size = value.position; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) + size = size + 4; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = value.sub_type; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + size = size - 4; + index += NumberUtils.setInt32LE(buffer, index, size); + } + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = data[i]; + } + else { + buffer.set(data, index); + } + index = index + value.position; + return index; +} +function serializeSymbol(buffer, key, value, index) { + buffer[index++] = BSON_DATA_SYMBOL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value.value, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path) { + buffer[index++] = BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + let output = { + $ref: value.collection || value.namespace, + $id: value.oid + }; + if (value.db != null) { + output.$db = value.db; + } + output = Object.assign(output, value.fields); + const endIndex = serializeInto(buffer, output, false, index, depth + 1, serializeFunctions, true, path); + const size = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, index, size); + return endIndex; +} +function serializeInto(buffer, object, checkKeys, startingIndex, depth, serializeFunctions, ignoreUndefined, path) { + if (path == null) { + if (object == null) { + buffer[0] = 0x05; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + buffer[4] = 0x00; + return 5; + } + if (Array.isArray(object)) { + throw new BSONError('serialize does not support an array as the root input'); + } + if (typeof object !== 'object') { + throw new BSONError('serialize does not support non-object as the root input'); + } + else if ('_bsontype' in object && typeof object._bsontype === 'string') { + throw new BSONError(`BSON types cannot be serialized as a document`); + } + else if (isDate(object) || + isRegExp(object) || + isUint8Array(object) || + isAnyArrayBuffer(object)) { + throw new BSONError(`date, regexp, typedarray, and arraybuffer cannot be BSON documents`); + } + path = new Set(); + } + path.add(object); + let index = startingIndex + 4; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + const key = `${i}`; + let value = object[i]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + if (typeof value === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (typeof value === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (typeof value === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (typeof value === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (typeof value === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else if (object instanceof Map || isMap(object)) { + const iterator = object.entries(); + let done = false; + while (!done) { + const entry = iterator.next(); + done = !!entry.done; + if (done) + continue; + const key = entry.value[0]; + let value = entry.value[1]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === null || (value === undefined && ignoreUndefined === false)) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + if (object != null && typeof object !== 'object') { + throw new BSONError('toBSON function did not return an object'); + } + } + for (const key of Object.keys(object)) { + let value = object[key]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + if (ignoreUndefined === false) + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + path.delete(object); + buffer[index++] = 0x00; + const size = index - startingIndex; + startingIndex += NumberUtils.setInt32LE(buffer, startingIndex, size); + return index; +} + +function isBSONType(value) { + return (value != null && + typeof value === 'object' && + '_bsontype' in value && + typeof value._bsontype === 'string'); +} +const keysToCodecs = { + $oid: ObjectId, + $binary: Binary, + $uuid: Binary, + $symbol: BSONSymbol, + $numberInt: Int32, + $numberDecimal: Decimal128, + $numberDouble: Double, + $numberLong: Long, + $minKey: MinKey, + $maxKey: MaxKey, + $regex: BSONRegExp, + $regularExpression: BSONRegExp, + $timestamp: Timestamp +}; +function deserializeValue(value, options = {}) { + if (typeof value === 'number') { + const in32BitRange = value <= BSON_INT32_MAX && value >= BSON_INT32_MIN; + const in64BitRange = value <= BSON_INT64_MAX && value >= BSON_INT64_MIN; + if (options.relaxed || options.legacy) { + return value; + } + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (in32BitRange) { + return new Int32(value); + } + if (in64BitRange) { + if (options.useBigInt64) { + return BigInt(value); + } + return Long.fromNumber(value); + } + } + return new Double(value); + } + if (value == null || typeof value !== 'object') + return value; + if (value.$undefined) + return null; + const keys = Object.keys(value).filter(k => k.startsWith('$') && value[k] != null); + for (let i = 0; i < keys.length; i++) { + const c = keysToCodecs[keys[i]]; + if (c) + return c.fromExtendedJSON(value, options); + } + if (value.$date != null) { + const d = value.$date; + const date = new Date(); + if (options.legacy) { + if (typeof d === 'number') + date.setTime(d); + else if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + else { + if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (Long.isLong(d)) + date.setTime(d.toNumber()); + else if (typeof d === 'number' && options.relaxed) + date.setTime(d); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + return date; + } + if (value.$code != null) { + const copy = Object.assign({}, value); + if (value.$scope) { + copy.$scope = deserializeValue(value.$scope); + } + return Code.fromExtendedJSON(value); + } + if (isDBRefLike(value) || value.$dbPointer) { + const v = value.$ref ? value : value.$dbPointer; + if (v instanceof DBRef) + return v; + const dollarKeys = Object.keys(v).filter(k => k.startsWith('$')); + let valid = true; + dollarKeys.forEach(k => { + if (['$ref', '$id', '$db'].indexOf(k) === -1) + valid = false; + }); + if (valid) + return DBRef.fromExtendedJSON(v); + } + return value; +} +function serializeArray(array, options) { + return array.map((v, index) => { + options.seenObjects.push({ propertyName: `index ${index}`, obj: null }); + try { + return serializeValue(v, options); + } + finally { + options.seenObjects.pop(); + } + }); +} +function getISOString(date) { + const isoStr = date.toISOString(); + return date.getUTCMilliseconds() !== 0 ? isoStr : isoStr.slice(0, -5) + 'Z'; +} +function serializeValue(value, options) { + if (value instanceof Map || isMap(value)) { + const obj = Object.create(null); + for (const [k, v] of value) { + if (typeof k !== 'string') { + throw new BSONError('Can only serialize maps with string keys'); + } + obj[k] = v; + } + return serializeValue(obj, options); + } + if ((typeof value === 'object' || typeof value === 'function') && value !== null) { + const index = options.seenObjects.findIndex(entry => entry.obj === value); + if (index !== -1) { + const props = options.seenObjects.map(entry => entry.propertyName); + const leadingPart = props + .slice(0, index) + .map(prop => `${prop} -> `) + .join(''); + const alreadySeen = props[index]; + const circularPart = ' -> ' + + props + .slice(index + 1, props.length - 1) + .map(prop => `${prop} -> `) + .join(''); + const current = props[props.length - 1]; + const leadingSpace = ' '.repeat(leadingPart.length + alreadySeen.length / 2); + const dashes = '-'.repeat(circularPart.length + (alreadySeen.length + current.length) / 2 - 1); + throw new BSONError('Converting circular structure to EJSON:\n' + + ` ${leadingPart}${alreadySeen}${circularPart}${current}\n` + + ` ${leadingSpace}\\${dashes}/`); + } + options.seenObjects[options.seenObjects.length - 1].obj = value; + } + if (Array.isArray(value)) + return serializeArray(value, options); + if (value === undefined) + return null; + if (value instanceof Date || isDate(value)) { + const dateNum = value.getTime(), inRange = dateNum > -1 && dateNum < 253402318800000; + if (options.legacy) { + return options.relaxed && inRange + ? { $date: value.getTime() } + : { $date: getISOString(value) }; + } + return options.relaxed && inRange + ? { $date: getISOString(value) } + : { $date: { $numberLong: value.getTime().toString() } }; + } + if (typeof value === 'number' && (!options.relaxed || !isFinite(value))) { + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return { $numberInt: value.toString() }; + } + if (value >= BSON_INT64_MIN && value <= BSON_INT64_MAX) { + return { $numberLong: value.toString() }; + } + } + return { $numberDouble: Object.is(value, -0) ? '-0.0' : value.toString() }; + } + if (typeof value === 'bigint') { + if (!options.relaxed) { + return { $numberLong: BigInt.asIntN(64, value).toString() }; + } + return Number(BigInt.asIntN(64, value)); + } + if (value instanceof RegExp || isRegExp(value)) { + let flags = value.flags; + if (flags === undefined) { + const match = value.toString().match(/[gimuy]*$/); + if (match) { + flags = match[0]; + } + } + const rx = new BSONRegExp(value.source, flags); + return rx.toExtendedJSON(options); + } + if (value != null && typeof value === 'object') + return serializeDocument(value, options); + return value; +} +const BSON_TYPE_MAPPINGS = { + Binary: (o) => new Binary(o.value(), o.sub_type), + Code: (o) => new Code(o.code, o.scope), + DBRef: (o) => new DBRef(o.collection || o.namespace, o.oid, o.db, o.fields), + Decimal128: (o) => new Decimal128(o.bytes), + Double: (o) => new Double(o.value), + Int32: (o) => new Int32(o.value), + Long: (o) => Long.fromBits(o.low != null ? o.low : o.low_, o.low != null ? o.high : o.high_, o.low != null ? o.unsigned : o.unsigned_), + MaxKey: () => new MaxKey(), + MinKey: () => new MinKey(), + ObjectId: (o) => new ObjectId(o), + BSONRegExp: (o) => new BSONRegExp(o.pattern, o.options), + BSONSymbol: (o) => new BSONSymbol(o.value), + Timestamp: (o) => Timestamp.fromBits(o.low, o.high) +}; +function serializeDocument(doc, options) { + if (doc == null || typeof doc !== 'object') + throw new BSONError('not an object instance'); + const bsontype = doc._bsontype; + if (typeof bsontype === 'undefined') { + const _doc = {}; + for (const name of Object.keys(doc)) { + options.seenObjects.push({ propertyName: name, obj: null }); + try { + const value = serializeValue(doc[name], options); + if (name === '__proto__') { + Object.defineProperty(_doc, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + _doc[name] = value; + } + } + finally { + options.seenObjects.pop(); + } + } + return _doc; + } + else if (doc != null && + typeof doc === 'object' && + typeof doc._bsontype === 'string' && + doc[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (isBSONType(doc)) { + let outDoc = doc; + if (typeof outDoc.toExtendedJSON !== 'function') { + const mapper = BSON_TYPE_MAPPINGS[doc._bsontype]; + if (!mapper) { + throw new BSONError('Unrecognized or invalid _bsontype: ' + doc._bsontype); + } + outDoc = mapper(outDoc); + } + if (bsontype === 'Code' && outDoc.scope) { + outDoc = new Code(outDoc.code, serializeValue(outDoc.scope, options)); + } + else if (bsontype === 'DBRef' && outDoc.oid) { + outDoc = new DBRef(serializeValue(outDoc.collection, options), serializeValue(outDoc.oid, options), serializeValue(outDoc.db, options), serializeValue(outDoc.fields, options)); + } + return outDoc.toExtendedJSON(options); + } + else { + throw new BSONError('_bsontype must be a string, but was: ' + typeof bsontype); + } +} +function parse(text, options) { + const ejsonOptions = { + useBigInt64: options?.useBigInt64 ?? false, + relaxed: options?.relaxed ?? true, + legacy: options?.legacy ?? false + }; + return JSON.parse(text, (key, value) => { + if (key.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(key)}`); + } + return deserializeValue(value, ejsonOptions); + }); +} +function stringify(value, replacer, space, options) { + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = undefined; + space = 0; + } + const serializeOptions = Object.assign({ relaxed: true, legacy: false }, options, { + seenObjects: [{ propertyName: '(root)', obj: null }] + }); + const doc = serializeValue(value, serializeOptions); + return JSON.stringify(doc, replacer, space); +} +function EJSONserialize(value, options) { + options = options || {}; + return JSON.parse(stringify(value, options)); +} +function EJSONdeserialize(ejson, options) { + options = options || {}; + return parse(JSON.stringify(ejson), options); +} +const EJSON = Object.create(null); +EJSON.parse = parse; +EJSON.stringify = stringify; +EJSON.serialize = EJSONserialize; +EJSON.deserialize = EJSONdeserialize; +Object.freeze(EJSON); + +function getSize(source, offset) { + try { + return NumberUtils.getNonnegativeInt32LE(source, offset); + } + catch (cause) { + throw new BSONOffsetError('BSON size cannot be negative', offset, { cause }); + } +} +function findNull(bytes, offset) { + let nullTerminatorOffset = offset; + for (; bytes[nullTerminatorOffset] !== 0x00; nullTerminatorOffset++) + ; + if (nullTerminatorOffset === bytes.length - 1) { + throw new BSONOffsetError('Null terminator not found', offset); + } + return nullTerminatorOffset; +} +function parseToElements(bytes, startOffset = 0) { + startOffset ??= 0; + if (bytes.length < 5) { + throw new BSONOffsetError(`Input must be at least 5 bytes, got ${bytes.length} bytes`, startOffset); + } + const documentSize = getSize(bytes, startOffset); + if (documentSize > bytes.length - startOffset) { + throw new BSONOffsetError(`Parsed documentSize (${documentSize} bytes) does not match input length (${bytes.length} bytes)`, startOffset); + } + if (bytes[startOffset + documentSize - 1] !== 0x00) { + throw new BSONOffsetError('BSON documents must end in 0x00', startOffset + documentSize); + } + const elements = []; + let offset = startOffset + 4; + while (offset <= documentSize + startOffset) { + const type = bytes[offset]; + offset += 1; + if (type === 0) { + if (offset - startOffset !== documentSize) { + throw new BSONOffsetError(`Invalid 0x00 type byte`, offset); + } + break; + } + const nameOffset = offset; + const nameLength = findNull(bytes, offset) - nameOffset; + offset += nameLength + 1; + let length; + if (type === 1 || + type === 18 || + type === 9 || + type === 17) { + length = 8; + } + else if (type === 16) { + length = 4; + } + else if (type === 7) { + length = 12; + } + else if (type === 19) { + length = 16; + } + else if (type === 8) { + length = 1; + } + else if (type === 10 || + type === 6 || + type === 127 || + type === 255) { + length = 0; + } + else if (type === 11) { + length = findNull(bytes, findNull(bytes, offset) + 1) + 1 - offset; + } + else if (type === 3 || + type === 4 || + type === 15) { + length = getSize(bytes, offset); + } + else if (type === 2 || + type === 5 || + type === 12 || + type === 13 || + type === 14) { + length = getSize(bytes, offset) + 4; + if (type === 5) { + length += 1; + } + if (type === 12) { + length += 12; + } + } + else { + throw new BSONOffsetError(`Invalid 0x${type.toString(16).padStart(2, '0')} type byte`, offset); + } + if (length > documentSize) { + throw new BSONOffsetError('value reports length larger than document', offset); + } + elements.push([type, nameOffset, nameLength, offset, length]); + offset += length; + } + return elements; +} + +const onDemand = Object.create(null); +onDemand.parseToElements = parseToElements; +onDemand.ByteUtils = ByteUtils; +onDemand.NumberUtils = NumberUtils; +Object.freeze(onDemand); + +const MAXSIZE = 1024 * 1024 * 17; +let buffer = ByteUtils.allocate(MAXSIZE); +function setInternalBufferSize(size) { + if (buffer.length < size) { + buffer = ByteUtils.allocate(size); + } +} +function serialize(object, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const minInternalBufferSize = typeof options.minInternalBufferSize === 'number' ? options.minInternalBufferSize : MAXSIZE; + if (buffer.length < minInternalBufferSize) { + buffer = ByteUtils.allocate(minInternalBufferSize); + } + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + const finishedBuffer = ByteUtils.allocateUnsafe(serializationIndex); + finishedBuffer.set(buffer.subarray(0, serializationIndex), 0); + return finishedBuffer; +} +function serializeWithBufferAndIndex(object, finalBuffer, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const startIndex = typeof options.index === 'number' ? options.index : 0; + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + finalBuffer.set(buffer.subarray(0, serializationIndex), startIndex); + return startIndex + serializationIndex - 1; +} +function deserialize(buffer, options = {}) { + return internalDeserialize(ByteUtils.toLocalBufferType(buffer), options); +} +function calculateObjectSize(object, options = {}) { + options = options || {}; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + return internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined); +} +function deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { + const internalOptions = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, options); + const bufferData = ByteUtils.toLocalBufferType(data); + let index = startIndex; + for (let i = 0; i < numberOfDocuments; i++) { + const size = NumberUtils.getInt32LE(bufferData, index); + internalOptions.index = index; + documents[docStartIndex + i] = internalDeserialize(bufferData, internalOptions); + index = index + size; + } + return index; +} + +var bson = /*#__PURE__*/Object.freeze({ + __proto__: null, + BSONError: BSONError, + BSONOffsetError: BSONOffsetError, + BSONRegExp: BSONRegExp, + BSONRuntimeError: BSONRuntimeError, + BSONSymbol: BSONSymbol, + BSONType: BSONType, + BSONValue: BSONValue, + BSONVersionError: BSONVersionError, + Binary: Binary, + Code: Code, + DBRef: DBRef, + Decimal128: Decimal128, + Double: Double, + EJSON: EJSON, + Int32: Int32, + Long: Long, + MaxKey: MaxKey, + MinKey: MinKey, + ObjectId: ObjectId, + Timestamp: Timestamp, + UUID: UUID, + calculateObjectSize: calculateObjectSize, + deserialize: deserialize, + deserializeStream: deserializeStream, + onDemand: onDemand, + serialize: serialize, + serializeWithBufferAndIndex: serializeWithBufferAndIndex, + setInternalBufferSize: setInternalBufferSize +}); + +exports.BSON = bson; +exports.BSONError = BSONError; +exports.BSONOffsetError = BSONOffsetError; +exports.BSONRegExp = BSONRegExp; +exports.BSONRuntimeError = BSONRuntimeError; +exports.BSONSymbol = BSONSymbol; +exports.BSONType = BSONType; +exports.BSONValue = BSONValue; +exports.BSONVersionError = BSONVersionError; +exports.Binary = Binary; +exports.Code = Code; +exports.DBRef = DBRef; +exports.Decimal128 = Decimal128; +exports.Double = Double; +exports.EJSON = EJSON; +exports.Int32 = Int32; +exports.Long = Long; +exports.MaxKey = MaxKey; +exports.MinKey = MinKey; +exports.ObjectId = ObjectId; +exports.Timestamp = Timestamp; +exports.UUID = UUID; +exports.calculateObjectSize = calculateObjectSize; +exports.deserialize = deserialize; +exports.deserializeStream = deserializeStream; +exports.onDemand = onDemand; +exports.serialize = serialize; +exports.serializeWithBufferAndIndex = serializeWithBufferAndIndex; +exports.setInternalBufferSize = setInternalBufferSize; +//# sourceMappingURL=bson.cjs.map diff --git a/user-service/node_modules/bson/lib/bson.cjs.map b/user-service/node_modules/bson/lib/bson.cjs.map new file mode 100644 index 0000000000..15f5a813e8 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"bson.cjs","sources":["../src/parser/utils.ts","../src/constants.ts","../src/error.ts","../src/parse_utf8.ts","../src/utils/latin.ts","../src/utils/node_byte_utils.ts","../src/utils/web_byte_utils.ts","../src/utils/byte_utils.ts","../src/bson_value.ts","../src/binary.ts","../src/code.ts","../src/db_ref.ts","../src/utils/string_utils.ts","../src/long.ts","../src/decimal128.ts","../src/double.ts","../src/int_32.ts","../src/max_key.ts","../src/min_key.ts","../src/utils/number_utils.ts","../src/objectid.ts","../src/parser/calculate_size.ts","../src/regexp.ts","../src/symbol.ts","../src/timestamp.ts","../src/parser/deserializer.ts","../src/parser/serializer.ts","../src/extended_json.ts","../src/parser/on_demand/parse_to_elements.ts","../src/parser/on_demand/index.ts","../src/bson.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["StringUtils.validateStringCharacters","StringUtils.removeLeadingZerosAndExplicitPlus","constants.JS_INT_MIN","constants.JS_INT_MAX","constants.BSON_INT32_MIN","constants.BSON_INT32_MAX","constants.BSON_MAJOR_VERSION","constants.BSON_DATA_STRING","constants.BSON_DATA_OID","constants.BSON_DATA_INT","constants.BSON_DATA_NUMBER","constants.BSON_DATA_DATE","constants.BSON_DATA_BOOLEAN","constants.BSON_DATA_OBJECT","constants.BSON_DATA_ARRAY","constants.BSON_DATA_UNDEFINED","constants.BSON_DATA_NULL","constants.BSON_DATA_LONG","constants.BSON_DATA_DECIMAL128","constants.BSON_DATA_BINARY","constants.BSON_BINARY_SUBTYPE_UUID_NEW","constants.BSON_DATA_REGEXP","constants.BSON_DATA_SYMBOL","constants.BSON_DATA_TIMESTAMP","constants.BSON_DATA_MIN_KEY","constants.BSON_DATA_MAX_KEY","constants.BSON_DATA_CODE","constants.BSON_DATA_CODE_W_SCOPE","constants.BSON_DATA_DBPOINTER","constants.BSON_BINARY_SUBTYPE_DEFAULT"],"mappings":";;AAAM,SAAU,gBAAgB,CAAC,KAAc,EAAA;AAC7C,IAAA,OAAO,CAAC,sBAAsB,EAAE,4BAA4B,CAAC,CAAC,QAAQ,CACpE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CACtC,CAAC;AACJ,CAAC;AAEK,SAAU,YAAY,CAAC,KAAc,EAAA;AACzC,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,qBAAqB,CAAC;AACzE,CAAC;AAUK,SAAU,QAAQ,CAAC,CAAU,EAAA;AACjC,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC;AACjE,CAAC;AAEK,SAAU,KAAK,CAAC,CAAU,EAAA;AAC9B,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC;AAC9D,CAAC;AAEK,SAAU,MAAM,CAAC,CAAU,EAAA;AAC/B,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC;AAC/D,CAAC;AAGe,SAAA,cAAc,CAAC,CAAU,EAAE,QAAkB,EAAA;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAS,EAAE,CAAU,KAAI;AACjD,QAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,YAAA,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA,CAAE,EAAE,CAAC;SAChC;AAAM,aAAA,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACnB,YAAA,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SAC9B;AACD,QAAA,OAAO,CAAC,CAAC;AACX,KAAC,CAAC,CAAC;AACL,CAAC;AAKK,SAAU,kBAAkB,CAAC,OAAiB,EAAA;AAClD,IAAA,MAAM,aAAa,GACjB,OAAO,IAAI,IAAI;QACf,OAAO,OAAO,KAAK,QAAQ;AAC3B,QAAA,SAAS,IAAI,OAAO;AACpB,QAAA,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC;IAExC,IAAI,aAAa,EAAE;QACjB,OAAO,OAAO,CAAC,OAA0B,CAAC;KAC3C;AACH;;ACtDO,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAG7B,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC;AAEnC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AAE3C,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAMxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAMnC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAGpC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAG3B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAG3B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAG3B,MAAM,eAAe,GAAG,CAAC,CAAC;AAG1B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAG3B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAG9B,MAAM,aAAa,GAAG,CAAC,CAAC;AAGxB,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAG5B,MAAM,cAAc,GAAG,CAAC,CAAC;AAGzB,MAAM,cAAc,GAAG,EAAE,CAAC;AAG1B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAG5B,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAG/B,MAAM,cAAc,GAAG,EAAE,CAAC;AAG1B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAG5B,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAGlC,MAAM,aAAa,GAAG,EAAE,CAAC;AAGzB,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAG/B,MAAM,cAAc,GAAG,EAAE,CAAC;AAG1B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAGhC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAG/B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAG/B,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAYtC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAkBjC,MAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;AACpC,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,IAAI,EAAE,CAAC;AACP,IAAA,IAAI,EAAE,CAAC;AACP,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,mBAAmB,EAAE,EAAE;AACvB,IAAA,GAAG,EAAE,EAAE;AACP,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,CAAC,CAAC;AACV,IAAA,MAAM,EAAE,GAAG;AACH,CAAA;;AClIJ,MAAO,SAAU,SAAQ,KAAK,CAAA;AAOlC,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,IAAa,IAAI,GAAA;AACf,QAAA,OAAO,WAAW,CAAC;KACpB;IAED,WAAY,CAAA,OAAe,EAAE,OAA6B,EAAA;AACxD,QAAA,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACzB;IAWM,OAAO,WAAW,CAAC,KAAc,EAAA;QACtC,QACE,KAAK,IAAI,IAAI;YACb,OAAO,KAAK,KAAK,QAAQ;AACzB,YAAA,WAAW,IAAI,KAAK;YACpB,KAAK,CAAC,SAAS,KAAK,IAAI;AAExB,YAAA,MAAM,IAAI,KAAK;AACf,YAAA,SAAS,IAAI,KAAK;YAClB,OAAO,IAAI,KAAK,EAChB;KACH;AACF,CAAA;AAMK,MAAO,gBAAiB,SAAQ,SAAS,CAAA;AAC7C,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,kBAAkB,CAAC;KAC3B;AAED,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,CAAA,uDAAA,EAA0D,kBAAkB,CAAA,IAAA,CAAM,CAAC,CAAC;KAC3F;AACF,CAAA;AAUK,MAAO,gBAAiB,SAAQ,SAAS,CAAA;AAC7C,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,kBAAkB,CAAC;KAC3B;AAED,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;KAChB;AACF,CAAA;AAWK,MAAO,eAAgB,SAAQ,SAAS,CAAA;AAC5C,IAAA,IAAW,IAAI,GAAA;AACb,QAAA,OAAO,iBAAiB,CAAC;KAC1B;AAID,IAAA,WAAA,CAAY,OAAe,EAAE,MAAc,EAAE,OAA6B,EAAA;QACxE,KAAK,CAAC,GAAG,OAAO,CAAA,UAAA,EAAa,MAAM,CAAE,CAAA,EAAE,OAAO,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;KACtB;AACF;;AC1FD,IAAI,gBAA6B,CAAC;AAClC,IAAI,mBAAgC,CAAC;AAQ/B,SAAU,SAAS,CAAC,MAAkB,EAAE,KAAa,EAAE,GAAW,EAAE,KAAc,EAAA;IACtF,IAAI,KAAK,EAAE;AACT,QAAA,gBAAgB,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,QAAA,IAAI;AACF,YAAA,OAAO,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;SAC7D;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,SAAS,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;SACzE;KACF;AACD,IAAA,mBAAmB,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,IAAA,OAAO,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACjE;;SCnBgB,iBAAiB,CAC/B,UAAsB,EACtB,KAAa,EACb,GAAW,EAAA;AAEX,IAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3B,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,MAAM,gBAAgB,GAAG,GAAG,GAAG,KAAK,CAAC;AACrC,IAAA,IAAI,gBAAgB,KAAK,CAAC,EAAE;AAC1B,QAAA,OAAO,EAAE,CAAC;KACX;AAED,IAAA,IAAI,gBAAgB,GAAG,EAAE,EAAE;AACzB,QAAA,OAAO,IAAI,CAAC;KACb;IAED,IAAI,gBAAgB,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;QACrD,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;KAC/C;IAED,IAAI,gBAAgB,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE;QACpF,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;KAC5F;IAED,IACE,gBAAgB,KAAK,CAAC;AACtB,QAAA,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG;AACvB,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;QAC3B,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,EAC3B;QACA,QACE,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAC1C;KACH;IAED,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,IAAI,GAAG,GAAG,EAAE;AACd,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACvB;AAED,IAAA,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC;SAgBe,kBAAkB,CAChC,WAAuB,EACvB,MAAc,EACd,MAAc,EAAA;AAEd,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC,CAAC;AAElC,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE;AAAE,QAAA,OAAO,IAAI,CAAC;IAEpC,IAAI,WAAW,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI,CAAC;IAE7D,KACE,IAAI,UAAU,GAAG,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAC9C,UAAU,GAAG,MAAM,CAAC,MAAM,EAC1B,UAAU,EAAE,EAAE,iBAAiB,EAAE,EACjC;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,IAAI,GAAG,GAAG;AAAE,YAAA,OAAO,IAAI,CAAC;AAE5B,QAAA,WAAW,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;KACvC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB;;ACzEM,SAAU,qBAAqB,CAAC,UAAkB,EAAA;AACtD,IAAA,OAAO,eAAe,CAAC,eAAe,CACpC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC;AAiBD,MAAM,iBAAiB,GAAuC,CAAC,MAAK;AAClE,IAAA,IAAI;AACF,QAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC;KACtC;AAAC,IAAA,MAAM;AACN,QAAA,OAAO,qBAAqB,CAAC;KAC9B;AACH,CAAC,GAAG,CAAC;AAGE,MAAM,eAAe,GAAG;AAC7B,IAAA,iBAAiB,CAAC,eAAwD,EAAA;AACxE,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AACpC,YAAA,OAAO,eAAe,CAAC;SACxB;AAED,QAAA,IAAI,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;AACvC,YAAA,OAAO,MAAM,CAAC,IAAI,CAChB,eAAe,CAAC,MAAM,EACtB,eAAe,CAAC,UAAU,EAC1B,eAAe,CAAC,UAAU,CAC3B,CAAC;SACH;QAED,MAAM,SAAS,GACb,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3F,IACE,SAAS,KAAK,aAAa;AAC3B,YAAA,SAAS,KAAK,mBAAmB;AACjC,YAAA,SAAS,KAAK,sBAAsB;YACpC,SAAS,KAAK,4BAA4B,EAC1C;AACA,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;SACrC;QAED,MAAM,IAAI,SAAS,CAAC,CAA6B,0BAAA,EAAA,MAAM,CAAC,eAAe,CAAC,CAAE,CAAA,CAAC,CAAC;KAC7E;AAED,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC3B;AAED,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACjC;IAED,MAAM,CAAC,CAAa,EAAE,CAAa,EAAA;QACjC,OAAO,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KACvD;AAED,IAAA,eAAe,CAAC,KAAe,EAAA;AAC7B,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3B;AAED,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACtC;AAED,IAAA,QAAQ,CAAC,MAAkB,EAAA;QACzB,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KACrE;AAGD,IAAA,YAAY,CAAC,UAAkB,EAAA;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KAC1C;AAGD,IAAA,UAAU,CAAC,MAAkB,EAAA;QAC3B,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KACrE;AAED,IAAA,OAAO,CAAC,GAAW,EAAA;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAChC;AAED,IAAA,KAAK,CAAC,MAAkB,EAAA;QACtB,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAClE;AAED,IAAA,MAAM,CAAC,MAAkB,EAAE,KAAa,EAAE,GAAW,EAAE,KAAc,EAAA;QACnE,MAAM,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI,EAAE,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AACpF,QAAA,IAAI,UAAU,IAAI,IAAI,EAAE;AACtB,YAAA,OAAO,UAAU,CAAC;SACnB;AAED,QAAA,MAAM,MAAM,GAAG,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACtF,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE;oBACnC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACpC,MAAM;iBACP;aACF;SACF;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AAED,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;KACzC;AAED,IAAA,cAAc,CAAC,MAAkB,EAAE,MAAc,EAAE,UAAkB,EAAA;QACnE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACzE,QAAA,IAAI,iBAAiB,IAAI,IAAI,EAAE;AAC7B,YAAA,OAAO,iBAAiB,CAAC;SAC1B;AAED,QAAA,OAAO,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;KAC/F;AAED,IAAA,WAAW,EAAE,iBAAiB;CAC/B;;AClID,SAAS,aAAa,GAAA;AACpB,IAAA,MAAM,EAAE,SAAS,EAAE,GAAG,UAAkD,CAAC;IACzE,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,OAAO,KAAK,aAAa,CAAC;AAC9E,CAAC;AAGK,SAAU,kBAAkB,CAAC,UAAkB,EAAA;AACnD,IAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAClB,QAAA,MAAM,IAAI,UAAU,CAAC,kDAAkD,UAAU,CAAA,CAAE,CAAC,CAAC;KACtF;AACD,IAAA,OAAO,YAAY,CAAC,eAAe,CACjC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC;AAGD,MAAM,cAAc,GAAuC,CAAC,MAAK;AAC/D,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,UAElB,CAAC;IACF,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,UAAU,EAAE;QAClE,OAAO,CAAC,UAAkB,KAAI;YAG5B,OAAO,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AACnE,SAAC,CAAC;KACH;SAAM;QACL,IAAI,aAAa,EAAE,EAAE;AACnB,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,UAAgE,CAAC;AACrF,YAAA,OAAO,EAAE,IAAI,GACX,0IAA0I,CAC3I,CAAC;SACH;AACD,QAAA,OAAO,kBAAkB,CAAC;KAC3B;AACH,CAAC,GAAG,CAAC;AAEL,MAAM,SAAS,GAAG,aAAa,CAAC;AAGzB,MAAM,YAAY,GAAG;AAC1B,IAAA,iBAAiB,CACf,mBAAsE,EAAA;QAEtE,MAAM,SAAS,GACb,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAEtD,QAAA,IAAI,SAAS,KAAK,YAAY,EAAE;AAC9B,YAAA,OAAO,mBAAiC,CAAC;SAC1C;AAED,QAAA,IAAI,WAAW,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE;YAC3C,OAAO,IAAI,UAAU,CACnB,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAC9B,mBAAmB,CAAC,UAAU,EAC9B,mBAAmB,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAChE,CACF,CAAC;SACH;QAED,IACE,SAAS,KAAK,aAAa;AAC3B,YAAA,SAAS,KAAK,mBAAmB;AACjC,YAAA,SAAS,KAAK,sBAAsB;YACpC,SAAS,KAAK,4BAA4B,EAC1C;AACA,YAAA,OAAO,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAC;SAC5C;QAED,MAAM,IAAI,SAAS,CAAC,CAAiC,8BAAA,EAAA,MAAM,CAAC,mBAAmB,CAAC,CAAE,CAAA,CAAC,CAAC;KACrF;AAED,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,MAAM,IAAI,SAAS,CAAC,CAAwD,qDAAA,EAAA,MAAM,CAAC,IAAI,CAAC,CAAE,CAAA,CAAC,CAAC;SAC7F;AACD,QAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;KAC7B;AAED,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KACpC;IAED,MAAM,CAAC,CAAa,EAAE,CAAa,EAAA;QACjC,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE;AACjC,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AACjB,gBAAA,OAAO,KAAK,CAAC;aACd;SACF;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,eAAe,CAAC,KAAe,EAAA;AAC7B,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC/B;AAED,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5D;AAED,IAAA,QAAQ,CAAC,UAAsB,EAAA;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;KAClD;AAGD,IAAA,YAAY,CAAC,UAAkB,EAAA;AAC7B,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;KACjE;AAGD,IAAA,UAAU,CAAC,UAAsB,EAAA;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACvF;AAED,IAAA,OAAO,CAAC,GAAW,EAAA;AACjB,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,EAAE,CAAC;AAElB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AAChD,YAAA,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC/B,MAAM;aACP;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;gBAChC,MAAM;aACP;AAED,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA,EAAG,UAAU,CAAA,EAAG,WAAW,CAAA,CAAE,EAAE,EAAE,CAAC,CAAC;AACpE,YAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACvB;AAED,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAChC;AAED,IAAA,KAAK,CAAC,UAAsB,EAAA;AAC1B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACpF;AAED,IAAA,MAAM,CAAC,UAAsB,EAAE,KAAa,EAAE,GAAW,EAAE,KAAc,EAAA;QACvE,MAAM,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI,EAAE,GAAG,iBAAiB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AACxF,QAAA,IAAI,UAAU,IAAI,IAAI,EAAE;AACtB,YAAA,OAAO,UAAU,CAAC;SACnB;QAED,OAAO,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;KACjD;AAED,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;KACnD;AAED,IAAA,cAAc,CAAC,UAAsB,EAAE,MAAc,EAAE,UAAkB,EAAA;QACvE,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/C,QAAA,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,UAAU,CAAC;KACzB;AAED,IAAA,WAAW,EAAE,cAAc;CAC5B;;AClJD,MAAM,eAAe,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;AAUtF,MAAM,SAAS,GAAc,eAAe,GAAG,eAAe,GAAG,YAAY;;MCxD9D,SAAS,CAAA;AAK7B,IAAA,KAAK,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,GAAA;AACpC,QAAA,OAAO,kBAAkB,CAAC;KAC3B;AAED,IAAA,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CACxC,KAAc,EACd,OAAiB,EACjB,OAAmB,EAAA;QAEnB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KAC9C;AAWF;;ACDK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;IAwCD,WAAY,CAAA,MAAuB,EAAE,OAAgB,EAAA;AACnD,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IACE,EAAE,MAAM,IAAI,IAAI,CAAC;YACjB,OAAO,MAAM,KAAK,QAAQ;AAC1B,YAAA,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3B,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACzB,YAAA,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACtB;AACA,YAAA,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;SACnF;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,MAAM,CAAC,2BAA2B,CAAC;AAE9D,QAAA,IAAI,MAAM,IAAI,IAAI,EAAE;YAElB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACrD,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;SACnB;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AACjC,kBAAE,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC;AACnC,kBAAE,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;SACxC;KACF;AAOD,IAAA,GAAG,CAAC,SAAkD,EAAA;QAEpD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3D,YAAA,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;SAC7D;aAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAChE,YAAA,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;AAG3E,QAAA,IAAI,WAAmB,CAAC;AACxB,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACvC;AAAM,aAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YACxC,WAAW,GAAG,SAAS,CAAC;SACzB;aAAM;AACL,YAAA,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;SAC5B;QAED,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,GAAG,EAAE;AACxC,YAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;SACjF;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC;SAC5C;aAAM;AACL,YAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC;SAC5C;KACF;IAQD,KAAK,CAAC,QAAwB,EAAE,MAAc,EAAA;AAC5C,QAAA,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;AAG7D,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE;AACrD,YAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAG7B,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;SACxB;AAED,QAAA,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,QAAQ;gBACX,MAAM,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;SAC3F;AAAM,aAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;SAC/C;KACF;IAQD,IAAI,CAAC,QAAgB,EAAE,MAAc,EAAA;AACnC,QAAA,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;AAGvD,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;KACvD;IAGD,KAAK,GAAA;QAEH,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ;cACvC,IAAI,CAAC,MAAM;AACb,cAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC5C;IAGD,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;IAED,MAAM,GAAA;AACJ,QAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;KACnE;AAED,IAAA,QAAQ,CAAC,QAA8C,EAAA;QACrD,IAAI,QAAQ,KAAK,KAAK;AAAE,YAAA,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvF,IAAI,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7F,QAAA,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO;AAC7C,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAChE,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC/D;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAErD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,OAAO;AACL,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO;aACtD,CAAC;SACH;QACD,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA,MAAM,EAAE,YAAY;AACpB,gBAAA,OAAO,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO;AACxD,aAAA;SACF,CAAC;KACH;IAED,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,YAAY,EAAE;AACzC,YAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;SACtD;AAED,QAAA,MAAM,IAAI,SAAS,CACjB,CAAA,iBAAA,EAAoB,IAAI,CAAC,QAAQ,CAAA,iDAAA,EAAoD,MAAM,CAAC,YAAY,CAAA,yBAAA,CAA2B,CACpI,CAAC;KACH;AAGD,IAAA,OAAO,mBAAmB,CAAC,GAAW,EAAE,OAAgB,EAAA;AACtD,QAAA,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;KACpD;AAGD,IAAA,OAAO,gBAAgB,CAAC,MAAc,EAAE,OAAgB,EAAA;AACtD,QAAA,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;KAC1D;AAGD,IAAA,OAAO,gBAAgB,CACrB,GAAyD,EACzD,OAAsB,EAAA;AAEtB,QAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,QAAA,IAAI,IAA4B,CAAC;AACjC,QAAA,IAAI,IAAI,CAAC;AACT,QAAA,IAAI,SAAS,IAAI,GAAG,EAAE;AACpB,YAAA,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG,EAAE;AACvE,gBAAA,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aAC1C;iBAAM;AACL,gBAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE;oBACnC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;oBACnE,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBACjD;aACF;SACF;AAAM,aAAA,IAAI,OAAO,IAAI,GAAG,EAAE;YACzB,IAAI,GAAG,CAAC,CAAC;YACT,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACxC;QACD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,uCAAA,EAA0C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAC;SACtF;QACD,OAAO,IAAI,KAAK,4BAA4B,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACxF;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;AAC3B,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACnD,QAAA,OAAO,CAA2B,wBAAA,EAAA,SAAS,CAAK,EAAA,EAAA,UAAU,GAAG,CAAC;KAC/D;;AA3OuB,MAA2B,CAAA,2BAAA,GAAG,CAAC,CAAC;AAGxC,MAAW,CAAA,WAAA,GAAG,GAAG,CAAC;AAElB,MAAe,CAAA,eAAA,GAAG,CAAC,CAAC;AAEpB,MAAgB,CAAA,gBAAA,GAAG,CAAC,CAAC;AAErB,MAAkB,CAAA,kBAAA,GAAG,CAAC,CAAC;AAEvB,MAAgB,CAAA,gBAAA,GAAG,CAAC,CAAC;AAErB,MAAY,CAAA,YAAA,GAAG,CAAC,CAAC;AAEjB,MAAW,CAAA,WAAA,GAAG,CAAC,CAAC;AAEhB,MAAiB,CAAA,iBAAA,GAAG,CAAC,CAAC;AAEtB,MAAc,CAAA,cAAA,GAAG,CAAC,CAAC;AAEnB,MAAiB,CAAA,iBAAA,GAAG,CAAC,CAAC;AAEtB,MAAoB,CAAA,oBAAA,GAAG,GAAG,CAAC;AA4N7C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,gBAAgB,GAAG,iEAAiE,CAAC;AAMrF,MAAO,IAAK,SAAQ,MAAM,CAAA;AAQ9B,IAAA,WAAA,CAAY,KAAkC,EAAA;AAC5C,QAAA,IAAI,KAAiB,CAAC;AACtB,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;SACzB;AAAM,aAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AAChC,YAAA,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;SACnE;AAAM,aAAA,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,gBAAgB,EAAE;AAC7E,YAAA,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAC5C;AAAM,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SACrC;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CACjB,gLAAgL,CACjL,CAAC;SACH;AACD,QAAA,KAAK,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;KAC5C;AAMD,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAED,IAAI,EAAE,CAAC,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;KACrB;IAMD,WAAW,CAAC,aAAa,GAAG,IAAI,EAAA;QAC9B,IAAI,aAAa,EAAE;YACjB,OAAO;AACL,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5C,gBAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9C,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACb;QACD,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACrC;AAKD,IAAA,QAAQ,CAAC,QAA2B,EAAA;QAClC,IAAI,QAAQ,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9D,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;IAMD,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;AAOD,IAAA,MAAM,CAAC,OAAmC,EAAA;QACxC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,OAAO,YAAY,IAAI,EAAE;AAC3B,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9C;AAED,QAAA,IAAI;AACF,YAAA,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;SACxD;AAAC,QAAA,MAAM;AACN,YAAA,OAAO,KAAK,CAAC;SACd;KACF;IAKD,QAAQ,GAAA;QACN,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;KACjD;AAKD,IAAA,OAAO,QAAQ,GAAA;QACb,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAItD,QAAA,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AACpC,QAAA,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAEpC,QAAA,OAAO,KAAK,CAAC;KACd;IAMD,OAAO,OAAO,CAAC,KAA0C,EAAA;QACvD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SACtC;AAED,QAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,KAAK,CAAC,UAAU,KAAK,gBAAgB,CAAC;SAC9C;AAED,QAAA,QACE,KAAK,CAAC,SAAS,KAAK,QAAQ;AAC5B,YAAA,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;AACpC,YAAA,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,EAAE,EAC9B;KACH;IAMD,OAAgB,mBAAmB,CAAC,SAAiB,EAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AAC/C,QAAA,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;KACzB;IAGD,OAAgB,gBAAgB,CAAC,MAAc,EAAA;QAC7C,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;KAC/C;IAGD,OAAO,eAAe,CAAC,cAAsB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE;AAC3C,YAAA,MAAM,IAAI,SAAS,CACjB,yFAAyF,CAC1F,CAAC;SACH;AACD,QAAA,OAAO,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;KAC5D;IAQD,OAAO,iBAAiB,CAAC,cAAsB,EAAA;AAC7C,QAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC1F;AAQD,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,SAAA,EAAY,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KAC5D;AACF;;ACxcK,MAAO,IAAK,SAAQ,SAAS,CAAA;AACjC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,MAAM,CAAC;KACf;IAYD,WAAY,CAAA,IAAuB,EAAE,KAAuB,EAAA;AAC1D,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC;KAC5B;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;AACtB,YAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC/C;AAED,QAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC5B;IAGD,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SACjD;AAED,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC7B;IAGD,OAAO,gBAAgB,CAAC,GAAiB,EAAA;QACvC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KACxC;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,IAAI,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpD,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;YACtB,gBAAgB,IAAI,IAAI,WAAW,GAAG,IAAI,GAAG,GAAG,CAAG,EAAA,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAE,CAAC;SACnF;QACD,MAAM,aAAa,GAAG,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;QACzD,OAAO,CAAA,SAAA,EAAY,WAAW,GAAG,IAAI,GAAG,EAAE,CAAA,EAAG,gBAAgB,CAAG,EAAA,aAAa,GAAG,IAAI,GAAG,EAAE,CAAA,CAAA,CAAG,CAAC;KAC9F;AACF;;ACtDK,SAAU,WAAW,CAAC,KAAc,EAAA;IACxC,QACE,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,IAAI,KAAK;QACd,KAAK,CAAC,GAAG,IAAI,IAAI;AACjB,QAAA,MAAM,IAAI,KAAK;AACf,QAAA,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;SAE7B,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,EACxE;AACJ,CAAC;AAOK,MAAO,KAAM,SAAQ,SAAS,CAAA;AAClC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,OAAO,CAAC;KAChB;AAYD,IAAA,WAAA,CAAY,UAAkB,EAAE,GAAa,EAAE,EAAW,EAAE,MAAiB,EAAA;AAC3E,QAAA,KAAK,EAAE,CAAC;QAER,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;AACnB,YAAA,UAAU,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;SAC7B;AAED,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACf,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;AACb,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;KAC5B;AAMD,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;KACxB;IAED,IAAI,SAAS,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;KACzB;IAED,MAAM,GAAA;AACJ,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CACrB;YACE,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;AACd,SAAA,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI;AAAE,YAAA,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AACrC,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,GAAc;YACjB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;AAEF,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,CAAC,CAAC;SACV;QAED,IAAI,IAAI,CAAC,EAAE;AAAE,YAAA,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QAC7B,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AAClC,QAAA,OAAO,CAAC,CAAC;KACV;IAGD,OAAO,gBAAgB,CAAC,GAAc,EAAA;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAuB,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;AAChB,QAAA,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KACpD;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;AAE3B,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;AAChC,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;YAC1B,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE;AAC9C,YAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE;SAC/E,CAAC;QAEF,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,cAAc,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5E,OAAO,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;KACxC;AACF;;AC3HK,SAAU,iCAAiC,CAAC,GAAW,EAAA;AAC3D,IAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,QAAA,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;IAC3C,MAAM,oBAAoB,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AAErD,IAAA,IAAI,oBAAoB,IAAI,UAAU,EAAE;QACtC,UAAU,IAAI,CAAC,CAAC;KACjB;IAED,IAAI,sBAAsB,GAAG,KAAK,CAAC;AAEnC,IAAA,OAAO,UAAU,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,EAAE,UAAU,EAAE;QACvE,sBAAsB,GAAG,IAAI,CAAC;KAC/B;IAED,IAAI,CAAC,sBAAsB,EAAE;AAC3B,QAAA,OAAO,oBAAoB,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;KAClD;AAED,IAAA,OAAO,CAAG,EAAA,UAAU,GAAG,GAAG,GAAG,EAAE,CAAG,EAAA,GAAG,CAAC,MAAM,KAAK,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;AAC9F,CAAC;AAQe,SAAA,wBAAwB,CAAC,GAAW,EAAE,KAAc,EAAA;AAClE,IAAA,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;IACpB,MAAM,eAAe,GAAG,sCAAsC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE/E,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAO,IAAA,EAAA,eAAe,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC;AACvC;;ACOA,IAAI,IAAI,GAAgC,SAAS,CAAC;AAMlD,IAAI;AACF,IAAA,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,CAC7B,IAAI,WAAW,CAAC,MAAM,CAEpB,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAC/oC,EACD,EAAE,CACH,CAAC,OAAqC,CAAC;AAC1C,CAAC;AAAC,MAAM;AAER,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/B,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/B,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACvD,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACvD,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,CAAC;AAG1C,MAAM,SAAS,GAA4B,EAAE,CAAC;AAG9C,MAAM,UAAU,GAA4B,EAAE,CAAC;AAE/C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,cAAc,GAAG,6BAA6B,CAAC;AA0B/C,MAAO,IAAK,SAAQ,SAAS,CAAA;AACjC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,MAAM,CAAC;KACf;AAGD,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC;KACb;AAuCD,IAAA,WAAA,CACE,UAAuC,GAAA,CAAC,EACxC,cAAiC,EACjC,QAAkB,EAAA;AAElB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,MAAM,YAAY,GAAG,OAAO,cAAc,KAAK,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9F,QAAA,MAAM,IAAI,GAAG,OAAO,cAAc,KAAK,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC;AACrE,QAAA,MAAM,GAAG,GACP,OAAO,UAAU,KAAK,QAAQ;cAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC;AAC3C,cAAE,OAAO,UAAU,KAAK,QAAQ;kBAC5B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC;AAC3C,kBAAE,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACxE,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;KAC9B;AA6BD,IAAA,OAAO,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAE,QAAkB,EAAA;QACnE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC9C;AAQD,IAAA,OAAO,OAAO,CAAC,KAAa,EAAE,QAAkB,EAAA;AAC9C,QAAA,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC;QAC1B,IAAI,QAAQ,EAAE;YACZ,KAAK,MAAM,CAAC,CAAC;AACb,YAAA,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AACvC,gBAAA,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAC9B,gBAAA,IAAI,SAAS;AAAE,oBAAA,OAAO,SAAS,CAAC;aACjC;YACD,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,YAAA,IAAI,KAAK;AAAE,gBAAA,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACnC,YAAA,OAAO,GAAG,CAAC;SACZ;aAAM;YACL,KAAK,IAAI,CAAC,CAAC;AACX,YAAA,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AAC1C,gBAAA,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7B,gBAAA,IAAI,SAAS;AAAE,oBAAA,OAAO,SAAS,CAAC;aACjC;YACD,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,IAAI,KAAK;AAAE,gBAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAClC,YAAA,OAAO,GAAG,CAAC;SACZ;KACF;AAQD,IAAA,OAAO,UAAU,CAAC,KAAa,EAAE,QAAkB,EAAA;QACjD,IAAI,KAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3D,IAAI,QAAQ,EAAE;YACZ,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACjC,IAAI,KAAK,IAAI,cAAc;gBAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAC7D;aAAM;YACL,IAAI,KAAK,IAAI,CAAC,cAAc;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;AACpD,YAAA,IAAI,KAAK,GAAG,CAAC,IAAI,cAAc;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;SACxD;QACD,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,cAAc,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC1F;AAQD,IAAA,OAAO,UAAU,CAAC,KAAa,EAAE,QAAkB,EAAA;AAEjD,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhD,QAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,IAAI,CACb,MAAM,CAAC,KAAK,GAAG,oBAAoB,CAAC,EACpC,MAAM,CAAC,CAAC,KAAK,IAAI,qBAAqB,IAAI,oBAAoB,CAAC,EAC/D,QAAQ,CACT,CAAC;KACH;AAaO,IAAA,OAAO,WAAW,CAAC,GAAW,EAAE,QAAiB,EAAE,KAAa,EAAA;AACtE,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;AAC1D,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAE1D,QAAA,IAAI,CAAC,CAAC;QACN,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAClE,aAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;SAClE;AAID,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzD,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EACtC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;aACxD;iBAAM;AACL,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAClC,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;aAC7C;SACF;AACD,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC3B,QAAA,OAAO,MAAM,CAAC;KACf;AAsDD,IAAA,OAAO,gBAAgB,CAAC,GAAW,EAAE,eAAkC,EAAE,KAAc,EAAA;QACrF,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YAEvC,CAAC,KAAK,GAAG,eAAe,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC;SACtD;aAAM;AACL,YAAA,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC;SAC9B;QACD,KAAK,KAAK,EAAE,CAAC;AAEb,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACtB,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACpF;QACD,IAAI,CAACA,wBAAoC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YACrD,MAAM,IAAI,SAAS,CAAC,CAAA,QAAA,EAAW,GAAG,CAA4C,yCAAA,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;SACxF;QAGD,MAAM,UAAU,GAAGC,iCAA6C,CAAC,GAAG,CAAC,CAAC;AAGtE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7D,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE;AACrE,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,OAAA,EAAU,GAAG,CAA4B,yBAAA,EAAA,MAAM,CAAC,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAA,aAAA,EAAgB,KAAK,IAAI,IAAI,GAAG,CAAA,YAAA,EAAe,KAAK,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CACnJ,CAAC;SACH;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AA8DD,IAAA,OAAO,UAAU,CAAC,GAAW,EAAE,eAAkC,EAAE,KAAc,EAAA;QAC/E,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YAEvC,CAAC,KAAK,GAAG,eAAe,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC;SACtD;aAAM;AACL,YAAA,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC;SAC9B;QACD,KAAK,KAAK,EAAE,CAAC;QACb,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,EAAE,EAAE;YAE/B,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;AAAM,aAAA,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW,KAAK,KAAK,GAAG,EAAE,EAAE;YAE3F,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC/C;AASD,IAAA,OAAO,SAAS,CAAC,KAAe,EAAE,QAAkB,EAAE,EAAY,EAAA;QAChE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;KACnF;AAQD,IAAA,OAAO,WAAW,CAAC,KAAe,EAAE,QAAkB,EAAA;AACpD,QAAA,OAAO,IAAI,IAAI,CACb,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAChE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAChE,QAAQ,CACT,CAAC;KACH;AAQD,IAAA,OAAO,WAAW,CAAC,KAAe,EAAE,QAAkB,EAAA;AACpD,QAAA,OAAO,IAAI,IAAI,CACb,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAChE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAChE,QAAQ,CACT,CAAC;KACH;IAKD,OAAO,MAAM,CAAC,KAAc,EAAA;QAC1B,QACE,KAAK,IAAI,IAAI;YACb,OAAO,KAAK,KAAK,QAAQ;AACzB,YAAA,YAAY,IAAI,KAAK;AACrB,YAAA,KAAK,CAAC,UAAU,KAAK,IAAI,EACzB;KACH;AAMD,IAAA,OAAO,SAAS,CACd,GAAwE,EACxE,QAAkB,EAAA;QAElB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEnE,OAAO,IAAI,CAAC,QAAQ,CAClB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,OAAO,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,GAAG,CAAC,QAAQ,CACxD,CAAC;KACH;AAGD,IAAA,GAAG,CAAC,MAA0C,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAAE,YAAA,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAI1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;AAE9B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;AACjC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;AAC9B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC;AAEhC,QAAA,IAAI,GAAG,GAAG,CAAC,EACT,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,CAAC;AACV,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;QACjB,GAAG,IAAI,MAAM,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3E;AAMD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;AAMD,IAAA,OAAO,CAAC,KAAyC,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAC/B,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEjE,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;AACvC,aAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;cAC5D,CAAC,CAAC;cACF,CAAC,CAAC;KACP;AAGD,IAAA,IAAI,CAAC,KAAyC,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC5B;AAMD,IAAA,MAAM,CAAC,OAA2C,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,MAAM,EAAE;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAG9D,IAAI,IAAI,EAAE;YAIR,IACE,CAAC,IAAI,CAAC,QAAQ;AACd,gBAAA,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU;AACzB,gBAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAClB,gBAAA,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,EACnB;AAEA,gBAAA,OAAO,IAAI,CAAC;aACb;AACD,YAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAClD,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,CACb,CAAC;AACF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACjE,QAAA,IAAI,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAGlB,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AAC3B,gBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;AAEvE,qBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAC,GAAG,CAAC;qBAChD;oBAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,oBAAA,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACxB,wBAAA,OAAO,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;qBACvD;yBAAM;AACL,wBAAA,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,wBAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,wBAAA,OAAO,GAAG,CAAC;qBACZ;iBACF;aACF;AAAM,iBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACrF,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,IAAI,OAAO,CAAC,UAAU,EAAE;AAAE,oBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/D,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;aACtC;iBAAM,IAAI,OAAO,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AACtE,YAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;SACjB;aAAM;YAGL,IAAI,CAAC,OAAO,CAAC,QAAQ;AAAE,gBAAA,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AACtD,YAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACxC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE1B,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,YAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;SAClB;QAQD,GAAG,GAAG,IAAI,CAAC;AACX,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAGvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAItE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAGtD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvC,YAAA,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC;gBAChB,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACnD,gBAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACpC;YAID,IAAI,SAAS,CAAC,MAAM,EAAE;AAAE,gBAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;AAE7C,YAAA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,YAAA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAC1B;AACD,QAAA,OAAO,GAAG,CAAC;KACZ;AAGD,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAMD,IAAA,MAAM,CAAC,KAAyC,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC;AACvF,YAAA,OAAO,KAAK,CAAC;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC;KAC3D;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3B;IAGD,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;IAGD,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;KACxB;IAGD,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC;KACjB;IAGD,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;KACvB;IAGD,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YAErB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;SAClE;AACD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;AACnD,QAAA,IAAI,GAAW,CAAC;QAChB,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;YAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM;AACnE,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;KAC7C;AAGD,IAAA,WAAW,CAAC,KAAyC,EAAA;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC7B;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;KAChC;AAGD,IAAA,kBAAkB,CAAC,KAAyC,EAAA;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC9B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;KACvC;AAED,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;KACvC;IAGD,MAAM,GAAA;QACJ,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KAC7B;IAGD,UAAU,GAAA;QACR,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;KACxC;IAGD,KAAK,GAAA;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KAC7B;IAGD,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;KACxC;IAGD,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;KAC1C;AAGD,IAAA,QAAQ,CAAC,KAAyC,EAAA;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC7B;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAC7B;AAGD,IAAA,eAAe,CAAC,KAAyC,EAAA;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC9B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KACpC;AAGD,IAAA,MAAM,CAAC,OAA2C,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAG7D,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAClD,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,CACb,CAAC;AACF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;AAED,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;KACjD;AAGD,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAED,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAOD,IAAA,QAAQ,CAAC,UAA8C,EAAA;QACrD,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAGtE,IAAI,IAAI,EAAE;YACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3E,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;QAED,IAAI,UAAU,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AACpF,QAAA,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AAEpF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,UAAU,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;;AAChE,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAC9C;aAAM,IAAI,UAAU,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AAG5E,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5D,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAKjF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;AAE9B,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;AACnC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;AACrC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,KAAK,EAAE,CAAC;AAClC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;AAEpC,QAAA,IAAI,GAAG,GAAG,CAAC,EACT,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,CAAC;AACV,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACrD,GAAG,IAAI,MAAM,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3E;AAGD,IAAA,GAAG,CAAC,UAA8C,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClC;IAGD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QACrE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACjC;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;KACtB;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC5D;AAGD,IAAA,SAAS,CAAC,KAAyC,EAAA;AACjD,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAC9B;AAED,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAC9B;AAKD,IAAA,EAAE,CAAC,KAA6B,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;AAOD,IAAA,SAAS,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,OAAO,IAAI,EAAE,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAClC,IAAI,OAAO,GAAG,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,GAAG,IAAI,OAAO,EACnB,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EACtD,IAAI,CAAC,QAAQ,CACd,CAAC;;YACC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzE;AAGD,IAAA,GAAG,CAAC,OAAsB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAChC;AAOD,IAAA,UAAU,CAAC,OAAsB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,OAAO,IAAI,EAAE,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAClC,IAAI,OAAO,GAAG,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,EACtD,IAAI,CAAC,IAAI,IAAI,OAAO,EACpB,IAAI,CAAC,QAAQ,CACd,CAAC;;AACC,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAChG;AAGD,IAAA,GAAG,CAAC,OAAsB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KACjC;AAOD,IAAA,kBAAkB,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACpD,OAAO,IAAI,EAAE,CAAC;QACd,IAAI,OAAO,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAC1B;AACH,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,OAAO,GAAG,EAAE,EAAE;AAChB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;AACrB,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,EAC5C,IAAI,KAAK,OAAO,EAChB,IAAI,CAAC,QAAQ,CACd,CAAC;aACH;iBAAM,IAAI,OAAO,KAAK,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;;AACnE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtE;KACF;AAGD,IAAA,KAAK,CAAC,OAAsB,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzC;AAED,IAAA,IAAI,CAAC,OAAsB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzC;AAOD,IAAA,QAAQ,CAAC,UAA8C,EAAA;AACrD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;KACnC;AAGD,IAAA,GAAG,CAAC,UAA8C,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClC;IAGD,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;KAClD;IAGD,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,cAAc,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAChF,QAAA,OAAO,IAAI,CAAC,IAAI,GAAG,cAAc,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;KACtD;IAGD,QAAQ,GAAA;AAEN,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;KAChC;AAOD,IAAA,OAAO,CAAC,EAAY,EAAA;AAClB,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;KACjD;IAMD,SAAS,GAAA;QACP,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAClB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO;AACL,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,EAAE,KAAK,EAAE;SACV,CAAC;KACH;IAMD,SAAS,GAAA;QACP,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAClB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO;AACL,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,EAAE,GAAG,IAAI;SACV,CAAC;KACH;IAKD,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KAClD;AAOD,IAAA,QAAQ,CAAC,KAAc,EAAA;AACrB,QAAA,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;AACpB,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,GAAG,CAAC;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YAErB,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AAG3B,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EACtC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EACzB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,gBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAC3D;;gBAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAChD;AAID,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExE,IAAI,GAAG,GAAS,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,EAAE;YACX,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpC,GAAG,GAAG,MAAM,CAAC;AACb,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE;gBAChB,OAAO,MAAM,GAAG,MAAM,CAAC;aACxB;iBAAM;AACL,gBAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,oBAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AAChD,gBAAA,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;aAC/B;SACF;KACF;IAGD,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;AAC/B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACjD;AAGD,IAAA,GAAG,CAAC,KAA6B,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;KACtB;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KACpC;AAOD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KACzC;AACD,IAAA,OAAO,gBAAgB,CACrB,GAA4B,EAC5B,OAAsB,EAAA;AAEtB,QAAA,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAE/D,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,uBAAuB,EAAE;AACpD,YAAA,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACzC,MAAM,IAAI,SAAS,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,WAAW,CAA2B,yBAAA,CAAA,CAAC,CAAC;SACxF;QAED,IAAI,WAAW,EAAE;YAEf,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;SAExC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;SAC9B;AACD,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAA,EAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAChF,QAAA,OAAO,CAAY,SAAA,EAAA,OAAO,CAAG,EAAA,WAAW,GAAG,CAAC;KAC7C;;AA9iCM,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAG1C,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAEzE,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEvB,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE9B,IAAA,CAAA,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtB,IAAI,CAAA,IAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE7B,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3B,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjE,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC;;ACzL5D,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAC5E,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,UAAU,GAAG,EAAE,CAAC;AAGtB,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAC1C;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AAEF,MAAM,mBAAmB,GAAG,SAAS,CAAC,eAAe,CACnD;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AACF,MAAM,mBAAmB,GAAG,SAAS,CAAC,eAAe,CACnD;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AAEF,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAGzC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,eAAe,GAAG,EAAE,CAAC;AAG3B,SAAS,OAAO,CAAC,KAAa,EAAA;IAC5B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC;AAGD,SAAS,UAAU,CAAC,KAAkD,EAAA;AACpE,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAE9B,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;KACvC;AAED,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAE3B,QAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAE1B,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAGD,SAAS,YAAY,CAAC,IAAU,EAAE,KAAW,EAAA;AAC3C,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC7C,IAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC/C,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjD,IAAI,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE5C,IAAA,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC9C,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1C,IAAA,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAGhF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,KAAW,EAAA;AAEvC,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AAC/B,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;AAGjC,IAAA,IAAI,MAAM,GAAG,OAAO,EAAE;AACpB,QAAA,OAAO,IAAI,CAAC;KACb;AAAM,SAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;KACnC;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,OAAe,EAAA;IACjD,MAAM,IAAI,SAAS,CAAC,CAAA,CAAA,EAAI,MAAM,CAAwC,qCAAA,EAAA,OAAO,CAAE,CAAA,CAAC,CAAC;AACnF,CAAC;AAYK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;AAQD,IAAA,WAAA,CAAY,KAA0B,EAAA;AACpC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;SACjD;AAAM,aAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AAC9B,YAAA,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,EAAE;AAC3B,gBAAA,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;aAClE;AACD,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;SAChE;KACF;IAOD,OAAO,UAAU,CAAC,cAAsB,EAAA;AACtC,QAAA,OAAO,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;KACzE;IAoBD,OAAO,sBAAsB,CAAC,cAAsB,EAAA;AAClD,QAAA,OAAO,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;KACxE;AAEO,IAAA,OAAO,WAAW,CAAC,cAAsB,EAAE,OAAmC,EAAA;QAEpF,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QAGzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,YAAY,GAAG,CAAC,CAAC;AAGrB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,SAAS,GAAG,CAAC,CAAC;QAGlB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,IAAI,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpC,IAAI,cAAc,GAAG,CAAC,CAAC;QAGvB,IAAI,KAAK,GAAG,CAAC,CAAC;AAKd,QAAA,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;YACjC,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;SAC7E;QAGD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAGxD,QAAA,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3E,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;SAC7E;QAED,IAAI,WAAW,EAAE;AAIf,YAAA,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAItC,YAAA,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzB,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/B,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAGjC,YAAA,IAAI,CAAC,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,UAAU,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;AAGvF,YAAA,IAAI,CAAC,IAAI,cAAc,KAAK,SAAS;AAAE,gBAAA,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;YAE3F,IAAI,CAAC,KAAK,SAAS,KAAK,OAAO,IAAI,SAAS,CAAC,EAAE;AAC7C,gBAAA,UAAU,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;aACzD;SACF;AAGD,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;YAClE,OAAO,GAAG,IAAI,CAAC;YACf,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC;SAC9C;AAGD,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACpE,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AAClE,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,GAAG,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;aAC/E;AAAM,iBAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACxC,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;aACnC;SACF;AAGD,QAAA,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACtE,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACjC,gBAAA,IAAI,QAAQ;AAAE,oBAAA,UAAU,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;gBAEtE,QAAQ,GAAG,IAAI,CAAC;AAChB,gBAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAClB,SAAS;aACV;AAED,YAAA,IAAI,aAAa,GAAG,UAAU,EAAE;gBAC9B,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,YAAY,EAAE;oBACjD,IAAI,CAAC,YAAY,EAAE;wBACjB,YAAY,GAAG,WAAW,CAAC;qBAC5B;oBAED,YAAY,GAAG,IAAI,CAAC;AAGpB,oBAAA,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7D,oBAAA,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;iBACnC;aACF;AAED,YAAA,IAAI,YAAY;AAAE,gBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACxC,YAAA,IAAI,QAAQ;AAAE,gBAAA,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;AAEhD,YAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;AAC9B,YAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;SACnB;QAED,IAAI,QAAQ,IAAI,CAAC,WAAW;YAC1B,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;AAG9E,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AAElE,YAAA,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAGnE,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YAG3D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAGlC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SACjC;QAGD,IAAI,cAAc,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAI7D,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,GAAG,CAAC,CAAC;YACZ,aAAa,GAAG,CAAC,CAAC;YAClB,iBAAiB,GAAG,CAAC,CAAC;SACvB;aAAM;AACL,YAAA,SAAS,GAAG,aAAa,GAAG,CAAC,CAAC;YAC9B,iBAAiB,GAAG,OAAO,CAAC;AAC5B,YAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;gBAC3B,OACE,cAAc,CACZ,YAAY,GAAG,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAC1E,KAAK,GAAG,EACT;AACA,oBAAA,iBAAiB,GAAG,iBAAiB,GAAG,CAAC,CAAC;iBAC3C;aACF;SACF;AAOD,QAAA,IAAI,QAAQ,IAAI,aAAa,IAAI,aAAa,GAAG,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;YACrE,QAAQ,GAAG,YAAY,CAAC;SACzB;aAAM;AACL,YAAA,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;SACrC;AAGD,QAAA,OAAO,QAAQ,GAAG,YAAY,EAAE;AAE9B,YAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;AAC1B,YAAA,IAAI,SAAS,IAAI,UAAU,EAAE;AAE3B,gBAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;oBAC3B,QAAQ,GAAG,YAAY,CAAC;oBACxB,MAAM;iBACP;AAED,gBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;aACxC;AACD,YAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;SACzB;AAED,QAAA,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,OAAO,QAAQ,GAAG,YAAY,IAAI,aAAa,GAAG,OAAO,EAAE;gBAEzD,IAAI,SAAS,KAAK,CAAC,IAAI,iBAAiB,GAAG,aAAa,EAAE;oBACxD,QAAQ,GAAG,YAAY,CAAC;oBACxB,iBAAiB,GAAG,CAAC,CAAC;oBACtB,MAAM;iBACP;AAED,gBAAA,IAAI,aAAa,GAAG,OAAO,EAAE;AAE3B,oBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;iBACvB;qBAAM;AAEL,oBAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;iBAC3B;AAED,gBAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oBAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACzB;qBAAM;oBAEL,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrC,oBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;wBAC9B,QAAQ,GAAG,YAAY,CAAC;wBACxB,MAAM;qBACP;AACD,oBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBACxC;aACF;AAID,YAAA,IAAI,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE;gBACrC,IAAI,WAAW,GAAG,WAAW,CAAC;gBAK9B,IAAI,QAAQ,EAAE;AACZ,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;AAChC,oBAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;iBAC/B;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;AAChC,oBAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;iBAC/B;AAED,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9E,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,gBAAA,IAAI,UAAU,IAAI,CAAC,EAAE;oBACnB,QAAQ,GAAG,CAAC,CAAC;AACb,oBAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,wBAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/C,wBAAA,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;4BAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;gCACnC,QAAQ,GAAG,CAAC,CAAC;gCACb,MAAM;6BACP;yBACF;qBACF;iBACF;gBAED,IAAI,QAAQ,EAAE;oBACZ,IAAI,IAAI,GAAG,SAAS,CAAC;AAErB,oBAAA,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;wBACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACtB,4BAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAGjB,4BAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,gCAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oCAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;AACxB,oCAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iCAClB;qCAAM;AACL,oCAAA,OAAO,IAAI,UAAU,CAAC,UAAU,GAAG,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;iCAC/E;6BACF;yBACF;6BAAM;4BACL,MAAM;yBACP;qBACF;iBACF;aACF;SACF;aAAM;YACL,OAAO,QAAQ,GAAG,YAAY,IAAI,aAAa,GAAG,OAAO,EAAE;AAEzD,gBAAA,IAAI,SAAS,KAAK,CAAC,EAAE;AACnB,oBAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;wBAC3B,QAAQ,GAAG,YAAY,CAAC;wBACxB,MAAM;qBACP;AAED,oBAAA,UAAU,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;iBAClD;AAED,gBAAA,IAAI,aAAa,GAAG,OAAO,EAAE;AAC3B,oBAAA,IACE,cAAc,CAAC,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG;wBACxE,iBAAiB,KAAK,CAAC,EACvB;AACA,wBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;qBAChD;AAED,oBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;iBACvB;qBAAM;AACL,oBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAC3B,wBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;qBAChD;AAED,oBAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;iBAC3B;AAED,gBAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oBAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACzB;qBAAM;AACL,oBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBACxC;aACF;AAID,YAAA,IAAI,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE;gBAIrC,IAAI,QAAQ,EAAE;AACZ,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;iBACjC;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;iBACjC;AAED,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE9E,gBAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,oBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;iBAChD;aACF;SACF;AAID,QAAA,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAGpC,QAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;AAC3B,YAAA,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACrC;AAAM,aAAA,IAAI,SAAS,GAAG,EAAE,EAAE;YACzB,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjC,YAAA,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE;AAChC,gBAAA,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,gBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpE;SACF;aAAM;YACL,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAElD,OAAO,IAAI,IAAI,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE;AACrC,gBAAA,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,gBAAA,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtE;YAED,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEjD,YAAA,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE;AAChC,gBAAA,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,gBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpE;SACF;AAED,QAAA,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzF,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEtD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE;AAC7C,YAAA,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7D;AAGD,QAAA,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;QAC1C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AAGlE,QAAA,IACE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC1F;YAEA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,YAAA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CACpB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAC3E,CAAC;YACF,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SAC/E;aAAM;YACL,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;SAChF;AAED,QAAA,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;QAG1B,IAAI,UAAU,EAAE;AACd,YAAA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC;SAChE;QAGD,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,GAAG,CAAC,CAAC;AAIV,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;AAC5C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AACtC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAI9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AACtC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACvC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAC/C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAG/C,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;KAC/B;IAED,QAAQ,GAAA;AAKN,QAAA,IAAI,eAAe,CAAC;QAEpB,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAE3B,QAAA,MAAM,WAAW,GAAG,IAAI,KAAK,CAAS,EAAE,CAAC,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhE,IAAI,KAAK,GAAG,CAAC,CAAC;QAGd,IAAI,OAAO,GAAG,KAAK,CAAC;AAGpB,QAAA,IAAI,eAAe,CAAC;AAEpB,QAAA,IAAI,cAAc,GAAgD,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAE1F,IAAI,CAAC,EAAE,CAAC,CAAC;QAGT,MAAM,MAAM,GAAa,EAAE,CAAC;QAG5B,KAAK,GAAG,CAAC,CAAC;AAGV,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAI1B,QAAA,MAAM,GAAG,GACP,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAI/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAG/F,KAAK,GAAG,CAAC,CAAC;AAGV,QAAA,MAAM,GAAG,GAAG;AACV,YAAA,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;SAC3B,CAAC;QAEF,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAChC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAClB;QAID,MAAM,WAAW,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,gBAAgB,CAAC;AAEpD,QAAA,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,EAAE;AAE1B,YAAA,IAAI,WAAW,KAAK,oBAAoB,EAAE;gBACxC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;aACrC;AAAM,iBAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AAC1C,gBAAA,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,aAAa,CAAC;AAC/C,gBAAA,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;aAChD;SACF;aAAM;YACL,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;YACtC,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,aAAa,CAAC;SAChD;AAGD,QAAA,MAAM,QAAQ,GAAG,eAAe,GAAG,aAAa,CAAC;QAOjD,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,eAAe,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;AAC5E,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC/B,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC/B,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAE9B,QAAA,IACE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC7B,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAC7B;YACA,OAAO,GAAG,IAAI,CAAC;SAChB;aAAM;YACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,gBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAC1C,gBAAA,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,gBAAA,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAI9B,gBAAA,IAAI,CAAC,YAAY;oBAAE,SAAS;gBAE5B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;oBAEvB,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,GAAG,EAAE,CAAC;oBAE3C,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;iBAC9C;aACF;SACF;QAMD,IAAI,OAAO,EAAE;YACX,kBAAkB,GAAG,CAAC,CAAC;AACvB,YAAA,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACxB;aAAM;YACL,kBAAkB,GAAG,EAAE,CAAC;AACxB,YAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AAC1B,gBAAA,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AAC5C,gBAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACnB;SACF;AAGD,QAAA,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC;AAS9D,QAAA,IAAI,mBAAmB,IAAI,EAAE,IAAI,mBAAmB,IAAI,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE;AAM1E,YAAA,IAAI,kBAAkB,GAAG,EAAE,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;gBACpB,IAAI,QAAQ,GAAG,CAAC;AAAE,oBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAA,CAAE,CAAC,CAAC;qBAC1C,IAAI,QAAQ,GAAG,CAAC;AAAE,oBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAA,CAAE,CAAC,CAAC;AACnD,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;YAED,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;AACvC,YAAA,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC;YAE5C,IAAI,kBAAkB,EAAE;AACtB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;AAED,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE;gBAC3C,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;aACxC;AAGD,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjB,YAAA,IAAI,mBAAmB,GAAG,CAAC,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAA,CAAE,CAAC,CAAC;aACxC;iBAAM;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAA,CAAE,CAAC,CAAC;aACvC;SACF;aAAM;AAEL,YAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE;oBAC3C,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;iBACxC;aACF;iBAAM;AACL,gBAAA,IAAI,cAAc,GAAG,kBAAkB,GAAG,QAAQ,CAAC;AAGnD,gBAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;wBACvC,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;qBACxC;iBACF;qBAAM;AACL,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClB;AAED,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEjB,gBAAA,OAAO,cAAc,EAAE,GAAG,CAAC,EAAE;AAC3B,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClB;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC7E,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;iBACxC;aACF;SACF;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACxB;IAED,MAAM,GAAA;QACJ,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5C;IAGD,cAAc,GAAA;QACZ,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5C;IAGD,OAAO,gBAAgB,CAAC,GAAuB,EAAA;QAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;KAClD;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,CAAG,CAAC;KACxC;AACF;;ACv0BK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;AAQD,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAK,KAAiB,YAAY,MAAM,EAAE;AACxC,YAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACzB;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;KACrB;IAeD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,SAAS,CAAC,UAAU,KAAK,CAAA,iCAAA,CAAmC,CAAC,CAAC;SACzE;AACD,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE;AAC1B,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,qBAAA,CAAuB,CAAC,CAAC;SAC9D;AACD,QAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,wBAAA,CAA0B,CAAC,CAAC;SACjD;AACD,QAAA,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,2CAAA,CAA6C,CAAC,CAAC;SACpF;AACD,QAAA,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;KACjC;IAOD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED,IAAA,QAAQ,CAAC,KAAc,EAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACnC;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;AAED,QAAA,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAGxC,YAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;SAClC;QAED,OAAO;AACL,YAAA,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;SAC5F,CAAC;KACH;AAGD,IAAA,OAAO,gBAAgB,CAAC,GAAmB,EAAE,OAAsB,EAAA;QACjE,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAClD,QAAA,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;KAC3E;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,WAAA,EAAc,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KACtD;AACF;;ACjGK,MAAO,KAAM,SAAQ,SAAS,CAAA;AAClC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,OAAO,CAAC;KAChB;AAQD,IAAA,WAAA,CAAY,KAAsB,EAAA;AAChC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAK,KAAiB,YAAY,MAAM,EAAE;AACxC,YAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACzB;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;KACzB;IAeD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,YAAY,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;AAE9D,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnC,QAAA,IAAI,cAAc,GAAG,YAAY,EAAE;AACjC,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,4CAAA,CAA8C,CAAC,CAAC;SACrF;AAAM,aAAA,IAAI,cAAc,GAAG,YAAY,EAAE;AACxC,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACtF;aAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;AAC9C,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,uBAAA,CAAyB,CAAC,CAAC;SAChE;AAAM,aAAA,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,YAAY,EAAE;AAEnD,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,6BAAA,CAA+B,CAAC,CAAC;SACtE;AACD,QAAA,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;KAChC;IAOD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED,IAAA,QAAQ,CAAC,KAAc,EAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACnC;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACtE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC9C;AAGD,IAAA,OAAO,gBAAgB,CAAC,GAAkB,EAAE,OAAsB,EAAA;QAChE,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KAC9F;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,UAAA,EAAa,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KACrD;AACF;;ACxFK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACvB;AAGD,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO,IAAI,MAAM,EAAE,CAAC;KACrB;IAED,OAAO,GAAA;AACL,QAAA,OAAO,cAAc,CAAC;KACvB;AACF;;AClBK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACvB;AAGD,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO,IAAI,MAAM,EAAE,CAAC;KACrB;IAED,OAAO,GAAA;AACL,QAAA,OAAO,cAAc,CAAC;KACvB;AACF;;AC9BD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAClC,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAGd,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AA8BlC,MAAM,WAAW,GAAgB;IACtC,qBAAqB,CAAC,MAAkB,EAAE,MAAc,EAAA;QACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,UAAU,CAAC,sCAAsC,MAAM,CAAA,CAAE,CAAC,CAAC;SACtE;AACD,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;aACb,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;aACxB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAC1B;KACH;IAGD,UAAU,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC3C,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;aACb,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;aACxB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAC1B;KACH;IAGD,WAAW,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC5C,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;AACd,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;AACxB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK;YAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,EAC7B;KACH;IAGD,WAAW,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC5C,QAAA,QACE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAClB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;AACxB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK;AAC1B,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,EACzB;KACH;IAGD,aAAa,CAAC,MAAkB,EAAE,MAAc,EAAA;QAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAMvD,QAAA,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;KAChD;AAGD,IAAA,YAAY,EAAE,WAAW;AACvB,UAAE,CAAC,MAAkB,EAAE,MAAc,KAAI;YACrC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;AACH,UAAE,CAAC,MAAkB,EAAE,MAAc,KAAI;YACrC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;AAGL,IAAA,UAAU,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAC/D,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAC5B,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,UAAU,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAC/D,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QAC5B,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAChC,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,aAAa,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAElE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC,CAAC;QAGvC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;AACpC,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACzB,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAQ7B,QAAA,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC;AACpD,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAE7B,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,YAAY,EAAE,WAAW;UACrB,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,KAAI;AACzD,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,YAAA,OAAO,CAAC,CAAC;SACV;UACD,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,KAAI;AACzD,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,YAAA,OAAO,CAAC,CAAC;SACV;CACN;;AChMD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAG1D,IAAI,cAAc,GAAsB,IAAI,CAAC;AAmBvC,MAAO,QAAS,SAAQ,SAAS,CAAA;AACrC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,UAAU,CAAC;KACnB;AAwDD,IAAA,WAAA,CAAY,OAAgE,EAAA;AAC1E,QAAA,KAAK,EAAE,CAAC;AAER,QAAA,IAAI,SAAS,CAAC;QACd,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE;AAC7D,YAAA,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;AACrE,gBAAA,MAAM,IAAI,SAAS,CAAC,qEAAqE,CAAC,CAAC;aAC5F;YACD,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE;gBACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;aACtD;iBAAM;AACL,gBAAA,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;aACxB;SACF;aAAM;YACL,SAAS,GAAG,OAAO,CAAC;SACrB;QAGD,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAGtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,SAAS,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;SACxF;AAAM,aAAA,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,EAAE;YAEvE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;SACtD;AAAM,aAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACxC,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBAChE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;aAC5C;iBAAM;AACL,gBAAA,MAAM,IAAI,SAAS,CACjB,4EAA4E,CAC7E,CAAC;aACH;SACF;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;SAC7E;AAED,QAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACtC;KACF;AAMD,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAED,IAAI,EAAE,CAAC,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,QAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpC;KACF;IAGD,WAAW,GAAA;QACT,IAAI,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE;YACxC,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACzC,YAAA,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;SACvB;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAMO,IAAA,OAAO,MAAM,GAAA;AACnB,QAAA,QAAQ,QAAQ,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,EAAE;KAC3D;IAOD,OAAO,QAAQ,CAAC,IAAa,EAAA;AAC3B,QAAA,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE;AAC5B,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;SACtC;AAED,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAG5C,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAGxC,QAAA,IAAI,cAAc,KAAK,IAAI,EAAE;AAC3B,YAAA,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SAC3C;QAGD,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AAG9B,QAAA,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE/B,QAAA,OAAO,MAAM,CAAC;KACf;AAMD,IAAA,QAAQ,CAAC,QAA2B,EAAA;QAElC,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;IAGD,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;IAGO,OAAO,EAAE,CAAC,QAAiB,EAAA;QACjC,QACE,QAAQ,IAAI,IAAI;YAChB,OAAO,QAAQ,KAAK,QAAQ;AAC5B,YAAA,WAAW,IAAI,QAAQ;AACvB,YAAA,QAAQ,CAAC,SAAS,KAAK,UAAU,EACjC;KACH;AAOD,IAAA,MAAM,CAAC,OAA4D,EAAA;QACjE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;AAC7C,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;AACxB,YAAA,QACE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EACvF;SACH;AAED,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;SACrD;AAED,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE;AAC5E,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC;SAC1F;AAED,QAAA,OAAO,KAAK,CAAC;KACd;IAGD,YAAY,GAAA;AACV,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACrD,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3C,QAAA,OAAO,SAAS,CAAC;KAClB;AAGD,IAAA,OAAO,QAAQ,GAAA;QACb,OAAO,IAAI,QAAQ,EAAE,CAAC;KACvB;IAGD,aAAa,CAAC,UAAsB,EAAE,KAAa,EAAA;QACjD,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,OAAO,EAAE,CAAC;KACX;IAOD,OAAO,cAAc,CAAC,IAAY,EAAA;QAChC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAAE,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE5C,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAExC,QAAA,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC7B;IAOD,OAAO,mBAAmB,CAAC,SAAiB,EAAA;AAC1C,QAAA,IAAI,SAAS,EAAE,MAAM,KAAK,EAAE,EAAE;AAC5B,YAAA,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;SACzD;QAED,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;KACnD;IAGD,OAAO,gBAAgB,CAAC,MAAc,EAAA;AACpC,QAAA,IAAI,MAAM,EAAE,MAAM,KAAK,EAAE,EAAE;AACzB,YAAA,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;SAC5D;QAED,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;KACnD;IAMD,OAAO,OAAO,CAAC,EAA0D,EAAA;QACvE,IAAI,EAAE,IAAI,IAAI;AAAE,YAAA,OAAO,KAAK,CAAC;AAE7B,QAAA,IAAI;AACF,YAAA,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjB,YAAA,OAAO,IAAI,CAAC;SACb;AAAC,QAAA,MAAM;AACN,YAAA,OAAO,KAAK,CAAC;SACd;KACF;IAGD,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;KACvC;IAGD,OAAO,gBAAgB,CAAC,GAAqB,EAAA;AAC3C,QAAA,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC/B;AAOD,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,aAAA,EAAgB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KAChE;;AApUc,QAAA,CAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;;SC5B7C,2BAA2B,CACzC,MAAgB,EAChB,kBAA4B,EAC5B,eAAyB,EAAA;AAEzB,IAAA,IAAI,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;AAExB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,WAAW,IAAI,gBAAgB,CAC7B,CAAC,CAAC,QAAQ,EAAE,EACZ,MAAM,CAAC,CAAC,CAAC,EACT,kBAAkB,EAClB,IAAI,EACJ,eAAe,CAChB,CAAC;SACH;KACF;SAAM;AAGL,QAAA,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE;AACxC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;SAC1B;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,WAAW,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;SAC/F;KACF;AAED,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAGD,SAAS,gBAAgB,CACvB,IAAY,EAEZ,KAAU,EACV,kBAAkB,GAAG,KAAK,EAC1B,OAAO,GAAG,KAAK,EACf,eAAe,GAAG,KAAK,EAAA;AAGvB,IAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,QAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;KACxB;IAED,QAAQ,OAAO,KAAK;AAClB,QAAA,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1F,QAAA,KAAK,QAAQ;AACX,YAAA,IACE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;gBAC3B,KAAK,IAAIC,UAAoB;AAC7B,gBAAA,KAAK,IAAIC,UAAoB,EAC7B;AACA,gBAAA,IAAI,KAAK,IAAIC,cAAwB,IAAI,KAAK,IAAIC,cAAwB,EAAE;oBAE1E,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;iBAC1E;qBAAM;oBACL,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;iBAC1E;aACF;iBAAM;gBAEL,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AACH,QAAA,KAAK,WAAW;YACd,IAAI,OAAO,IAAI,CAAC,eAAe;gBAC7B,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrE,YAAA,OAAO,CAAC,CAAC;AACX,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3E,QAAA,KAAK,QAAQ;YACX,IACE,KAAK,IAAI,IAAI;AACb,gBAAA,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;AACnC,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKC,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACxF,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACpE;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aAC3E;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AAAM,iBAAA,IACL,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;AACzB,gBAAA,KAAK,YAAY,WAAW;AAC5B,gBAAA,gBAAgB,CAAC,KAAK,CAAC,EACvB;AACA,gBAAA,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,EACxF;aACH;AAAM,iBAAA,IACL,KAAK,CAAC,SAAS,KAAK,MAAM;gBAC1B,KAAK,CAAC,SAAS,KAAK,QAAQ;AAC5B,gBAAA,KAAK,CAAC,SAAS,KAAK,WAAW,EAC/B;gBACA,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aAC3E;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;AAErC,gBAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9D,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBACtD,CAAC;wBACD,CAAC;wBACD,CAAC;wBACD,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAC/C,CAAC;wBACD,2BAA2B,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAC7E;iBACH;qBAAM;oBACL,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBACtD,CAAC;wBACD,CAAC;wBACD,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC/C,wBAAA,CAAC,EACD;iBACH;aACF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,MAAM,MAAM,GAAW,KAAK,CAAC;gBAE7B,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACjD,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,yBAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACjC;iBACH;qBAAM;AACL,oBAAA,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACvF;iBACH;aACF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;oBACrC,CAAC;oBACD,CAAC;AACD,oBAAA,CAAC,EACD;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAEtC,gBAAA,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC;oBACE,IAAI,EAAE,KAAK,CAAC,UAAU;oBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;AACf,iBAAA,EACD,KAAK,CAAC,MAAM,CACb,CAAC;AAGF,gBAAA,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;AACpB,oBAAA,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;iBAClC;gBAED,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;oBACD,2BAA2B,CAAC,cAAc,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAChF;aACH;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;oBACtC,CAAC;qBACA,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;qBACrB,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;qBACzB,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;AACzB,oBAAA,CAAC,EACD;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;oBACvC,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;AACvC,oBAAA,CAAC,EACD;aACH;iBAAM;gBACL,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,oBAAA,2BAA2B,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;AACvE,oBAAA,CAAC,EACD;aACH;AACH,QAAA,KAAK,UAAU;YACb,IAAI,kBAAkB,EAAE;gBACtB,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;oBACD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1C,oBAAA,CAAC,EACD;aACH;KACJ;AAED,IAAA,OAAO,CAAC,CAAC;AACX;;AC7MA,SAAS,WAAW,CAAC,GAAW,EAAA;AAC9B,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAqBK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;IAQD,WAAY,CAAA,OAAe,EAAE,OAAgB,EAAA;AAC3C,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAE1C,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,sDAAA,EAAyD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CACxF,CAAC;SACH;AACD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,qDAAA,EAAwD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CACvF,CAAC;SACH;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IACE,EACE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBACvB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CACxB,EACD;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,+BAAA,EAAkC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAoB,kBAAA,CAAA,CAAC,CAAC;aAC5F;SACF;KACF;IAED,OAAO,YAAY,CAAC,OAAgB,EAAA;QAClC,OAAO,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;KACzD;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SACzD;AACD,QAAA,OAAO,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;KACjF;IAGD,OAAO,gBAAgB,CAAC,GAAkD,EAAA;AACxE,QAAA,IAAI,QAAQ,IAAI,GAAG,EAAE;AACnB,YAAA,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE;gBAElC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,YAAY,EAAE;AACzC,oBAAA,OAAO,GAA4B,CAAC;iBACrC;aACF;iBAAM;AACL,gBAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC1E;SACF;AACD,QAAA,IAAI,oBAAoB,IAAI,GAAG,EAAE;YAC/B,OAAO,IAAI,UAAU,CACnB,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CACxD,CAAC;SACH;AACD,QAAA,MAAM,IAAI,SAAS,CAAC,CAAA,yCAAA,EAA4C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAC;KACxF;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;AAC5D,QAAA,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,KAAK,cAAc,CAAC;AAC3B,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvD,QAAA,OAAO,CAAkB,eAAA,EAAA,OAAO,CAAK,EAAA,EAAA,KAAK,GAAG,CAAC;KAC/C;AACF;;ACpGK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;AAMD,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;KACpB;IAGD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;KAChC;IAGD,OAAO,gBAAgB,CAAC,GAAuB,EAAA;AAC7C,QAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACpC;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,eAAA,EAAkB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KAC1D;AACF;;ACtCM,MAAM,yBAAyB,GACpC,IAAuC,CAAC;AAcpC,MAAO,SAAU,SAAQ,yBAAyB,CAAA;AACtD,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,WAAW,CAAC;KACpB;AAgBD,IAAA,WAAA,CAAY,GAA8D,EAAA;AACxE,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SACnB;AAAM,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAClC,YAAA,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SAClB;AAAM,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAChC;AAAM,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;YAC9D,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;AAC3F,gBAAA,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;aACvF;YACD,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;AAC3F,gBAAA,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;aACvF;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAC5B,gBAAA,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;aACtF;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAC5B,gBAAA,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;aACtF;AACD,YAAA,IAAI,CAAC,GAAG,UAAW,EAAE;AACnB,gBAAA,MAAM,IAAI,SAAS,CACjB,kFAAkF,CACnF,CAAC;aACH;AACD,YAAA,IAAI,CAAC,GAAG,UAAW,EAAE;AACnB,gBAAA,MAAM,IAAI,SAAS,CACjB,kFAAkF,CACnF,CAAC;aACH;AAED,YAAA,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SACnB;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CACjB,qFAAqF,CACtF,CAAC;SACH;KACF;IAED,MAAM,GAAA;QACJ,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC5B,CAAC;KACH;IAGD,OAAO,OAAO,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACjD;IAGD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACpD;AAQD,IAAA,OAAO,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAA;AAC/C,QAAA,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;KACnD;AAQD,IAAA,OAAO,UAAU,CAAC,GAAW,EAAE,QAAgB,EAAA;AAC7C,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;KAC5D;IAGD,cAAc,GAAA;QACZ,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;KAClE;IAGD,OAAO,gBAAgB,CAAC,GAAsB,EAAA;QAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;cACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,EAAE;AACvC,cAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;cACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,EAAE;AACvC,cAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAChC;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;AAC3B,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAsB,mBAAA,EAAA,CAAC,CAAQ,KAAA,EAAA,CAAC,KAAK,CAAC;KAC9C;;AAjHe,SAAA,CAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB;;AC8CrD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAACH,UAAoB,CAAC,CAAC;AAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAACD,UAAoB,CAAC,CAAC;SAE9C,mBAAmB,CACjC,MAAkB,EAClB,OAA2B,EAC3B,OAAiB,EAAA;AAEjB,IAAA,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC;AACzC,IAAA,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnD,IAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACZ,QAAA,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAA,CAAE,CAAC,CAAC;KAC3D;IAED,IAAI,OAAO,CAAC,gCAAgC,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE;QACpE,MAAM,IAAI,SAAS,CAAC,CAAiB,cAAA,EAAA,MAAM,CAAC,MAAM,CAAyB,sBAAA,EAAA,IAAI,CAAE,CAAA,CAAC,CAAC;KACpF;IAED,IAAI,CAAC,OAAO,CAAC,gCAAgC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,SAAS,CAAC,CAAiB,cAAA,EAAA,MAAM,CAAC,MAAM,CAAuB,oBAAA,EAAA,IAAI,CAAE,CAAA,CAAC,CAAC;KAClF;IAED,IAAI,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,IAAI,SAAS,CACjB,CAAA,WAAA,EAAc,IAAI,CAAA,iBAAA,EAAoB,KAAK,CAAA,0BAAA,EAA6B,MAAM,CAAC,UAAU,CAAA,CAAA,CAAG,CAC7F,CAAC;KACH;IAGD,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE;AAClC,QAAA,MAAM,IAAI,SAAS,CACjB,6EAA6E,CAC9E,CAAC;KACH;IAGD,OAAO,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,SAAS,iBAAiB,CACxB,MAAkB,EAClB,KAAa,EACb,OAA2B,EAC3B,OAAO,GAAG,KAAK,EAAA;AAEf,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAGnF,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAG5D,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;AAG9F,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;AACvD,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;AAClD,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;AACpD,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;AAEjD,IAAA,IAAI,WAAW,IAAI,CAAC,aAAa,EAAE;AACjC,QAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;KACrF;AAED,IAAA,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;KACrF;IAGD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAGpF,IAAI,mBAAmB,GAAG,IAAI,CAAC;AAE/B,IAAA,IAAI,iBAA0B,CAAC;AAE/B,IAAA,IAAI,WAAW,CAAC;AAGhB,IAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC;AAC1C,IAAA,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE;QAC1C,iBAAiB,GAAG,iBAAiB,CAAC;KACvC;SAAM;QACL,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,EAAA;AAC3E,YAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;SACjE;QACD,IAAI,OAAO,oBAAoB,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;AAChD,YAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;SACrF;AACD,QAAA,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAE5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,iBAAiB,CAAC,EAAE;AACnE,YAAA,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;SAC7F;KACF;IAGD,IAAI,CAAC,mBAAmB,EAAE;AACxB,QAAA,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAExB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAChD,YAAA,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SACtB;KACF;IAGD,MAAM,UAAU,GAAG,KAAK,CAAC;AAGzB,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAGlF,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,CAAC;IAGX,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAGlF,MAAM,MAAM,GAAa,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;IAE3C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC;IAEnB,IAAI,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;IAG7C,OAAO,CAAC,IAAI,EAAE;AAEZ,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAGpC,IAAI,WAAW,KAAK,CAAC;YAAE,MAAM;QAG7B,IAAI,CAAC,GAAG,KAAK,CAAC;AAEd,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,YAAA,CAAC,EAAE,CAAC;SACL;AAGD,QAAA,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAGtF,MAAM,IAAI,GAAG,OAAO,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAGhF,IAAI,iBAAiB,GAAG,IAAI,CAAC;QAC7B,IAAI,mBAAmB,IAAI,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;YACjD,iBAAiB,GAAG,iBAAiB,CAAC;SACvC;aAAM;YACL,iBAAiB,GAAG,CAAC,iBAAiB,CAAC;SACxC;QAED,IAAI,eAAe,KAAK,KAAK,IAAK,IAAe,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5D,YAAA,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;SACzD;AACD,QAAA,IAAI,KAAK,CAAC;AAEV,QAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAEd,QAAA,IAAI,WAAW,KAAKK,gBAA0B,EAAE;YAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACnF,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,aAAuB,EAAE;YAClD,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACxD,YAAA,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1B,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;SACpB;aAAM,IAAI,WAAW,KAAKC,aAAuB,IAAI,aAAa,KAAK,KAAK,EAAE;AAC7E,YAAA,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKA,aAAuB,EAAE;YAClD,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,aAAa,KAAK,KAAK;AAAE,gBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3D,KAAK,IAAI,CAAC,CAAC;AAEX,YAAA,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC1D;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAC5C,gBAAA,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACpD,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;SAC/B;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEzD,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;AACvD,gBAAA,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;YAG9D,IAAI,GAAG,EAAE;gBACP,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;aACjD;iBAAM;gBACL,IAAI,aAAa,GAAG,OAAO,CAAC;gBAC5B,IAAI,CAAC,mBAAmB,EAAE;AACxB,oBAAA,aAAa,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;iBACzE;gBACD,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;aACjE;AAED,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,eAAyB,EAAE;YACpD,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,YAAY,GAAuB,OAAO,CAAC;AAG/C,YAAA,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAGrC,YAAA,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;gBACpC,YAAY,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;aAC1C;YAED,IAAI,CAAC,mBAAmB,EAAE;AACxB,gBAAA,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;aAC7E;YACD,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9D,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAE3B,YAAA,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAClF,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;SACtE;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YACxD,KAAK,GAAG,SAAS,CAAC;SACnB;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,KAAK,GAAG,IAAI,CAAC;SACd;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,IAAI,WAAW,EAAE;gBACf,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,CAAC;aACZ;iBAAM;gBAEL,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3D,KAAK,IAAI,CAAC,CAAC;gBAEX,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEzC,gBAAA,IAAI,YAAY,IAAI,aAAa,KAAK,IAAI,EAAE;oBAC1C,KAAK;wBACH,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAC/E,8BAAE,IAAI,CAAC,QAAQ,EAAE;8BACf,IAAI,CAAC;iBACZ;qBAAM;oBACL,KAAK,GAAG,IAAI,CAAC;iBACd;aACF;SACF;AAAM,aAAA,IAAI,WAAW,KAAKC,oBAA8B,EAAE;YAEzD,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAE1D,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAEnB,YAAA,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;SAC/B;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAGhC,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;AAGnF,YAAA,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU;AAChC,gBAAA,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;AAGpE,YAAA,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE;AAE3B,gBAAA,IAAI,OAAO,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACzC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC;oBACX,IAAI,UAAU,GAAG,CAAC;AAChB,wBAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;AAClF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;AACrF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;iBACvF;AAED,gBAAA,IAAI,cAAc,IAAI,aAAa,EAAE;AACnC,oBAAA,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;iBAC9E;qBAAM;AACL,oBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,oBAAA,IAAI,OAAO,KAAKC,4BAAsC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7E,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;qBACxB;iBACF;aACF;iBAAM;AAEL,gBAAA,IAAI,OAAO,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACzC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC;oBACX,IAAI,UAAU,GAAG,CAAC;AAChB,wBAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;AAClF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;AACrF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;iBACvF;AAED,gBAAA,IAAI,cAAc,IAAI,aAAa,EAAE;AACnC,oBAAA,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBAE7C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;wBAC/B,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;qBAC9B;iBACF;qBAAM;AACL,oBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,oBAAA,IAAI,OAAO,KAAKA,4BAAsC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7E,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;qBACxB;iBACF;aACF;AAGD,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;aAAM,IAAI,WAAW,KAAKC,gBAA0B,IAAI,UAAU,KAAK,KAAK,EAAE;YAE7E,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAEzD,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAChE,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAGrD,YAAA,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzC,gBAAA,QAAQ,aAAa,CAAC,CAAC,CAAC;AACtB,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;AACR,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;AACR,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;iBACT;aACF;AAED,YAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;SACnD;aAAM,IAAI,WAAW,KAAKA,gBAA0B,IAAI,UAAU,KAAK,IAAI,EAAE;YAE5E,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAChE,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;SAC/C;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC1F,YAAA,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AACxD,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YACxD,KAAK,GAAG,IAAI,SAAS,CAAC;gBACpB,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;gBACzC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;AAC9C,aAAA,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;SACtB;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;SACtB;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,MAAM,EACN,KAAK,EACL,KAAK,GAAG,UAAU,GAAG,CAAC,EACtB,iBAAiB,CAClB,CAAC;AAEF,YAAA,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC;AAGjC,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,sBAAgC,EAAE;YAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC;YAGX,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC7B,gBAAA,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;aAChF;YAGD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YAEX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AAGD,YAAA,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,MAAM,EACN,KAAK,EACL,KAAK,GAAG,UAAU,GAAG,CAAC,EACtB,iBAAiB,CAClB,CAAC;AAEF,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAE3B,MAAM,MAAM,GAAG,KAAK,CAAC;YAErB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzD,YAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAEtE,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAG3B,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE;AAC/C,gBAAA,MAAM,IAAI,SAAS,CAAC,wDAAwD,CAAC,CAAC;aAC/E;YAGD,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE;AAC/C,gBAAA,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;aAClF;YAED,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;SAC/C;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YAExD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YAEX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC;AAEpC,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;AAEnD,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAE7F,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAG3B,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9D,YAAA,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AAGpC,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;YAGnB,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;SACnC;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,2BAAA,EAA8B,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,CAAG,CACjF,CAAC;SACH;AACD,QAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,YAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE;gBAClC,KAAK;AACL,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC,CAAC;SACJ;aAAM;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;SACtB;KACF;AAGD,IAAA,IAAI,IAAI,KAAK,KAAK,GAAG,UAAU,EAAE;AAC/B,QAAA,IAAI,OAAO;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;AACvD,QAAA,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;KAC5C;AAGD,IAAA,IAAI,CAAC,eAAe;AAAE,QAAA,OAAO,MAAM,CAAC;AAEpC,IAAA,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAuB,CAAC;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;AAChB,QAAA,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KAC7D;AAED,IAAA,OAAO,MAAM,CAAC;AAChB;;AClmBA,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;AAQnE,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGrB,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,GAAG,CAAC,CAAC;AACzC,IAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAEhE,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAEhD,IAAA,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;AAEzB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IACpF,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,IAAI,GACR,CAAC,cAAc;AACf,QAAA,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAC3B,KAAK,IAAIF,cAAwB;QACjC,KAAK,IAAID,cAAwB;UAC7BK,aAAuB;AACzB,UAAEC,gBAA0B,CAAC;AAEjC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,IAAI,IAAI,KAAKD,aAAuB,EAAE;QACpC,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KACvD;SAAM;QACL,KAAK,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KACzD;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IACpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGQ,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAE1E,KAAK,IAAI,oBAAoB,CAAC;AAC9B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,CAAU,EAAE,KAAa,EAAA;IAE/E,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAG3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAc,EAAE,KAAa,EAAA;IAEtF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGJ,iBAA2B,CAAC;AAE9C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAW,EAAE,KAAa,EAAA;IAEhF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAGpB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,IAAA,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;AACzC,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAE3C,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGU,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QACtD,MAAM,IAAI,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,8BAA8B,CAAC,CAAC;KAC/E;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEvB,IAAI,KAAK,CAAC,UAAU;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,SAAS;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAG5C,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AACvB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAE5F,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGA,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAGpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QAGvC,MAAM,IAAI,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,8BAA8B,CAAC,CAAC;KAClF;AAGD,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9D,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAEvE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AACvB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAsB,EAAE,KAAa,EAAA;AAE7F,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;QAClB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGL,cAAwB,CAAC;KAC5C;AAAM,SAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;QACvC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGQ,iBAA2B,CAAC;KAC/C;SAAM;QACL,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,iBAA2B,CAAC;KAC/C;AAGD,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAe,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGjB,aAAuB,CAAC;AAE1C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAG5C,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGW,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAE1B,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGU,2BAAqC,CAAC;AAExD,IAAA,IAAI,IAAI,IAAI,EAAE,EAAE;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;KAC7D;SAAM;AACL,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AACrB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,MAAkB,EAClB,GAAW,EACX,KAAe,EACf,KAAa,EACb,SAAkB,EAClB,KAAa,EACb,kBAA2B,EAC3B,eAAwB,EACxB,IAAmB,EAAA;AAEnB,IAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnB,QAAA,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;KAClE;AAED,IAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAGhB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAGf,eAAyB,GAAGD,gBAA0B,CAAC;AAEhG,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AAEF,IAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnB,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAC5F,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGK,oBAA8B,CAAC;AAEjD,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AAAE,QAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,KAAK,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAW,EAAE,KAAa,EAAA;IAEhF,MAAM,CAAC,KAAK,EAAE,CAAC;AACb,QAAA,KAAK,CAAC,SAAS,KAAK,MAAM,GAAGD,cAAwB,GAAGM,mBAA6B,CAAC;AAExF,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;AACnC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAErC,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAqB,EAAE,KAAa,EAAA;AAC3F,IAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAExB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGd,aAAuB,CAAC;AAE1C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,gBAA0B,CAAC;AAG7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAGpB,IAAA,KAAK,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAE9D,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAe,EAAE,KAAa,EAAA;IACxF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGgB,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;AAGxC,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE7E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CACpB,MAAkB,EAClB,GAAW,EACX,KAAW,EACX,KAAa,EACb,SAAS,GAAG,KAAK,EACjB,KAAK,GAAG,CAAC,EACT,kBAAkB,GAAG,KAAK,EAC1B,eAAe,GAAG,IAAI,EACtB,IAAmB,EAAA;IAEnB,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;QAElD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,sBAAgC,CAAC;AAEnD,QAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,QAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAGpB,IAAI,UAAU,GAAG,KAAK,CAAC;AAIvB,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;AAElC,QAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAElB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEjF,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAErC,QAAA,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;QAG7B,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,SAAS,EACT,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AACF,QAAA,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AAGrB,QAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;QAGxC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEpE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;KACrB;SAAM;QACL,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAE3C,QAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,QAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAEpB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE7C,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAE7E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;KACrB;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGP,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAE1B,IAAA,IAAI,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAE1B,IAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB;AAAE,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IAElE,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IAGjC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;KACtD;AAED,IAAA,IAAI,IAAI,IAAI,EAAE,EAAE;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5D;SAAM;AACL,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC/B,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGG,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,MAAkB,EAClB,GAAW,EACX,KAAY,EACZ,KAAa,EACb,KAAa,EACb,kBAA2B,EAC3B,IAAmB,EAAA;IAGnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGT,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAA,IAAI,MAAM,GAAc;AACtB,QAAA,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;QACzC,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;AAEF,IAAA,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;AACpB,QAAA,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;KACvB;IAED,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,IAAI,EACJ,IAAI,CACL,CAAC;AAGF,IAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;IAEnC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAE1D,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC;SAEe,aAAa,CAC3B,MAAkB,EAClB,MAAgB,EAChB,SAAkB,EAClB,aAAqB,EACrB,KAAa,EACb,kBAA2B,EAC3B,eAAwB,EACxB,IAA0B,EAAA;AAE1B,IAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAEhB,QAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAGlB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAEjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,OAAO,CAAC,CAAC;SACV;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;SAC9E;AACD,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,YAAA,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;SAChF;aAAM,IAAI,WAAW,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE;AACxE,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACtE;aAAM,IACL,MAAM,CAAC,MAAM,CAAC;YACd,QAAQ,CAAC,MAAM,CAAC;YAChB,YAAY,CAAC,MAAM,CAAC;AACpB,YAAA,gBAAgB,CAAC,MAAM,CAAC,EACxB;AACA,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,kEAAA,CAAoE,CAAC,CAAC;SAC3F;AAED,QAAA,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;KAClB;AAGD,IAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAGjB,IAAA,IAAI,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;AAG9B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAEzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,GAAG,GAAG,CAAG,EAAA,CAAC,EAAE,CAAC;AACnB,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAGtB,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAED,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;gBACrC,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBAC9B,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzB,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBAC/D,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKP,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;SAAM,IAAI,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;AACjD,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,OAAO,CAAC,IAAI,EAAE;AAEZ,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC9B,YAAA,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAEpB,YAAA,IAAI,IAAI;gBAAE,SAAS;YAGnB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3B,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAGD,YAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAG1B,YAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACnD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;oBAG7B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,8BAA8B,CAAC,CAAC;iBACpE;gBAED,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;wBAClB,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,0BAA0B,CAAC,CAAC;qBAChE;AAAM,yBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC5B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,CAAC;qBAC7D;iBACF;aACF;AAED,YAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrB,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBAC7B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,eAAe,KAAK,KAAK,CAAC,EAAE;gBAC/E,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBACvD,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKA,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAChE,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;SAAM;AACL,QAAA,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE;AAExC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAChD,gBAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;aACjE;SACF;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAExB,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAGD,YAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAG1B,YAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACnD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;oBAG7B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,8BAA8B,CAAC,CAAC;iBACpE;gBAED,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;wBAClB,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,0BAA0B,CAAC,CAAC;qBAChE;AAAM,yBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC5B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,CAAC;qBAC7D;iBACF;aACF;AAED,YAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrB,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBAC7B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBAC9B,IAAI,eAAe,KAAK,KAAK;oBAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACjF;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzB,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBACvD,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKA,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAChE,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;AAGD,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAGpB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAGvB,IAAA,MAAM,IAAI,GAAG,KAAK,GAAG,aAAa,CAAC;IAEnC,aAAa,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrE,IAAA,OAAO,KAAK,CAAC;AACf;;ACn3BA,SAAS,UAAU,CAAC,KAAc,EAAA;IAChC,QACE,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,WAAW,IAAI,KAAK;AACpB,QAAA,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EACnC;AACJ,CAAC;AAID,MAAM,YAAY,GAAG;AACnB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,cAAc,EAAE,UAAU;AAC1B,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,kBAAkB,EAAE,UAAU;AAC9B,IAAA,UAAU,EAAE,SAAS;CACb,CAAC;AAGX,SAAS,gBAAgB,CAAC,KAAU,EAAE,UAAwB,EAAE,EAAA;AAC9D,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAE7B,MAAM,YAAY,GAAG,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,CAAC;QACxE,MAAM,YAAY,GAAG,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,CAAC;QAExE,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AACrC,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAEpD,IAAI,YAAY,EAAE;AAChB,gBAAA,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AAEvB,oBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;iBACtB;AACD,gBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC/B;SACF;AAGD,QAAA,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1B;AAGD,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK,CAAC;IAG7D,IAAI,KAAK,CAAC,UAAU;AAAE,QAAA,OAAO,IAAI,CAAC;AAElC,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CACpC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CACV,CAAC;AACnC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;KAClD;AAED,IAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAExB,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBACvD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;gBACnD,MAAM,IAAI,gBAAgB,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;SAClF;aAAM;YACL,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,iBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/C,iBAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBAC9D,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;gBACnD,MAAM,IAAI,gBAAgB,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;SAClF;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC9C;AAED,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KACrC;IAED,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE;AAC1C,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QAIhD,IAAI,CAAC,YAAY,KAAK;AAAE,YAAA,OAAO,CAAC,CAAC;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,GAAG,IAAI,CAAC;AACjB,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,IAAG;AACrB,YAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC;AAC9D,SAAC,CAAC,CAAC;AAGH,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;KAC7C;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,SAAS,cAAc,CAAC,KAAY,EAAE,OAA8B,EAAA;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,KAAa,KAAI;AAC7C,QAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAS,MAAA,EAAA,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AACxE,QAAA,IAAI;AACF,YAAA,OAAO,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;SACnC;gBAAS;AACR,YAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;SAC3B;AACH,KAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAU,EAAA;AAC9B,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAElC,OAAO,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC9E,CAAC;AAGD,SAAS,cAAc,CAAC,KAAU,EAAE,OAA8B,EAAA;IAChE,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;QACxC,MAAM,GAAG,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE;AAC1B,YAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,gBAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;aACjE;AACD,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;KACrC;AAED,IAAA,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI,EAAE;AAChF,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,KAAK;AACtB,iBAAA,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;iBACf,GAAG,CAAC,IAAI,IAAI,CAAG,EAAA,IAAI,MAAM,CAAC;iBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,YAAY,GAChB,MAAM;gBACN,KAAK;qBACF,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;qBAClC,GAAG,CAAC,IAAI,IAAI,CAAG,EAAA,IAAI,MAAM,CAAC;qBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACxC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CACvB,YAAY,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CACpE,CAAC;YAEF,MAAM,IAAI,SAAS,CACjB,2CAA2C;AACzC,gBAAA,CAAA,IAAA,EAAO,WAAW,CAAG,EAAA,WAAW,GAAG,YAAY,CAAA,EAAG,OAAO,CAAI,EAAA,CAAA;AAC7D,gBAAA,CAAA,IAAA,EAAO,YAAY,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,CAAG,CACpC,CAAC;SACH;AACD,QAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;KACjE;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI,CAAC;IAErC,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,EAE7B,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,eAAe,CAAC;AAEtD,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO;kBAC7B,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE;kBAC1B,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;SACpC;AACD,QAAA,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO;cAC7B,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE;AAChC,cAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5D;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AACvE,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAEpD,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,EAAE;gBACtD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;aACzC;YACD,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,EAAE;gBAEtD,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;aAC1C;SACF;QACD,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5E;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAE7B,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC7D;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;KAEzC;IAED,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC9C,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;aAClB;SACF;QAED,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,QAAA,OAAO,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACnC;AAED,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACzF,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,kBAAkB,GAAG;AACzB,IAAA,MAAM,EAAE,CAAC,CAAS,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC;AACxD,IAAA,IAAI,EAAE,CAAC,CAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AAC5C,IAAA,KAAK,EAAE,CAAC,CAAQ,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAClF,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,IAAA,MAAM,EAAE,CAAC,CAAS,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,IAAA,KAAK,EAAE,CAAC,CAAQ,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,IAAA,IAAI,EAAE,CACJ,CAIC,KAED,IAAI,CAAC,QAAQ,CAEX,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAC9B,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAChC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CACzC;AACH,IAAA,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE;AAC1B,IAAA,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE;IAC1B,QAAQ,EAAE,CAAC,CAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;AAC1C,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AACnE,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,IAAA,SAAS,EAAE,CAAC,CAAY,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;CACtD,CAAC;AAGX,SAAS,iBAAiB,CAAC,GAAQ,EAAE,OAA8B,EAAA;AACjE,IAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAE1F,IAAA,MAAM,QAAQ,GAA0B,GAAG,CAAC,SAAS,CAAC;AACtD,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;QAEnC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,YAAA,IAAI;gBACF,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACjD,gBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,oBAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE;wBAChC,KAAK;AACL,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,YAAY,EAAE,IAAI;AACnB,qBAAA,CAAC,CAAC;iBACJ;qBAAM;AACL,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;iBACpB;aACF;oBAAS;AACR,gBAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;aAC3B;SACF;AACD,QAAA,OAAO,IAAI,CAAC;KACb;SAAM,IACL,GAAG,IAAI,IAAI;QACX,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,kBAAkB,EAC5D;QACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;KAC9B;AAAM,SAAA,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;QAG1B,IAAI,MAAM,GAAQ,GAAG,CAAC;AACtB,QAAA,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU,EAAE;YAK/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,SAAS,CAAC,qCAAqC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;aAC5E;AACD,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;SACzB;QAGD,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE;AACvC,YAAA,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;SACvE;aAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE;AAC7C,YAAA,MAAM,GAAG,IAAI,KAAK,CAChB,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAC1C,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EACnC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAClC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACvC,CAAC;SACH;AAED,QAAA,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACvC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,uCAAuC,GAAG,OAAO,QAAQ,CAAC,CAAC;KAChF;AACH,CAAC;AAmBD,SAAS,KAAK,CAAC,IAAY,EAAE,OAAsB,EAAA;AACjD,IAAA,MAAM,YAAY,GAAG;AACnB,QAAA,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK;AAC1C,QAAA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;AACjC,QAAA,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK;KACjC,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,KAAI;QACrC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAC9B,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,4DAAA,EAA+D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAE,CAAA,CACrF,CAAC;SACH;AACD,QAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC/C,KAAC,CAAC,CAAC;AACL,CAAC;AAyBD,SAAS,SAAS,CAEhB,KAAU,EAEV,QAA6F,EAC7F,KAAuB,EACvB,OAAsB,EAAA;IAEtB,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC9C,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;KACX;AACD,IAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAChF,OAAO,GAAG,QAAQ,CAAC;QACnB,QAAQ,GAAG,SAAS,CAAC;QACrB,KAAK,GAAG,CAAC,CAAC;KACX;AACD,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE;QAChF,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACrD,KAAA,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAA4C,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC;AASD,SAAS,cAAc,CAAC,KAAU,EAAE,OAAsB,EAAA;AACxD,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AASD,SAAS,gBAAgB,CAAC,KAAe,EAAE,OAAsB,EAAA;AAC/D,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAGK,MAAA,KAAK,GAKP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;AAC5B,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;AACjC,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;ACldpB,SAAS,OAAO,CAAC,MAAkB,EAAE,MAAc,EAAA;AACjD,IAAA,IAAI;QACF,OAAO,WAAW,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1D;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;KAC9E;AACH,CAAC;AAOD,SAAS,QAAQ,CAAC,KAAiB,EAAE,MAAc,EAAA;IACjD,IAAI,oBAAoB,GAAG,MAAM,CAAC;IAElC,OAAO,KAAK,CAAC,oBAAoB,CAAC,KAAK,IAAI,EAAE,oBAAoB,EAAE;QAAC,CAAC;IAErE,IAAI,oBAAoB,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAE7C,QAAA,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;KAChE;AAED,IAAA,OAAO,oBAAoB,CAAC;AAC9B,CAAC;SAMe,eAAe,CAC7B,KAAiB,EACjB,cAA6B,CAAC,EAAA;IAE9B,WAAW,KAAK,CAAC,CAAC;AAElB,IAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,IAAI,eAAe,CACvB,CAAuC,oCAAA,EAAA,KAAK,CAAC,MAAM,CAAQ,MAAA,CAAA,EAC3D,WAAW,CACZ,CAAC;KACH;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE;AAC7C,QAAA,MAAM,IAAI,eAAe,CACvB,CAAA,qBAAA,EAAwB,YAAY,CAAA,qCAAA,EAAwC,KAAK,CAAC,MAAM,CAAA,OAAA,CAAS,EACjG,WAAW,CACZ,CAAC;KACH;IAED,IAAI,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;KAC1F;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;AACnC,IAAA,IAAI,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC;AAE7B,IAAA,OAAO,MAAM,IAAI,YAAY,GAAG,WAAW,EAAE;AAC3C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,CAAC;AAEZ,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,YAAA,IAAI,MAAM,GAAG,WAAW,KAAK,YAAY,EAAE;AACzC,gBAAA,MAAM,IAAI,eAAe,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;aAC7D;YACD,MAAM;SACP;QAED,MAAM,UAAU,GAAG,MAAM,CAAC;QAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC;AACxD,QAAA,MAAM,IAAI,UAAU,GAAG,CAAC,CAAC;AAEzB,QAAA,IAAI,MAAc,CAAC;AAEnB,QAAA,IACE,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAAyB,EAAA;AAC7B,YAAA,IAAI,KAAyB,CAAA;YAC7B,IAAI,KAAA,EAA8B,EAClC;YACA,MAAM,GAAG,CAAC,CAAC;SACZ;aAAM,IAAI,IAAI,KAAwB,EAAA,EAAE;YACvC,MAAM,GAAG,CAAC,CAAC;SACZ;aAAM,IAAI,IAAI,KAA6B,CAAA,EAAE;YAC5C,MAAM,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,IAAI,KAA4B,EAAA,EAAE;YAC3C,MAAM,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,IAAI,KAAyB,CAAA,EAAE;YACxC,MAAM,GAAG,CAAC,CAAC;SACZ;AAAM,aAAA,IACL,IAAI,KAAyB,EAAA;AAC7B,YAAA,IAAI,KAA8B,CAAA;AAClC,YAAA,IAAI,KAA2B,GAAA;YAC/B,IAAI,KAAA,GAA2B,EAC/B;YACA,MAAM,GAAG,CAAC,CAAC;SACZ;aAEI,IAAI,IAAI,KAA0B,EAAA,EAAE;AACvC,YAAA,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;SACpE;AAAM,aAAA,IACL,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAA0B,CAAA;YAC9B,IAAI,KAAA,EAAwC,EAC5C;AACA,YAAA,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACjC;AAAM,aAAA,IACL,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAA4B,CAAA;AAChC,YAAA,IAAI,KAA8B,EAAA;AAClC,YAAA,IAAI,KAA+B,EAAA;YACnC,IAAI,KAAA,EAA2B,EAC/B;YACA,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,IAAI,KAA4B,CAAA,EAAE;gBAEpC,MAAM,IAAI,CAAC,CAAC;aACb;YACD,IAAI,IAAI,KAA8B,EAAA,EAAE;gBAEtC,MAAM,IAAI,EAAE,CAAC;aACd;SACF;aAAM;YACL,MAAM,IAAI,eAAe,CACvB,CAAA,UAAA,EAAa,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAY,UAAA,CAAA,EAC3D,MAAM,CACP,CAAC;SACH;AAED,QAAA,IAAI,MAAM,GAAG,YAAY,EAAE;AACzB,YAAA,MAAM,IAAI,eAAe,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAC;SAChF;AAED,QAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,MAAM,CAAC;KAClB;AAED,IAAA,OAAO,QAAQ,CAAC;AAClB;;ACpKM,MAAA,QAAQ,GAAa,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AAE/C,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;AAC3C,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;AAC/B,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;AAEnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;;ACqCvB,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAGjC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAQnC,SAAU,qBAAqB,CAAC,IAAY,EAAA;AAEhD,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE;AACxB,QAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KACnC;AACH,CAAC;SASe,SAAS,CAAC,MAAgB,EAAE,UAA4B,EAAE,EAAA;AAExE,IAAA,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;AACrF,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;AAChF,IAAA,MAAM,qBAAqB,GACzB,OAAO,OAAO,CAAC,qBAAqB,KAAK,QAAQ,GAAG,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC;AAG9F,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,qBAAqB,EAAE;AACzC,QAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;KACpD;IAGD,MAAM,kBAAkB,GAAG,aAAa,CACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,CAAC,EACD,CAAC,EACD,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;IAGF,MAAM,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAGpE,IAAA,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;AAG9D,IAAA,OAAO,cAAc,CAAC;AACxB,CAAC;AAWK,SAAU,2BAA2B,CACzC,MAAgB,EAChB,WAAuB,EACvB,UAA4B,EAAE,EAAA;AAG9B,IAAA,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;AACrF,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;AAChF,IAAA,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAGzE,MAAM,kBAAkB,GAAG,aAAa,CACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,CAAC,EACD,CAAC,EACD,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AAEF,IAAA,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;AAGpE,IAAA,OAAO,UAAU,GAAG,kBAAkB,GAAG,CAAC,CAAC;AAC7C,CAAC;SASe,WAAW,CAAC,MAAkB,EAAE,UAA8B,EAAE,EAAA;IAC9E,OAAO,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;SAee,mBAAmB,CACjC,MAAgB,EAChB,UAAsC,EAAE,EAAA;AAExC,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AAExB,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAEhF,OAAO,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;AAClF,CAAC;AAce,SAAA,iBAAiB,CAC/B,IAA8B,EAC9B,UAAkB,EAClB,iBAAyB,EACzB,SAAqB,EACrB,aAAqB,EACrB,OAA2B,EAAA;AAE3B,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC,EAAE,gCAAgC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EACpD,OAAO,CACR,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAErD,IAAI,KAAK,GAAG,UAAU,CAAC;AAEvB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;QAE1C,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAEvD,QAAA,eAAe,CAAC,KAAK,GAAG,KAAK,CAAC;AAE9B,QAAA,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAEhF,QAAA,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;KACtB;AAGD,IAAA,OAAO,KAAK,CAAC;AACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/user-service/node_modules/bson/lib/bson.mjs b/user-service/node_modules/bson/lib/bson.mjs new file mode 100644 index 0000000000..c4ab0982f8 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.mjs @@ -0,0 +1,4387 @@ +function isAnyArrayBuffer(value) { + return ['[object ArrayBuffer]', '[object SharedArrayBuffer]'].includes(Object.prototype.toString.call(value)); +} +function isUint8Array(value) { + return Object.prototype.toString.call(value) === '[object Uint8Array]'; +} +function isRegExp(d) { + return Object.prototype.toString.call(d) === '[object RegExp]'; +} +function isMap(d) { + return Object.prototype.toString.call(d) === '[object Map]'; +} +function isDate(d) { + return Object.prototype.toString.call(d) === '[object Date]'; +} +function defaultInspect(x, _options) { + return JSON.stringify(x, (k, v) => { + if (typeof v === 'bigint') { + return { $numberLong: `${v}` }; + } + else if (isMap(v)) { + return Object.fromEntries(v); + } + return v; + }); +} +function getStylizeFunction(options) { + const stylizeExists = options != null && + typeof options === 'object' && + 'stylize' in options && + typeof options.stylize === 'function'; + if (stylizeExists) { + return options.stylize; + } +} + +const BSON_MAJOR_VERSION = 6; +const BSON_INT32_MAX = 0x7fffffff; +const BSON_INT32_MIN = -0x80000000; +const BSON_INT64_MAX = Math.pow(2, 63) - 1; +const BSON_INT64_MIN = -Math.pow(2, 63); +const JS_INT_MAX = Math.pow(2, 53); +const JS_INT_MIN = -Math.pow(2, 53); +const BSON_DATA_NUMBER = 1; +const BSON_DATA_STRING = 2; +const BSON_DATA_OBJECT = 3; +const BSON_DATA_ARRAY = 4; +const BSON_DATA_BINARY = 5; +const BSON_DATA_UNDEFINED = 6; +const BSON_DATA_OID = 7; +const BSON_DATA_BOOLEAN = 8; +const BSON_DATA_DATE = 9; +const BSON_DATA_NULL = 10; +const BSON_DATA_REGEXP = 11; +const BSON_DATA_DBPOINTER = 12; +const BSON_DATA_CODE = 13; +const BSON_DATA_SYMBOL = 14; +const BSON_DATA_CODE_W_SCOPE = 15; +const BSON_DATA_INT = 16; +const BSON_DATA_TIMESTAMP = 17; +const BSON_DATA_LONG = 18; +const BSON_DATA_DECIMAL128 = 19; +const BSON_DATA_MIN_KEY = 0xff; +const BSON_DATA_MAX_KEY = 0x7f; +const BSON_BINARY_SUBTYPE_DEFAULT = 0; +const BSON_BINARY_SUBTYPE_UUID_NEW = 4; +const BSONType = Object.freeze({ + double: 1, + string: 2, + object: 3, + array: 4, + binData: 5, + undefined: 6, + objectId: 7, + bool: 8, + date: 9, + null: 10, + regex: 11, + dbPointer: 12, + javascript: 13, + symbol: 14, + javascriptWithScope: 15, + int: 16, + timestamp: 17, + long: 18, + decimal: 19, + minKey: -1, + maxKey: 127 +}); + +class BSONError extends Error { + get bsonError() { + return true; + } + get name() { + return 'BSONError'; + } + constructor(message, options) { + super(message, options); + } + static isBSONError(value) { + return (value != null && + typeof value === 'object' && + 'bsonError' in value && + value.bsonError === true && + 'name' in value && + 'message' in value && + 'stack' in value); + } +} +class BSONVersionError extends BSONError { + get name() { + return 'BSONVersionError'; + } + constructor() { + super(`Unsupported BSON version, bson types must be from bson ${BSON_MAJOR_VERSION}.x.x`); + } +} +class BSONRuntimeError extends BSONError { + get name() { + return 'BSONRuntimeError'; + } + constructor(message) { + super(message); + } +} +class BSONOffsetError extends BSONError { + get name() { + return 'BSONOffsetError'; + } + constructor(message, offset, options) { + super(`${message}. offset: ${offset}`, options); + this.offset = offset; + } +} + +let TextDecoderFatal; +let TextDecoderNonFatal; +function parseUtf8(buffer, start, end, fatal) { + if (fatal) { + TextDecoderFatal ??= new TextDecoder('utf8', { fatal: true }); + try { + return TextDecoderFatal.decode(buffer.subarray(start, end)); + } + catch (cause) { + throw new BSONError('Invalid UTF-8 string in BSON document', { cause }); + } + } + TextDecoderNonFatal ??= new TextDecoder('utf8', { fatal: false }); + return TextDecoderNonFatal.decode(buffer.subarray(start, end)); +} + +function tryReadBasicLatin(uint8array, start, end) { + if (uint8array.length === 0) { + return ''; + } + const stringByteLength = end - start; + if (stringByteLength === 0) { + return ''; + } + if (stringByteLength > 20) { + return null; + } + if (stringByteLength === 1 && uint8array[start] < 128) { + return String.fromCharCode(uint8array[start]); + } + if (stringByteLength === 2 && uint8array[start] < 128 && uint8array[start + 1] < 128) { + return String.fromCharCode(uint8array[start]) + String.fromCharCode(uint8array[start + 1]); + } + if (stringByteLength === 3 && + uint8array[start] < 128 && + uint8array[start + 1] < 128 && + uint8array[start + 2] < 128) { + return (String.fromCharCode(uint8array[start]) + + String.fromCharCode(uint8array[start + 1]) + + String.fromCharCode(uint8array[start + 2])); + } + const latinBytes = []; + for (let i = start; i < end; i++) { + const byte = uint8array[i]; + if (byte > 127) { + return null; + } + latinBytes.push(byte); + } + return String.fromCharCode(...latinBytes); +} +function tryWriteBasicLatin(destination, source, offset) { + if (source.length === 0) + return 0; + if (source.length > 25) + return null; + if (destination.length - offset < source.length) + return null; + for (let charOffset = 0, destinationOffset = offset; charOffset < source.length; charOffset++, destinationOffset++) { + const char = source.charCodeAt(charOffset); + if (char > 127) + return null; + destination[destinationOffset] = char; + } + return source.length; +} + +function nodejsMathRandomBytes(byteLength) { + return nodeJsByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const nodejsRandomBytes = await (async () => { + try { + return (await import('crypto')).randomBytes; + } + catch { + return nodejsMathRandomBytes; + } +})(); +const nodeJsByteUtils = { + toLocalBufferType(potentialBuffer) { + if (Buffer.isBuffer(potentialBuffer)) { + return potentialBuffer; + } + if (ArrayBuffer.isView(potentialBuffer)) { + return Buffer.from(potentialBuffer.buffer, potentialBuffer.byteOffset, potentialBuffer.byteLength); + } + const stringTag = potentialBuffer?.[Symbol.toStringTag] ?? Object.prototype.toString.call(potentialBuffer); + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return Buffer.from(potentialBuffer); + } + throw new BSONError(`Cannot create Buffer from ${String(potentialBuffer)}`); + }, + allocate(size) { + return Buffer.alloc(size); + }, + allocateUnsafe(size) { + return Buffer.allocUnsafe(size); + }, + equals(a, b) { + return nodeJsByteUtils.toLocalBufferType(a).equals(b); + }, + fromNumberArray(array) { + return Buffer.from(array); + }, + fromBase64(base64) { + return Buffer.from(base64, 'base64'); + }, + toBase64(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('base64'); + }, + fromISO88591(codePoints) { + return Buffer.from(codePoints, 'binary'); + }, + toISO88591(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('binary'); + }, + fromHex(hex) { + return Buffer.from(hex, 'hex'); + }, + toHex(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('hex'); + }, + toUTF8(buffer, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(buffer, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + const string = nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end); + if (fatal) { + for (let i = 0; i < string.length; i++) { + if (string.charCodeAt(i) === 0xfffd) { + parseUtf8(buffer, start, end, true); + break; + } + } + } + return string; + }, + utf8ByteLength(input) { + return Buffer.byteLength(input, 'utf8'); + }, + encodeUTF8Into(buffer, source, byteOffset) { + const latinBytesWritten = tryWriteBasicLatin(buffer, source, byteOffset); + if (latinBytesWritten != null) { + return latinBytesWritten; + } + return nodeJsByteUtils.toLocalBufferType(buffer).write(source, byteOffset, undefined, 'utf8'); + }, + randomBytes: nodejsRandomBytes +}; + +function isReactNative() { + const { navigator } = globalThis; + return typeof navigator === 'object' && navigator.product === 'ReactNative'; +} +function webMathRandomBytes(byteLength) { + if (byteLength < 0) { + throw new RangeError(`The argument 'byteLength' is invalid. Received ${byteLength}`); + } + return webByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const webRandomBytes = (() => { + const { crypto } = globalThis; + if (crypto != null && typeof crypto.getRandomValues === 'function') { + return (byteLength) => { + return crypto.getRandomValues(webByteUtils.allocate(byteLength)); + }; + } + else { + if (isReactNative()) { + const { console } = globalThis; + console?.warn?.('BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.'); + } + return webMathRandomBytes; + } +})(); +const HEX_DIGIT = /(\d|[a-f])/i; +const webByteUtils = { + toLocalBufferType(potentialUint8array) { + const stringTag = potentialUint8array?.[Symbol.toStringTag] ?? + Object.prototype.toString.call(potentialUint8array); + if (stringTag === 'Uint8Array') { + return potentialUint8array; + } + if (ArrayBuffer.isView(potentialUint8array)) { + return new Uint8Array(potentialUint8array.buffer.slice(potentialUint8array.byteOffset, potentialUint8array.byteOffset + potentialUint8array.byteLength)); + } + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return new Uint8Array(potentialUint8array); + } + throw new BSONError(`Cannot make a Uint8Array from ${String(potentialUint8array)}`); + }, + allocate(size) { + if (typeof size !== 'number') { + throw new TypeError(`The "size" argument must be of type number. Received ${String(size)}`); + } + return new Uint8Array(size); + }, + allocateUnsafe(size) { + return webByteUtils.allocate(size); + }, + equals(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }, + fromNumberArray(array) { + return Uint8Array.from(array); + }, + fromBase64(base64) { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + }, + toBase64(uint8array) { + return btoa(webByteUtils.toISO88591(uint8array)); + }, + fromISO88591(codePoints) { + return Uint8Array.from(codePoints, c => c.charCodeAt(0) & 0xff); + }, + toISO88591(uint8array) { + return Array.from(Uint16Array.from(uint8array), b => String.fromCharCode(b)).join(''); + }, + fromHex(hex) { + const evenLengthHex = hex.length % 2 === 0 ? hex : hex.slice(0, hex.length - 1); + const buffer = []; + for (let i = 0; i < evenLengthHex.length; i += 2) { + const firstDigit = evenLengthHex[i]; + const secondDigit = evenLengthHex[i + 1]; + if (!HEX_DIGIT.test(firstDigit)) { + break; + } + if (!HEX_DIGIT.test(secondDigit)) { + break; + } + const hexDigit = Number.parseInt(`${firstDigit}${secondDigit}`, 16); + buffer.push(hexDigit); + } + return Uint8Array.from(buffer); + }, + toHex(uint8array) { + return Array.from(uint8array, byte => byte.toString(16).padStart(2, '0')).join(''); + }, + toUTF8(uint8array, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(uint8array, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + return parseUtf8(uint8array, start, end, fatal); + }, + utf8ByteLength(input) { + return new TextEncoder().encode(input).byteLength; + }, + encodeUTF8Into(uint8array, source, byteOffset) { + const bytes = new TextEncoder().encode(source); + uint8array.set(bytes, byteOffset); + return bytes.byteLength; + }, + randomBytes: webRandomBytes +}; + +const hasGlobalBuffer = typeof Buffer === 'function' && Buffer.prototype?._isBuffer !== true; +const ByteUtils = hasGlobalBuffer ? nodeJsByteUtils : webByteUtils; + +class BSONValue { + get [Symbol.for('@@mdb.bson.version')]() { + return BSON_MAJOR_VERSION; + } + [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) { + return this.inspect(depth, options, inspect); + } +} + +class Binary extends BSONValue { + get _bsontype() { + return 'Binary'; + } + constructor(buffer, subType) { + super(); + if (!(buffer == null) && + typeof buffer === 'string' && + !ArrayBuffer.isView(buffer) && + !isAnyArrayBuffer(buffer) && + !Array.isArray(buffer)) { + throw new BSONError('Binary can only be constructed from Uint8Array or number[]'); + } + this.sub_type = subType ?? Binary.BSON_BINARY_SUBTYPE_DEFAULT; + if (buffer == null) { + this.buffer = ByteUtils.allocate(Binary.BUFFER_SIZE); + this.position = 0; + } + else { + this.buffer = Array.isArray(buffer) + ? ByteUtils.fromNumberArray(buffer) + : ByteUtils.toLocalBufferType(buffer); + this.position = this.buffer.byteLength; + } + } + put(byteValue) { + if (typeof byteValue === 'string' && byteValue.length !== 1) { + throw new BSONError('only accepts single character String'); + } + else if (typeof byteValue !== 'number' && byteValue.length !== 1) + throw new BSONError('only accepts single character Uint8Array or Array'); + let decodedByte; + if (typeof byteValue === 'string') { + decodedByte = byteValue.charCodeAt(0); + } + else if (typeof byteValue === 'number') { + decodedByte = byteValue; + } + else { + decodedByte = byteValue[0]; + } + if (decodedByte < 0 || decodedByte > 255) { + throw new BSONError('only accepts number in a valid unsigned byte range 0-255'); + } + if (this.buffer.byteLength > this.position) { + this.buffer[this.position++] = decodedByte; + } + else { + const newSpace = ByteUtils.allocate(Binary.BUFFER_SIZE + this.buffer.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + this.buffer[this.position++] = decodedByte; + } + } + write(sequence, offset) { + offset = typeof offset === 'number' ? offset : this.position; + if (this.buffer.byteLength < offset + sequence.length) { + const newSpace = ByteUtils.allocate(this.buffer.byteLength + sequence.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + } + if (ArrayBuffer.isView(sequence)) { + this.buffer.set(ByteUtils.toLocalBufferType(sequence), offset); + this.position = + offset + sequence.byteLength > this.position ? offset + sequence.length : this.position; + } + else if (typeof sequence === 'string') { + throw new BSONError('input cannot be string'); + } + } + read(position, length) { + length = length && length > 0 ? length : this.position; + return this.buffer.slice(position, position + length); + } + value() { + return this.buffer.length === this.position + ? this.buffer + : this.buffer.subarray(0, this.position); + } + length() { + return this.position; + } + toJSON() { + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.buffer.subarray(0, this.position)); + if (encoding === 'base64') + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + if (encoding === 'utf8' || encoding === 'utf-8') + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + } + toExtendedJSON(options) { + options = options || {}; + const base64String = ByteUtils.toBase64(this.buffer); + const subType = Number(this.sub_type).toString(16); + if (options.legacy) { + return { + $binary: base64String, + $type: subType.length === 1 ? '0' + subType : subType + }; + } + return { + $binary: { + base64: base64String, + subType: subType.length === 1 ? '0' + subType : subType + } + }; + } + toUUID() { + if (this.sub_type === Binary.SUBTYPE_UUID) { + return new UUID(this.buffer.slice(0, this.position)); + } + throw new BSONError(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Binary.SUBTYPE_UUID}" is currently supported.`); + } + static createFromHexString(hex, subType) { + return new Binary(ByteUtils.fromHex(hex), subType); + } + static createFromBase64(base64, subType) { + return new Binary(ByteUtils.fromBase64(base64), subType); + } + static fromExtendedJSON(doc, options) { + options = options || {}; + let data; + let type; + if ('$binary' in doc) { + if (options.legacy && typeof doc.$binary === 'string' && '$type' in doc) { + type = doc.$type ? parseInt(doc.$type, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary); + } + else { + if (typeof doc.$binary !== 'string') { + type = doc.$binary.subType ? parseInt(doc.$binary.subType, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary.base64); + } + } + } + else if ('$uuid' in doc) { + type = 4; + data = UUID.bytesFromString(doc.$uuid); + } + if (!data) { + throw new BSONError(`Unexpected Binary Extended JSON format ${JSON.stringify(doc)}`); + } + return type === BSON_BINARY_SUBTYPE_UUID_NEW ? new UUID(data) : new Binary(data, type); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const base64 = ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + const base64Arg = inspect(base64, options); + const subTypeArg = inspect(this.sub_type, options); + return `Binary.createFromBase64(${base64Arg}, ${subTypeArg})`; + } +} +Binary.BSON_BINARY_SUBTYPE_DEFAULT = 0; +Binary.BUFFER_SIZE = 256; +Binary.SUBTYPE_DEFAULT = 0; +Binary.SUBTYPE_FUNCTION = 1; +Binary.SUBTYPE_BYTE_ARRAY = 2; +Binary.SUBTYPE_UUID_OLD = 3; +Binary.SUBTYPE_UUID = 4; +Binary.SUBTYPE_MD5 = 5; +Binary.SUBTYPE_ENCRYPTED = 6; +Binary.SUBTYPE_COLUMN = 7; +Binary.SUBTYPE_SENSITIVE = 8; +Binary.SUBTYPE_USER_DEFINED = 128; +const UUID_BYTE_LENGTH = 16; +const UUID_WITHOUT_DASHES = /^[0-9A-F]{32}$/i; +const UUID_WITH_DASHES = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; +class UUID extends Binary { + constructor(input) { + let bytes; + if (input == null) { + bytes = UUID.generate(); + } + else if (input instanceof UUID) { + bytes = ByteUtils.toLocalBufferType(new Uint8Array(input.buffer)); + } + else if (ArrayBuffer.isView(input) && input.byteLength === UUID_BYTE_LENGTH) { + bytes = ByteUtils.toLocalBufferType(input); + } + else if (typeof input === 'string') { + bytes = UUID.bytesFromString(input); + } + else { + throw new BSONError('Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).'); + } + super(bytes, BSON_BINARY_SUBTYPE_UUID_NEW); + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + } + toHexString(includeDashes = true) { + if (includeDashes) { + return [ + ByteUtils.toHex(this.buffer.subarray(0, 4)), + ByteUtils.toHex(this.buffer.subarray(4, 6)), + ByteUtils.toHex(this.buffer.subarray(6, 8)), + ByteUtils.toHex(this.buffer.subarray(8, 10)), + ByteUtils.toHex(this.buffer.subarray(10, 16)) + ].join('-'); + } + return ByteUtils.toHex(this.buffer); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.id); + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + equals(otherId) { + if (!otherId) { + return false; + } + if (otherId instanceof UUID) { + return ByteUtils.equals(otherId.id, this.id); + } + try { + return ByteUtils.equals(new UUID(otherId).id, this.id); + } + catch { + return false; + } + } + toBinary() { + return new Binary(this.id, Binary.SUBTYPE_UUID); + } + static generate() { + const bytes = ByteUtils.randomBytes(UUID_BYTE_LENGTH); + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + return bytes; + } + static isValid(input) { + if (!input) { + return false; + } + if (typeof input === 'string') { + return UUID.isValidUUIDString(input); + } + if (isUint8Array(input)) { + return input.byteLength === UUID_BYTE_LENGTH; + } + return (input._bsontype === 'Binary' && + input.sub_type === this.SUBTYPE_UUID && + input.buffer.byteLength === 16); + } + static createFromHexString(hexString) { + const buffer = UUID.bytesFromString(hexString); + return new UUID(buffer); + } + static createFromBase64(base64) { + return new UUID(ByteUtils.fromBase64(base64)); + } + static bytesFromString(representation) { + if (!UUID.isValidUUIDString(representation)) { + throw new BSONError('UUID string representation must be 32 hex digits or canonical hyphenated representation'); + } + return ByteUtils.fromHex(representation.replace(/-/g, '')); + } + static isValidUUIDString(representation) { + return UUID_WITHOUT_DASHES.test(representation) || UUID_WITH_DASHES.test(representation); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new UUID(${inspect(this.toHexString(), options)})`; + } +} + +class Code extends BSONValue { + get _bsontype() { + return 'Code'; + } + constructor(code, scope) { + super(); + this.code = code.toString(); + this.scope = scope ?? null; + } + toJSON() { + if (this.scope != null) { + return { code: this.code, scope: this.scope }; + } + return { code: this.code }; + } + toExtendedJSON() { + if (this.scope) { + return { $code: this.code, $scope: this.scope }; + } + return { $code: this.code }; + } + static fromExtendedJSON(doc) { + return new Code(doc.$code, doc.$scope); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + let parametersString = inspect(this.code, options); + const multiLineFn = parametersString.includes('\n'); + if (this.scope != null) { + parametersString += `,${multiLineFn ? '\n' : ' '}${inspect(this.scope, options)}`; + } + const endingNewline = multiLineFn && this.scope === null; + return `new Code(${multiLineFn ? '\n' : ''}${parametersString}${endingNewline ? '\n' : ''})`; + } +} + +function isDBRefLike(value) { + return (value != null && + typeof value === 'object' && + '$id' in value && + value.$id != null && + '$ref' in value && + typeof value.$ref === 'string' && + (!('$db' in value) || ('$db' in value && typeof value.$db === 'string'))); +} +class DBRef extends BSONValue { + get _bsontype() { + return 'DBRef'; + } + constructor(collection, oid, db, fields) { + super(); + const parts = collection.split('.'); + if (parts.length === 2) { + db = parts.shift(); + collection = parts.shift(); + } + this.collection = collection; + this.oid = oid; + this.db = db; + this.fields = fields || {}; + } + get namespace() { + return this.collection; + } + set namespace(value) { + this.collection = value; + } + toJSON() { + const o = Object.assign({ + $ref: this.collection, + $id: this.oid + }, this.fields); + if (this.db != null) + o.$db = this.db; + return o; + } + toExtendedJSON(options) { + options = options || {}; + let o = { + $ref: this.collection, + $id: this.oid + }; + if (options.legacy) { + return o; + } + if (this.db) + o.$db = this.db; + o = Object.assign(o, this.fields); + return o; + } + static fromExtendedJSON(doc) { + const copy = Object.assign({}, doc); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(doc.$ref, doc.$id, doc.$db, copy); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const args = [ + inspect(this.namespace, options), + inspect(this.oid, options), + ...(this.db ? [inspect(this.db, options)] : []), + ...(Object.keys(this.fields).length > 0 ? [inspect(this.fields, options)] : []) + ]; + args[1] = inspect === defaultInspect ? `new ObjectId(${args[1]})` : args[1]; + return `new DBRef(${args.join(', ')})`; + } +} + +function removeLeadingZerosAndExplicitPlus(str) { + if (str === '') { + return str; + } + let startIndex = 0; + const isNegative = str[startIndex] === '-'; + const isExplicitlyPositive = str[startIndex] === '+'; + if (isExplicitlyPositive || isNegative) { + startIndex += 1; + } + let foundInsignificantZero = false; + for (; startIndex < str.length && str[startIndex] === '0'; ++startIndex) { + foundInsignificantZero = true; + } + if (!foundInsignificantZero) { + return isExplicitlyPositive ? str.slice(1) : str; + } + return `${isNegative ? '-' : ''}${str.length === startIndex ? '0' : str.slice(startIndex)}`; +} +function validateStringCharacters(str, radix) { + radix = radix ?? 10; + const validCharacters = '0123456789abcdefghijklmnopqrstuvwxyz'.slice(0, radix); + const regex = new RegExp(`[^-+${validCharacters}]`, 'i'); + return regex.test(str) ? false : str; +} + +let wasm = undefined; +try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; +} +catch { +} +const TWO_PWR_16_DBL = 1 << 16; +const TWO_PWR_24_DBL = 1 << 24; +const TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +const TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +const TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; +const INT_CACHE = {}; +const UINT_CACHE = {}; +const MAX_INT64_STRING_LENGTH = 20; +const DECIMAL_REG_EX = /^(\+?0|(\+|-)?[1-9][0-9]*)$/; +class Long extends BSONValue { + get _bsontype() { + return 'Long'; + } + get __isLong__() { + return true; + } + constructor(lowOrValue = 0, highOrUnsigned, unsigned) { + super(); + const unsignedBool = typeof highOrUnsigned === 'boolean' ? highOrUnsigned : Boolean(unsigned); + const high = typeof highOrUnsigned === 'number' ? highOrUnsigned : 0; + const res = typeof lowOrValue === 'string' + ? Long.fromString(lowOrValue, unsignedBool) + : typeof lowOrValue === 'bigint' + ? Long.fromBigInt(lowOrValue, unsignedBool) + : { low: lowOrValue | 0, high: high | 0, unsigned: unsignedBool }; + this.low = res.low; + this.high = res.high; + this.unsigned = res.unsigned; + } + static fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); + } + static fromInt(value, unsigned) { + let obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if ((cache = 0 <= value && value < 256)) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } + else { + value |= 0; + if ((cache = -128 <= value && value < 128)) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + static fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? Long.UZERO : Long.ZERO; + if (unsigned) { + if (value < 0) + return Long.UZERO; + if (value >= TWO_PWR_64_DBL) + return Long.MAX_UNSIGNED_VALUE; + } + else { + if (value <= -TWO_PWR_63_DBL) + return Long.MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return Long.MAX_VALUE; + } + if (value < 0) + return Long.fromNumber(-value, unsigned).neg(); + return Long.fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); + } + static fromBigInt(value, unsigned) { + const FROM_BIGINT_BIT_MASK = BigInt(0xffffffff); + const FROM_BIGINT_BIT_SHIFT = BigInt(32); + return new Long(Number(value & FROM_BIGINT_BIT_MASK), Number((value >> FROM_BIGINT_BIT_SHIFT) & FROM_BIGINT_BIT_MASK), unsigned); + } + static _fromString(str, unsigned, radix) { + if (str.length === 0) + throw new BSONError('empty string'); + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + let p; + if ((p = str.indexOf('-')) > 0) + throw new BSONError('interior hyphen'); + else if (p === 0) { + return Long._fromString(str.substring(1), unsigned, radix).neg(); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 8)); + let result = Long.ZERO; + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + const power = Long.fromNumber(Math.pow(radix, size)); + result = result.mul(power).add(Long.fromNumber(value)); + } + else { + result = result.mul(radixToPower); + result = result.add(Long.fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + static fromStringStrict(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str.trim() !== str) { + throw new BSONError(`Input: '${str}' contains leading and/or trailing whitespace`); + } + if (!validateStringCharacters(str, radix)) { + throw new BSONError(`Input: '${str}' contains invalid characters for radix: ${radix}`); + } + const cleanedStr = removeLeadingZerosAndExplicitPlus(str); + const result = Long._fromString(cleanedStr, unsigned, radix); + if (result.toString(radix).toLowerCase() !== cleanedStr.toLowerCase()) { + throw new BSONError(`Input: ${str} is not representable as ${result.unsigned ? 'an unsigned' : 'a signed'} 64-bit Long ${radix != null ? `with radix: ${radix}` : ''}`); + } + return result; + } + static fromString(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str === 'NaN' && radix < 24) { + return Long.ZERO; + } + else if ((str === 'Infinity' || str === '+Infinity' || str === '-Infinity') && radix < 35) { + return Long.ZERO; + } + return Long._fromString(str, unsigned, radix); + } + static fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + } + static fromBytesLE(bytes, unsigned) { + return new Long(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24), bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24), unsigned); + } + static fromBytesBE(bytes, unsigned) { + return new Long((bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7], (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3], unsigned); + } + static isLong(value) { + return (value != null && + typeof value === 'object' && + '__isLong__' in value && + value.__isLong__ === true); + } + static fromValue(val, unsigned) { + if (typeof val === 'number') + return Long.fromNumber(val, unsigned); + if (typeof val === 'string') + return Long.fromString(val, unsigned); + return Long.fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned); + } + add(addend) { + if (!Long.isLong(addend)) + addend = Long.fromValue(addend); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = addend.high >>> 16; + const b32 = addend.high & 0xffff; + const b16 = addend.low >>> 16; + const b00 = addend.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + and(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned); + } + compare(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.eq(other)) + return 0; + const thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || + (other.high === this.high && other.low >>> 0 > this.low >>> 0) + ? -1 + : 1; + } + comp(other) { + return this.compare(other); + } + divide(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (divisor.isZero()) + throw new BSONError('division by zero'); + if (wasm) { + if (!this.unsigned && + this.high === -0x80000000 && + divisor.low === -1 && + divisor.high === -1) { + return this; + } + const low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? Long.UZERO : Long.ZERO; + let approx, rem, res; + if (!this.unsigned) { + if (this.eq(Long.MIN_VALUE)) { + if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE)) + return Long.MIN_VALUE; + else if (divisor.eq(Long.MIN_VALUE)) + return Long.ONE; + else { + const halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(Long.ZERO)) { + return divisor.isNegative() ? Long.ONE : Long.NEG_ONE; + } + else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } + else if (divisor.eq(Long.MIN_VALUE)) + return this.unsigned ? Long.UZERO : Long.ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } + else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = Long.ZERO; + } + else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return Long.UZERO; + if (divisor.gt(this.shru(1))) + return Long.UONE; + res = Long.UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + const log2 = Math.ceil(Math.log(approx) / Math.LN2); + const delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); + let approxRes = Long.fromNumber(approx); + let approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = Long.fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = Long.ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + } + div(divisor) { + return this.divide(divisor); + } + equals(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + } + eq(other) { + return this.equals(other); + } + getHighBits() { + return this.high; + } + getHighBitsUnsigned() { + return this.high >>> 0; + } + getLowBits() { + return this.low; + } + getLowBitsUnsigned() { + return this.low >>> 0; + } + getNumBitsAbs() { + if (this.isNegative()) { + return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + } + const val = this.high !== 0 ? this.high : this.low; + let bit; + for (bit = 31; bit > 0; bit--) + if ((val & (1 << bit)) !== 0) + break; + return this.high !== 0 ? bit + 33 : bit + 1; + } + greaterThan(other) { + return this.comp(other) > 0; + } + gt(other) { + return this.greaterThan(other); + } + greaterThanOrEqual(other) { + return this.comp(other) >= 0; + } + gte(other) { + return this.greaterThanOrEqual(other); + } + ge(other) { + return this.greaterThanOrEqual(other); + } + isEven() { + return (this.low & 1) === 0; + } + isNegative() { + return !this.unsigned && this.high < 0; + } + isOdd() { + return (this.low & 1) === 1; + } + isPositive() { + return this.unsigned || this.high >= 0; + } + isZero() { + return this.high === 0 && this.low === 0; + } + lessThan(other) { + return this.comp(other) < 0; + } + lt(other) { + return this.lessThan(other); + } + lessThanOrEqual(other) { + return this.comp(other) <= 0; + } + lte(other) { + return this.lessThanOrEqual(other); + } + modulo(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (wasm) { + const low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + } + mod(divisor) { + return this.modulo(divisor); + } + rem(divisor) { + return this.modulo(divisor); + } + multiply(multiplier) { + if (this.isZero()) + return Long.ZERO; + if (!Long.isLong(multiplier)) + multiplier = Long.fromValue(multiplier); + if (wasm) { + const low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return Long.ZERO; + if (this.eq(Long.MIN_VALUE)) + return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (multiplier.eq(Long.MIN_VALUE)) + return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } + else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24)) + return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = multiplier.high >>> 16; + const b32 = multiplier.high & 0xffff; + const b16 = multiplier.low >>> 16; + const b00 = multiplier.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + mul(multiplier) { + return this.multiply(multiplier); + } + negate() { + if (!this.unsigned && this.eq(Long.MIN_VALUE)) + return Long.MIN_VALUE; + return this.not().add(Long.ONE); + } + neg() { + return this.negate(); + } + not() { + return Long.fromBits(~this.low, ~this.high, this.unsigned); + } + notEquals(other) { + return !this.equals(other); + } + neq(other) { + return this.notEquals(other); + } + ne(other) { + return this.notEquals(other); + } + or(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned); + } + shiftLeft(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); + else + return Long.fromBits(0, this.low << (numBits - 32), this.unsigned); + } + shl(numBits) { + return this.shiftLeft(numBits); + } + shiftRight(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); + else + return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); + } + shr(numBits) { + return this.shiftRight(numBits); + } + shiftRightUnsigned(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + const high = this.high; + if (numBits < 32) { + const low = this.low; + return Long.fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); + } + else if (numBits === 32) + return Long.fromBits(high, 0, this.unsigned); + else + return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned); + } + } + shr_u(numBits) { + return this.shiftRightUnsigned(numBits); + } + shru(numBits) { + return this.shiftRightUnsigned(numBits); + } + subtract(subtrahend) { + if (!Long.isLong(subtrahend)) + subtrahend = Long.fromValue(subtrahend); + return this.add(subtrahend.neg()); + } + sub(subtrahend) { + return this.subtract(subtrahend); + } + toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + } + toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + } + toBigInt() { + return BigInt(this.toString()); + } + toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + } + toBytesLE() { + const hi = this.high, lo = this.low; + return [ + lo & 0xff, + (lo >>> 8) & 0xff, + (lo >>> 16) & 0xff, + lo >>> 24, + hi & 0xff, + (hi >>> 8) & 0xff, + (hi >>> 16) & 0xff, + hi >>> 24 + ]; + } + toBytesBE() { + const hi = this.high, lo = this.low; + return [ + hi >>> 24, + (hi >>> 16) & 0xff, + (hi >>> 8) & 0xff, + hi & 0xff, + lo >>> 24, + (lo >>> 16) & 0xff, + (lo >>> 8) & 0xff, + lo & 0xff + ]; + } + toSigned() { + if (!this.unsigned) + return this; + return Long.fromBits(this.low, this.high, false); + } + toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + if (this.isZero()) + return '0'; + if (this.isNegative()) { + if (this.eq(Long.MIN_VALUE)) { + const radixLong = Long.fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } + else + return '-' + this.neg().toString(radix); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 6), this.unsigned); + let rem = this; + let result = ''; + while (true) { + const remDiv = rem.div(radixToPower); + const intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0; + let digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) { + return digits + result; + } + else { + while (digits.length < 6) + digits = '0' + digits; + result = '' + digits + result; + } + } + } + toUnsigned() { + if (this.unsigned) + return this; + return Long.fromBits(this.low, this.high, true); + } + xor(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + } + eqz() { + return this.isZero(); + } + le(other) { + return this.lessThanOrEqual(other); + } + toExtendedJSON(options) { + if (options && options.relaxed) + return this.toNumber(); + return { $numberLong: this.toString() }; + } + static fromExtendedJSON(doc, options) { + const { useBigInt64 = false, relaxed = true } = { ...options }; + if (doc.$numberLong.length > MAX_INT64_STRING_LENGTH) { + throw new BSONError('$numberLong string is too long'); + } + if (!DECIMAL_REG_EX.test(doc.$numberLong)) { + throw new BSONError(`$numberLong string "${doc.$numberLong}" is in an invalid format`); + } + if (useBigInt64) { + const bigIntResult = BigInt(doc.$numberLong); + return BigInt.asIntN(64, bigIntResult); + } + const longResult = Long.fromString(doc.$numberLong); + if (relaxed) { + return longResult.toNumber(); + } + return longResult; + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const longVal = inspect(this.toString(), options); + const unsignedVal = this.unsigned ? `, ${inspect(this.unsigned, options)}` : ''; + return `new Long(${longVal}${unsignedVal})`; + } +} +Long.TWO_PWR_24 = Long.fromInt(TWO_PWR_24_DBL); +Long.MAX_UNSIGNED_VALUE = Long.fromBits(0xffffffff | 0, 0xffffffff | 0, true); +Long.ZERO = Long.fromInt(0); +Long.UZERO = Long.fromInt(0, true); +Long.ONE = Long.fromInt(1); +Long.UONE = Long.fromInt(1, true); +Long.NEG_ONE = Long.fromInt(-1); +Long.MAX_VALUE = Long.fromBits(0xffffffff | 0, 0x7fffffff | 0, false); +Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0, false); + +const PARSE_STRING_REGEXP = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/; +const PARSE_INF_REGEXP = /^(\+|-)?(Infinity|inf)$/i; +const PARSE_NAN_REGEXP = /^(\+|-)?NaN$/i; +const EXPONENT_MAX = 6111; +const EXPONENT_MIN = -6176; +const EXPONENT_BIAS = 6176; +const MAX_DIGITS = 34; +const NAN_BUFFER = ByteUtils.fromNumberArray([ + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_NEGATIVE_BUFFER = ByteUtils.fromNumberArray([ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_POSITIVE_BUFFER = ByteUtils.fromNumberArray([ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const EXPONENT_REGEX = /^([-+])?(\d+)?$/; +const COMBINATION_MASK = 0x1f; +const EXPONENT_MASK = 0x3fff; +const COMBINATION_INFINITY = 30; +const COMBINATION_NAN = 31; +function isDigit(value) { + return !isNaN(parseInt(value, 10)); +} +function divideu128(value) { + const DIVISOR = Long.fromNumber(1000 * 1000 * 1000); + let _rem = Long.fromNumber(0); + if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { + return { quotient: value, rem: _rem }; + } + for (let i = 0; i <= 3; i++) { + _rem = _rem.shiftLeft(32); + _rem = _rem.add(new Long(value.parts[i], 0)); + value.parts[i] = _rem.div(DIVISOR).low; + _rem = _rem.modulo(DIVISOR); + } + return { quotient: value, rem: _rem }; +} +function multiply64x2(left, right) { + if (!left && !right) { + return { high: Long.fromNumber(0), low: Long.fromNumber(0) }; + } + const leftHigh = left.shiftRightUnsigned(32); + const leftLow = new Long(left.getLowBits(), 0); + const rightHigh = right.shiftRightUnsigned(32); + const rightLow = new Long(right.getLowBits(), 0); + let productHigh = leftHigh.multiply(rightHigh); + let productMid = leftHigh.multiply(rightLow); + const productMid2 = leftLow.multiply(rightHigh); + let productLow = leftLow.multiply(rightLow); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productMid = new Long(productMid.getLowBits(), 0) + .add(productMid2) + .add(productLow.shiftRightUnsigned(32)); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productLow = productMid.shiftLeft(32).add(new Long(productLow.getLowBits(), 0)); + return { high: productHigh, low: productLow }; +} +function lessThan(left, right) { + const uhleft = left.high >>> 0; + const uhright = right.high >>> 0; + if (uhleft < uhright) { + return true; + } + else if (uhleft === uhright) { + const ulleft = left.low >>> 0; + const ulright = right.low >>> 0; + if (ulleft < ulright) + return true; + } + return false; +} +function invalidErr(string, message) { + throw new BSONError(`"${string}" is not a valid Decimal128 string - ${message}`); +} +class Decimal128 extends BSONValue { + get _bsontype() { + return 'Decimal128'; + } + constructor(bytes) { + super(); + if (typeof bytes === 'string') { + this.bytes = Decimal128.fromString(bytes).bytes; + } + else if (isUint8Array(bytes)) { + if (bytes.byteLength !== 16) { + throw new BSONError('Decimal128 must take a Buffer of 16 bytes'); + } + this.bytes = bytes; + } + else { + throw new BSONError('Decimal128 must take a Buffer or string'); + } + } + static fromString(representation) { + return Decimal128._fromString(representation, { allowRounding: false }); + } + static fromStringWithRounding(representation) { + return Decimal128._fromString(representation, { allowRounding: true }); + } + static _fromString(representation, options) { + let isNegative = false; + let sawSign = false; + let sawRadix = false; + let foundNonZero = false; + let significantDigits = 0; + let nDigitsRead = 0; + let nDigits = 0; + let radixPosition = 0; + let firstNonZero = 0; + const digits = [0]; + let nDigitsStored = 0; + let digitsInsert = 0; + let lastDigit = 0; + let exponent = 0; + let significandHigh = new Long(0, 0); + let significandLow = new Long(0, 0); + let biasedExponent = 0; + let index = 0; + if (representation.length >= 7000) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + const stringMatch = representation.match(PARSE_STRING_REGEXP); + const infMatch = representation.match(PARSE_INF_REGEXP); + const nanMatch = representation.match(PARSE_NAN_REGEXP); + if ((!stringMatch && !infMatch && !nanMatch) || representation.length === 0) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + if (stringMatch) { + const unsignedNumber = stringMatch[2]; + const e = stringMatch[4]; + const expSign = stringMatch[5]; + const expNumber = stringMatch[6]; + if (e && expNumber === undefined) + invalidErr(representation, 'missing exponent power'); + if (e && unsignedNumber === undefined) + invalidErr(representation, 'missing exponent base'); + if (e === undefined && (expSign || expNumber)) { + invalidErr(representation, 'missing e before exponent'); + } + } + if (representation[index] === '+' || representation[index] === '-') { + sawSign = true; + isNegative = representation[index++] === '-'; + } + if (!isDigit(representation[index]) && representation[index] !== '.') { + if (representation[index] === 'i' || representation[index] === 'I') { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + else if (representation[index] === 'N') { + return new Decimal128(NAN_BUFFER); + } + } + while (isDigit(representation[index]) || representation[index] === '.') { + if (representation[index] === '.') { + if (sawRadix) + invalidErr(representation, 'contains multiple periods'); + sawRadix = true; + index = index + 1; + continue; + } + if (nDigitsStored < MAX_DIGITS) { + if (representation[index] !== '0' || foundNonZero) { + if (!foundNonZero) { + firstNonZero = nDigitsRead; + } + foundNonZero = true; + digits[digitsInsert++] = parseInt(representation[index], 10); + nDigitsStored = nDigitsStored + 1; + } + } + if (foundNonZero) + nDigits = nDigits + 1; + if (sawRadix) + radixPosition = radixPosition + 1; + nDigitsRead = nDigitsRead + 1; + index = index + 1; + } + if (sawRadix && !nDigitsRead) + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + if (representation[index] === 'e' || representation[index] === 'E') { + const match = representation.substr(++index).match(EXPONENT_REGEX); + if (!match || !match[2]) + return new Decimal128(NAN_BUFFER); + exponent = parseInt(match[0], 10); + index = index + match[0].length; + } + if (representation[index]) + return new Decimal128(NAN_BUFFER); + if (!nDigitsStored) { + digits[0] = 0; + nDigits = 1; + nDigitsStored = 1; + significantDigits = 0; + } + else { + lastDigit = nDigitsStored - 1; + significantDigits = nDigits; + if (significantDigits !== 1) { + while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') { + significantDigits = significantDigits - 1; + } + } + } + if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) { + exponent = EXPONENT_MIN; + } + else { + exponent = exponent - radixPosition; + } + while (exponent > EXPONENT_MAX) { + lastDigit = lastDigit + 1; + if (lastDigit >= MAX_DIGITS) { + if (significantDigits === 0) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + exponent = exponent - 1; + } + if (options.allowRounding) { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0 && significantDigits < nDigitsStored) { + exponent = EXPONENT_MIN; + significantDigits = 0; + break; + } + if (nDigitsStored < nDigits) { + nDigits = nDigits - 1; + } + else { + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + const digitsString = digits.join(''); + if (digitsString.match(/^0+$/)) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + let endOfString = nDigitsRead; + if (sawRadix) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + let roundBit = 0; + if (roundDigit >= 5) { + roundBit = 1; + if (roundDigit === 5) { + roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0; + for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) { + if (parseInt(representation[i], 10)) { + roundBit = 1; + break; + } + } + } + } + if (roundBit) { + let dIdx = lastDigit; + for (; dIdx >= 0; dIdx--) { + if (++digits[dIdx] > 9) { + digits[dIdx] = 0; + if (dIdx === 0) { + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + digits[dIdx] = 1; + } + else { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + } + } + else { + break; + } + } + } + } + } + else { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0) { + if (significantDigits === 0) { + exponent = EXPONENT_MIN; + break; + } + invalidErr(representation, 'exponent underflow'); + } + if (nDigitsStored < nDigits) { + if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' && + significantDigits !== 0) { + invalidErr(representation, 'inexact rounding'); + } + nDigits = nDigits - 1; + } + else { + if (digits[lastDigit] !== 0) { + invalidErr(representation, 'inexact rounding'); + } + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + if (sawRadix) { + firstNonZero = firstNonZero + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + if (roundDigit !== 0) { + invalidErr(representation, 'inexact rounding'); + } + } + } + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + if (significantDigits === 0) { + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + } + else if (lastDigit < 17) { + let dIdx = 0; + significandLow = Long.fromNumber(digits[dIdx++]); + significandHigh = new Long(0, 0); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + else { + let dIdx = 0; + significandHigh = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit - 17; dIdx++) { + significandHigh = significandHigh.multiply(Long.fromNumber(10)); + significandHigh = significandHigh.add(Long.fromNumber(digits[dIdx])); + } + significandLow = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + const significand = multiply64x2(significandHigh, Long.fromString('100000000000000000')); + significand.low = significand.low.add(significandLow); + if (lessThan(significand.low, significandLow)) { + significand.high = significand.high.add(Long.fromNumber(1)); + } + biasedExponent = exponent + EXPONENT_BIAS; + const dec = { low: Long.fromNumber(0), high: Long.fromNumber(0) }; + if (significand.high.shiftRightUnsigned(49).and(Long.fromNumber(1)).equals(Long.fromNumber(1))) { + dec.high = dec.high.or(Long.fromNumber(0x3).shiftLeft(61)); + dec.high = dec.high.or(Long.fromNumber(biasedExponent).and(Long.fromNumber(0x3fff).shiftLeft(47))); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x7fffffffffff))); + } + else { + dec.high = dec.high.or(Long.fromNumber(biasedExponent & 0x3fff).shiftLeft(49)); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x1ffffffffffff))); + } + dec.low = significand.low; + if (isNegative) { + dec.high = dec.high.or(Long.fromString('9223372036854775808')); + } + const buffer = ByteUtils.allocateUnsafe(16); + index = 0; + buffer[index++] = dec.low.low & 0xff; + buffer[index++] = (dec.low.low >> 8) & 0xff; + buffer[index++] = (dec.low.low >> 16) & 0xff; + buffer[index++] = (dec.low.low >> 24) & 0xff; + buffer[index++] = dec.low.high & 0xff; + buffer[index++] = (dec.low.high >> 8) & 0xff; + buffer[index++] = (dec.low.high >> 16) & 0xff; + buffer[index++] = (dec.low.high >> 24) & 0xff; + buffer[index++] = dec.high.low & 0xff; + buffer[index++] = (dec.high.low >> 8) & 0xff; + buffer[index++] = (dec.high.low >> 16) & 0xff; + buffer[index++] = (dec.high.low >> 24) & 0xff; + buffer[index++] = dec.high.high & 0xff; + buffer[index++] = (dec.high.high >> 8) & 0xff; + buffer[index++] = (dec.high.high >> 16) & 0xff; + buffer[index++] = (dec.high.high >> 24) & 0xff; + return new Decimal128(buffer); + } + toString() { + let biased_exponent; + let significand_digits = 0; + const significand = new Array(36); + for (let i = 0; i < significand.length; i++) + significand[i] = 0; + let index = 0; + let is_zero = false; + let significand_msb; + let significand128 = { parts: [0, 0, 0, 0] }; + let j, k; + const string = []; + index = 0; + const buffer = this.bytes; + const low = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midl = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midh = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const high = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + index = 0; + const dec = { + low: new Long(low, midl), + high: new Long(midh, high) + }; + if (dec.high.lessThan(Long.ZERO)) { + string.push('-'); + } + const combination = (high >> 26) & COMBINATION_MASK; + if (combination >> 3 === 3) { + if (combination === COMBINATION_INFINITY) { + return string.join('') + 'Infinity'; + } + else if (combination === COMBINATION_NAN) { + return 'NaN'; + } + else { + biased_exponent = (high >> 15) & EXPONENT_MASK; + significand_msb = 0x08 + ((high >> 14) & 0x01); + } + } + else { + significand_msb = (high >> 14) & 0x07; + biased_exponent = (high >> 17) & EXPONENT_MASK; + } + const exponent = biased_exponent - EXPONENT_BIAS; + significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); + significand128.parts[1] = midh; + significand128.parts[2] = midl; + significand128.parts[3] = low; + if (significand128.parts[0] === 0 && + significand128.parts[1] === 0 && + significand128.parts[2] === 0 && + significand128.parts[3] === 0) { + is_zero = true; + } + else { + for (k = 3; k >= 0; k--) { + let least_digits = 0; + const result = divideu128(significand128); + significand128 = result.quotient; + least_digits = result.rem.low; + if (!least_digits) + continue; + for (j = 8; j >= 0; j--) { + significand[k * 9 + j] = least_digits % 10; + least_digits = Math.floor(least_digits / 10); + } + } + } + if (is_zero) { + significand_digits = 1; + significand[index] = 0; + } + else { + significand_digits = 36; + while (!significand[index]) { + significand_digits = significand_digits - 1; + index = index + 1; + } + } + const scientific_exponent = significand_digits - 1 + exponent; + if (scientific_exponent >= 34 || scientific_exponent <= -7 || exponent > 0) { + if (significand_digits > 34) { + string.push(`${0}`); + if (exponent > 0) + string.push(`E+${exponent}`); + else if (exponent < 0) + string.push(`E${exponent}`); + return string.join(''); + } + string.push(`${significand[index++]}`); + significand_digits = significand_digits - 1; + if (significand_digits) { + string.push('.'); + } + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + string.push('E'); + if (scientific_exponent > 0) { + string.push(`+${scientific_exponent}`); + } + else { + string.push(`${scientific_exponent}`); + } + } + else { + if (exponent >= 0) { + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + } + else { + let radix_position = significand_digits + exponent; + if (radix_position > 0) { + for (let i = 0; i < radix_position; i++) { + string.push(`${significand[index++]}`); + } + } + else { + string.push('0'); + } + string.push('.'); + while (radix_position++ < 0) { + string.push('0'); + } + for (let i = 0; i < significand_digits - Math.max(radix_position - 1, 0); i++) { + string.push(`${significand[index++]}`); + } + } + } + return string.join(''); + } + toJSON() { + return { $numberDecimal: this.toString() }; + } + toExtendedJSON() { + return { $numberDecimal: this.toString() }; + } + static fromExtendedJSON(doc) { + return Decimal128.fromString(doc.$numberDecimal); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const d128string = inspect(this.toString(), options); + return `new Decimal128(${d128string})`; + } +} + +class Double extends BSONValue { + get _bsontype() { + return 'Double'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value; + } + static fromString(value) { + const coercedValue = Number(value); + if (value === 'NaN') + return new Double(NaN); + if (value === 'Infinity') + return new Double(Infinity); + if (value === '-Infinity') + return new Double(-Infinity); + if (!Number.isFinite(coercedValue)) { + throw new BSONError(`Input: ${value} is not representable as a Double`); + } + if (value.trim() !== value) { + throw new BSONError(`Input: '${value}' contains whitespace`); + } + if (value === '') { + throw new BSONError(`Input is an empty string`); + } + if (/[^-0-9.+eE]/.test(value)) { + throw new BSONError(`Input: '${value}' is not in decimal or exponential notation`); + } + return new Double(coercedValue); + } + valueOf() { + return this.value; + } + toJSON() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toExtendedJSON(options) { + if (options && (options.legacy || (options.relaxed && isFinite(this.value)))) { + return this.value; + } + if (Object.is(Math.sign(this.value), -0)) { + return { $numberDouble: '-0.0' }; + } + return { + $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() + }; + } + static fromExtendedJSON(doc, options) { + const doubleValue = parseFloat(doc.$numberDouble); + return options && options.relaxed ? doubleValue : new Double(doubleValue); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Double(${inspect(this.value, options)})`; + } +} + +class Int32 extends BSONValue { + get _bsontype() { + return 'Int32'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value | 0; + } + static fromString(value) { + const cleanedValue = removeLeadingZerosAndExplicitPlus(value); + const coercedValue = Number(value); + if (BSON_INT32_MAX < coercedValue) { + throw new BSONError(`Input: '${value}' is larger than the maximum value for Int32`); + } + else if (BSON_INT32_MIN > coercedValue) { + throw new BSONError(`Input: '${value}' is smaller than the minimum value for Int32`); + } + else if (!Number.isSafeInteger(coercedValue)) { + throw new BSONError(`Input: '${value}' is not a safe integer`); + } + else if (coercedValue.toString() !== cleanedValue) { + throw new BSONError(`Input: '${value}' is not a valid Int32 string`); + } + return new Int32(coercedValue); + } + valueOf() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toJSON() { + return this.value; + } + toExtendedJSON(options) { + if (options && (options.relaxed || options.legacy)) + return this.value; + return { $numberInt: this.value.toString() }; + } + static fromExtendedJSON(doc, options) { + return options && options.relaxed ? parseInt(doc.$numberInt, 10) : new Int32(doc.$numberInt); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Int32(${inspect(this.value, options)})`; + } +} + +class MaxKey extends BSONValue { + get _bsontype() { + return 'MaxKey'; + } + toExtendedJSON() { + return { $maxKey: 1 }; + } + static fromExtendedJSON() { + return new MaxKey(); + } + inspect() { + return 'new MaxKey()'; + } +} + +class MinKey extends BSONValue { + get _bsontype() { + return 'MinKey'; + } + toExtendedJSON() { + return { $minKey: 1 }; + } + static fromExtendedJSON() { + return new MinKey(); + } + inspect() { + return 'new MinKey()'; + } +} + +const FLOAT = new Float64Array(1); +const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8); +FLOAT[0] = -1; +const isBigEndian = FLOAT_BYTES[7] === 0; +const NumberUtils = { + getNonnegativeInt32LE(source, offset) { + if (source[offset + 3] > 127) { + throw new RangeError(`Size cannot be negative at offset: ${offset}`); + } + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getInt32LE(source, offset) { + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getUint32LE(source, offset) { + return (source[offset] + + source[offset + 1] * 256 + + source[offset + 2] * 65536 + + source[offset + 3] * 16777216); + }, + getUint32BE(source, offset) { + return (source[offset + 3] + + source[offset + 2] * 256 + + source[offset + 1] * 65536 + + source[offset] * 16777216); + }, + getBigInt64LE(source, offset) { + const lo = NumberUtils.getUint32LE(source, offset); + const hi = NumberUtils.getUint32LE(source, offset + 4); + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }, + getFloat64LE: isBigEndian + ? (source, offset) => { + FLOAT_BYTES[7] = source[offset]; + FLOAT_BYTES[6] = source[offset + 1]; + FLOAT_BYTES[5] = source[offset + 2]; + FLOAT_BYTES[4] = source[offset + 3]; + FLOAT_BYTES[3] = source[offset + 4]; + FLOAT_BYTES[2] = source[offset + 5]; + FLOAT_BYTES[1] = source[offset + 6]; + FLOAT_BYTES[0] = source[offset + 7]; + return FLOAT[0]; + } + : (source, offset) => { + FLOAT_BYTES[0] = source[offset]; + FLOAT_BYTES[1] = source[offset + 1]; + FLOAT_BYTES[2] = source[offset + 2]; + FLOAT_BYTES[3] = source[offset + 3]; + FLOAT_BYTES[4] = source[offset + 4]; + FLOAT_BYTES[5] = source[offset + 5]; + FLOAT_BYTES[6] = source[offset + 6]; + FLOAT_BYTES[7] = source[offset + 7]; + return FLOAT[0]; + }, + setInt32BE(destination, offset, value) { + destination[offset + 3] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset] = value; + return 4; + }, + setInt32LE(destination, offset, value) { + destination[offset] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 3] = value; + return 4; + }, + setBigInt64LE(destination, offset, value) { + const mask32bits = BigInt(4294967295); + let lo = Number(value & mask32bits); + destination[offset] = lo; + lo >>= 8; + destination[offset + 1] = lo; + lo >>= 8; + destination[offset + 2] = lo; + lo >>= 8; + destination[offset + 3] = lo; + let hi = Number((value >> BigInt(32)) & mask32bits); + destination[offset + 4] = hi; + hi >>= 8; + destination[offset + 5] = hi; + hi >>= 8; + destination[offset + 6] = hi; + hi >>= 8; + destination[offset + 7] = hi; + return 8; + }, + setFloat64LE: isBigEndian + ? (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[7]; + destination[offset + 1] = FLOAT_BYTES[6]; + destination[offset + 2] = FLOAT_BYTES[5]; + destination[offset + 3] = FLOAT_BYTES[4]; + destination[offset + 4] = FLOAT_BYTES[3]; + destination[offset + 5] = FLOAT_BYTES[2]; + destination[offset + 6] = FLOAT_BYTES[1]; + destination[offset + 7] = FLOAT_BYTES[0]; + return 8; + } + : (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[0]; + destination[offset + 1] = FLOAT_BYTES[1]; + destination[offset + 2] = FLOAT_BYTES[2]; + destination[offset + 3] = FLOAT_BYTES[3]; + destination[offset + 4] = FLOAT_BYTES[4]; + destination[offset + 5] = FLOAT_BYTES[5]; + destination[offset + 6] = FLOAT_BYTES[6]; + destination[offset + 7] = FLOAT_BYTES[7]; + return 8; + } +}; + +const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$'); +let PROCESS_UNIQUE = null; +class ObjectId extends BSONValue { + get _bsontype() { + return 'ObjectId'; + } + constructor(inputId) { + super(); + let workingId; + if (typeof inputId === 'object' && inputId && 'id' in inputId) { + if (typeof inputId.id !== 'string' && !ArrayBuffer.isView(inputId.id)) { + throw new BSONError('Argument passed in must have an id that is of type string or Buffer'); + } + if ('toHexString' in inputId && typeof inputId.toHexString === 'function') { + workingId = ByteUtils.fromHex(inputId.toHexString()); + } + else { + workingId = inputId.id; + } + } + else { + workingId = inputId; + } + if (workingId == null || typeof workingId === 'number') { + this.buffer = ObjectId.generate(typeof workingId === 'number' ? workingId : undefined); + } + else if (ArrayBuffer.isView(workingId) && workingId.byteLength === 12) { + this.buffer = ByteUtils.toLocalBufferType(workingId); + } + else if (typeof workingId === 'string') { + if (workingId.length === 24 && checkForHexRegExp.test(workingId)) { + this.buffer = ByteUtils.fromHex(workingId); + } + else { + throw new BSONError('input must be a 24 character hex string, 12 byte Uint8Array, or an integer'); + } + } + else { + throw new BSONError('Argument passed in does not match the accepted types'); + } + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(this.id); + } + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(value); + } + } + toHexString() { + if (ObjectId.cacheHexString && this.__id) { + return this.__id; + } + const hexString = ByteUtils.toHex(this.id); + if (ObjectId.cacheHexString && !this.__id) { + this.__id = hexString; + } + return hexString; + } + static getInc() { + return (ObjectId.index = (ObjectId.index + 1) % 0xffffff); + } + static generate(time) { + if ('number' !== typeof time) { + time = Math.floor(Date.now() / 1000); + } + const inc = ObjectId.getInc(); + const buffer = ByteUtils.allocateUnsafe(12); + NumberUtils.setInt32BE(buffer, 0, time); + if (PROCESS_UNIQUE === null) { + PROCESS_UNIQUE = ByteUtils.randomBytes(5); + } + buffer[4] = PROCESS_UNIQUE[0]; + buffer[5] = PROCESS_UNIQUE[1]; + buffer[6] = PROCESS_UNIQUE[2]; + buffer[7] = PROCESS_UNIQUE[3]; + buffer[8] = PROCESS_UNIQUE[4]; + buffer[11] = inc & 0xff; + buffer[10] = (inc >> 8) & 0xff; + buffer[9] = (inc >> 16) & 0xff; + return buffer; + } + toString(encoding) { + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + if (encoding === 'hex') + return this.toHexString(); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + static is(variable) { + return (variable != null && + typeof variable === 'object' && + '_bsontype' in variable && + variable._bsontype === 'ObjectId'); + } + equals(otherId) { + if (otherId === undefined || otherId === null) { + return false; + } + if (ObjectId.is(otherId)) { + return (this.buffer[11] === otherId.buffer[11] && ByteUtils.equals(this.buffer, otherId.buffer)); + } + if (typeof otherId === 'string') { + return otherId.toLowerCase() === this.toHexString(); + } + if (typeof otherId === 'object' && typeof otherId.toHexString === 'function') { + const otherIdString = otherId.toHexString(); + const thisIdString = this.toHexString(); + return typeof otherIdString === 'string' && otherIdString.toLowerCase() === thisIdString; + } + return false; + } + getTimestamp() { + const timestamp = new Date(); + const time = NumberUtils.getUint32BE(this.buffer, 0); + timestamp.setTime(Math.floor(time) * 1000); + return timestamp; + } + static createPk() { + return new ObjectId(); + } + serializeInto(uint8array, index) { + uint8array[index] = this.buffer[0]; + uint8array[index + 1] = this.buffer[1]; + uint8array[index + 2] = this.buffer[2]; + uint8array[index + 3] = this.buffer[3]; + uint8array[index + 4] = this.buffer[4]; + uint8array[index + 5] = this.buffer[5]; + uint8array[index + 6] = this.buffer[6]; + uint8array[index + 7] = this.buffer[7]; + uint8array[index + 8] = this.buffer[8]; + uint8array[index + 9] = this.buffer[9]; + uint8array[index + 10] = this.buffer[10]; + uint8array[index + 11] = this.buffer[11]; + return 12; + } + static createFromTime(time) { + const buffer = ByteUtils.allocate(12); + for (let i = 11; i >= 4; i--) + buffer[i] = 0; + NumberUtils.setInt32BE(buffer, 0, time); + return new ObjectId(buffer); + } + static createFromHexString(hexString) { + if (hexString?.length !== 24) { + throw new BSONError('hex string must be 24 characters'); + } + return new ObjectId(ByteUtils.fromHex(hexString)); + } + static createFromBase64(base64) { + if (base64?.length !== 16) { + throw new BSONError('base64 string must be 16 characters'); + } + return new ObjectId(ByteUtils.fromBase64(base64)); + } + static isValid(id) { + if (id == null) + return false; + try { + new ObjectId(id); + return true; + } + catch { + return false; + } + } + toExtendedJSON() { + if (this.toHexString) + return { $oid: this.toHexString() }; + return { $oid: this.toString('hex') }; + } + static fromExtendedJSON(doc) { + return new ObjectId(doc.$oid); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new ObjectId(${inspect(this.toHexString(), options)})`; + } +} +ObjectId.index = Math.floor(Math.random() * 0xffffff); + +function internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined) { + let totalLength = 4 + 1; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + totalLength += calculateElement(i.toString(), object[i], serializeFunctions, true, ignoreUndefined); + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + } + for (const key of Object.keys(object)) { + totalLength += calculateElement(key, object[key], serializeFunctions, false, ignoreUndefined); + } + } + return totalLength; +} +function calculateElement(name, value, serializeFunctions = false, isArray = false, ignoreUndefined = false) { + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + switch (typeof value) { + case 'string': + return 1 + ByteUtils.utf8ByteLength(name) + 1 + 4 + ByteUtils.utf8ByteLength(value) + 1; + case 'number': + if (Math.floor(value) === value && + value >= JS_INT_MIN && + value <= JS_INT_MAX) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (4 + 1); + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + case 'undefined': + if (isArray || !ignoreUndefined) + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + return 0; + case 'boolean': + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 1); + case 'object': + if (value != null && + typeof value._bsontype === 'string' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value == null || value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + } + else if (value._bsontype === 'ObjectId') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (12 + 1); + } + else if (value instanceof Date || isDate(value)) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (ArrayBuffer.isView(value) || + value instanceof ArrayBuffer || + isAnyArrayBuffer(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 4 + 1) + value.byteLength); + } + else if (value._bsontype === 'Long' || + value._bsontype === 'Double' || + value._bsontype === 'Timestamp') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (value._bsontype === 'Decimal128') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (16 + 1); + } + else if (value._bsontype === 'Code') { + if (value.scope != null && Object.keys(value.scope).length > 0) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + + internalCalculateObjectSize(value.scope, serializeFunctions, ignoreUndefined)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1); + } + } + else if (value._bsontype === 'Binary') { + const binary = value; + if (binary.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + (binary.position + 1 + 4 + 1 + 4)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (binary.position + 1 + 4 + 1)); + } + } + else if (value._bsontype === 'Symbol') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + ByteUtils.utf8ByteLength(value.value) + + 4 + + 1 + + 1); + } + else if (value._bsontype === 'DBRef') { + const ordered_values = Object.assign({ + $ref: value.collection, + $id: value.oid + }, value.fields); + if (value.db != null) { + ordered_values['$db'] = value.db; + } + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + internalCalculateObjectSize(ordered_values, serializeFunctions, ignoreUndefined)); + } + else if (value instanceof RegExp || isRegExp(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.source) + + 1 + + (value.global ? 1 : 0) + + (value.ignoreCase ? 1 : 0) + + (value.multiline ? 1 : 0) + + 1); + } + else if (value._bsontype === 'BSONRegExp') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.pattern) + + 1 + + ByteUtils.utf8ByteLength(value.options) + + 1); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + internalCalculateObjectSize(value, serializeFunctions, ignoreUndefined) + + 1); + } + case 'function': + if (serializeFunctions) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.toString()) + + 1); + } + } + return 0; +} + +function alphabetize(str) { + return str.split('').sort().join(''); +} +class BSONRegExp extends BSONValue { + get _bsontype() { + return 'BSONRegExp'; + } + constructor(pattern, options) { + super(); + this.pattern = pattern; + this.options = alphabetize(options ?? ''); + if (this.pattern.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`); + } + if (this.options.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`); + } + for (let i = 0; i < this.options.length; i++) { + if (!(this.options[i] === 'i' || + this.options[i] === 'm' || + this.options[i] === 'x' || + this.options[i] === 'l' || + this.options[i] === 's' || + this.options[i] === 'u')) { + throw new BSONError(`The regular expression option [${this.options[i]}] is not supported`); + } + } + } + static parseOptions(options) { + return options ? options.split('').sort().join('') : ''; + } + toExtendedJSON(options) { + options = options || {}; + if (options.legacy) { + return { $regex: this.pattern, $options: this.options }; + } + return { $regularExpression: { pattern: this.pattern, options: this.options } }; + } + static fromExtendedJSON(doc) { + if ('$regex' in doc) { + if (typeof doc.$regex !== 'string') { + if (doc.$regex._bsontype === 'BSONRegExp') { + return doc; + } + } + else { + return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options)); + } + } + if ('$regularExpression' in doc) { + return new BSONRegExp(doc.$regularExpression.pattern, BSONRegExp.parseOptions(doc.$regularExpression.options)); + } + throw new BSONError(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(doc)}`); + } + inspect(depth, options, inspect) { + const stylize = getStylizeFunction(options) ?? (v => v); + inspect ??= defaultInspect; + const pattern = stylize(inspect(this.pattern), 'regexp'); + const flags = stylize(inspect(this.options), 'regexp'); + return `new BSONRegExp(${pattern}, ${flags})`; + } +} + +class BSONSymbol extends BSONValue { + get _bsontype() { + return 'BSONSymbol'; + } + constructor(value) { + super(); + this.value = value; + } + valueOf() { + return this.value; + } + toString() { + return this.value; + } + toJSON() { + return this.value; + } + toExtendedJSON() { + return { $symbol: this.value }; + } + static fromExtendedJSON(doc) { + return new BSONSymbol(doc.$symbol); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new BSONSymbol(${inspect(this.value, options)})`; + } +} + +const LongWithoutOverridesClass = Long; +class Timestamp extends LongWithoutOverridesClass { + get _bsontype() { + return 'Timestamp'; + } + constructor(low) { + if (low == null) { + super(0, 0, true); + } + else if (typeof low === 'bigint') { + super(low, true); + } + else if (Long.isLong(low)) { + super(low.low, low.high, true); + } + else if (typeof low === 'object' && 't' in low && 'i' in low) { + if (typeof low.t !== 'number' && (typeof low.t !== 'object' || low.t._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide t as a number'); + } + if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide i as a number'); + } + const t = Number(low.t); + const i = Number(low.i); + if (t < 0 || Number.isNaN(t)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive t'); + } + if (i < 0 || Number.isNaN(i)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive i'); + } + if (t > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max'); + } + if (i > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max'); + } + super(i, t, true); + } + else { + throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }'); + } + } + toJSON() { + return { + $timestamp: this.toString() + }; + } + static fromInt(value) { + return new Timestamp(Long.fromInt(value, true)); + } + static fromNumber(value) { + return new Timestamp(Long.fromNumber(value, true)); + } + static fromBits(lowBits, highBits) { + return new Timestamp({ i: lowBits, t: highBits }); + } + static fromString(str, optRadix) { + return new Timestamp(Long.fromString(str, true, optRadix)); + } + toExtendedJSON() { + return { $timestamp: { t: this.high >>> 0, i: this.low >>> 0 } }; + } + static fromExtendedJSON(doc) { + const i = Long.isLong(doc.$timestamp.i) + ? doc.$timestamp.i.getLowBitsUnsigned() + : doc.$timestamp.i; + const t = Long.isLong(doc.$timestamp.t) + ? doc.$timestamp.t.getLowBitsUnsigned() + : doc.$timestamp.t; + return new Timestamp({ t, i }); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const t = inspect(this.high >>> 0, options); + const i = inspect(this.low >>> 0, options); + return `new Timestamp({ t: ${t}, i: ${i} })`; + } +} +Timestamp.MAX_VALUE = Long.MAX_UNSIGNED_VALUE; + +const JS_INT_MAX_LONG = Long.fromNumber(JS_INT_MAX); +const JS_INT_MIN_LONG = Long.fromNumber(JS_INT_MIN); +function internalDeserialize(buffer, options, isArray) { + options = options == null ? {} : options; + const index = options && options.index ? options.index : 0; + const size = NumberUtils.getInt32LE(buffer, index); + if (size < 5) { + throw new BSONError(`bson size must be >= 5, is ${size}`); + } + if (options.allowObjectSmallerThanBufferSize && buffer.length < size) { + throw new BSONError(`buffer length ${buffer.length} must be >= bson size ${size}`); + } + if (!options.allowObjectSmallerThanBufferSize && buffer.length !== size) { + throw new BSONError(`buffer length ${buffer.length} must === bson size ${size}`); + } + if (size + index > buffer.byteLength) { + throw new BSONError(`(bson size ${size} + options.index ${index} must be <= buffer length ${buffer.byteLength})`); + } + if (buffer[index + size - 1] !== 0) { + throw new BSONError("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00"); + } + return deserializeObject(buffer, index, options, isArray); +} +const allowedDBRefKeys = /^\$ref$|^\$id$|^\$db$/; +function deserializeObject(buffer, index, options, isArray = false) { + const fieldsAsRaw = options['fieldsAsRaw'] == null ? null : options['fieldsAsRaw']; + const raw = options['raw'] == null ? false : options['raw']; + const bsonRegExp = typeof options['bsonRegExp'] === 'boolean' ? options['bsonRegExp'] : false; + const promoteBuffers = options.promoteBuffers ?? false; + const promoteLongs = options.promoteLongs ?? true; + const promoteValues = options.promoteValues ?? true; + const useBigInt64 = options.useBigInt64 ?? false; + if (useBigInt64 && !promoteValues) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + if (useBigInt64 && !promoteLongs) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + const validation = options.validation == null ? { utf8: true } : options.validation; + let globalUTFValidation = true; + let validationSetting; + let utf8KeysSet; + const utf8ValidatedKeys = validation.utf8; + if (typeof utf8ValidatedKeys === 'boolean') { + validationSetting = utf8ValidatedKeys; + } + else { + globalUTFValidation = false; + const utf8ValidationValues = Object.keys(utf8ValidatedKeys).map(function (key) { + return utf8ValidatedKeys[key]; + }); + if (utf8ValidationValues.length === 0) { + throw new BSONError('UTF-8 validation setting cannot be empty'); + } + if (typeof utf8ValidationValues[0] !== 'boolean') { + throw new BSONError('Invalid UTF-8 validation option, must specify boolean values'); + } + validationSetting = utf8ValidationValues[0]; + if (!utf8ValidationValues.every(item => item === validationSetting)) { + throw new BSONError('Invalid UTF-8 validation option - keys must be all true or all false'); + } + } + if (!globalUTFValidation) { + utf8KeysSet = new Set(); + for (const key of Object.keys(utf8ValidatedKeys)) { + utf8KeysSet.add(key); + } + } + const startIndex = index; + if (buffer.length < 5) + throw new BSONError('corrupt bson message < 5 bytes long'); + const size = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (size < 5 || size > buffer.length) + throw new BSONError('corrupt bson message'); + const object = isArray ? [] : {}; + let arrayIndex = 0; + const done = false; + let isPossibleDBRef = isArray ? false : null; + while (!done) { + const elementType = buffer[index++]; + if (elementType === 0) + break; + let i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.byteLength) + throw new BSONError('Bad BSON Document: illegal CString'); + const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i, false); + let shouldValidateKey = true; + if (globalUTFValidation || utf8KeysSet?.has(name)) { + shouldValidateKey = validationSetting; + } + else { + shouldValidateKey = !validationSetting; + } + if (isPossibleDBRef !== false && name[0] === '$') { + isPossibleDBRef = allowedDBRefKeys.test(name); + } + let value; + index = i + 1; + if (elementType === BSON_DATA_STRING) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + value = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + } + else if (elementType === BSON_DATA_OID) { + const oid = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oid[i] = buffer[index + i]; + value = new ObjectId(oid); + index = index + 12; + } + else if (elementType === BSON_DATA_INT && promoteValues === false) { + value = new Int32(NumberUtils.getInt32LE(buffer, index)); + index += 4; + } + else if (elementType === BSON_DATA_INT) { + value = NumberUtils.getInt32LE(buffer, index); + index += 4; + } + else if (elementType === BSON_DATA_NUMBER) { + value = NumberUtils.getFloat64LE(buffer, index); + index += 8; + if (promoteValues === false) + value = new Double(value); + } + else if (elementType === BSON_DATA_DATE) { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + value = new Date(new Long(lowBits, highBits).toNumber()); + } + else if (elementType === BSON_DATA_BOOLEAN) { + if (buffer[index] !== 0 && buffer[index] !== 1) + throw new BSONError('illegal boolean type value'); + value = buffer[index++] === 1; + } + else if (elementType === BSON_DATA_OBJECT) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + if (objectSize <= 0 || objectSize > buffer.length - index) + throw new BSONError('bad embedded document length in bson'); + if (raw) { + value = buffer.slice(index, index + objectSize); + } + else { + let objectOptions = options; + if (!globalUTFValidation) { + objectOptions = { ...options, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, objectOptions, false); + } + index = index + objectSize; + } + else if (elementType === BSON_DATA_ARRAY) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + let arrayOptions = options; + const stopIndex = index + objectSize; + if (fieldsAsRaw && fieldsAsRaw[name]) { + arrayOptions = { ...options, raw: true }; + } + if (!globalUTFValidation) { + arrayOptions = { ...arrayOptions, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, arrayOptions, true); + index = index + objectSize; + if (buffer[index - 1] !== 0) + throw new BSONError('invalid array terminator byte'); + if (index !== stopIndex) + throw new BSONError('corrupted array bson'); + } + else if (elementType === BSON_DATA_UNDEFINED) { + value = undefined; + } + else if (elementType === BSON_DATA_NULL) { + value = null; + } + else if (elementType === BSON_DATA_LONG) { + if (useBigInt64) { + value = NumberUtils.getBigInt64LE(buffer, index); + index += 8; + } + else { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + const long = new Long(lowBits, highBits); + if (promoteLongs && promoteValues === true) { + value = + long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) + ? long.toNumber() + : long; + } + else { + value = long; + } + } + } + else if (elementType === BSON_DATA_DECIMAL128) { + const bytes = ByteUtils.allocateUnsafe(16); + for (let i = 0; i < 16; i++) + bytes[i] = buffer[index + i]; + index = index + 16; + value = new Decimal128(bytes); + } + else if (elementType === BSON_DATA_BINARY) { + let binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + const totalBinarySize = binarySize; + const subType = buffer[index++]; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found'); + if (binarySize > buffer.byteLength) + throw new BSONError('Binary type size larger than document size'); + if (buffer['slice'] != null) { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.toLocalBufferType(buffer.slice(index, index + binarySize)); + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + else { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.allocateUnsafe(binarySize); + for (i = 0; i < binarySize; i++) { + value[i] = buffer[index + i]; + } + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + index = index + binarySize; + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === false) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + const optionsArray = new Array(regExpOptions.length); + for (i = 0; i < regExpOptions.length; i++) { + switch (regExpOptions[i]) { + case 'm': + optionsArray[i] = 'm'; + break; + case 's': + optionsArray[i] = 'g'; + break; + case 'i': + optionsArray[i] = 'i'; + break; + } + } + value = new RegExp(source, optionsArray.join('')); + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === true) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + value = new BSONRegExp(source, regExpOptions); + } + else if (elementType === BSON_DATA_SYMBOL) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const symbol = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = promoteValues ? symbol : new BSONSymbol(symbol); + index = index + stringSize; + } + else if (elementType === BSON_DATA_TIMESTAMP) { + value = new Timestamp({ + i: NumberUtils.getUint32LE(buffer, index), + t: NumberUtils.getUint32LE(buffer, index + 4) + }); + index += 8; + } + else if (elementType === BSON_DATA_MIN_KEY) { + value = new MinKey(); + } + else if (elementType === BSON_DATA_MAX_KEY) { + value = new MaxKey(); + } + else if (elementType === BSON_DATA_CODE) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = new Code(functionString); + index = index + stringSize; + } + else if (elementType === BSON_DATA_CODE_W_SCOPE) { + const totalSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (totalSize < 4 + 4 + 4 + 1) { + throw new BSONError('code_w_scope total size shorter minimum expected length'); + } + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + const scopeObject = deserializeObject(buffer, _index, options, false); + index = index + objectSize; + if (totalSize < 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too short, truncating scope'); + } + if (totalSize > 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too long, clips outer document'); + } + value = new Code(functionString, scopeObject); + } + else if (elementType === BSON_DATA_DBPOINTER) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) + throw new BSONError('bad string length in bson'); + const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const oidBuffer = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oidBuffer[i] = buffer[index + i]; + const oid = new ObjectId(oidBuffer); + index = index + 12; + value = new DBRef(namespace, oid); + } + else { + throw new BSONError(`Detected unknown BSON type ${elementType.toString(16)} for fieldname "${name}"`); + } + if (name === '__proto__') { + Object.defineProperty(object, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + object[name] = value; + } + } + if (size !== index - startIndex) { + if (isArray) + throw new BSONError('corrupt array bson'); + throw new BSONError('corrupt object bson'); + } + if (!isPossibleDBRef) + return object; + if (isDBRefLike(object)) { + const copy = Object.assign({}, object); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(object.$ref, object.$id, object.$db, copy); + } + return object; +} + +const regexp = /\x00/; +const ignoreKeys = new Set(['$db', '$ref', '$id', '$clusterTime']); +function serializeString(buffer, key, value, index) { + buffer[index++] = BSON_DATA_STRING; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes + 1; + buffer[index - 1] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value, index + 4); + NumberUtils.setInt32LE(buffer, index, size + 1); + index = index + 4 + size; + buffer[index++] = 0; + return index; +} +function serializeNumber(buffer, key, value, index) { + const isNegativeZero = Object.is(value, -0); + const type = !isNegativeZero && + Number.isSafeInteger(value) && + value <= BSON_INT32_MAX && + value >= BSON_INT32_MIN + ? BSON_DATA_INT + : BSON_DATA_NUMBER; + buffer[index++] = type; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0x00; + if (type === BSON_DATA_INT) { + index += NumberUtils.setInt32LE(buffer, index, value); + } + else { + index += NumberUtils.setFloat64LE(buffer, index, value); + } + return index; +} +function serializeBigInt(buffer, key, value, index) { + buffer[index++] = BSON_DATA_LONG; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index += numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setBigInt64LE(buffer, index, value); + return index; +} +function serializeNull(buffer, key, _, index) { + buffer[index++] = BSON_DATA_NULL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeBoolean(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BOOLEAN; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + buffer[index++] = value ? 1 : 0; + return index; +} +function serializeDate(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DATE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const dateInMilis = Long.fromNumber(value.getTime()); + const lowBits = dateInMilis.getLowBits(); + const highBits = dateInMilis.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.source && value.source.match(regexp) != null) { + throw new BSONError('value ' + value.source + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.source, index); + buffer[index++] = 0x00; + if (value.ignoreCase) + buffer[index++] = 0x69; + if (value.global) + buffer[index++] = 0x73; + if (value.multiline) + buffer[index++] = 0x6d; + buffer[index++] = 0x00; + return index; +} +function serializeBSONRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.pattern.match(regexp) != null) { + throw new BSONError('pattern ' + value.pattern + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.pattern, index); + buffer[index++] = 0x00; + const sortedOptions = value.options.split('').sort().join(''); + index = index + ByteUtils.encodeUTF8Into(buffer, sortedOptions, index); + buffer[index++] = 0x00; + return index; +} +function serializeMinMax(buffer, key, value, index) { + if (value === null) { + buffer[index++] = BSON_DATA_NULL; + } + else if (value._bsontype === 'MinKey') { + buffer[index++] = BSON_DATA_MIN_KEY; + } + else { + buffer[index++] = BSON_DATA_MAX_KEY; + } + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeObjectId(buffer, key, value, index) { + buffer[index++] = BSON_DATA_OID; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += value.serializeInto(buffer, index); + return index; +} +function serializeBuffer(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = value.length; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = BSON_BINARY_SUBTYPE_DEFAULT; + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = value[i]; + } + else { + buffer.set(value, index); + } + index = index + size; + return index; +} +function serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path) { + if (path.has(value)) { + throw new BSONError('Cannot convert circular structure to BSON'); + } + path.add(value); + buffer[index++] = Array.isArray(value) ? BSON_DATA_ARRAY : BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const endIndex = serializeInto(buffer, value, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + path.delete(value); + return endIndex; +} +function serializeDecimal128(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DECIMAL128; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + for (let i = 0; i < 16; i++) + buffer[index + i] = value.bytes[i]; + return index + 16; +} +function serializeLong(buffer, key, value, index) { + buffer[index++] = + value._bsontype === 'Long' ? BSON_DATA_LONG : BSON_DATA_TIMESTAMP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const lowBits = value.getLowBits(); + const highBits = value.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeInt32(buffer, key, value, index) { + value = value.valueOf(); + buffer[index++] = BSON_DATA_INT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setInt32LE(buffer, index, value); + return index; +} +function serializeDouble(buffer, key, value, index) { + buffer[index++] = BSON_DATA_NUMBER; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setFloat64LE(buffer, index, value.value); + return index; +} +function serializeFunction(buffer, key, value, index) { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeCode(buffer, key, value, index, checkKeys = false, depth = 0, serializeFunctions = false, ignoreUndefined = true, path) { + if (value.scope && typeof value.scope === 'object') { + buffer[index++] = BSON_DATA_CODE_W_SCOPE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + const functionString = value.code; + index = index + 4; + const codeSize = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, codeSize); + buffer[index + 4 + codeSize - 1] = 0; + index = index + codeSize + 4; + const endIndex = serializeInto(buffer, value.scope, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + index = endIndex - 1; + const totalSize = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, startIndex, totalSize); + buffer[index++] = 0; + } + else { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.code.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + } + return index; +} +function serializeBinary(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const data = value.buffer; + let size = value.position; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) + size = size + 4; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = value.sub_type; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + size = size - 4; + index += NumberUtils.setInt32LE(buffer, index, size); + } + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = data[i]; + } + else { + buffer.set(data, index); + } + index = index + value.position; + return index; +} +function serializeSymbol(buffer, key, value, index) { + buffer[index++] = BSON_DATA_SYMBOL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value.value, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path) { + buffer[index++] = BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + let output = { + $ref: value.collection || value.namespace, + $id: value.oid + }; + if (value.db != null) { + output.$db = value.db; + } + output = Object.assign(output, value.fields); + const endIndex = serializeInto(buffer, output, false, index, depth + 1, serializeFunctions, true, path); + const size = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, index, size); + return endIndex; +} +function serializeInto(buffer, object, checkKeys, startingIndex, depth, serializeFunctions, ignoreUndefined, path) { + if (path == null) { + if (object == null) { + buffer[0] = 0x05; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + buffer[4] = 0x00; + return 5; + } + if (Array.isArray(object)) { + throw new BSONError('serialize does not support an array as the root input'); + } + if (typeof object !== 'object') { + throw new BSONError('serialize does not support non-object as the root input'); + } + else if ('_bsontype' in object && typeof object._bsontype === 'string') { + throw new BSONError(`BSON types cannot be serialized as a document`); + } + else if (isDate(object) || + isRegExp(object) || + isUint8Array(object) || + isAnyArrayBuffer(object)) { + throw new BSONError(`date, regexp, typedarray, and arraybuffer cannot be BSON documents`); + } + path = new Set(); + } + path.add(object); + let index = startingIndex + 4; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + const key = `${i}`; + let value = object[i]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + if (typeof value === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (typeof value === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (typeof value === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (typeof value === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (typeof value === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else if (object instanceof Map || isMap(object)) { + const iterator = object.entries(); + let done = false; + while (!done) { + const entry = iterator.next(); + done = !!entry.done; + if (done) + continue; + const key = entry.value[0]; + let value = entry.value[1]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === null || (value === undefined && ignoreUndefined === false)) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + if (object != null && typeof object !== 'object') { + throw new BSONError('toBSON function did not return an object'); + } + } + for (const key of Object.keys(object)) { + let value = object[key]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + if (ignoreUndefined === false) + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + path.delete(object); + buffer[index++] = 0x00; + const size = index - startingIndex; + startingIndex += NumberUtils.setInt32LE(buffer, startingIndex, size); + return index; +} + +function isBSONType(value) { + return (value != null && + typeof value === 'object' && + '_bsontype' in value && + typeof value._bsontype === 'string'); +} +const keysToCodecs = { + $oid: ObjectId, + $binary: Binary, + $uuid: Binary, + $symbol: BSONSymbol, + $numberInt: Int32, + $numberDecimal: Decimal128, + $numberDouble: Double, + $numberLong: Long, + $minKey: MinKey, + $maxKey: MaxKey, + $regex: BSONRegExp, + $regularExpression: BSONRegExp, + $timestamp: Timestamp +}; +function deserializeValue(value, options = {}) { + if (typeof value === 'number') { + const in32BitRange = value <= BSON_INT32_MAX && value >= BSON_INT32_MIN; + const in64BitRange = value <= BSON_INT64_MAX && value >= BSON_INT64_MIN; + if (options.relaxed || options.legacy) { + return value; + } + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (in32BitRange) { + return new Int32(value); + } + if (in64BitRange) { + if (options.useBigInt64) { + return BigInt(value); + } + return Long.fromNumber(value); + } + } + return new Double(value); + } + if (value == null || typeof value !== 'object') + return value; + if (value.$undefined) + return null; + const keys = Object.keys(value).filter(k => k.startsWith('$') && value[k] != null); + for (let i = 0; i < keys.length; i++) { + const c = keysToCodecs[keys[i]]; + if (c) + return c.fromExtendedJSON(value, options); + } + if (value.$date != null) { + const d = value.$date; + const date = new Date(); + if (options.legacy) { + if (typeof d === 'number') + date.setTime(d); + else if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + else { + if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (Long.isLong(d)) + date.setTime(d.toNumber()); + else if (typeof d === 'number' && options.relaxed) + date.setTime(d); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + return date; + } + if (value.$code != null) { + const copy = Object.assign({}, value); + if (value.$scope) { + copy.$scope = deserializeValue(value.$scope); + } + return Code.fromExtendedJSON(value); + } + if (isDBRefLike(value) || value.$dbPointer) { + const v = value.$ref ? value : value.$dbPointer; + if (v instanceof DBRef) + return v; + const dollarKeys = Object.keys(v).filter(k => k.startsWith('$')); + let valid = true; + dollarKeys.forEach(k => { + if (['$ref', '$id', '$db'].indexOf(k) === -1) + valid = false; + }); + if (valid) + return DBRef.fromExtendedJSON(v); + } + return value; +} +function serializeArray(array, options) { + return array.map((v, index) => { + options.seenObjects.push({ propertyName: `index ${index}`, obj: null }); + try { + return serializeValue(v, options); + } + finally { + options.seenObjects.pop(); + } + }); +} +function getISOString(date) { + const isoStr = date.toISOString(); + return date.getUTCMilliseconds() !== 0 ? isoStr : isoStr.slice(0, -5) + 'Z'; +} +function serializeValue(value, options) { + if (value instanceof Map || isMap(value)) { + const obj = Object.create(null); + for (const [k, v] of value) { + if (typeof k !== 'string') { + throw new BSONError('Can only serialize maps with string keys'); + } + obj[k] = v; + } + return serializeValue(obj, options); + } + if ((typeof value === 'object' || typeof value === 'function') && value !== null) { + const index = options.seenObjects.findIndex(entry => entry.obj === value); + if (index !== -1) { + const props = options.seenObjects.map(entry => entry.propertyName); + const leadingPart = props + .slice(0, index) + .map(prop => `${prop} -> `) + .join(''); + const alreadySeen = props[index]; + const circularPart = ' -> ' + + props + .slice(index + 1, props.length - 1) + .map(prop => `${prop} -> `) + .join(''); + const current = props[props.length - 1]; + const leadingSpace = ' '.repeat(leadingPart.length + alreadySeen.length / 2); + const dashes = '-'.repeat(circularPart.length + (alreadySeen.length + current.length) / 2 - 1); + throw new BSONError('Converting circular structure to EJSON:\n' + + ` ${leadingPart}${alreadySeen}${circularPart}${current}\n` + + ` ${leadingSpace}\\${dashes}/`); + } + options.seenObjects[options.seenObjects.length - 1].obj = value; + } + if (Array.isArray(value)) + return serializeArray(value, options); + if (value === undefined) + return null; + if (value instanceof Date || isDate(value)) { + const dateNum = value.getTime(), inRange = dateNum > -1 && dateNum < 253402318800000; + if (options.legacy) { + return options.relaxed && inRange + ? { $date: value.getTime() } + : { $date: getISOString(value) }; + } + return options.relaxed && inRange + ? { $date: getISOString(value) } + : { $date: { $numberLong: value.getTime().toString() } }; + } + if (typeof value === 'number' && (!options.relaxed || !isFinite(value))) { + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return { $numberInt: value.toString() }; + } + if (value >= BSON_INT64_MIN && value <= BSON_INT64_MAX) { + return { $numberLong: value.toString() }; + } + } + return { $numberDouble: Object.is(value, -0) ? '-0.0' : value.toString() }; + } + if (typeof value === 'bigint') { + if (!options.relaxed) { + return { $numberLong: BigInt.asIntN(64, value).toString() }; + } + return Number(BigInt.asIntN(64, value)); + } + if (value instanceof RegExp || isRegExp(value)) { + let flags = value.flags; + if (flags === undefined) { + const match = value.toString().match(/[gimuy]*$/); + if (match) { + flags = match[0]; + } + } + const rx = new BSONRegExp(value.source, flags); + return rx.toExtendedJSON(options); + } + if (value != null && typeof value === 'object') + return serializeDocument(value, options); + return value; +} +const BSON_TYPE_MAPPINGS = { + Binary: (o) => new Binary(o.value(), o.sub_type), + Code: (o) => new Code(o.code, o.scope), + DBRef: (o) => new DBRef(o.collection || o.namespace, o.oid, o.db, o.fields), + Decimal128: (o) => new Decimal128(o.bytes), + Double: (o) => new Double(o.value), + Int32: (o) => new Int32(o.value), + Long: (o) => Long.fromBits(o.low != null ? o.low : o.low_, o.low != null ? o.high : o.high_, o.low != null ? o.unsigned : o.unsigned_), + MaxKey: () => new MaxKey(), + MinKey: () => new MinKey(), + ObjectId: (o) => new ObjectId(o), + BSONRegExp: (o) => new BSONRegExp(o.pattern, o.options), + BSONSymbol: (o) => new BSONSymbol(o.value), + Timestamp: (o) => Timestamp.fromBits(o.low, o.high) +}; +function serializeDocument(doc, options) { + if (doc == null || typeof doc !== 'object') + throw new BSONError('not an object instance'); + const bsontype = doc._bsontype; + if (typeof bsontype === 'undefined') { + const _doc = {}; + for (const name of Object.keys(doc)) { + options.seenObjects.push({ propertyName: name, obj: null }); + try { + const value = serializeValue(doc[name], options); + if (name === '__proto__') { + Object.defineProperty(_doc, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + _doc[name] = value; + } + } + finally { + options.seenObjects.pop(); + } + } + return _doc; + } + else if (doc != null && + typeof doc === 'object' && + typeof doc._bsontype === 'string' && + doc[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (isBSONType(doc)) { + let outDoc = doc; + if (typeof outDoc.toExtendedJSON !== 'function') { + const mapper = BSON_TYPE_MAPPINGS[doc._bsontype]; + if (!mapper) { + throw new BSONError('Unrecognized or invalid _bsontype: ' + doc._bsontype); + } + outDoc = mapper(outDoc); + } + if (bsontype === 'Code' && outDoc.scope) { + outDoc = new Code(outDoc.code, serializeValue(outDoc.scope, options)); + } + else if (bsontype === 'DBRef' && outDoc.oid) { + outDoc = new DBRef(serializeValue(outDoc.collection, options), serializeValue(outDoc.oid, options), serializeValue(outDoc.db, options), serializeValue(outDoc.fields, options)); + } + return outDoc.toExtendedJSON(options); + } + else { + throw new BSONError('_bsontype must be a string, but was: ' + typeof bsontype); + } +} +function parse(text, options) { + const ejsonOptions = { + useBigInt64: options?.useBigInt64 ?? false, + relaxed: options?.relaxed ?? true, + legacy: options?.legacy ?? false + }; + return JSON.parse(text, (key, value) => { + if (key.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(key)}`); + } + return deserializeValue(value, ejsonOptions); + }); +} +function stringify(value, replacer, space, options) { + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = undefined; + space = 0; + } + const serializeOptions = Object.assign({ relaxed: true, legacy: false }, options, { + seenObjects: [{ propertyName: '(root)', obj: null }] + }); + const doc = serializeValue(value, serializeOptions); + return JSON.stringify(doc, replacer, space); +} +function EJSONserialize(value, options) { + options = options || {}; + return JSON.parse(stringify(value, options)); +} +function EJSONdeserialize(ejson, options) { + options = options || {}; + return parse(JSON.stringify(ejson), options); +} +const EJSON = Object.create(null); +EJSON.parse = parse; +EJSON.stringify = stringify; +EJSON.serialize = EJSONserialize; +EJSON.deserialize = EJSONdeserialize; +Object.freeze(EJSON); + +function getSize(source, offset) { + try { + return NumberUtils.getNonnegativeInt32LE(source, offset); + } + catch (cause) { + throw new BSONOffsetError('BSON size cannot be negative', offset, { cause }); + } +} +function findNull(bytes, offset) { + let nullTerminatorOffset = offset; + for (; bytes[nullTerminatorOffset] !== 0x00; nullTerminatorOffset++) + ; + if (nullTerminatorOffset === bytes.length - 1) { + throw new BSONOffsetError('Null terminator not found', offset); + } + return nullTerminatorOffset; +} +function parseToElements(bytes, startOffset = 0) { + startOffset ??= 0; + if (bytes.length < 5) { + throw new BSONOffsetError(`Input must be at least 5 bytes, got ${bytes.length} bytes`, startOffset); + } + const documentSize = getSize(bytes, startOffset); + if (documentSize > bytes.length - startOffset) { + throw new BSONOffsetError(`Parsed documentSize (${documentSize} bytes) does not match input length (${bytes.length} bytes)`, startOffset); + } + if (bytes[startOffset + documentSize - 1] !== 0x00) { + throw new BSONOffsetError('BSON documents must end in 0x00', startOffset + documentSize); + } + const elements = []; + let offset = startOffset + 4; + while (offset <= documentSize + startOffset) { + const type = bytes[offset]; + offset += 1; + if (type === 0) { + if (offset - startOffset !== documentSize) { + throw new BSONOffsetError(`Invalid 0x00 type byte`, offset); + } + break; + } + const nameOffset = offset; + const nameLength = findNull(bytes, offset) - nameOffset; + offset += nameLength + 1; + let length; + if (type === 1 || + type === 18 || + type === 9 || + type === 17) { + length = 8; + } + else if (type === 16) { + length = 4; + } + else if (type === 7) { + length = 12; + } + else if (type === 19) { + length = 16; + } + else if (type === 8) { + length = 1; + } + else if (type === 10 || + type === 6 || + type === 127 || + type === 255) { + length = 0; + } + else if (type === 11) { + length = findNull(bytes, findNull(bytes, offset) + 1) + 1 - offset; + } + else if (type === 3 || + type === 4 || + type === 15) { + length = getSize(bytes, offset); + } + else if (type === 2 || + type === 5 || + type === 12 || + type === 13 || + type === 14) { + length = getSize(bytes, offset) + 4; + if (type === 5) { + length += 1; + } + if (type === 12) { + length += 12; + } + } + else { + throw new BSONOffsetError(`Invalid 0x${type.toString(16).padStart(2, '0')} type byte`, offset); + } + if (length > documentSize) { + throw new BSONOffsetError('value reports length larger than document', offset); + } + elements.push([type, nameOffset, nameLength, offset, length]); + offset += length; + } + return elements; +} + +const onDemand = Object.create(null); +onDemand.parseToElements = parseToElements; +onDemand.ByteUtils = ByteUtils; +onDemand.NumberUtils = NumberUtils; +Object.freeze(onDemand); + +const MAXSIZE = 1024 * 1024 * 17; +let buffer = ByteUtils.allocate(MAXSIZE); +function setInternalBufferSize(size) { + if (buffer.length < size) { + buffer = ByteUtils.allocate(size); + } +} +function serialize(object, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const minInternalBufferSize = typeof options.minInternalBufferSize === 'number' ? options.minInternalBufferSize : MAXSIZE; + if (buffer.length < minInternalBufferSize) { + buffer = ByteUtils.allocate(minInternalBufferSize); + } + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + const finishedBuffer = ByteUtils.allocateUnsafe(serializationIndex); + finishedBuffer.set(buffer.subarray(0, serializationIndex), 0); + return finishedBuffer; +} +function serializeWithBufferAndIndex(object, finalBuffer, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const startIndex = typeof options.index === 'number' ? options.index : 0; + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + finalBuffer.set(buffer.subarray(0, serializationIndex), startIndex); + return startIndex + serializationIndex - 1; +} +function deserialize(buffer, options = {}) { + return internalDeserialize(ByteUtils.toLocalBufferType(buffer), options); +} +function calculateObjectSize(object, options = {}) { + options = options || {}; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + return internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined); +} +function deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { + const internalOptions = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, options); + const bufferData = ByteUtils.toLocalBufferType(data); + let index = startIndex; + for (let i = 0; i < numberOfDocuments; i++) { + const size = NumberUtils.getInt32LE(bufferData, index); + internalOptions.index = index; + documents[docStartIndex + i] = internalDeserialize(bufferData, internalOptions); + index = index + size; + } + return index; +} + +var bson = /*#__PURE__*/Object.freeze({ + __proto__: null, + BSONError: BSONError, + BSONOffsetError: BSONOffsetError, + BSONRegExp: BSONRegExp, + BSONRuntimeError: BSONRuntimeError, + BSONSymbol: BSONSymbol, + BSONType: BSONType, + BSONValue: BSONValue, + BSONVersionError: BSONVersionError, + Binary: Binary, + Code: Code, + DBRef: DBRef, + Decimal128: Decimal128, + Double: Double, + EJSON: EJSON, + Int32: Int32, + Long: Long, + MaxKey: MaxKey, + MinKey: MinKey, + ObjectId: ObjectId, + Timestamp: Timestamp, + UUID: UUID, + calculateObjectSize: calculateObjectSize, + deserialize: deserialize, + deserializeStream: deserializeStream, + onDemand: onDemand, + serialize: serialize, + serializeWithBufferAndIndex: serializeWithBufferAndIndex, + setInternalBufferSize: setInternalBufferSize +}); + +export { bson as BSON, BSONError, BSONOffsetError, BSONRegExp, BSONRuntimeError, BSONSymbol, BSONType, BSONValue, BSONVersionError, Binary, Code, DBRef, Decimal128, Double, EJSON, Int32, Long, MaxKey, MinKey, ObjectId, Timestamp, UUID, calculateObjectSize, deserialize, deserializeStream, onDemand, serialize, serializeWithBufferAndIndex, setInternalBufferSize }; +//# sourceMappingURL=bson.mjs.map diff --git a/user-service/node_modules/bson/lib/bson.mjs.map b/user-service/node_modules/bson/lib/bson.mjs.map new file mode 100644 index 0000000000..fd50af3fdd --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"bson.mjs","sources":["../src/parser/utils.ts","../src/constants.ts","../src/error.ts","../src/parse_utf8.ts","../src/utils/latin.ts","../src/utils/node_byte_utils.ts","../src/utils/web_byte_utils.ts","../src/utils/byte_utils.ts","../src/bson_value.ts","../src/binary.ts","../src/code.ts","../src/db_ref.ts","../src/utils/string_utils.ts","../src/long.ts","../src/decimal128.ts","../src/double.ts","../src/int_32.ts","../src/max_key.ts","../src/min_key.ts","../src/utils/number_utils.ts","../src/objectid.ts","../src/parser/calculate_size.ts","../src/regexp.ts","../src/symbol.ts","../src/timestamp.ts","../src/parser/deserializer.ts","../src/parser/serializer.ts","../src/extended_json.ts","../src/parser/on_demand/parse_to_elements.ts","../src/parser/on_demand/index.ts","../src/bson.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["StringUtils.validateStringCharacters","StringUtils.removeLeadingZerosAndExplicitPlus","constants.JS_INT_MIN","constants.JS_INT_MAX","constants.BSON_INT32_MIN","constants.BSON_INT32_MAX","constants.BSON_MAJOR_VERSION","constants.BSON_DATA_STRING","constants.BSON_DATA_OID","constants.BSON_DATA_INT","constants.BSON_DATA_NUMBER","constants.BSON_DATA_DATE","constants.BSON_DATA_BOOLEAN","constants.BSON_DATA_OBJECT","constants.BSON_DATA_ARRAY","constants.BSON_DATA_UNDEFINED","constants.BSON_DATA_NULL","constants.BSON_DATA_LONG","constants.BSON_DATA_DECIMAL128","constants.BSON_DATA_BINARY","constants.BSON_BINARY_SUBTYPE_UUID_NEW","constants.BSON_DATA_REGEXP","constants.BSON_DATA_SYMBOL","constants.BSON_DATA_TIMESTAMP","constants.BSON_DATA_MIN_KEY","constants.BSON_DATA_MAX_KEY","constants.BSON_DATA_CODE","constants.BSON_DATA_CODE_W_SCOPE","constants.BSON_DATA_DBPOINTER","constants.BSON_BINARY_SUBTYPE_DEFAULT"],"mappings":"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G,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAA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"} \ No newline at end of file diff --git a/user-service/node_modules/bson/lib/bson.rn.cjs b/user-service/node_modules/bson/lib/bson.rn.cjs new file mode 100644 index 0000000000..8536b9c1cd --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.rn.cjs @@ -0,0 +1,4434 @@ +'use strict'; + +function isAnyArrayBuffer(value) { + return ['[object ArrayBuffer]', '[object SharedArrayBuffer]'].includes(Object.prototype.toString.call(value)); +} +function isUint8Array(value) { + return Object.prototype.toString.call(value) === '[object Uint8Array]'; +} +function isBigInt64Array(value) { + return Object.prototype.toString.call(value) === '[object BigInt64Array]'; +} +function isBigUInt64Array(value) { + return Object.prototype.toString.call(value) === '[object BigUint64Array]'; +} +function isRegExp(d) { + return Object.prototype.toString.call(d) === '[object RegExp]'; +} +function isMap(d) { + return Object.prototype.toString.call(d) === '[object Map]'; +} +function isDate(d) { + return Object.prototype.toString.call(d) === '[object Date]'; +} +function defaultInspect(x, _options) { + return JSON.stringify(x, (k, v) => { + if (typeof v === 'bigint') { + return { $numberLong: `${v}` }; + } + else if (isMap(v)) { + return Object.fromEntries(v); + } + return v; + }); +} +function getStylizeFunction(options) { + const stylizeExists = options != null && + typeof options === 'object' && + 'stylize' in options && + typeof options.stylize === 'function'; + if (stylizeExists) { + return options.stylize; + } +} + +const BSON_MAJOR_VERSION = 6; +const BSON_INT32_MAX = 0x7fffffff; +const BSON_INT32_MIN = -0x80000000; +const BSON_INT64_MAX = Math.pow(2, 63) - 1; +const BSON_INT64_MIN = -Math.pow(2, 63); +const JS_INT_MAX = Math.pow(2, 53); +const JS_INT_MIN = -Math.pow(2, 53); +const BSON_DATA_NUMBER = 1; +const BSON_DATA_STRING = 2; +const BSON_DATA_OBJECT = 3; +const BSON_DATA_ARRAY = 4; +const BSON_DATA_BINARY = 5; +const BSON_DATA_UNDEFINED = 6; +const BSON_DATA_OID = 7; +const BSON_DATA_BOOLEAN = 8; +const BSON_DATA_DATE = 9; +const BSON_DATA_NULL = 10; +const BSON_DATA_REGEXP = 11; +const BSON_DATA_DBPOINTER = 12; +const BSON_DATA_CODE = 13; +const BSON_DATA_SYMBOL = 14; +const BSON_DATA_CODE_W_SCOPE = 15; +const BSON_DATA_INT = 16; +const BSON_DATA_TIMESTAMP = 17; +const BSON_DATA_LONG = 18; +const BSON_DATA_DECIMAL128 = 19; +const BSON_DATA_MIN_KEY = 0xff; +const BSON_DATA_MAX_KEY = 0x7f; +const BSON_BINARY_SUBTYPE_DEFAULT = 0; +const BSON_BINARY_SUBTYPE_FUNCTION = 1; +const BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; +const BSON_BINARY_SUBTYPE_UUID = 3; +const BSON_BINARY_SUBTYPE_UUID_NEW = 4; +const BSON_BINARY_SUBTYPE_MD5 = 5; +const BSON_BINARY_SUBTYPE_ENCRYPTED = 6; +const BSON_BINARY_SUBTYPE_COLUMN = 7; +const BSON_BINARY_SUBTYPE_SENSITIVE = 8; +const BSON_BINARY_SUBTYPE_USER_DEFINED = 128; +const BSONType = Object.freeze({ + double: 1, + string: 2, + object: 3, + array: 4, + binData: 5, + undefined: 6, + objectId: 7, + bool: 8, + date: 9, + null: 10, + regex: 11, + dbPointer: 12, + javascript: 13, + symbol: 14, + javascriptWithScope: 15, + int: 16, + timestamp: 17, + long: 18, + decimal: 19, + minKey: -1, + maxKey: 127 +}); + +class BSONError extends Error { + get bsonError() { + return true; + } + get name() { + return 'BSONError'; + } + constructor(message, options) { + super(message, options); + } + static isBSONError(value) { + return (value != null && + typeof value === 'object' && + 'bsonError' in value && + value.bsonError === true && + 'name' in value && + 'message' in value && + 'stack' in value); + } +} +class BSONVersionError extends BSONError { + get name() { + return 'BSONVersionError'; + } + constructor() { + super(`Unsupported BSON version, bson types must be from bson ${BSON_MAJOR_VERSION}.x.x`); + } +} +class BSONRuntimeError extends BSONError { + get name() { + return 'BSONRuntimeError'; + } + constructor(message) { + super(message); + } +} +class BSONOffsetError extends BSONError { + get name() { + return 'BSONOffsetError'; + } + constructor(message, offset, options) { + super(`${message}. offset: ${offset}`, options); + this.offset = offset; + } +} + +const { TextDecoder } = require('../vendor/text-encoding'); +let TextDecoderFatal; +let TextDecoderNonFatal; +function parseUtf8(buffer, start, end, fatal) { + if (fatal) { + TextDecoderFatal ??= new TextDecoder('utf8', { fatal: true }); + try { + return TextDecoderFatal.decode(buffer.subarray(start, end)); + } + catch (cause) { + throw new BSONError('Invalid UTF-8 string in BSON document', { cause }); + } + } + TextDecoderNonFatal ??= new TextDecoder('utf8', { fatal: false }); + return TextDecoderNonFatal.decode(buffer.subarray(start, end)); +} + +function tryReadBasicLatin(uint8array, start, end) { + if (uint8array.length === 0) { + return ''; + } + const stringByteLength = end - start; + if (stringByteLength === 0) { + return ''; + } + if (stringByteLength > 20) { + return null; + } + if (stringByteLength === 1 && uint8array[start] < 128) { + return String.fromCharCode(uint8array[start]); + } + if (stringByteLength === 2 && uint8array[start] < 128 && uint8array[start + 1] < 128) { + return String.fromCharCode(uint8array[start]) + String.fromCharCode(uint8array[start + 1]); + } + if (stringByteLength === 3 && + uint8array[start] < 128 && + uint8array[start + 1] < 128 && + uint8array[start + 2] < 128) { + return (String.fromCharCode(uint8array[start]) + + String.fromCharCode(uint8array[start + 1]) + + String.fromCharCode(uint8array[start + 2])); + } + const latinBytes = []; + for (let i = start; i < end; i++) { + const byte = uint8array[i]; + if (byte > 127) { + return null; + } + latinBytes.push(byte); + } + return String.fromCharCode(...latinBytes); +} +function tryWriteBasicLatin(destination, source, offset) { + if (source.length === 0) + return 0; + if (source.length > 25) + return null; + if (destination.length - offset < source.length) + return null; + for (let charOffset = 0, destinationOffset = offset; charOffset < source.length; charOffset++, destinationOffset++) { + const char = source.charCodeAt(charOffset); + if (char > 127) + return null; + destination[destinationOffset] = char; + } + return source.length; +} + +function nodejsMathRandomBytes(byteLength) { + return nodeJsByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const nodejsRandomBytes = (() => { + try { + return require('crypto').randomBytes; + } + catch { + return nodejsMathRandomBytes; + } +})(); +const nodeJsByteUtils = { + toLocalBufferType(potentialBuffer) { + if (Buffer.isBuffer(potentialBuffer)) { + return potentialBuffer; + } + if (ArrayBuffer.isView(potentialBuffer)) { + return Buffer.from(potentialBuffer.buffer, potentialBuffer.byteOffset, potentialBuffer.byteLength); + } + const stringTag = potentialBuffer?.[Symbol.toStringTag] ?? Object.prototype.toString.call(potentialBuffer); + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return Buffer.from(potentialBuffer); + } + throw new BSONError(`Cannot create Buffer from ${String(potentialBuffer)}`); + }, + allocate(size) { + return Buffer.alloc(size); + }, + allocateUnsafe(size) { + return Buffer.allocUnsafe(size); + }, + equals(a, b) { + return nodeJsByteUtils.toLocalBufferType(a).equals(b); + }, + fromNumberArray(array) { + return Buffer.from(array); + }, + fromBase64(base64) { + return Buffer.from(base64, 'base64'); + }, + toBase64(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('base64'); + }, + fromISO88591(codePoints) { + return Buffer.from(codePoints, 'binary'); + }, + toISO88591(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('binary'); + }, + fromHex(hex) { + return Buffer.from(hex, 'hex'); + }, + toHex(buffer) { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('hex'); + }, + toUTF8(buffer, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(buffer, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + const string = nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end); + if (fatal) { + for (let i = 0; i < string.length; i++) { + if (string.charCodeAt(i) === 0xfffd) { + parseUtf8(buffer, start, end, true); + break; + } + } + } + return string; + }, + utf8ByteLength(input) { + return Buffer.byteLength(input, 'utf8'); + }, + encodeUTF8Into(buffer, source, byteOffset) { + const latinBytesWritten = tryWriteBasicLatin(buffer, source, byteOffset); + if (latinBytesWritten != null) { + return latinBytesWritten; + } + return nodeJsByteUtils.toLocalBufferType(buffer).write(source, byteOffset, undefined, 'utf8'); + }, + randomBytes: nodejsRandomBytes +}; + +const { TextEncoder } = require('../vendor/text-encoding'); +const { encode: btoa, decode: atob } = require('../vendor/base64'); +function isReactNative() { + const { navigator } = globalThis; + return typeof navigator === 'object' && navigator.product === 'ReactNative'; +} +function webMathRandomBytes(byteLength) { + if (byteLength < 0) { + throw new RangeError(`The argument 'byteLength' is invalid. Received ${byteLength}`); + } + return webByteUtils.fromNumberArray(Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256))); +} +const webRandomBytes = (() => { + const { crypto } = globalThis; + if (crypto != null && typeof crypto.getRandomValues === 'function') { + return (byteLength) => { + return crypto.getRandomValues(webByteUtils.allocate(byteLength)); + }; + } + else { + if (isReactNative()) { + const { console } = globalThis; + console?.warn?.('BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.'); + } + return webMathRandomBytes; + } +})(); +const HEX_DIGIT = /(\d|[a-f])/i; +const webByteUtils = { + toLocalBufferType(potentialUint8array) { + const stringTag = potentialUint8array?.[Symbol.toStringTag] ?? + Object.prototype.toString.call(potentialUint8array); + if (stringTag === 'Uint8Array') { + return potentialUint8array; + } + if (ArrayBuffer.isView(potentialUint8array)) { + return new Uint8Array(potentialUint8array.buffer.slice(potentialUint8array.byteOffset, potentialUint8array.byteOffset + potentialUint8array.byteLength)); + } + if (stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]') { + return new Uint8Array(potentialUint8array); + } + throw new BSONError(`Cannot make a Uint8Array from ${String(potentialUint8array)}`); + }, + allocate(size) { + if (typeof size !== 'number') { + throw new TypeError(`The "size" argument must be of type number. Received ${String(size)}`); + } + return new Uint8Array(size); + }, + allocateUnsafe(size) { + return webByteUtils.allocate(size); + }, + equals(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }, + fromNumberArray(array) { + return Uint8Array.from(array); + }, + fromBase64(base64) { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + }, + toBase64(uint8array) { + return btoa(webByteUtils.toISO88591(uint8array)); + }, + fromISO88591(codePoints) { + return Uint8Array.from(codePoints, c => c.charCodeAt(0) & 0xff); + }, + toISO88591(uint8array) { + return Array.from(Uint16Array.from(uint8array), b => String.fromCharCode(b)).join(''); + }, + fromHex(hex) { + const evenLengthHex = hex.length % 2 === 0 ? hex : hex.slice(0, hex.length - 1); + const buffer = []; + for (let i = 0; i < evenLengthHex.length; i += 2) { + const firstDigit = evenLengthHex[i]; + const secondDigit = evenLengthHex[i + 1]; + if (!HEX_DIGIT.test(firstDigit)) { + break; + } + if (!HEX_DIGIT.test(secondDigit)) { + break; + } + const hexDigit = Number.parseInt(`${firstDigit}${secondDigit}`, 16); + buffer.push(hexDigit); + } + return Uint8Array.from(buffer); + }, + toHex(uint8array) { + return Array.from(uint8array, byte => byte.toString(16).padStart(2, '0')).join(''); + }, + toUTF8(uint8array, start, end, fatal) { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(uint8array, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + return parseUtf8(uint8array, start, end, fatal); + }, + utf8ByteLength(input) { + return new TextEncoder().encode(input).byteLength; + }, + encodeUTF8Into(uint8array, source, byteOffset) { + const bytes = new TextEncoder().encode(source); + uint8array.set(bytes, byteOffset); + return bytes.byteLength; + }, + randomBytes: webRandomBytes +}; + +const hasGlobalBuffer = typeof Buffer === 'function' && Buffer.prototype?._isBuffer !== true; +const ByteUtils = hasGlobalBuffer ? nodeJsByteUtils : webByteUtils; + +class BSONValue { + get [Symbol.for('@@mdb.bson.version')]() { + return BSON_MAJOR_VERSION; + } + [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) { + return this.inspect(depth, options, inspect); + } +} + +class Binary extends BSONValue { + get _bsontype() { + return 'Binary'; + } + constructor(buffer, subType) { + super(); + if (!(buffer == null) && + typeof buffer === 'string' && + !ArrayBuffer.isView(buffer) && + !isAnyArrayBuffer(buffer) && + !Array.isArray(buffer)) { + throw new BSONError('Binary can only be constructed from Uint8Array or number[]'); + } + this.sub_type = subType ?? Binary.BSON_BINARY_SUBTYPE_DEFAULT; + if (buffer == null) { + this.buffer = ByteUtils.allocate(Binary.BUFFER_SIZE); + this.position = 0; + } + else { + this.buffer = Array.isArray(buffer) + ? ByteUtils.fromNumberArray(buffer) + : ByteUtils.toLocalBufferType(buffer); + this.position = this.buffer.byteLength; + } + } + put(byteValue) { + if (typeof byteValue === 'string' && byteValue.length !== 1) { + throw new BSONError('only accepts single character String'); + } + else if (typeof byteValue !== 'number' && byteValue.length !== 1) + throw new BSONError('only accepts single character Uint8Array or Array'); + let decodedByte; + if (typeof byteValue === 'string') { + decodedByte = byteValue.charCodeAt(0); + } + else if (typeof byteValue === 'number') { + decodedByte = byteValue; + } + else { + decodedByte = byteValue[0]; + } + if (decodedByte < 0 || decodedByte > 255) { + throw new BSONError('only accepts number in a valid unsigned byte range 0-255'); + } + if (this.buffer.byteLength > this.position) { + this.buffer[this.position++] = decodedByte; + } + else { + const newSpace = ByteUtils.allocate(Binary.BUFFER_SIZE + this.buffer.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + this.buffer[this.position++] = decodedByte; + } + } + write(sequence, offset) { + offset = typeof offset === 'number' ? offset : this.position; + if (this.buffer.byteLength < offset + sequence.length) { + const newSpace = ByteUtils.allocate(this.buffer.byteLength + sequence.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + } + if (ArrayBuffer.isView(sequence)) { + this.buffer.set(ByteUtils.toLocalBufferType(sequence), offset); + this.position = + offset + sequence.byteLength > this.position ? offset + sequence.length : this.position; + } + else if (typeof sequence === 'string') { + throw new BSONError('input cannot be string'); + } + } + read(position, length) { + length = length && length > 0 ? length : this.position; + return this.buffer.slice(position, position + length); + } + value() { + return this.buffer.length === this.position + ? this.buffer + : this.buffer.subarray(0, this.position); + } + length() { + return this.position; + } + toJSON() { + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.buffer.subarray(0, this.position)); + if (encoding === 'base64') + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + if (encoding === 'utf8' || encoding === 'utf-8') + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + } + toExtendedJSON(options) { + options = options || {}; + const base64String = ByteUtils.toBase64(this.buffer); + const subType = Number(this.sub_type).toString(16); + if (options.legacy) { + return { + $binary: base64String, + $type: subType.length === 1 ? '0' + subType : subType + }; + } + return { + $binary: { + base64: base64String, + subType: subType.length === 1 ? '0' + subType : subType + } + }; + } + toUUID() { + if (this.sub_type === Binary.SUBTYPE_UUID) { + return new UUID(this.buffer.slice(0, this.position)); + } + throw new BSONError(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Binary.SUBTYPE_UUID}" is currently supported.`); + } + static createFromHexString(hex, subType) { + return new Binary(ByteUtils.fromHex(hex), subType); + } + static createFromBase64(base64, subType) { + return new Binary(ByteUtils.fromBase64(base64), subType); + } + static fromExtendedJSON(doc, options) { + options = options || {}; + let data; + let type; + if ('$binary' in doc) { + if (options.legacy && typeof doc.$binary === 'string' && '$type' in doc) { + type = doc.$type ? parseInt(doc.$type, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary); + } + else { + if (typeof doc.$binary !== 'string') { + type = doc.$binary.subType ? parseInt(doc.$binary.subType, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary.base64); + } + } + } + else if ('$uuid' in doc) { + type = 4; + data = UUID.bytesFromString(doc.$uuid); + } + if (!data) { + throw new BSONError(`Unexpected Binary Extended JSON format ${JSON.stringify(doc)}`); + } + return type === BSON_BINARY_SUBTYPE_UUID_NEW ? new UUID(data) : new Binary(data, type); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const base64 = ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + const base64Arg = inspect(base64, options); + const subTypeArg = inspect(this.sub_type, options); + return `Binary.createFromBase64(${base64Arg}, ${subTypeArg})`; + } +} +Binary.BSON_BINARY_SUBTYPE_DEFAULT = 0; +Binary.BUFFER_SIZE = 256; +Binary.SUBTYPE_DEFAULT = 0; +Binary.SUBTYPE_FUNCTION = 1; +Binary.SUBTYPE_BYTE_ARRAY = 2; +Binary.SUBTYPE_UUID_OLD = 3; +Binary.SUBTYPE_UUID = 4; +Binary.SUBTYPE_MD5 = 5; +Binary.SUBTYPE_ENCRYPTED = 6; +Binary.SUBTYPE_COLUMN = 7; +Binary.SUBTYPE_SENSITIVE = 8; +Binary.SUBTYPE_USER_DEFINED = 128; +const UUID_BYTE_LENGTH = 16; +const UUID_WITHOUT_DASHES = /^[0-9A-F]{32}$/i; +const UUID_WITH_DASHES = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; +class UUID extends Binary { + constructor(input) { + let bytes; + if (input == null) { + bytes = UUID.generate(); + } + else if (input instanceof UUID) { + bytes = ByteUtils.toLocalBufferType(new Uint8Array(input.buffer)); + } + else if (ArrayBuffer.isView(input) && input.byteLength === UUID_BYTE_LENGTH) { + bytes = ByteUtils.toLocalBufferType(input); + } + else if (typeof input === 'string') { + bytes = UUID.bytesFromString(input); + } + else { + throw new BSONError('Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).'); + } + super(bytes, BSON_BINARY_SUBTYPE_UUID_NEW); + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + } + toHexString(includeDashes = true) { + if (includeDashes) { + return [ + ByteUtils.toHex(this.buffer.subarray(0, 4)), + ByteUtils.toHex(this.buffer.subarray(4, 6)), + ByteUtils.toHex(this.buffer.subarray(6, 8)), + ByteUtils.toHex(this.buffer.subarray(8, 10)), + ByteUtils.toHex(this.buffer.subarray(10, 16)) + ].join('-'); + } + return ByteUtils.toHex(this.buffer); + } + toString(encoding) { + if (encoding === 'hex') + return ByteUtils.toHex(this.id); + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + equals(otherId) { + if (!otherId) { + return false; + } + if (otherId instanceof UUID) { + return ByteUtils.equals(otherId.id, this.id); + } + try { + return ByteUtils.equals(new UUID(otherId).id, this.id); + } + catch { + return false; + } + } + toBinary() { + return new Binary(this.id, Binary.SUBTYPE_UUID); + } + static generate() { + const bytes = ByteUtils.randomBytes(UUID_BYTE_LENGTH); + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + return bytes; + } + static isValid(input) { + if (!input) { + return false; + } + if (typeof input === 'string') { + return UUID.isValidUUIDString(input); + } + if (isUint8Array(input)) { + return input.byteLength === UUID_BYTE_LENGTH; + } + return (input._bsontype === 'Binary' && + input.sub_type === this.SUBTYPE_UUID && + input.buffer.byteLength === 16); + } + static createFromHexString(hexString) { + const buffer = UUID.bytesFromString(hexString); + return new UUID(buffer); + } + static createFromBase64(base64) { + return new UUID(ByteUtils.fromBase64(base64)); + } + static bytesFromString(representation) { + if (!UUID.isValidUUIDString(representation)) { + throw new BSONError('UUID string representation must be 32 hex digits or canonical hyphenated representation'); + } + return ByteUtils.fromHex(representation.replace(/-/g, '')); + } + static isValidUUIDString(representation) { + return UUID_WITHOUT_DASHES.test(representation) || UUID_WITH_DASHES.test(representation); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new UUID(${inspect(this.toHexString(), options)})`; + } +} + +class Code extends BSONValue { + get _bsontype() { + return 'Code'; + } + constructor(code, scope) { + super(); + this.code = code.toString(); + this.scope = scope ?? null; + } + toJSON() { + if (this.scope != null) { + return { code: this.code, scope: this.scope }; + } + return { code: this.code }; + } + toExtendedJSON() { + if (this.scope) { + return { $code: this.code, $scope: this.scope }; + } + return { $code: this.code }; + } + static fromExtendedJSON(doc) { + return new Code(doc.$code, doc.$scope); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + let parametersString = inspect(this.code, options); + const multiLineFn = parametersString.includes('\n'); + if (this.scope != null) { + parametersString += `,${multiLineFn ? '\n' : ' '}${inspect(this.scope, options)}`; + } + const endingNewline = multiLineFn && this.scope === null; + return `new Code(${multiLineFn ? '\n' : ''}${parametersString}${endingNewline ? '\n' : ''})`; + } +} + +function isDBRefLike(value) { + return (value != null && + typeof value === 'object' && + '$id' in value && + value.$id != null && + '$ref' in value && + typeof value.$ref === 'string' && + (!('$db' in value) || ('$db' in value && typeof value.$db === 'string'))); +} +class DBRef extends BSONValue { + get _bsontype() { + return 'DBRef'; + } + constructor(collection, oid, db, fields) { + super(); + const parts = collection.split('.'); + if (parts.length === 2) { + db = parts.shift(); + collection = parts.shift(); + } + this.collection = collection; + this.oid = oid; + this.db = db; + this.fields = fields || {}; + } + get namespace() { + return this.collection; + } + set namespace(value) { + this.collection = value; + } + toJSON() { + const o = Object.assign({ + $ref: this.collection, + $id: this.oid + }, this.fields); + if (this.db != null) + o.$db = this.db; + return o; + } + toExtendedJSON(options) { + options = options || {}; + let o = { + $ref: this.collection, + $id: this.oid + }; + if (options.legacy) { + return o; + } + if (this.db) + o.$db = this.db; + o = Object.assign(o, this.fields); + return o; + } + static fromExtendedJSON(doc) { + const copy = Object.assign({}, doc); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(doc.$ref, doc.$id, doc.$db, copy); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const args = [ + inspect(this.namespace, options), + inspect(this.oid, options), + ...(this.db ? [inspect(this.db, options)] : []), + ...(Object.keys(this.fields).length > 0 ? [inspect(this.fields, options)] : []) + ]; + args[1] = inspect === defaultInspect ? `new ObjectId(${args[1]})` : args[1]; + return `new DBRef(${args.join(', ')})`; + } +} + +function removeLeadingZerosAndExplicitPlus(str) { + if (str === '') { + return str; + } + let startIndex = 0; + const isNegative = str[startIndex] === '-'; + const isExplicitlyPositive = str[startIndex] === '+'; + if (isExplicitlyPositive || isNegative) { + startIndex += 1; + } + let foundInsignificantZero = false; + for (; startIndex < str.length && str[startIndex] === '0'; ++startIndex) { + foundInsignificantZero = true; + } + if (!foundInsignificantZero) { + return isExplicitlyPositive ? str.slice(1) : str; + } + return `${isNegative ? '-' : ''}${str.length === startIndex ? '0' : str.slice(startIndex)}`; +} +function validateStringCharacters(str, radix) { + radix = radix ?? 10; + const validCharacters = '0123456789abcdefghijklmnopqrstuvwxyz'.slice(0, radix); + const regex = new RegExp(`[^-+${validCharacters}]`, 'i'); + return regex.test(str) ? false : str; +} + +let wasm = undefined; +try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11])), {}).exports; +} +catch { +} +const TWO_PWR_16_DBL = 1 << 16; +const TWO_PWR_24_DBL = 1 << 24; +const TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +const TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +const TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; +const INT_CACHE = {}; +const UINT_CACHE = {}; +const MAX_INT64_STRING_LENGTH = 20; +const DECIMAL_REG_EX = /^(\+?0|(\+|-)?[1-9][0-9]*)$/; +class Long extends BSONValue { + get _bsontype() { + return 'Long'; + } + get __isLong__() { + return true; + } + constructor(lowOrValue = 0, highOrUnsigned, unsigned) { + super(); + const unsignedBool = typeof highOrUnsigned === 'boolean' ? highOrUnsigned : Boolean(unsigned); + const high = typeof highOrUnsigned === 'number' ? highOrUnsigned : 0; + const res = typeof lowOrValue === 'string' + ? Long.fromString(lowOrValue, unsignedBool) + : typeof lowOrValue === 'bigint' + ? Long.fromBigInt(lowOrValue, unsignedBool) + : { low: lowOrValue | 0, high: high | 0, unsigned: unsignedBool }; + this.low = res.low; + this.high = res.high; + this.unsigned = res.unsigned; + } + static fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); + } + static fromInt(value, unsigned) { + let obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if ((cache = 0 <= value && value < 256)) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } + else { + value |= 0; + if ((cache = -128 <= value && value < 128)) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = Long.fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + static fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? Long.UZERO : Long.ZERO; + if (unsigned) { + if (value < 0) + return Long.UZERO; + if (value >= TWO_PWR_64_DBL) + return Long.MAX_UNSIGNED_VALUE; + } + else { + if (value <= -TWO_PWR_63_DBL) + return Long.MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return Long.MAX_VALUE; + } + if (value < 0) + return Long.fromNumber(-value, unsigned).neg(); + return Long.fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); + } + static fromBigInt(value, unsigned) { + const FROM_BIGINT_BIT_MASK = BigInt(0xffffffff); + const FROM_BIGINT_BIT_SHIFT = BigInt(32); + return new Long(Number(value & FROM_BIGINT_BIT_MASK), Number((value >> FROM_BIGINT_BIT_SHIFT) & FROM_BIGINT_BIT_MASK), unsigned); + } + static _fromString(str, unsigned, radix) { + if (str.length === 0) + throw new BSONError('empty string'); + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + let p; + if ((p = str.indexOf('-')) > 0) + throw new BSONError('interior hyphen'); + else if (p === 0) { + return Long._fromString(str.substring(1), unsigned, radix).neg(); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 8)); + let result = Long.ZERO; + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + const power = Long.fromNumber(Math.pow(radix, size)); + result = result.mul(power).add(Long.fromNumber(value)); + } + else { + result = result.mul(radixToPower); + result = result.add(Long.fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + static fromStringStrict(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str.trim() !== str) { + throw new BSONError(`Input: '${str}' contains leading and/or trailing whitespace`); + } + if (!validateStringCharacters(str, radix)) { + throw new BSONError(`Input: '${str}' contains invalid characters for radix: ${radix}`); + } + const cleanedStr = removeLeadingZerosAndExplicitPlus(str); + const result = Long._fromString(cleanedStr, unsigned, radix); + if (result.toString(radix).toLowerCase() !== cleanedStr.toLowerCase()) { + throw new BSONError(`Input: ${str} is not representable as ${result.unsigned ? 'an unsigned' : 'a signed'} 64-bit Long ${radix != null ? `with radix: ${radix}` : ''}`); + } + return result; + } + static fromString(str, unsignedOrRadix, radix) { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } + else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str === 'NaN' && radix < 24) { + return Long.ZERO; + } + else if ((str === 'Infinity' || str === '+Infinity' || str === '-Infinity') && radix < 35) { + return Long.ZERO; + } + return Long._fromString(str, unsigned, radix); + } + static fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + } + static fromBytesLE(bytes, unsigned) { + return new Long(bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24), bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24), unsigned); + } + static fromBytesBE(bytes, unsigned) { + return new Long((bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7], (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3], unsigned); + } + static isLong(value) { + return (value != null && + typeof value === 'object' && + '__isLong__' in value && + value.__isLong__ === true); + } + static fromValue(val, unsigned) { + if (typeof val === 'number') + return Long.fromNumber(val, unsigned); + if (typeof val === 'string') + return Long.fromString(val, unsigned); + return Long.fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned); + } + add(addend) { + if (!Long.isLong(addend)) + addend = Long.fromValue(addend); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = addend.high >>> 16; + const b32 = addend.high & 0xffff; + const b16 = addend.low >>> 16; + const b00 = addend.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + and(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned); + } + compare(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.eq(other)) + return 0; + const thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || + (other.high === this.high && other.low >>> 0 > this.low >>> 0) + ? -1 + : 1; + } + comp(other) { + return this.compare(other); + } + divide(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (divisor.isZero()) + throw new BSONError('division by zero'); + if (wasm) { + if (!this.unsigned && + this.high === -0x80000000 && + divisor.low === -1 && + divisor.high === -1) { + return this; + } + const low = (this.unsigned ? wasm.div_u : wasm.div_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? Long.UZERO : Long.ZERO; + let approx, rem, res; + if (!this.unsigned) { + if (this.eq(Long.MIN_VALUE)) { + if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE)) + return Long.MIN_VALUE; + else if (divisor.eq(Long.MIN_VALUE)) + return Long.ONE; + else { + const halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(Long.ZERO)) { + return divisor.isNegative() ? Long.ONE : Long.NEG_ONE; + } + else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } + else if (divisor.eq(Long.MIN_VALUE)) + return this.unsigned ? Long.UZERO : Long.ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } + else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = Long.ZERO; + } + else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return Long.UZERO; + if (divisor.gt(this.shru(1))) + return Long.UONE; + res = Long.UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + const log2 = Math.ceil(Math.log(approx) / Math.LN2); + const delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); + let approxRes = Long.fromNumber(approx); + let approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = Long.fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = Long.ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + } + div(divisor) { + return this.divide(divisor); + } + equals(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + } + eq(other) { + return this.equals(other); + } + getHighBits() { + return this.high; + } + getHighBitsUnsigned() { + return this.high >>> 0; + } + getLowBits() { + return this.low; + } + getLowBitsUnsigned() { + return this.low >>> 0; + } + getNumBitsAbs() { + if (this.isNegative()) { + return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + } + const val = this.high !== 0 ? this.high : this.low; + let bit; + for (bit = 31; bit > 0; bit--) + if ((val & (1 << bit)) !== 0) + break; + return this.high !== 0 ? bit + 33 : bit + 1; + } + greaterThan(other) { + return this.comp(other) > 0; + } + gt(other) { + return this.greaterThan(other); + } + greaterThanOrEqual(other) { + return this.comp(other) >= 0; + } + gte(other) { + return this.greaterThanOrEqual(other); + } + ge(other) { + return this.greaterThanOrEqual(other); + } + isEven() { + return (this.low & 1) === 0; + } + isNegative() { + return !this.unsigned && this.high < 0; + } + isOdd() { + return (this.low & 1) === 1; + } + isPositive() { + return this.unsigned || this.high >= 0; + } + isZero() { + return this.high === 0 && this.low === 0; + } + lessThan(other) { + return this.comp(other) < 0; + } + lt(other) { + return this.lessThan(other); + } + lessThanOrEqual(other) { + return this.comp(other) <= 0; + } + lte(other) { + return this.lessThanOrEqual(other); + } + modulo(divisor) { + if (!Long.isLong(divisor)) + divisor = Long.fromValue(divisor); + if (wasm) { + const low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(this.low, this.high, divisor.low, divisor.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + } + mod(divisor) { + return this.modulo(divisor); + } + rem(divisor) { + return this.modulo(divisor); + } + multiply(multiplier) { + if (this.isZero()) + return Long.ZERO; + if (!Long.isLong(multiplier)) + multiplier = Long.fromValue(multiplier); + if (wasm) { + const low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return Long.ZERO; + if (this.eq(Long.MIN_VALUE)) + return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (multiplier.eq(Long.MIN_VALUE)) + return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } + else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24)) + return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + const b48 = multiplier.high >>> 16; + const b32 = multiplier.high & 0xffff; + const b16 = multiplier.low >>> 16; + const b00 = multiplier.low & 0xffff; + let c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + mul(multiplier) { + return this.multiply(multiplier); + } + negate() { + if (!this.unsigned && this.eq(Long.MIN_VALUE)) + return Long.MIN_VALUE; + return this.not().add(Long.ONE); + } + neg() { + return this.negate(); + } + not() { + return Long.fromBits(~this.low, ~this.high, this.unsigned); + } + notEquals(other) { + return !this.equals(other); + } + neq(other) { + return this.notEquals(other); + } + ne(other) { + return this.notEquals(other); + } + or(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned); + } + shiftLeft(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); + else + return Long.fromBits(0, this.low << (numBits - 32), this.unsigned); + } + shl(numBits) { + return this.shiftLeft(numBits); + } + shiftRight(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return Long.fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); + else + return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); + } + shr(numBits) { + return this.shiftRight(numBits); + } + shiftRightUnsigned(numBits) { + if (Long.isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + const high = this.high; + if (numBits < 32) { + const low = this.low; + return Long.fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); + } + else if (numBits === 32) + return Long.fromBits(high, 0, this.unsigned); + else + return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned); + } + } + shr_u(numBits) { + return this.shiftRightUnsigned(numBits); + } + shru(numBits) { + return this.shiftRightUnsigned(numBits); + } + subtract(subtrahend) { + if (!Long.isLong(subtrahend)) + subtrahend = Long.fromValue(subtrahend); + return this.add(subtrahend.neg()); + } + sub(subtrahend) { + return this.subtract(subtrahend); + } + toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + } + toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + } + toBigInt() { + return BigInt(this.toString()); + } + toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + } + toBytesLE() { + const hi = this.high, lo = this.low; + return [ + lo & 0xff, + (lo >>> 8) & 0xff, + (lo >>> 16) & 0xff, + lo >>> 24, + hi & 0xff, + (hi >>> 8) & 0xff, + (hi >>> 16) & 0xff, + hi >>> 24 + ]; + } + toBytesBE() { + const hi = this.high, lo = this.low; + return [ + hi >>> 24, + (hi >>> 16) & 0xff, + (hi >>> 8) & 0xff, + hi & 0xff, + lo >>> 24, + (lo >>> 16) & 0xff, + (lo >>> 8) & 0xff, + lo & 0xff + ]; + } + toSigned() { + if (!this.unsigned) + return this; + return Long.fromBits(this.low, this.high, false); + } + toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw new BSONError('radix'); + if (this.isZero()) + return '0'; + if (this.isNegative()) { + if (this.eq(Long.MIN_VALUE)) { + const radixLong = Long.fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } + else + return '-' + this.neg().toString(radix); + } + const radixToPower = Long.fromNumber(Math.pow(radix, 6), this.unsigned); + let rem = this; + let result = ''; + while (true) { + const remDiv = rem.div(radixToPower); + const intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0; + let digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) { + return digits + result; + } + else { + while (digits.length < 6) + digits = '0' + digits; + result = '' + digits + result; + } + } + } + toUnsigned() { + if (this.unsigned) + return this; + return Long.fromBits(this.low, this.high, true); + } + xor(other) { + if (!Long.isLong(other)) + other = Long.fromValue(other); + return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + } + eqz() { + return this.isZero(); + } + le(other) { + return this.lessThanOrEqual(other); + } + toExtendedJSON(options) { + if (options && options.relaxed) + return this.toNumber(); + return { $numberLong: this.toString() }; + } + static fromExtendedJSON(doc, options) { + const { useBigInt64 = false, relaxed = true } = { ...options }; + if (doc.$numberLong.length > MAX_INT64_STRING_LENGTH) { + throw new BSONError('$numberLong string is too long'); + } + if (!DECIMAL_REG_EX.test(doc.$numberLong)) { + throw new BSONError(`$numberLong string "${doc.$numberLong}" is in an invalid format`); + } + if (useBigInt64) { + const bigIntResult = BigInt(doc.$numberLong); + return BigInt.asIntN(64, bigIntResult); + } + const longResult = Long.fromString(doc.$numberLong); + if (relaxed) { + return longResult.toNumber(); + } + return longResult; + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const longVal = inspect(this.toString(), options); + const unsignedVal = this.unsigned ? `, ${inspect(this.unsigned, options)}` : ''; + return `new Long(${longVal}${unsignedVal})`; + } +} +Long.TWO_PWR_24 = Long.fromInt(TWO_PWR_24_DBL); +Long.MAX_UNSIGNED_VALUE = Long.fromBits(0xffffffff | 0, 0xffffffff | 0, true); +Long.ZERO = Long.fromInt(0); +Long.UZERO = Long.fromInt(0, true); +Long.ONE = Long.fromInt(1); +Long.UONE = Long.fromInt(1, true); +Long.NEG_ONE = Long.fromInt(-1); +Long.MAX_VALUE = Long.fromBits(0xffffffff | 0, 0x7fffffff | 0, false); +Long.MIN_VALUE = Long.fromBits(0, 0x80000000 | 0, false); + +const PARSE_STRING_REGEXP = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/; +const PARSE_INF_REGEXP = /^(\+|-)?(Infinity|inf)$/i; +const PARSE_NAN_REGEXP = /^(\+|-)?NaN$/i; +const EXPONENT_MAX = 6111; +const EXPONENT_MIN = -6176; +const EXPONENT_BIAS = 6176; +const MAX_DIGITS = 34; +const NAN_BUFFER = ByteUtils.fromNumberArray([ + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_NEGATIVE_BUFFER = ByteUtils.fromNumberArray([ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const INF_POSITIVE_BUFFER = ByteUtils.fromNumberArray([ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +].reverse()); +const EXPONENT_REGEX = /^([-+])?(\d+)?$/; +const COMBINATION_MASK = 0x1f; +const EXPONENT_MASK = 0x3fff; +const COMBINATION_INFINITY = 30; +const COMBINATION_NAN = 31; +function isDigit(value) { + return !isNaN(parseInt(value, 10)); +} +function divideu128(value) { + const DIVISOR = Long.fromNumber(1000 * 1000 * 1000); + let _rem = Long.fromNumber(0); + if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { + return { quotient: value, rem: _rem }; + } + for (let i = 0; i <= 3; i++) { + _rem = _rem.shiftLeft(32); + _rem = _rem.add(new Long(value.parts[i], 0)); + value.parts[i] = _rem.div(DIVISOR).low; + _rem = _rem.modulo(DIVISOR); + } + return { quotient: value, rem: _rem }; +} +function multiply64x2(left, right) { + if (!left && !right) { + return { high: Long.fromNumber(0), low: Long.fromNumber(0) }; + } + const leftHigh = left.shiftRightUnsigned(32); + const leftLow = new Long(left.getLowBits(), 0); + const rightHigh = right.shiftRightUnsigned(32); + const rightLow = new Long(right.getLowBits(), 0); + let productHigh = leftHigh.multiply(rightHigh); + let productMid = leftHigh.multiply(rightLow); + const productMid2 = leftLow.multiply(rightHigh); + let productLow = leftLow.multiply(rightLow); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productMid = new Long(productMid.getLowBits(), 0) + .add(productMid2) + .add(productLow.shiftRightUnsigned(32)); + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productLow = productMid.shiftLeft(32).add(new Long(productLow.getLowBits(), 0)); + return { high: productHigh, low: productLow }; +} +function lessThan(left, right) { + const uhleft = left.high >>> 0; + const uhright = right.high >>> 0; + if (uhleft < uhright) { + return true; + } + else if (uhleft === uhright) { + const ulleft = left.low >>> 0; + const ulright = right.low >>> 0; + if (ulleft < ulright) + return true; + } + return false; +} +function invalidErr(string, message) { + throw new BSONError(`"${string}" is not a valid Decimal128 string - ${message}`); +} +class Decimal128 extends BSONValue { + get _bsontype() { + return 'Decimal128'; + } + constructor(bytes) { + super(); + if (typeof bytes === 'string') { + this.bytes = Decimal128.fromString(bytes).bytes; + } + else if (isUint8Array(bytes)) { + if (bytes.byteLength !== 16) { + throw new BSONError('Decimal128 must take a Buffer of 16 bytes'); + } + this.bytes = bytes; + } + else { + throw new BSONError('Decimal128 must take a Buffer or string'); + } + } + static fromString(representation) { + return Decimal128._fromString(representation, { allowRounding: false }); + } + static fromStringWithRounding(representation) { + return Decimal128._fromString(representation, { allowRounding: true }); + } + static _fromString(representation, options) { + let isNegative = false; + let sawSign = false; + let sawRadix = false; + let foundNonZero = false; + let significantDigits = 0; + let nDigitsRead = 0; + let nDigits = 0; + let radixPosition = 0; + let firstNonZero = 0; + const digits = [0]; + let nDigitsStored = 0; + let digitsInsert = 0; + let lastDigit = 0; + let exponent = 0; + let significandHigh = new Long(0, 0); + let significandLow = new Long(0, 0); + let biasedExponent = 0; + let index = 0; + if (representation.length >= 7000) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + const stringMatch = representation.match(PARSE_STRING_REGEXP); + const infMatch = representation.match(PARSE_INF_REGEXP); + const nanMatch = representation.match(PARSE_NAN_REGEXP); + if ((!stringMatch && !infMatch && !nanMatch) || representation.length === 0) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + if (stringMatch) { + const unsignedNumber = stringMatch[2]; + const e = stringMatch[4]; + const expSign = stringMatch[5]; + const expNumber = stringMatch[6]; + if (e && expNumber === undefined) + invalidErr(representation, 'missing exponent power'); + if (e && unsignedNumber === undefined) + invalidErr(representation, 'missing exponent base'); + if (e === undefined && (expSign || expNumber)) { + invalidErr(representation, 'missing e before exponent'); + } + } + if (representation[index] === '+' || representation[index] === '-') { + sawSign = true; + isNegative = representation[index++] === '-'; + } + if (!isDigit(representation[index]) && representation[index] !== '.') { + if (representation[index] === 'i' || representation[index] === 'I') { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + else if (representation[index] === 'N') { + return new Decimal128(NAN_BUFFER); + } + } + while (isDigit(representation[index]) || representation[index] === '.') { + if (representation[index] === '.') { + if (sawRadix) + invalidErr(representation, 'contains multiple periods'); + sawRadix = true; + index = index + 1; + continue; + } + if (nDigitsStored < MAX_DIGITS) { + if (representation[index] !== '0' || foundNonZero) { + if (!foundNonZero) { + firstNonZero = nDigitsRead; + } + foundNonZero = true; + digits[digitsInsert++] = parseInt(representation[index], 10); + nDigitsStored = nDigitsStored + 1; + } + } + if (foundNonZero) + nDigits = nDigits + 1; + if (sawRadix) + radixPosition = radixPosition + 1; + nDigitsRead = nDigitsRead + 1; + index = index + 1; + } + if (sawRadix && !nDigitsRead) + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + if (representation[index] === 'e' || representation[index] === 'E') { + const match = representation.substr(++index).match(EXPONENT_REGEX); + if (!match || !match[2]) + return new Decimal128(NAN_BUFFER); + exponent = parseInt(match[0], 10); + index = index + match[0].length; + } + if (representation[index]) + return new Decimal128(NAN_BUFFER); + if (!nDigitsStored) { + digits[0] = 0; + nDigits = 1; + nDigitsStored = 1; + significantDigits = 0; + } + else { + lastDigit = nDigitsStored - 1; + significantDigits = nDigits; + if (significantDigits !== 1) { + while (representation[firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix)] === '0') { + significantDigits = significantDigits - 1; + } + } + } + if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) { + exponent = EXPONENT_MIN; + } + else { + exponent = exponent - radixPosition; + } + while (exponent > EXPONENT_MAX) { + lastDigit = lastDigit + 1; + if (lastDigit >= MAX_DIGITS) { + if (significantDigits === 0) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + exponent = exponent - 1; + } + if (options.allowRounding) { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0 && significantDigits < nDigitsStored) { + exponent = EXPONENT_MIN; + significantDigits = 0; + break; + } + if (nDigitsStored < nDigits) { + nDigits = nDigits - 1; + } + else { + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + const digitsString = digits.join(''); + if (digitsString.match(/^0+$/)) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + let endOfString = nDigitsRead; + if (sawRadix) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + let roundBit = 0; + if (roundDigit >= 5) { + roundBit = 1; + if (roundDigit === 5) { + roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0; + for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) { + if (parseInt(representation[i], 10)) { + roundBit = 1; + break; + } + } + } + } + if (roundBit) { + let dIdx = lastDigit; + for (; dIdx >= 0; dIdx--) { + if (++digits[dIdx] > 9) { + digits[dIdx] = 0; + if (dIdx === 0) { + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + digits[dIdx] = 1; + } + else { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + } + } + else { + break; + } + } + } + } + } + else { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + if (lastDigit === 0) { + if (significantDigits === 0) { + exponent = EXPONENT_MIN; + break; + } + invalidErr(representation, 'exponent underflow'); + } + if (nDigitsStored < nDigits) { + if (representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' && + significantDigits !== 0) { + invalidErr(representation, 'inexact rounding'); + } + nDigits = nDigits - 1; + } + else { + if (digits[lastDigit] !== 0) { + invalidErr(representation, 'inexact rounding'); + } + lastDigit = lastDigit - 1; + } + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } + else { + invalidErr(representation, 'overflow'); + } + } + if (lastDigit + 1 < significantDigits) { + if (sawRadix) { + firstNonZero = firstNonZero + 1; + } + if (sawSign) { + firstNonZero = firstNonZero + 1; + } + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + if (roundDigit !== 0) { + invalidErr(representation, 'inexact rounding'); + } + } + } + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + if (significantDigits === 0) { + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + } + else if (lastDigit < 17) { + let dIdx = 0; + significandLow = Long.fromNumber(digits[dIdx++]); + significandHigh = new Long(0, 0); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + else { + let dIdx = 0; + significandHigh = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit - 17; dIdx++) { + significandHigh = significandHigh.multiply(Long.fromNumber(10)); + significandHigh = significandHigh.add(Long.fromNumber(digits[dIdx])); + } + significandLow = Long.fromNumber(digits[dIdx++]); + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + const significand = multiply64x2(significandHigh, Long.fromString('100000000000000000')); + significand.low = significand.low.add(significandLow); + if (lessThan(significand.low, significandLow)) { + significand.high = significand.high.add(Long.fromNumber(1)); + } + biasedExponent = exponent + EXPONENT_BIAS; + const dec = { low: Long.fromNumber(0), high: Long.fromNumber(0) }; + if (significand.high.shiftRightUnsigned(49).and(Long.fromNumber(1)).equals(Long.fromNumber(1))) { + dec.high = dec.high.or(Long.fromNumber(0x3).shiftLeft(61)); + dec.high = dec.high.or(Long.fromNumber(biasedExponent).and(Long.fromNumber(0x3fff).shiftLeft(47))); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x7fffffffffff))); + } + else { + dec.high = dec.high.or(Long.fromNumber(biasedExponent & 0x3fff).shiftLeft(49)); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x1ffffffffffff))); + } + dec.low = significand.low; + if (isNegative) { + dec.high = dec.high.or(Long.fromString('9223372036854775808')); + } + const buffer = ByteUtils.allocateUnsafe(16); + index = 0; + buffer[index++] = dec.low.low & 0xff; + buffer[index++] = (dec.low.low >> 8) & 0xff; + buffer[index++] = (dec.low.low >> 16) & 0xff; + buffer[index++] = (dec.low.low >> 24) & 0xff; + buffer[index++] = dec.low.high & 0xff; + buffer[index++] = (dec.low.high >> 8) & 0xff; + buffer[index++] = (dec.low.high >> 16) & 0xff; + buffer[index++] = (dec.low.high >> 24) & 0xff; + buffer[index++] = dec.high.low & 0xff; + buffer[index++] = (dec.high.low >> 8) & 0xff; + buffer[index++] = (dec.high.low >> 16) & 0xff; + buffer[index++] = (dec.high.low >> 24) & 0xff; + buffer[index++] = dec.high.high & 0xff; + buffer[index++] = (dec.high.high >> 8) & 0xff; + buffer[index++] = (dec.high.high >> 16) & 0xff; + buffer[index++] = (dec.high.high >> 24) & 0xff; + return new Decimal128(buffer); + } + toString() { + let biased_exponent; + let significand_digits = 0; + const significand = new Array(36); + for (let i = 0; i < significand.length; i++) + significand[i] = 0; + let index = 0; + let is_zero = false; + let significand_msb; + let significand128 = { parts: [0, 0, 0, 0] }; + let j, k; + const string = []; + index = 0; + const buffer = this.bytes; + const low = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midl = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const midh = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + const high = buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + index = 0; + const dec = { + low: new Long(low, midl), + high: new Long(midh, high) + }; + if (dec.high.lessThan(Long.ZERO)) { + string.push('-'); + } + const combination = (high >> 26) & COMBINATION_MASK; + if (combination >> 3 === 3) { + if (combination === COMBINATION_INFINITY) { + return string.join('') + 'Infinity'; + } + else if (combination === COMBINATION_NAN) { + return 'NaN'; + } + else { + biased_exponent = (high >> 15) & EXPONENT_MASK; + significand_msb = 0x08 + ((high >> 14) & 0x01); + } + } + else { + significand_msb = (high >> 14) & 0x07; + biased_exponent = (high >> 17) & EXPONENT_MASK; + } + const exponent = biased_exponent - EXPONENT_BIAS; + significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); + significand128.parts[1] = midh; + significand128.parts[2] = midl; + significand128.parts[3] = low; + if (significand128.parts[0] === 0 && + significand128.parts[1] === 0 && + significand128.parts[2] === 0 && + significand128.parts[3] === 0) { + is_zero = true; + } + else { + for (k = 3; k >= 0; k--) { + let least_digits = 0; + const result = divideu128(significand128); + significand128 = result.quotient; + least_digits = result.rem.low; + if (!least_digits) + continue; + for (j = 8; j >= 0; j--) { + significand[k * 9 + j] = least_digits % 10; + least_digits = Math.floor(least_digits / 10); + } + } + } + if (is_zero) { + significand_digits = 1; + significand[index] = 0; + } + else { + significand_digits = 36; + while (!significand[index]) { + significand_digits = significand_digits - 1; + index = index + 1; + } + } + const scientific_exponent = significand_digits - 1 + exponent; + if (scientific_exponent >= 34 || scientific_exponent <= -7 || exponent > 0) { + if (significand_digits > 34) { + string.push(`${0}`); + if (exponent > 0) + string.push(`E+${exponent}`); + else if (exponent < 0) + string.push(`E${exponent}`); + return string.join(''); + } + string.push(`${significand[index++]}`); + significand_digits = significand_digits - 1; + if (significand_digits) { + string.push('.'); + } + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + string.push('E'); + if (scientific_exponent > 0) { + string.push(`+${scientific_exponent}`); + } + else { + string.push(`${scientific_exponent}`); + } + } + else { + if (exponent >= 0) { + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + } + else { + let radix_position = significand_digits + exponent; + if (radix_position > 0) { + for (let i = 0; i < radix_position; i++) { + string.push(`${significand[index++]}`); + } + } + else { + string.push('0'); + } + string.push('.'); + while (radix_position++ < 0) { + string.push('0'); + } + for (let i = 0; i < significand_digits - Math.max(radix_position - 1, 0); i++) { + string.push(`${significand[index++]}`); + } + } + } + return string.join(''); + } + toJSON() { + return { $numberDecimal: this.toString() }; + } + toExtendedJSON() { + return { $numberDecimal: this.toString() }; + } + static fromExtendedJSON(doc) { + return Decimal128.fromString(doc.$numberDecimal); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const d128string = inspect(this.toString(), options); + return `new Decimal128(${d128string})`; + } +} + +class Double extends BSONValue { + get _bsontype() { + return 'Double'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value; + } + static fromString(value) { + const coercedValue = Number(value); + if (value === 'NaN') + return new Double(NaN); + if (value === 'Infinity') + return new Double(Infinity); + if (value === '-Infinity') + return new Double(-Infinity); + if (!Number.isFinite(coercedValue)) { + throw new BSONError(`Input: ${value} is not representable as a Double`); + } + if (value.trim() !== value) { + throw new BSONError(`Input: '${value}' contains whitespace`); + } + if (value === '') { + throw new BSONError(`Input is an empty string`); + } + if (/[^-0-9.+eE]/.test(value)) { + throw new BSONError(`Input: '${value}' is not in decimal or exponential notation`); + } + return new Double(coercedValue); + } + valueOf() { + return this.value; + } + toJSON() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toExtendedJSON(options) { + if (options && (options.legacy || (options.relaxed && isFinite(this.value)))) { + return this.value; + } + if (Object.is(Math.sign(this.value), -0)) { + return { $numberDouble: '-0.0' }; + } + return { + $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() + }; + } + static fromExtendedJSON(doc, options) { + const doubleValue = parseFloat(doc.$numberDouble); + return options && options.relaxed ? doubleValue : new Double(doubleValue); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Double(${inspect(this.value, options)})`; + } +} + +class Int32 extends BSONValue { + get _bsontype() { + return 'Int32'; + } + constructor(value) { + super(); + if (value instanceof Number) { + value = value.valueOf(); + } + this.value = +value | 0; + } + static fromString(value) { + const cleanedValue = removeLeadingZerosAndExplicitPlus(value); + const coercedValue = Number(value); + if (BSON_INT32_MAX < coercedValue) { + throw new BSONError(`Input: '${value}' is larger than the maximum value for Int32`); + } + else if (BSON_INT32_MIN > coercedValue) { + throw new BSONError(`Input: '${value}' is smaller than the minimum value for Int32`); + } + else if (!Number.isSafeInteger(coercedValue)) { + throw new BSONError(`Input: '${value}' is not a safe integer`); + } + else if (coercedValue.toString() !== cleanedValue) { + throw new BSONError(`Input: '${value}' is not a valid Int32 string`); + } + return new Int32(coercedValue); + } + valueOf() { + return this.value; + } + toString(radix) { + return this.value.toString(radix); + } + toJSON() { + return this.value; + } + toExtendedJSON(options) { + if (options && (options.relaxed || options.legacy)) + return this.value; + return { $numberInt: this.value.toString() }; + } + static fromExtendedJSON(doc, options) { + return options && options.relaxed ? parseInt(doc.$numberInt, 10) : new Int32(doc.$numberInt); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new Int32(${inspect(this.value, options)})`; + } +} + +class MaxKey extends BSONValue { + get _bsontype() { + return 'MaxKey'; + } + toExtendedJSON() { + return { $maxKey: 1 }; + } + static fromExtendedJSON() { + return new MaxKey(); + } + inspect() { + return 'new MaxKey()'; + } +} + +class MinKey extends BSONValue { + get _bsontype() { + return 'MinKey'; + } + toExtendedJSON() { + return { $minKey: 1 }; + } + static fromExtendedJSON() { + return new MinKey(); + } + inspect() { + return 'new MinKey()'; + } +} + +const FLOAT = new Float64Array(1); +const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8); +FLOAT[0] = -1; +const isBigEndian = FLOAT_BYTES[7] === 0; +const NumberUtils = { + getNonnegativeInt32LE(source, offset) { + if (source[offset + 3] > 127) { + throw new RangeError(`Size cannot be negative at offset: ${offset}`); + } + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getInt32LE(source, offset) { + return (source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24)); + }, + getUint32LE(source, offset) { + return (source[offset] + + source[offset + 1] * 256 + + source[offset + 2] * 65536 + + source[offset + 3] * 16777216); + }, + getUint32BE(source, offset) { + return (source[offset + 3] + + source[offset + 2] * 256 + + source[offset + 1] * 65536 + + source[offset] * 16777216); + }, + getBigInt64LE(source, offset) { + const lo = NumberUtils.getUint32LE(source, offset); + const hi = NumberUtils.getUint32LE(source, offset + 4); + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }, + getFloat64LE: isBigEndian + ? (source, offset) => { + FLOAT_BYTES[7] = source[offset]; + FLOAT_BYTES[6] = source[offset + 1]; + FLOAT_BYTES[5] = source[offset + 2]; + FLOAT_BYTES[4] = source[offset + 3]; + FLOAT_BYTES[3] = source[offset + 4]; + FLOAT_BYTES[2] = source[offset + 5]; + FLOAT_BYTES[1] = source[offset + 6]; + FLOAT_BYTES[0] = source[offset + 7]; + return FLOAT[0]; + } + : (source, offset) => { + FLOAT_BYTES[0] = source[offset]; + FLOAT_BYTES[1] = source[offset + 1]; + FLOAT_BYTES[2] = source[offset + 2]; + FLOAT_BYTES[3] = source[offset + 3]; + FLOAT_BYTES[4] = source[offset + 4]; + FLOAT_BYTES[5] = source[offset + 5]; + FLOAT_BYTES[6] = source[offset + 6]; + FLOAT_BYTES[7] = source[offset + 7]; + return FLOAT[0]; + }, + setInt32BE(destination, offset, value) { + destination[offset + 3] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset] = value; + return 4; + }, + setInt32LE(destination, offset, value) { + destination[offset] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 3] = value; + return 4; + }, + setBigInt64LE(destination, offset, value) { + const mask32bits = BigInt(4294967295); + let lo = Number(value & mask32bits); + destination[offset] = lo; + lo >>= 8; + destination[offset + 1] = lo; + lo >>= 8; + destination[offset + 2] = lo; + lo >>= 8; + destination[offset + 3] = lo; + let hi = Number((value >> BigInt(32)) & mask32bits); + destination[offset + 4] = hi; + hi >>= 8; + destination[offset + 5] = hi; + hi >>= 8; + destination[offset + 6] = hi; + hi >>= 8; + destination[offset + 7] = hi; + return 8; + }, + setFloat64LE: isBigEndian + ? (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[7]; + destination[offset + 1] = FLOAT_BYTES[6]; + destination[offset + 2] = FLOAT_BYTES[5]; + destination[offset + 3] = FLOAT_BYTES[4]; + destination[offset + 4] = FLOAT_BYTES[3]; + destination[offset + 5] = FLOAT_BYTES[2]; + destination[offset + 6] = FLOAT_BYTES[1]; + destination[offset + 7] = FLOAT_BYTES[0]; + return 8; + } + : (destination, offset, value) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[0]; + destination[offset + 1] = FLOAT_BYTES[1]; + destination[offset + 2] = FLOAT_BYTES[2]; + destination[offset + 3] = FLOAT_BYTES[3]; + destination[offset + 4] = FLOAT_BYTES[4]; + destination[offset + 5] = FLOAT_BYTES[5]; + destination[offset + 6] = FLOAT_BYTES[6]; + destination[offset + 7] = FLOAT_BYTES[7]; + return 8; + } +}; + +const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$'); +let PROCESS_UNIQUE = null; +class ObjectId extends BSONValue { + get _bsontype() { + return 'ObjectId'; + } + constructor(inputId) { + super(); + let workingId; + if (typeof inputId === 'object' && inputId && 'id' in inputId) { + if (typeof inputId.id !== 'string' && !ArrayBuffer.isView(inputId.id)) { + throw new BSONError('Argument passed in must have an id that is of type string or Buffer'); + } + if ('toHexString' in inputId && typeof inputId.toHexString === 'function') { + workingId = ByteUtils.fromHex(inputId.toHexString()); + } + else { + workingId = inputId.id; + } + } + else { + workingId = inputId; + } + if (workingId == null || typeof workingId === 'number') { + this.buffer = ObjectId.generate(typeof workingId === 'number' ? workingId : undefined); + } + else if (ArrayBuffer.isView(workingId) && workingId.byteLength === 12) { + this.buffer = ByteUtils.toLocalBufferType(workingId); + } + else if (typeof workingId === 'string') { + if (workingId.length === 24 && checkForHexRegExp.test(workingId)) { + this.buffer = ByteUtils.fromHex(workingId); + } + else { + throw new BSONError('input must be a 24 character hex string, 12 byte Uint8Array, or an integer'); + } + } + else { + throw new BSONError('Argument passed in does not match the accepted types'); + } + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(this.id); + } + } + get id() { + return this.buffer; + } + set id(value) { + this.buffer = value; + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(value); + } + } + toHexString() { + if (ObjectId.cacheHexString && this.__id) { + return this.__id; + } + const hexString = ByteUtils.toHex(this.id); + if (ObjectId.cacheHexString && !this.__id) { + this.__id = hexString; + } + return hexString; + } + static getInc() { + return (ObjectId.index = (ObjectId.index + 1) % 0xffffff); + } + static generate(time) { + if ('number' !== typeof time) { + time = Math.floor(Date.now() / 1000); + } + const inc = ObjectId.getInc(); + const buffer = ByteUtils.allocateUnsafe(12); + NumberUtils.setInt32BE(buffer, 0, time); + if (PROCESS_UNIQUE === null) { + PROCESS_UNIQUE = ByteUtils.randomBytes(5); + } + buffer[4] = PROCESS_UNIQUE[0]; + buffer[5] = PROCESS_UNIQUE[1]; + buffer[6] = PROCESS_UNIQUE[2]; + buffer[7] = PROCESS_UNIQUE[3]; + buffer[8] = PROCESS_UNIQUE[4]; + buffer[11] = inc & 0xff; + buffer[10] = (inc >> 8) & 0xff; + buffer[9] = (inc >> 16) & 0xff; + return buffer; + } + toString(encoding) { + if (encoding === 'base64') + return ByteUtils.toBase64(this.id); + if (encoding === 'hex') + return this.toHexString(); + return this.toHexString(); + } + toJSON() { + return this.toHexString(); + } + static is(variable) { + return (variable != null && + typeof variable === 'object' && + '_bsontype' in variable && + variable._bsontype === 'ObjectId'); + } + equals(otherId) { + if (otherId === undefined || otherId === null) { + return false; + } + if (ObjectId.is(otherId)) { + return (this.buffer[11] === otherId.buffer[11] && ByteUtils.equals(this.buffer, otherId.buffer)); + } + if (typeof otherId === 'string') { + return otherId.toLowerCase() === this.toHexString(); + } + if (typeof otherId === 'object' && typeof otherId.toHexString === 'function') { + const otherIdString = otherId.toHexString(); + const thisIdString = this.toHexString(); + return typeof otherIdString === 'string' && otherIdString.toLowerCase() === thisIdString; + } + return false; + } + getTimestamp() { + const timestamp = new Date(); + const time = NumberUtils.getUint32BE(this.buffer, 0); + timestamp.setTime(Math.floor(time) * 1000); + return timestamp; + } + static createPk() { + return new ObjectId(); + } + serializeInto(uint8array, index) { + uint8array[index] = this.buffer[0]; + uint8array[index + 1] = this.buffer[1]; + uint8array[index + 2] = this.buffer[2]; + uint8array[index + 3] = this.buffer[3]; + uint8array[index + 4] = this.buffer[4]; + uint8array[index + 5] = this.buffer[5]; + uint8array[index + 6] = this.buffer[6]; + uint8array[index + 7] = this.buffer[7]; + uint8array[index + 8] = this.buffer[8]; + uint8array[index + 9] = this.buffer[9]; + uint8array[index + 10] = this.buffer[10]; + uint8array[index + 11] = this.buffer[11]; + return 12; + } + static createFromTime(time) { + const buffer = ByteUtils.allocate(12); + for (let i = 11; i >= 4; i--) + buffer[i] = 0; + NumberUtils.setInt32BE(buffer, 0, time); + return new ObjectId(buffer); + } + static createFromHexString(hexString) { + if (hexString?.length !== 24) { + throw new BSONError('hex string must be 24 characters'); + } + return new ObjectId(ByteUtils.fromHex(hexString)); + } + static createFromBase64(base64) { + if (base64?.length !== 16) { + throw new BSONError('base64 string must be 16 characters'); + } + return new ObjectId(ByteUtils.fromBase64(base64)); + } + static isValid(id) { + if (id == null) + return false; + try { + new ObjectId(id); + return true; + } + catch { + return false; + } + } + toExtendedJSON() { + if (this.toHexString) + return { $oid: this.toHexString() }; + return { $oid: this.toString('hex') }; + } + static fromExtendedJSON(doc) { + return new ObjectId(doc.$oid); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new ObjectId(${inspect(this.toHexString(), options)})`; + } +} +ObjectId.index = Math.floor(Math.random() * 0xffffff); + +function internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined) { + let totalLength = 4 + 1; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + totalLength += calculateElement(i.toString(), object[i], serializeFunctions, true, ignoreUndefined); + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + } + for (const key of Object.keys(object)) { + totalLength += calculateElement(key, object[key], serializeFunctions, false, ignoreUndefined); + } + } + return totalLength; +} +function calculateElement(name, value, serializeFunctions = false, isArray = false, ignoreUndefined = false) { + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + switch (typeof value) { + case 'string': + return 1 + ByteUtils.utf8ByteLength(name) + 1 + 4 + ByteUtils.utf8ByteLength(value) + 1; + case 'number': + if (Math.floor(value) === value && + value >= JS_INT_MIN && + value <= JS_INT_MAX) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (4 + 1); + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + } + else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + case 'undefined': + if (isArray || !ignoreUndefined) + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + return 0; + case 'boolean': + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 1); + case 'object': + if (value != null && + typeof value._bsontype === 'string' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value == null || value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + } + else if (value._bsontype === 'ObjectId') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (12 + 1); + } + else if (value instanceof Date || isDate(value)) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (ArrayBuffer.isView(value) || + value instanceof ArrayBuffer || + isAnyArrayBuffer(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 4 + 1) + value.byteLength); + } + else if (value._bsontype === 'Long' || + value._bsontype === 'Double' || + value._bsontype === 'Timestamp') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + else if (value._bsontype === 'Decimal128') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (16 + 1); + } + else if (value._bsontype === 'Code') { + if (value.scope != null && Object.keys(value.scope).length > 0) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + + internalCalculateObjectSize(value.scope, serializeFunctions, ignoreUndefined)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1); + } + } + else if (value._bsontype === 'Binary') { + const binary = value; + if (binary.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + (binary.position + 1 + 4 + 1 + 4)); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (binary.position + 1 + 4 + 1)); + } + } + else if (value._bsontype === 'Symbol') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + ByteUtils.utf8ByteLength(value.value) + + 4 + + 1 + + 1); + } + else if (value._bsontype === 'DBRef') { + const ordered_values = Object.assign({ + $ref: value.collection, + $id: value.oid + }, value.fields); + if (value.db != null) { + ordered_values['$db'] = value.db; + } + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + internalCalculateObjectSize(ordered_values, serializeFunctions, ignoreUndefined)); + } + else if (value instanceof RegExp || isRegExp(value)) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.source) + + 1 + + (value.global ? 1 : 0) + + (value.ignoreCase ? 1 : 0) + + (value.multiline ? 1 : 0) + + 1); + } + else if (value._bsontype === 'BSONRegExp') { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.pattern) + + 1 + + ByteUtils.utf8ByteLength(value.options) + + 1); + } + else { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + internalCalculateObjectSize(value, serializeFunctions, ignoreUndefined) + + 1); + } + case 'function': + if (serializeFunctions) { + return ((name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.toString()) + + 1); + } + } + return 0; +} + +function alphabetize(str) { + return str.split('').sort().join(''); +} +class BSONRegExp extends BSONValue { + get _bsontype() { + return 'BSONRegExp'; + } + constructor(pattern, options) { + super(); + this.pattern = pattern; + this.options = alphabetize(options ?? ''); + if (this.pattern.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`); + } + if (this.options.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`); + } + for (let i = 0; i < this.options.length; i++) { + if (!(this.options[i] === 'i' || + this.options[i] === 'm' || + this.options[i] === 'x' || + this.options[i] === 'l' || + this.options[i] === 's' || + this.options[i] === 'u')) { + throw new BSONError(`The regular expression option [${this.options[i]}] is not supported`); + } + } + } + static parseOptions(options) { + return options ? options.split('').sort().join('') : ''; + } + toExtendedJSON(options) { + options = options || {}; + if (options.legacy) { + return { $regex: this.pattern, $options: this.options }; + } + return { $regularExpression: { pattern: this.pattern, options: this.options } }; + } + static fromExtendedJSON(doc) { + if ('$regex' in doc) { + if (typeof doc.$regex !== 'string') { + if (doc.$regex._bsontype === 'BSONRegExp') { + return doc; + } + } + else { + return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options)); + } + } + if ('$regularExpression' in doc) { + return new BSONRegExp(doc.$regularExpression.pattern, BSONRegExp.parseOptions(doc.$regularExpression.options)); + } + throw new BSONError(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(doc)}`); + } + inspect(depth, options, inspect) { + const stylize = getStylizeFunction(options) ?? (v => v); + inspect ??= defaultInspect; + const pattern = stylize(inspect(this.pattern), 'regexp'); + const flags = stylize(inspect(this.options), 'regexp'); + return `new BSONRegExp(${pattern}, ${flags})`; + } +} + +class BSONSymbol extends BSONValue { + get _bsontype() { + return 'BSONSymbol'; + } + constructor(value) { + super(); + this.value = value; + } + valueOf() { + return this.value; + } + toString() { + return this.value; + } + toJSON() { + return this.value; + } + toExtendedJSON() { + return { $symbol: this.value }; + } + static fromExtendedJSON(doc) { + return new BSONSymbol(doc.$symbol); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + return `new BSONSymbol(${inspect(this.value, options)})`; + } +} + +const LongWithoutOverridesClass = Long; +class Timestamp extends LongWithoutOverridesClass { + get _bsontype() { + return 'Timestamp'; + } + constructor(low) { + if (low == null) { + super(0, 0, true); + } + else if (typeof low === 'bigint') { + super(low, true); + } + else if (Long.isLong(low)) { + super(low.low, low.high, true); + } + else if (typeof low === 'object' && 't' in low && 'i' in low) { + if (typeof low.t !== 'number' && (typeof low.t !== 'object' || low.t._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide t as a number'); + } + if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide i as a number'); + } + const t = Number(low.t); + const i = Number(low.i); + if (t < 0 || Number.isNaN(t)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive t'); + } + if (i < 0 || Number.isNaN(i)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive i'); + } + if (t > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide t equal or less than uint32 max'); + } + if (i > 4294967295) { + throw new BSONError('Timestamp constructed from { t, i } must provide i equal or less than uint32 max'); + } + super(i, t, true); + } + else { + throw new BSONError('A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }'); + } + } + toJSON() { + return { + $timestamp: this.toString() + }; + } + static fromInt(value) { + return new Timestamp(Long.fromInt(value, true)); + } + static fromNumber(value) { + return new Timestamp(Long.fromNumber(value, true)); + } + static fromBits(lowBits, highBits) { + return new Timestamp({ i: lowBits, t: highBits }); + } + static fromString(str, optRadix) { + return new Timestamp(Long.fromString(str, true, optRadix)); + } + toExtendedJSON() { + return { $timestamp: { t: this.high >>> 0, i: this.low >>> 0 } }; + } + static fromExtendedJSON(doc) { + const i = Long.isLong(doc.$timestamp.i) + ? doc.$timestamp.i.getLowBitsUnsigned() + : doc.$timestamp.i; + const t = Long.isLong(doc.$timestamp.t) + ? doc.$timestamp.t.getLowBitsUnsigned() + : doc.$timestamp.t; + return new Timestamp({ t, i }); + } + inspect(depth, options, inspect) { + inspect ??= defaultInspect; + const t = inspect(this.high >>> 0, options); + const i = inspect(this.low >>> 0, options); + return `new Timestamp({ t: ${t}, i: ${i} })`; + } +} +Timestamp.MAX_VALUE = Long.MAX_UNSIGNED_VALUE; + +const JS_INT_MAX_LONG = Long.fromNumber(JS_INT_MAX); +const JS_INT_MIN_LONG = Long.fromNumber(JS_INT_MIN); +function internalDeserialize(buffer, options, isArray) { + options = options == null ? {} : options; + const index = options && options.index ? options.index : 0; + const size = NumberUtils.getInt32LE(buffer, index); + if (size < 5) { + throw new BSONError(`bson size must be >= 5, is ${size}`); + } + if (options.allowObjectSmallerThanBufferSize && buffer.length < size) { + throw new BSONError(`buffer length ${buffer.length} must be >= bson size ${size}`); + } + if (!options.allowObjectSmallerThanBufferSize && buffer.length !== size) { + throw new BSONError(`buffer length ${buffer.length} must === bson size ${size}`); + } + if (size + index > buffer.byteLength) { + throw new BSONError(`(bson size ${size} + options.index ${index} must be <= buffer length ${buffer.byteLength})`); + } + if (buffer[index + size - 1] !== 0) { + throw new BSONError("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00"); + } + return deserializeObject(buffer, index, options, isArray); +} +const allowedDBRefKeys = /^\$ref$|^\$id$|^\$db$/; +function deserializeObject(buffer, index, options, isArray = false) { + const fieldsAsRaw = options['fieldsAsRaw'] == null ? null : options['fieldsAsRaw']; + const raw = options['raw'] == null ? false : options['raw']; + const bsonRegExp = typeof options['bsonRegExp'] === 'boolean' ? options['bsonRegExp'] : false; + const promoteBuffers = options.promoteBuffers ?? false; + const promoteLongs = options.promoteLongs ?? true; + const promoteValues = options.promoteValues ?? true; + const useBigInt64 = options.useBigInt64 ?? false; + if (useBigInt64 && !promoteValues) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + if (useBigInt64 && !promoteLongs) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + const validation = options.validation == null ? { utf8: true } : options.validation; + let globalUTFValidation = true; + let validationSetting; + let utf8KeysSet; + const utf8ValidatedKeys = validation.utf8; + if (typeof utf8ValidatedKeys === 'boolean') { + validationSetting = utf8ValidatedKeys; + } + else { + globalUTFValidation = false; + const utf8ValidationValues = Object.keys(utf8ValidatedKeys).map(function (key) { + return utf8ValidatedKeys[key]; + }); + if (utf8ValidationValues.length === 0) { + throw new BSONError('UTF-8 validation setting cannot be empty'); + } + if (typeof utf8ValidationValues[0] !== 'boolean') { + throw new BSONError('Invalid UTF-8 validation option, must specify boolean values'); + } + validationSetting = utf8ValidationValues[0]; + if (!utf8ValidationValues.every(item => item === validationSetting)) { + throw new BSONError('Invalid UTF-8 validation option - keys must be all true or all false'); + } + } + if (!globalUTFValidation) { + utf8KeysSet = new Set(); + for (const key of Object.keys(utf8ValidatedKeys)) { + utf8KeysSet.add(key); + } + } + const startIndex = index; + if (buffer.length < 5) + throw new BSONError('corrupt bson message < 5 bytes long'); + const size = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (size < 5 || size > buffer.length) + throw new BSONError('corrupt bson message'); + const object = isArray ? [] : {}; + let arrayIndex = 0; + const done = false; + let isPossibleDBRef = isArray ? false : null; + while (!done) { + const elementType = buffer[index++]; + if (elementType === 0) + break; + let i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.byteLength) + throw new BSONError('Bad BSON Document: illegal CString'); + const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i, false); + let shouldValidateKey = true; + if (globalUTFValidation || utf8KeysSet?.has(name)) { + shouldValidateKey = validationSetting; + } + else { + shouldValidateKey = !validationSetting; + } + if (isPossibleDBRef !== false && name[0] === '$') { + isPossibleDBRef = allowedDBRefKeys.test(name); + } + let value; + index = i + 1; + if (elementType === BSON_DATA_STRING) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + value = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + } + else if (elementType === BSON_DATA_OID) { + const oid = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oid[i] = buffer[index + i]; + value = new ObjectId(oid); + index = index + 12; + } + else if (elementType === BSON_DATA_INT && promoteValues === false) { + value = new Int32(NumberUtils.getInt32LE(buffer, index)); + index += 4; + } + else if (elementType === BSON_DATA_INT) { + value = NumberUtils.getInt32LE(buffer, index); + index += 4; + } + else if (elementType === BSON_DATA_NUMBER) { + value = NumberUtils.getFloat64LE(buffer, index); + index += 8; + if (promoteValues === false) + value = new Double(value); + } + else if (elementType === BSON_DATA_DATE) { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + value = new Date(new Long(lowBits, highBits).toNumber()); + } + else if (elementType === BSON_DATA_BOOLEAN) { + if (buffer[index] !== 0 && buffer[index] !== 1) + throw new BSONError('illegal boolean type value'); + value = buffer[index++] === 1; + } + else if (elementType === BSON_DATA_OBJECT) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + if (objectSize <= 0 || objectSize > buffer.length - index) + throw new BSONError('bad embedded document length in bson'); + if (raw) { + value = buffer.slice(index, index + objectSize); + } + else { + let objectOptions = options; + if (!globalUTFValidation) { + objectOptions = { ...options, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, objectOptions, false); + } + index = index + objectSize; + } + else if (elementType === BSON_DATA_ARRAY) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + let arrayOptions = options; + const stopIndex = index + objectSize; + if (fieldsAsRaw && fieldsAsRaw[name]) { + arrayOptions = { ...options, raw: true }; + } + if (!globalUTFValidation) { + arrayOptions = { ...arrayOptions, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, arrayOptions, true); + index = index + objectSize; + if (buffer[index - 1] !== 0) + throw new BSONError('invalid array terminator byte'); + if (index !== stopIndex) + throw new BSONError('corrupted array bson'); + } + else if (elementType === BSON_DATA_UNDEFINED) { + value = undefined; + } + else if (elementType === BSON_DATA_NULL) { + value = null; + } + else if (elementType === BSON_DATA_LONG) { + if (useBigInt64) { + value = NumberUtils.getBigInt64LE(buffer, index); + index += 8; + } + else { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + const long = new Long(lowBits, highBits); + if (promoteLongs && promoteValues === true) { + value = + long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) + ? long.toNumber() + : long; + } + else { + value = long; + } + } + } + else if (elementType === BSON_DATA_DECIMAL128) { + const bytes = ByteUtils.allocateUnsafe(16); + for (let i = 0; i < 16; i++) + bytes[i] = buffer[index + i]; + index = index + 16; + value = new Decimal128(bytes); + } + else if (elementType === BSON_DATA_BINARY) { + let binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + const totalBinarySize = binarySize; + const subType = buffer[index++]; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found'); + if (binarySize > buffer.byteLength) + throw new BSONError('Binary type size larger than document size'); + if (buffer['slice'] != null) { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.toLocalBufferType(buffer.slice(index, index + binarySize)); + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + else { + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + if (promoteBuffers && promoteValues) { + value = ByteUtils.allocateUnsafe(binarySize); + for (i = 0; i < binarySize; i++) { + value[i] = buffer[index + i]; + } + } + else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + index = index + binarySize; + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === false) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + const optionsArray = new Array(regExpOptions.length); + for (i = 0; i < regExpOptions.length; i++) { + switch (regExpOptions[i]) { + case 'm': + optionsArray[i] = 'm'; + break; + case 's': + optionsArray[i] = 'g'; + break; + case 'i': + optionsArray[i] = 'i'; + break; + } + } + value = new RegExp(source, optionsArray.join('')); + } + else if (elementType === BSON_DATA_REGEXP && bsonRegExp === true) { + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + i = index; + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + if (i >= buffer.length) + throw new BSONError('Bad BSON Document: illegal CString'); + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + value = new BSONRegExp(source, regExpOptions); + } + else if (elementType === BSON_DATA_SYMBOL) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const symbol = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = promoteValues ? symbol : new BSONSymbol(symbol); + index = index + stringSize; + } + else if (elementType === BSON_DATA_TIMESTAMP) { + value = new Timestamp({ + i: NumberUtils.getUint32LE(buffer, index), + t: NumberUtils.getUint32LE(buffer, index + 4) + }); + index += 8; + } + else if (elementType === BSON_DATA_MIN_KEY) { + value = new MinKey(); + } + else if (elementType === BSON_DATA_MAX_KEY) { + value = new MaxKey(); + } + else if (elementType === BSON_DATA_CODE) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = new Code(functionString); + index = index + stringSize; + } + else if (elementType === BSON_DATA_CODE_W_SCOPE) { + const totalSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (totalSize < 4 + 4 + 4 + 1) { + throw new BSONError('code_w_scope total size shorter minimum expected length'); + } + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + const scopeObject = deserializeObject(buffer, _index, options, false); + index = index + objectSize; + if (totalSize < 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too short, truncating scope'); + } + if (totalSize > 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too long, clips outer document'); + } + value = new Code(functionString, scopeObject); + } + else if (elementType === BSON_DATA_DBPOINTER) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0) + throw new BSONError('bad string length in bson'); + const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + const oidBuffer = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) + oidBuffer[i] = buffer[index + i]; + const oid = new ObjectId(oidBuffer); + index = index + 12; + value = new DBRef(namespace, oid); + } + else { + throw new BSONError(`Detected unknown BSON type ${elementType.toString(16)} for fieldname "${name}"`); + } + if (name === '__proto__') { + Object.defineProperty(object, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + object[name] = value; + } + } + if (size !== index - startIndex) { + if (isArray) + throw new BSONError('corrupt array bson'); + throw new BSONError('corrupt object bson'); + } + if (!isPossibleDBRef) + return object; + if (isDBRefLike(object)) { + const copy = Object.assign({}, object); + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(object.$ref, object.$id, object.$db, copy); + } + return object; +} + +const regexp = /\x00/; +const ignoreKeys = new Set(['$db', '$ref', '$id', '$clusterTime']); +function serializeString(buffer, key, value, index) { + buffer[index++] = BSON_DATA_STRING; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes + 1; + buffer[index - 1] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value, index + 4); + NumberUtils.setInt32LE(buffer, index, size + 1); + index = index + 4 + size; + buffer[index++] = 0; + return index; +} +function serializeNumber(buffer, key, value, index) { + const isNegativeZero = Object.is(value, -0); + const type = !isNegativeZero && + Number.isSafeInteger(value) && + value <= BSON_INT32_MAX && + value >= BSON_INT32_MIN + ? BSON_DATA_INT + : BSON_DATA_NUMBER; + buffer[index++] = type; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0x00; + if (type === BSON_DATA_INT) { + index += NumberUtils.setInt32LE(buffer, index, value); + } + else { + index += NumberUtils.setFloat64LE(buffer, index, value); + } + return index; +} +function serializeBigInt(buffer, key, value, index) { + buffer[index++] = BSON_DATA_LONG; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index += numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setBigInt64LE(buffer, index, value); + return index; +} +function serializeNull(buffer, key, _, index) { + buffer[index++] = BSON_DATA_NULL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeBoolean(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BOOLEAN; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + buffer[index++] = value ? 1 : 0; + return index; +} +function serializeDate(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DATE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const dateInMilis = Long.fromNumber(value.getTime()); + const lowBits = dateInMilis.getLowBits(); + const highBits = dateInMilis.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.source && value.source.match(regexp) != null) { + throw new BSONError('value ' + value.source + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.source, index); + buffer[index++] = 0x00; + if (value.ignoreCase) + buffer[index++] = 0x69; + if (value.global) + buffer[index++] = 0x73; + if (value.multiline) + buffer[index++] = 0x6d; + buffer[index++] = 0x00; + return index; +} +function serializeBSONRegExp(buffer, key, value, index) { + buffer[index++] = BSON_DATA_REGEXP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.pattern.match(regexp) != null) { + throw new BSONError('pattern ' + value.pattern + ' must not contain null bytes'); + } + index = index + ByteUtils.encodeUTF8Into(buffer, value.pattern, index); + buffer[index++] = 0x00; + const sortedOptions = value.options.split('').sort().join(''); + index = index + ByteUtils.encodeUTF8Into(buffer, sortedOptions, index); + buffer[index++] = 0x00; + return index; +} +function serializeMinMax(buffer, key, value, index) { + if (value === null) { + buffer[index++] = BSON_DATA_NULL; + } + else if (value._bsontype === 'MinKey') { + buffer[index++] = BSON_DATA_MIN_KEY; + } + else { + buffer[index++] = BSON_DATA_MAX_KEY; + } + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} +function serializeObjectId(buffer, key, value, index) { + buffer[index++] = BSON_DATA_OID; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += value.serializeInto(buffer, index); + return index; +} +function serializeBuffer(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = value.length; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = BSON_BINARY_SUBTYPE_DEFAULT; + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = value[i]; + } + else { + buffer.set(value, index); + } + index = index + size; + return index; +} +function serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path) { + if (path.has(value)) { + throw new BSONError('Cannot convert circular structure to BSON'); + } + path.add(value); + buffer[index++] = Array.isArray(value) ? BSON_DATA_ARRAY : BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const endIndex = serializeInto(buffer, value, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + path.delete(value); + return endIndex; +} +function serializeDecimal128(buffer, key, value, index) { + buffer[index++] = BSON_DATA_DECIMAL128; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + for (let i = 0; i < 16; i++) + buffer[index + i] = value.bytes[i]; + return index + 16; +} +function serializeLong(buffer, key, value, index) { + buffer[index++] = + value._bsontype === 'Long' ? BSON_DATA_LONG : BSON_DATA_TIMESTAMP; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const lowBits = value.getLowBits(); + const highBits = value.getHighBits(); + index += NumberUtils.setInt32LE(buffer, index, lowBits); + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} +function serializeInt32(buffer, key, value, index) { + value = value.valueOf(); + buffer[index++] = BSON_DATA_INT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setInt32LE(buffer, index, value); + return index; +} +function serializeDouble(buffer, key, value, index) { + buffer[index++] = BSON_DATA_NUMBER; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + index += NumberUtils.setFloat64LE(buffer, index, value.value); + return index; +} +function serializeFunction(buffer, key, value, index) { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeCode(buffer, key, value, index, checkKeys = false, depth = 0, serializeFunctions = false, ignoreUndefined = true, path) { + if (value.scope && typeof value.scope === 'object') { + buffer[index++] = BSON_DATA_CODE_W_SCOPE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + const functionString = value.code; + index = index + 4; + const codeSize = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, codeSize); + buffer[index + 4 + codeSize - 1] = 0; + index = index + codeSize + 4; + const endIndex = serializeInto(buffer, value.scope, checkKeys, index, depth + 1, serializeFunctions, ignoreUndefined, path); + index = endIndex - 1; + const totalSize = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, startIndex, totalSize); + buffer[index++] = 0; + } + else { + buffer[index++] = BSON_DATA_CODE; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const functionString = value.code.toString(); + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + } + return index; +} +function serializeBinary(buffer, key, value, index) { + buffer[index++] = BSON_DATA_BINARY; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const data = value.buffer; + let size = value.position; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) + size = size + 4; + index += NumberUtils.setInt32LE(buffer, index, size); + buffer[index++] = value.sub_type; + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + size = size - 4; + index += NumberUtils.setInt32LE(buffer, index, size); + } + if (size <= 16) { + for (let i = 0; i < size; i++) + buffer[index + i] = data[i]; + } + else { + buffer.set(data, index); + } + index = index + value.position; + return index; +} +function serializeSymbol(buffer, key, value, index) { + buffer[index++] = BSON_DATA_SYMBOL; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const size = ByteUtils.encodeUTF8Into(buffer, value.value, index + 4) + 1; + NumberUtils.setInt32LE(buffer, index, size); + index = index + 4 + size - 1; + buffer[index++] = 0; + return index; +} +function serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path) { + buffer[index++] = BSON_DATA_OBJECT; + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + let startIndex = index; + let output = { + $ref: value.collection || value.namespace, + $id: value.oid + }; + if (value.db != null) { + output.$db = value.db; + } + output = Object.assign(output, value.fields); + const endIndex = serializeInto(buffer, output, false, index, depth + 1, serializeFunctions, true, path); + const size = endIndex - startIndex; + startIndex += NumberUtils.setInt32LE(buffer, index, size); + return endIndex; +} +function serializeInto(buffer, object, checkKeys, startingIndex, depth, serializeFunctions, ignoreUndefined, path) { + if (path == null) { + if (object == null) { + buffer[0] = 0x05; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + buffer[4] = 0x00; + return 5; + } + if (Array.isArray(object)) { + throw new BSONError('serialize does not support an array as the root input'); + } + if (typeof object !== 'object') { + throw new BSONError('serialize does not support non-object as the root input'); + } + else if ('_bsontype' in object && typeof object._bsontype === 'string') { + throw new BSONError(`BSON types cannot be serialized as a document`); + } + else if (isDate(object) || + isRegExp(object) || + isUint8Array(object) || + isAnyArrayBuffer(object)) { + throw new BSONError(`date, regexp, typedarray, and arraybuffer cannot be BSON documents`); + } + path = new Set(); + } + path.add(object); + let index = startingIndex + 4; + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + const key = `${i}`; + let value = object[i]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + if (typeof value === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (typeof value === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (typeof value === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (typeof value === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (typeof value === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else if (object instanceof Map || isMap(object)) { + const iterator = object.entries(); + let done = false; + while (!done) { + const entry = iterator.next(); + done = !!entry.done; + if (done) + continue; + const key = entry.value[0]; + let value = entry.value[1]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === null || (value === undefined && ignoreUndefined === false)) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + else { + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + if (object != null && typeof object !== 'object') { + throw new BSONError('toBSON function did not return an object'); + } + } + for (const key of Object.keys(object)) { + let value = object[key]; + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + const type = typeof value; + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } + else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } + else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } + else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } + else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } + else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } + else if (value === undefined) { + if (ignoreUndefined === false) + index = serializeNull(buffer, key, value, index); + } + else if (value === null) { + index = serializeNull(buffer, key, value, index); + } + else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } + else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype == null) { + index = serializeObject(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } + else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } + else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } + else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } + else if (value._bsontype === 'Code') { + index = serializeCode(buffer, key, value, index, checkKeys, depth, serializeFunctions, ignoreUndefined, path); + } + else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } + else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } + else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } + else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } + else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } + else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } + else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } + else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + path.delete(object); + buffer[index++] = 0x00; + const size = index - startingIndex; + startingIndex += NumberUtils.setInt32LE(buffer, startingIndex, size); + return index; +} + +function isBSONType(value) { + return (value != null && + typeof value === 'object' && + '_bsontype' in value && + typeof value._bsontype === 'string'); +} +const keysToCodecs = { + $oid: ObjectId, + $binary: Binary, + $uuid: Binary, + $symbol: BSONSymbol, + $numberInt: Int32, + $numberDecimal: Decimal128, + $numberDouble: Double, + $numberLong: Long, + $minKey: MinKey, + $maxKey: MaxKey, + $regex: BSONRegExp, + $regularExpression: BSONRegExp, + $timestamp: Timestamp +}; +function deserializeValue(value, options = {}) { + if (typeof value === 'number') { + const in32BitRange = value <= BSON_INT32_MAX && value >= BSON_INT32_MIN; + const in64BitRange = value <= BSON_INT64_MAX && value >= BSON_INT64_MIN; + if (options.relaxed || options.legacy) { + return value; + } + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (in32BitRange) { + return new Int32(value); + } + if (in64BitRange) { + if (options.useBigInt64) { + return BigInt(value); + } + return Long.fromNumber(value); + } + } + return new Double(value); + } + if (value == null || typeof value !== 'object') + return value; + if (value.$undefined) + return null; + const keys = Object.keys(value).filter(k => k.startsWith('$') && value[k] != null); + for (let i = 0; i < keys.length; i++) { + const c = keysToCodecs[keys[i]]; + if (c) + return c.fromExtendedJSON(value, options); + } + if (value.$date != null) { + const d = value.$date; + const date = new Date(); + if (options.legacy) { + if (typeof d === 'number') + date.setTime(d); + else if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + else { + if (typeof d === 'string') + date.setTime(Date.parse(d)); + else if (Long.isLong(d)) + date.setTime(d.toNumber()); + else if (typeof d === 'number' && options.relaxed) + date.setTime(d); + else if (typeof d === 'bigint') + date.setTime(Number(d)); + else + throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + return date; + } + if (value.$code != null) { + const copy = Object.assign({}, value); + if (value.$scope) { + copy.$scope = deserializeValue(value.$scope); + } + return Code.fromExtendedJSON(value); + } + if (isDBRefLike(value) || value.$dbPointer) { + const v = value.$ref ? value : value.$dbPointer; + if (v instanceof DBRef) + return v; + const dollarKeys = Object.keys(v).filter(k => k.startsWith('$')); + let valid = true; + dollarKeys.forEach(k => { + if (['$ref', '$id', '$db'].indexOf(k) === -1) + valid = false; + }); + if (valid) + return DBRef.fromExtendedJSON(v); + } + return value; +} +function serializeArray(array, options) { + return array.map((v, index) => { + options.seenObjects.push({ propertyName: `index ${index}`, obj: null }); + try { + return serializeValue(v, options); + } + finally { + options.seenObjects.pop(); + } + }); +} +function getISOString(date) { + const isoStr = date.toISOString(); + return date.getUTCMilliseconds() !== 0 ? isoStr : isoStr.slice(0, -5) + 'Z'; +} +function serializeValue(value, options) { + if (value instanceof Map || isMap(value)) { + const obj = Object.create(null); + for (const [k, v] of value) { + if (typeof k !== 'string') { + throw new BSONError('Can only serialize maps with string keys'); + } + obj[k] = v; + } + return serializeValue(obj, options); + } + if ((typeof value === 'object' || typeof value === 'function') && value !== null) { + const index = options.seenObjects.findIndex(entry => entry.obj === value); + if (index !== -1) { + const props = options.seenObjects.map(entry => entry.propertyName); + const leadingPart = props + .slice(0, index) + .map(prop => `${prop} -> `) + .join(''); + const alreadySeen = props[index]; + const circularPart = ' -> ' + + props + .slice(index + 1, props.length - 1) + .map(prop => `${prop} -> `) + .join(''); + const current = props[props.length - 1]; + const leadingSpace = ' '.repeat(leadingPart.length + alreadySeen.length / 2); + const dashes = '-'.repeat(circularPart.length + (alreadySeen.length + current.length) / 2 - 1); + throw new BSONError('Converting circular structure to EJSON:\n' + + ` ${leadingPart}${alreadySeen}${circularPart}${current}\n` + + ` ${leadingSpace}\\${dashes}/`); + } + options.seenObjects[options.seenObjects.length - 1].obj = value; + } + if (Array.isArray(value)) + return serializeArray(value, options); + if (value === undefined) + return null; + if (value instanceof Date || isDate(value)) { + const dateNum = value.getTime(), inRange = dateNum > -1 && dateNum < 253402318800000; + if (options.legacy) { + return options.relaxed && inRange + ? { $date: value.getTime() } + : { $date: getISOString(value) }; + } + return options.relaxed && inRange + ? { $date: getISOString(value) } + : { $date: { $numberLong: value.getTime().toString() } }; + } + if (typeof value === 'number' && (!options.relaxed || !isFinite(value))) { + if (Number.isInteger(value) && !Object.is(value, -0)) { + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return { $numberInt: value.toString() }; + } + if (value >= BSON_INT64_MIN && value <= BSON_INT64_MAX) { + return { $numberLong: value.toString() }; + } + } + return { $numberDouble: Object.is(value, -0) ? '-0.0' : value.toString() }; + } + if (typeof value === 'bigint') { + if (!options.relaxed) { + return { $numberLong: BigInt.asIntN(64, value).toString() }; + } + return Number(BigInt.asIntN(64, value)); + } + if (value instanceof RegExp || isRegExp(value)) { + let flags = value.flags; + if (flags === undefined) { + const match = value.toString().match(/[gimuy]*$/); + if (match) { + flags = match[0]; + } + } + const rx = new BSONRegExp(value.source, flags); + return rx.toExtendedJSON(options); + } + if (value != null && typeof value === 'object') + return serializeDocument(value, options); + return value; +} +const BSON_TYPE_MAPPINGS = { + Binary: (o) => new Binary(o.value(), o.sub_type), + Code: (o) => new Code(o.code, o.scope), + DBRef: (o) => new DBRef(o.collection || o.namespace, o.oid, o.db, o.fields), + Decimal128: (o) => new Decimal128(o.bytes), + Double: (o) => new Double(o.value), + Int32: (o) => new Int32(o.value), + Long: (o) => Long.fromBits(o.low != null ? o.low : o.low_, o.low != null ? o.high : o.high_, o.low != null ? o.unsigned : o.unsigned_), + MaxKey: () => new MaxKey(), + MinKey: () => new MinKey(), + ObjectId: (o) => new ObjectId(o), + BSONRegExp: (o) => new BSONRegExp(o.pattern, o.options), + BSONSymbol: (o) => new BSONSymbol(o.value), + Timestamp: (o) => Timestamp.fromBits(o.low, o.high) +}; +function serializeDocument(doc, options) { + if (doc == null || typeof doc !== 'object') + throw new BSONError('not an object instance'); + const bsontype = doc._bsontype; + if (typeof bsontype === 'undefined') { + const _doc = {}; + for (const name of Object.keys(doc)) { + options.seenObjects.push({ propertyName: name, obj: null }); + try { + const value = serializeValue(doc[name], options); + if (name === '__proto__') { + Object.defineProperty(_doc, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } + else { + _doc[name] = value; + } + } + finally { + options.seenObjects.pop(); + } + } + return _doc; + } + else if (doc != null && + typeof doc === 'object' && + typeof doc._bsontype === 'string' && + doc[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION) { + throw new BSONVersionError(); + } + else if (isBSONType(doc)) { + let outDoc = doc; + if (typeof outDoc.toExtendedJSON !== 'function') { + const mapper = BSON_TYPE_MAPPINGS[doc._bsontype]; + if (!mapper) { + throw new BSONError('Unrecognized or invalid _bsontype: ' + doc._bsontype); + } + outDoc = mapper(outDoc); + } + if (bsontype === 'Code' && outDoc.scope) { + outDoc = new Code(outDoc.code, serializeValue(outDoc.scope, options)); + } + else if (bsontype === 'DBRef' && outDoc.oid) { + outDoc = new DBRef(serializeValue(outDoc.collection, options), serializeValue(outDoc.oid, options), serializeValue(outDoc.db, options), serializeValue(outDoc.fields, options)); + } + return outDoc.toExtendedJSON(options); + } + else { + throw new BSONError('_bsontype must be a string, but was: ' + typeof bsontype); + } +} +function parse(text, options) { + const ejsonOptions = { + useBigInt64: options?.useBigInt64 ?? false, + relaxed: options?.relaxed ?? true, + legacy: options?.legacy ?? false + }; + return JSON.parse(text, (key, value) => { + if (key.indexOf('\x00') !== -1) { + throw new BSONError(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(key)}`); + } + return deserializeValue(value, ejsonOptions); + }); +} +function stringify(value, replacer, space, options) { + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = undefined; + space = 0; + } + const serializeOptions = Object.assign({ relaxed: true, legacy: false }, options, { + seenObjects: [{ propertyName: '(root)', obj: null }] + }); + const doc = serializeValue(value, serializeOptions); + return JSON.stringify(doc, replacer, space); +} +function EJSONserialize(value, options) { + options = options || {}; + return JSON.parse(stringify(value, options)); +} +function EJSONdeserialize(ejson, options) { + options = options || {}; + return parse(JSON.stringify(ejson), options); +} +const EJSON = Object.create(null); +EJSON.parse = parse; +EJSON.stringify = stringify; +EJSON.serialize = EJSONserialize; +EJSON.deserialize = EJSONdeserialize; +Object.freeze(EJSON); + +function getSize(source, offset) { + try { + return NumberUtils.getNonnegativeInt32LE(source, offset); + } + catch (cause) { + throw new BSONOffsetError('BSON size cannot be negative', offset, { cause }); + } +} +function findNull(bytes, offset) { + let nullTerminatorOffset = offset; + for (; bytes[nullTerminatorOffset] !== 0x00; nullTerminatorOffset++) + ; + if (nullTerminatorOffset === bytes.length - 1) { + throw new BSONOffsetError('Null terminator not found', offset); + } + return nullTerminatorOffset; +} +function parseToElements(bytes, startOffset = 0) { + startOffset ??= 0; + if (bytes.length < 5) { + throw new BSONOffsetError(`Input must be at least 5 bytes, got ${bytes.length} bytes`, startOffset); + } + const documentSize = getSize(bytes, startOffset); + if (documentSize > bytes.length - startOffset) { + throw new BSONOffsetError(`Parsed documentSize (${documentSize} bytes) does not match input length (${bytes.length} bytes)`, startOffset); + } + if (bytes[startOffset + documentSize - 1] !== 0x00) { + throw new BSONOffsetError('BSON documents must end in 0x00', startOffset + documentSize); + } + const elements = []; + let offset = startOffset + 4; + while (offset <= documentSize + startOffset) { + const type = bytes[offset]; + offset += 1; + if (type === 0) { + if (offset - startOffset !== documentSize) { + throw new BSONOffsetError(`Invalid 0x00 type byte`, offset); + } + break; + } + const nameOffset = offset; + const nameLength = findNull(bytes, offset) - nameOffset; + offset += nameLength + 1; + let length; + if (type === 1 || + type === 18 || + type === 9 || + type === 17) { + length = 8; + } + else if (type === 16) { + length = 4; + } + else if (type === 7) { + length = 12; + } + else if (type === 19) { + length = 16; + } + else if (type === 8) { + length = 1; + } + else if (type === 10 || + type === 6 || + type === 127 || + type === 255) { + length = 0; + } + else if (type === 11) { + length = findNull(bytes, findNull(bytes, offset) + 1) + 1 - offset; + } + else if (type === 3 || + type === 4 || + type === 15) { + length = getSize(bytes, offset); + } + else if (type === 2 || + type === 5 || + type === 12 || + type === 13 || + type === 14) { + length = getSize(bytes, offset) + 4; + if (type === 5) { + length += 1; + } + if (type === 12) { + length += 12; + } + } + else { + throw new BSONOffsetError(`Invalid 0x${type.toString(16).padStart(2, '0')} type byte`, offset); + } + if (length > documentSize) { + throw new BSONOffsetError('value reports length larger than document', offset); + } + elements.push([type, nameOffset, nameLength, offset, length]); + offset += length; + } + return elements; +} + +const onDemand = Object.create(null); +onDemand.parseToElements = parseToElements; +onDemand.ByteUtils = ByteUtils; +onDemand.NumberUtils = NumberUtils; +Object.freeze(onDemand); + +const MAXSIZE = 1024 * 1024 * 17; +let buffer = ByteUtils.allocate(MAXSIZE); +function setInternalBufferSize(size) { + if (buffer.length < size) { + buffer = ByteUtils.allocate(size); + } +} +function serialize(object, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const minInternalBufferSize = typeof options.minInternalBufferSize === 'number' ? options.minInternalBufferSize : MAXSIZE; + if (buffer.length < minInternalBufferSize) { + buffer = ByteUtils.allocate(minInternalBufferSize); + } + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + const finishedBuffer = ByteUtils.allocateUnsafe(serializationIndex); + finishedBuffer.set(buffer.subarray(0, serializationIndex), 0); + return finishedBuffer; +} +function serializeWithBufferAndIndex(object, finalBuffer, options = {}) { + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const startIndex = typeof options.index === 'number' ? options.index : 0; + const serializationIndex = serializeInto(buffer, object, checkKeys, 0, 0, serializeFunctions, ignoreUndefined, null); + finalBuffer.set(buffer.subarray(0, serializationIndex), startIndex); + return startIndex + serializationIndex - 1; +} +function deserialize(buffer, options = {}) { + return internalDeserialize(ByteUtils.toLocalBufferType(buffer), options); +} +function calculateObjectSize(object, options = {}) { + options = options || {}; + const serializeFunctions = typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + return internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined); +} +function deserializeStream(data, startIndex, numberOfDocuments, documents, docStartIndex, options) { + const internalOptions = Object.assign({ allowObjectSmallerThanBufferSize: true, index: 0 }, options); + const bufferData = ByteUtils.toLocalBufferType(data); + let index = startIndex; + for (let i = 0; i < numberOfDocuments; i++) { + const size = NumberUtils.getInt32LE(bufferData, index); + internalOptions.index = index; + documents[docStartIndex + i] = internalDeserialize(bufferData, internalOptions); + index = index + size; + } + return index; +} + +var bson = /*#__PURE__*/Object.freeze({ + __proto__: null, + BSONError: BSONError, + BSONOffsetError: BSONOffsetError, + BSONRegExp: BSONRegExp, + BSONRuntimeError: BSONRuntimeError, + BSONSymbol: BSONSymbol, + BSONType: BSONType, + BSONValue: BSONValue, + BSONVersionError: BSONVersionError, + Binary: Binary, + Code: Code, + DBRef: DBRef, + Decimal128: Decimal128, + Double: Double, + EJSON: EJSON, + Int32: Int32, + Long: Long, + MaxKey: MaxKey, + MinKey: MinKey, + ObjectId: ObjectId, + Timestamp: Timestamp, + UUID: UUID, + calculateObjectSize: calculateObjectSize, + deserialize: deserialize, + deserializeStream: deserializeStream, + onDemand: onDemand, + serialize: serialize, + serializeWithBufferAndIndex: serializeWithBufferAndIndex, + setInternalBufferSize: setInternalBufferSize +}); + +exports.BSON = bson; +exports.BSONError = BSONError; +exports.BSONOffsetError = BSONOffsetError; +exports.BSONRegExp = BSONRegExp; +exports.BSONRuntimeError = BSONRuntimeError; +exports.BSONSymbol = BSONSymbol; +exports.BSONType = BSONType; +exports.BSONValue = BSONValue; +exports.BSONVersionError = BSONVersionError; +exports.Binary = Binary; +exports.Code = Code; +exports.DBRef = DBRef; +exports.Decimal128 = Decimal128; +exports.Double = Double; +exports.EJSON = EJSON; +exports.Int32 = Int32; +exports.Long = Long; +exports.MaxKey = MaxKey; +exports.MinKey = MinKey; +exports.ObjectId = ObjectId; +exports.Timestamp = Timestamp; +exports.UUID = UUID; +exports.calculateObjectSize = calculateObjectSize; +exports.deserialize = deserialize; +exports.deserializeStream = deserializeStream; +exports.onDemand = onDemand; +exports.serialize = serialize; +exports.serializeWithBufferAndIndex = serializeWithBufferAndIndex; +exports.setInternalBufferSize = setInternalBufferSize; +//# sourceMappingURL=bson.rn.cjs.map diff --git a/user-service/node_modules/bson/lib/bson.rn.cjs.map b/user-service/node_modules/bson/lib/bson.rn.cjs.map new file mode 100644 index 0000000000..27dfe757c2 --- /dev/null +++ b/user-service/node_modules/bson/lib/bson.rn.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"bson.rn.cjs","sources":["../src/parser/utils.ts","../src/constants.ts","../src/error.ts","../src/parse_utf8.ts","../src/utils/latin.ts","../src/utils/node_byte_utils.ts","../src/utils/web_byte_utils.ts","../src/utils/byte_utils.ts","../src/bson_value.ts","../src/binary.ts","../src/code.ts","../src/db_ref.ts","../src/utils/string_utils.ts","../src/long.ts","../src/decimal128.ts","../src/double.ts","../src/int_32.ts","../src/max_key.ts","../src/min_key.ts","../src/utils/number_utils.ts","../src/objectid.ts","../src/parser/calculate_size.ts","../src/regexp.ts","../src/symbol.ts","../src/timestamp.ts","../src/parser/deserializer.ts","../src/parser/serializer.ts","../src/extended_json.ts","../src/parser/on_demand/parse_to_elements.ts","../src/parser/on_demand/index.ts","../src/bson.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["StringUtils.validateStringCharacters","StringUtils.removeLeadingZerosAndExplicitPlus","constants.JS_INT_MIN","constants.JS_INT_MAX","constants.BSON_INT32_MIN","constants.BSON_INT32_MAX","constants.BSON_MAJOR_VERSION","constants.BSON_DATA_STRING","constants.BSON_DATA_OID","constants.BSON_DATA_INT","constants.BSON_DATA_NUMBER","constants.BSON_DATA_DATE","constants.BSON_DATA_BOOLEAN","constants.BSON_DATA_OBJECT","constants.BSON_DATA_ARRAY","constants.BSON_DATA_UNDEFINED","constants.BSON_DATA_NULL","constants.BSON_DATA_LONG","constants.BSON_DATA_DECIMAL128","constants.BSON_DATA_BINARY","constants.BSON_BINARY_SUBTYPE_UUID_NEW","constants.BSON_DATA_REGEXP","constants.BSON_DATA_SYMBOL","constants.BSON_DATA_TIMESTAMP","constants.BSON_DATA_MIN_KEY","constants.BSON_DATA_MAX_KEY","constants.BSON_DATA_CODE","constants.BSON_DATA_CODE_W_SCOPE","constants.BSON_DATA_DBPOINTER","constants.BSON_BINARY_SUBTYPE_DEFAULT"],"mappings":"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C,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAC/oC,EACD,EAAE,CACH,CAAC,OAAqC,CAAC;AAC1C,CAAC;AAAC,MAAM;AAER,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/B,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/B,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACvD,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACvD,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,CAAC;AAG1C,MAAM,SAAS,GAA4B,EAAE,CAAC;AAG9C,MAAM,UAAU,GAA4B,EAAE,CAAC;AAE/C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,cAAc,GAAG,6BAA6B,CAAC;AA0B/C,MAAO,IAAK,SAAQ,SAAS,CAAA;AACjC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,MAAM,CAAC;KACf;AAGD,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC;KACb;AAuCD,IAAA,WAAA,CACE,UAAuC,GAAA,CAAC,EACxC,cAAiC,EACjC,QAAkB,EAAA;AAElB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,MAAM,YAAY,GAAG,OAAO,cAAc,KAAK,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9F,QAAA,MAAM,IAAI,GAAG,OAAO,cAAc,KAAK,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC;AACrE,QAAA,MAAM,GAAG,GACP,OAAO,UAAU,KAAK,QAAQ;cAC1B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC;AAC3C,cAAE,OAAO,UAAU,KAAK,QAAQ;kBAC5B,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC;AAC3C,kBAAE,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACxE,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;KAC9B;AA6BD,IAAA,OAAO,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAE,QAAkB,EAAA;QACnE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC9C;AAQD,IAAA,OAAO,OAAO,CAAC,KAAa,EAAE,QAAkB,EAAA;AAC9C,QAAA,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC;QAC1B,IAAI,QAAQ,EAAE;YACZ,KAAK,MAAM,CAAC,CAAC;AACb,YAAA,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AACvC,gBAAA,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAC9B,gBAAA,IAAI,SAAS;AAAE,oBAAA,OAAO,SAAS,CAAC;aACjC;YACD,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,YAAA,IAAI,KAAK;AAAE,gBAAA,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACnC,YAAA,OAAO,GAAG,CAAC;SACZ;aAAM;YACL,KAAK,IAAI,CAAC,CAAC;AACX,YAAA,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG;AAC1C,gBAAA,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7B,gBAAA,IAAI,SAAS;AAAE,oBAAA,OAAO,SAAS,CAAC;aACjC;YACD,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,IAAI,KAAK;AAAE,gBAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAClC,YAAA,OAAO,GAAG,CAAC;SACZ;KACF;AAQD,IAAA,OAAO,UAAU,CAAC,KAAa,EAAE,QAAkB,EAAA;QACjD,IAAI,KAAK,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3D,IAAI,QAAQ,EAAE;YACZ,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACjC,IAAI,KAAK,IAAI,cAAc;gBAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAC7D;aAAM;YACL,IAAI,KAAK,IAAI,CAAC,cAAc;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;AACpD,YAAA,IAAI,KAAK,GAAG,CAAC,IAAI,cAAc;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;SACxD;QACD,IAAI,KAAK,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,cAAc,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,cAAc,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC1F;AAQD,IAAA,OAAO,UAAU,CAAC,KAAa,EAAE,QAAkB,EAAA;AAEjD,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhD,QAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,IAAI,CACb,MAAM,CAAC,KAAK,GAAG,oBAAoB,CAAC,EACpC,MAAM,CAAC,CAAC,KAAK,IAAI,qBAAqB,IAAI,oBAAoB,CAAC,EAC/D,QAAQ,CACT,CAAC;KACH;AAaO,IAAA,OAAO,WAAW,CAAC,GAAW,EAAE,QAAiB,EAAE,KAAa,EAAA;AACtE,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,cAAc,CAAC,CAAC;AAC1D,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAE1D,QAAA,IAAI,CAAC,CAAC;QACN,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAClE,aAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;SAClE;AAID,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzD,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AACtC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EACtC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;aACxD;iBAAM;AACL,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAClC,gBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;aAC7C;SACF;AACD,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC3B,QAAA,OAAO,MAAM,CAAC;KACf;AAsDD,IAAA,OAAO,gBAAgB,CAAC,GAAW,EAAE,eAAkC,EAAE,KAAc,EAAA;QACrF,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YAEvC,CAAC,KAAK,GAAG,eAAe,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC;SACtD;aAAM;AACL,YAAA,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC;SAC9B;QACD,KAAK,KAAK,EAAE,CAAC;AAEb,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;AACtB,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACpF;QACD,IAAI,CAACA,wBAAoC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YACrD,MAAM,IAAI,SAAS,CAAC,CAAA,QAAA,EAAW,GAAG,CAA4C,yCAAA,EAAA,KAAK,CAAE,CAAA,CAAC,CAAC;SACxF;QAGD,MAAM,UAAU,GAAGC,iCAA6C,CAAC,GAAG,CAAC,CAAC;AAGtE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7D,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE;AACrE,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,OAAA,EAAU,GAAG,CAA4B,yBAAA,EAAA,MAAM,CAAC,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAA,aAAA,EAAgB,KAAK,IAAI,IAAI,GAAG,CAAA,YAAA,EAAe,KAAK,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CACnJ,CAAC;SACH;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AA8DD,IAAA,OAAO,UAAU,CAAC,GAAW,EAAE,eAAkC,EAAE,KAAc,EAAA;QAC/E,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YAEvC,CAAC,KAAK,GAAG,eAAe,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC;SACtD;aAAM;AACL,YAAA,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAC;SAC9B;QACD,KAAK,KAAK,EAAE,CAAC;QACb,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,EAAE,EAAE;YAE/B,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;AAAM,aAAA,IAAI,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW,KAAK,KAAK,GAAG,EAAE,EAAE;YAE3F,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC/C;AASD,IAAA,OAAO,SAAS,CAAC,KAAe,EAAE,QAAkB,EAAE,EAAY,EAAA;QAChE,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;KACnF;AAQD,IAAA,OAAO,WAAW,CAAC,KAAe,EAAE,QAAkB,EAAA;AACpD,QAAA,OAAO,IAAI,IAAI,CACb,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAChE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAChE,QAAQ,CACT,CAAC;KACH;AAQD,IAAA,OAAO,WAAW,CAAC,KAAe,EAAE,QAAkB,EAAA;AACpD,QAAA,OAAO,IAAI,IAAI,CACb,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAChE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAChE,QAAQ,CACT,CAAC;KACH;IAKD,OAAO,MAAM,CAAC,KAAc,EAAA;QAC1B,QACE,KAAK,IAAI,IAAI;YACb,OAAO,KAAK,KAAK,QAAQ;AACzB,YAAA,YAAY,IAAI,KAAK;AACrB,YAAA,KAAK,CAAC,UAAU,KAAK,IAAI,EACzB;KACH;AAMD,IAAA,OAAO,SAAS,CACd,GAAwE,EACxE,QAAkB,EAAA;QAElB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEnE,OAAO,IAAI,CAAC,QAAQ,CAClB,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,IAAI,EACR,OAAO,QAAQ,KAAK,SAAS,GAAG,QAAQ,GAAG,GAAG,CAAC,QAAQ,CACxD,CAAC;KACH;AAGD,IAAA,GAAG,CAAC,MAA0C,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAAE,YAAA,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAI1D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;AAE9B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;AACjC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;AAC9B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC;AAEhC,QAAA,IAAI,GAAG,GAAG,CAAC,EACT,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,CAAC;AACV,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;QACjB,GAAG,IAAI,MAAM,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3E;AAMD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;AAMD,IAAA,OAAO,CAAC,KAAyC,EAAA;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAC/B,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,QAAQ;AAAE,YAAA,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEjE,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;AACvC,aAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;cAC5D,CAAC,CAAC;cACF,CAAC,CAAC;KACP;AAGD,IAAA,IAAI,CAAC,KAAyC,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC5B;AAMD,IAAA,MAAM,CAAC,OAA2C,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,MAAM,EAAE;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAG9D,IAAI,IAAI,EAAE;YAIR,IACE,CAAC,IAAI,CAAC,QAAQ;AACd,gBAAA,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU;AACzB,gBAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAClB,gBAAA,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,EACnB;AAEA,gBAAA,OAAO,IAAI,CAAC;aACb;AACD,YAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAClD,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,CACb,CAAC;AACF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACjE,QAAA,IAAI,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAGlB,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AAC3B,gBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,IAAI,CAAC,SAAS,CAAC;AAEvE,qBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;oBAAE,OAAO,IAAI,CAAC,GAAG,CAAC;qBAChD;oBAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,oBAAA,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACxB,wBAAA,OAAO,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;qBACvD;yBAAM;AACL,wBAAA,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,wBAAA,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,wBAAA,OAAO,GAAG,CAAC;qBACZ;iBACF;aACF;AAAM,iBAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;AACrF,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,IAAI,OAAO,CAAC,UAAU,EAAE;AAAE,oBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/D,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;aACtC;iBAAM,IAAI,OAAO,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AACtE,YAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;SACjB;aAAM;YAGL,IAAI,CAAC,OAAO,CAAC,QAAQ;AAAE,gBAAA,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AACtD,YAAA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACxC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE1B,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,YAAA,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;SAClB;QAQD,GAAG,GAAG,IAAI,CAAC;AACX,QAAA,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAGvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAItE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAGtD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvC,YAAA,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC;gBAChB,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACnD,gBAAA,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACpC;YAID,IAAI,SAAS,CAAC,MAAM,EAAE;AAAE,gBAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;AAE7C,YAAA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,YAAA,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAC1B;AACD,QAAA,OAAO,GAAG,CAAC;KACZ;AAGD,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAMD,IAAA,MAAM,CAAC,KAAyC,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC;AACvF,YAAA,OAAO,KAAK,CAAC;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC;KAC3D;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC3B;IAGD,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,IAAI,CAAC;KAClB;IAGD,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;KACxB;IAGD,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC;KACjB;IAGD,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;KACvB;IAGD,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YAErB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;SAClE;AACD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;AACnD,QAAA,IAAI,GAAW,CAAC;QAChB,KAAK,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;YAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;gBAAE,MAAM;AACnE,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;KAC7C;AAGD,IAAA,WAAW,CAAC,KAAyC,EAAA;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC7B;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;KAChC;AAGD,IAAA,kBAAkB,CAAC,KAAyC,EAAA;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC9B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;KACvC;AAED,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;KACvC;IAGD,MAAM,GAAA;QACJ,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KAC7B;IAGD,UAAU,GAAA;QACR,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;KACxC;IAGD,KAAK,GAAA;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;KAC7B;IAGD,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;KACxC;IAGD,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;KAC1C;AAGD,IAAA,QAAQ,CAAC,KAAyC,EAAA;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KAC7B;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KAC7B;AAGD,IAAA,eAAe,CAAC,KAAyC,EAAA;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAC9B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KACpC;AAGD,IAAA,MAAM,CAAC,OAA2C,EAAA;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAG7D,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAClD,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,CACb,CAAC;AACF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;AAED,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;KACjD;AAGD,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAED,IAAA,GAAG,CAAC,OAA2C,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;AAOD,IAAA,QAAQ,CAAC,UAA8C,EAAA;QACrD,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAGtE,IAAI,IAAI,EAAE;YACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AAC3E,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3D;QAED,IAAI,UAAU,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AACpF,QAAA,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AAEpF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,UAAU,CAAC,UAAU,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;;AAChE,gBAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;SAC9C;aAAM,IAAI,UAAU,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;AAG5E,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5D,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAKjF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;AAE9B,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;AACnC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;AACrC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,KAAK,EAAE,CAAC;AAClC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;AAEpC,QAAA,IAAI,GAAG,GAAG,CAAC,EACT,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,CAAC;AACV,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;AACjB,QAAA,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAClB,GAAG,IAAI,MAAM,CAAC;AACd,QAAA,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACrD,GAAG,IAAI,MAAM,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC3E;AAGD,IAAA,GAAG,CAAC,UAA8C,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClC;IAGD,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QACrE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACjC;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;KACtB;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC5D;AAGD,IAAA,SAAS,CAAC,KAAyC,EAAA;AACjD,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5B;AAGD,IAAA,GAAG,CAAC,KAAyC,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAC9B;AAED,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAC9B;AAKD,IAAA,EAAE,CAAC,KAA6B,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;AAOD,IAAA,SAAS,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,OAAO,IAAI,EAAE,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAClC,IAAI,OAAO,GAAG,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,GAAG,IAAI,OAAO,EACnB,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EACtD,IAAI,CAAC,QAAQ,CACd,CAAC;;YACC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzE;AAGD,IAAA,GAAG,CAAC,OAAsB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAChC;AAOD,IAAA,UAAU,CAAC,OAAsB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,OAAO,IAAI,EAAE,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAClC,IAAI,OAAO,GAAG,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,EACtD,IAAI,CAAC,IAAI,IAAI,OAAO,EACpB,IAAI,CAAC,QAAQ,CACd,CAAC;;AACC,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KAChG;AAGD,IAAA,GAAG,CAAC,OAAsB,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KACjC;AAOD,IAAA,kBAAkB,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACpD,OAAO,IAAI,EAAE,CAAC;QACd,IAAI,OAAO,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;aAC1B;AACH,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,OAAO,GAAG,EAAE,EAAE;AAChB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;AACrB,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAClB,CAAC,GAAG,KAAK,OAAO,KAAK,IAAI,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,EAC5C,IAAI,KAAK,OAAO,EAChB,IAAI,CAAC,QAAQ,CACd,CAAC;aACH;iBAAM,IAAI,OAAO,KAAK,EAAE;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;;AACnE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtE;KACF;AAGD,IAAA,KAAK,CAAC,OAAsB,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzC;AAED,IAAA,IAAI,CAAC,OAAsB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;KACzC;AAOD,IAAA,QAAQ,CAAC,UAA8C,EAAA;AACrD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;KACnC;AAGD,IAAA,GAAG,CAAC,UAA8C,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAClC;IAGD,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;KAClD;IAGD,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,cAAc,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAChF,QAAA,OAAO,IAAI,CAAC,IAAI,GAAG,cAAc,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;KACtD;IAGD,QAAQ,GAAA;AAEN,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;KAChC;AAOD,IAAA,OAAO,CAAC,EAAY,EAAA;AAClB,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;KACjD;IAMD,SAAS,GAAA;QACP,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAClB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO;AACL,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,EAAE,KAAK,EAAE;SACV,CAAC;KACH;IAMD,SAAS,GAAA;QACP,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAClB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO;AACL,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,EAAE,GAAG,IAAI;AACT,YAAA,EAAE,KAAK,EAAE;AACT,YAAA,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI;AAClB,YAAA,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI;AACjB,YAAA,EAAE,GAAG,IAAI;SACV,CAAC;KACH;IAKD,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;AAChC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KAClD;AAOD,IAAA,QAAQ,CAAC,KAAc,EAAA;AACrB,QAAA,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;AACpB,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,GAAG,CAAC;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YAErB,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AAG3B,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EACtC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EACzB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,gBAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAC3D;;gBAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAChD;AAID,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExE,IAAI,GAAG,GAAS,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,EAAE;YACX,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpC,GAAG,GAAG,MAAM,CAAC;AACb,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE;gBAChB,OAAO,MAAM,GAAG,MAAM,CAAC;aACxB;iBAAM;AACL,gBAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,oBAAA,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AAChD,gBAAA,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;aAC/B;SACF;KACF;IAGD,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC;AAC/B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACjD;AAGD,IAAA,GAAG,CAAC,KAA6B,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAAE,YAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnF;IAGD,GAAG,GAAA;AACD,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;KACtB;AAGD,IAAA,EAAE,CAAC,KAAyC,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;KACpC;AAOD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KACzC;AACD,IAAA,OAAO,gBAAgB,CACrB,GAA4B,EAC5B,OAAsB,EAAA;AAEtB,QAAA,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAE/D,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,uBAAuB,EAAE;AACpD,YAAA,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;SACvD;QAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACzC,MAAM,IAAI,SAAS,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,WAAW,CAA2B,yBAAA,CAAA,CAAC,CAAC;SACxF;QAED,IAAI,WAAW,EAAE;YAEf,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;SAExC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;SAC9B;AACD,QAAA,OAAO,UAAU,CAAC;KACnB;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAA,EAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;AAChF,QAAA,OAAO,CAAY,SAAA,EAAA,OAAO,CAAG,EAAA,WAAW,GAAG,CAAC;KAC7C;;AA9iCM,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAG1C,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAEzE,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEvB,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE9B,IAAA,CAAA,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtB,IAAI,CAAA,IAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAE7B,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3B,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAEjE,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC;;ACzL5D,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAC5E,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC;AAC3B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,UAAU,GAAG,EAAE,CAAC;AAGtB,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAC1C;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AAEF,MAAM,mBAAmB,GAAG,SAAS,CAAC,eAAe,CACnD;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AACF,MAAM,mBAAmB,GAAG,SAAS,CAAC,eAAe,CACnD;AACE,IAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC/F,CAAC,OAAO,EAAE,CACZ,CAAC;AAEF,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAGzC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,eAAe,GAAG,EAAE,CAAC;AAG3B,SAAS,OAAO,CAAC,KAAa,EAAA;IAC5B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC;AAGD,SAAS,UAAU,CAAC,KAAkD,EAAA;AACpE,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAE9B,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;KACvC;AAED,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAE3B,QAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAE1B,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAGD,SAAS,YAAY,CAAC,IAAU,EAAE,KAAW,EAAA;AAC3C,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC7C,IAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAC/C,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjD,IAAI,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAE5C,IAAA,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAC9C,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1C,IAAA,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAGhF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,KAAW,EAAA;AAEvC,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AAC/B,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;AAGjC,IAAA,IAAI,MAAM,GAAG,OAAO,EAAE;AACpB,QAAA,OAAO,IAAI,CAAC;KACb;AAAM,SAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;KACnC;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,OAAe,EAAA;IACjD,MAAM,IAAI,SAAS,CAAC,CAAA,CAAA,EAAI,MAAM,CAAwC,qCAAA,EAAA,OAAO,CAAE,CAAA,CAAC,CAAC;AACnF,CAAC;AAYK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;AAQD,IAAA,WAAA,CAAY,KAA0B,EAAA;AACpC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;SACjD;AAAM,aAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AAC9B,YAAA,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,EAAE;AAC3B,gBAAA,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;aAClE;AACD,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;SAChE;KACF;IAOD,OAAO,UAAU,CAAC,cAAsB,EAAA;AACtC,QAAA,OAAO,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;KACzE;IAoBD,OAAO,sBAAsB,CAAC,cAAsB,EAAA;AAClD,QAAA,OAAO,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;KACxE;AAEO,IAAA,OAAO,WAAW,CAAC,cAAsB,EAAE,OAAmC,EAAA;QAEpF,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QAGzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,YAAY,GAAG,CAAC,CAAC;AAGrB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,SAAS,GAAG,CAAC,CAAC;QAGlB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,IAAI,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEpC,IAAI,cAAc,GAAG,CAAC,CAAC;QAGvB,IAAI,KAAK,GAAG,CAAC,CAAC;AAKd,QAAA,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;YACjC,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;SAC7E;QAGD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAGxD,QAAA,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3E,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;SAC7E;QAED,IAAI,WAAW,EAAE;AAIf,YAAA,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAItC,YAAA,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzB,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/B,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAGjC,YAAA,IAAI,CAAC,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,UAAU,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;AAGvF,YAAA,IAAI,CAAC,IAAI,cAAc,KAAK,SAAS;AAAE,gBAAA,UAAU,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;YAE3F,IAAI,CAAC,KAAK,SAAS,KAAK,OAAO,IAAI,SAAS,CAAC,EAAE;AAC7C,gBAAA,UAAU,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;aACzD;SACF;AAGD,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;YAClE,OAAO,GAAG,IAAI,CAAC;YACf,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC;SAC9C;AAGD,QAAA,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACpE,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AAClE,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,GAAG,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;aAC/E;AAAM,iBAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACxC,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;aACnC;SACF;AAGD,QAAA,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACtE,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACjC,gBAAA,IAAI,QAAQ;AAAE,oBAAA,UAAU,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;gBAEtE,QAAQ,GAAG,IAAI,CAAC;AAChB,gBAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAClB,SAAS;aACV;AAED,YAAA,IAAI,aAAa,GAAG,UAAU,EAAE;gBAC9B,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,YAAY,EAAE;oBACjD,IAAI,CAAC,YAAY,EAAE;wBACjB,YAAY,GAAG,WAAW,CAAC;qBAC5B;oBAED,YAAY,GAAG,IAAI,CAAC;AAGpB,oBAAA,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7D,oBAAA,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;iBACnC;aACF;AAED,YAAA,IAAI,YAAY;AAAE,gBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;AACxC,YAAA,IAAI,QAAQ;AAAE,gBAAA,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;AAEhD,YAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;AAC9B,YAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;SACnB;QAED,IAAI,QAAQ,IAAI,CAAC,WAAW;YAC1B,MAAM,IAAI,SAAS,CAAC,EAAE,GAAG,cAAc,GAAG,gCAAgC,CAAC,CAAC;AAG9E,QAAA,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AAElE,YAAA,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAGnE,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YAG3D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAGlC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SACjC;QAGD,IAAI,cAAc,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAI7D,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,GAAG,CAAC,CAAC;YACZ,aAAa,GAAG,CAAC,CAAC;YAClB,iBAAiB,GAAG,CAAC,CAAC;SACvB;aAAM;AACL,YAAA,SAAS,GAAG,aAAa,GAAG,CAAC,CAAC;YAC9B,iBAAiB,GAAG,OAAO,CAAC;AAC5B,YAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;gBAC3B,OACE,cAAc,CACZ,YAAY,GAAG,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAC1E,KAAK,GAAG,EACT;AACA,oBAAA,iBAAiB,GAAG,iBAAiB,GAAG,CAAC,CAAC;iBAC3C;aACF;SACF;AAOD,QAAA,IAAI,QAAQ,IAAI,aAAa,IAAI,aAAa,GAAG,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;YACrE,QAAQ,GAAG,YAAY,CAAC;SACzB;aAAM;AACL,YAAA,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;SACrC;AAGD,QAAA,OAAO,QAAQ,GAAG,YAAY,EAAE;AAE9B,YAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;AAC1B,YAAA,IAAI,SAAS,IAAI,UAAU,EAAE;AAE3B,gBAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;oBAC3B,QAAQ,GAAG,YAAY,CAAC;oBACxB,MAAM;iBACP;AAED,gBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;aACxC;AACD,YAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;SACzB;AAED,QAAA,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,OAAO,QAAQ,GAAG,YAAY,IAAI,aAAa,GAAG,OAAO,EAAE;gBAEzD,IAAI,SAAS,KAAK,CAAC,IAAI,iBAAiB,GAAG,aAAa,EAAE;oBACxD,QAAQ,GAAG,YAAY,CAAC;oBACxB,iBAAiB,GAAG,CAAC,CAAC;oBACtB,MAAM;iBACP;AAED,gBAAA,IAAI,aAAa,GAAG,OAAO,EAAE;AAE3B,oBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;iBACvB;qBAAM;AAEL,oBAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;iBAC3B;AAED,gBAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oBAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACzB;qBAAM;oBAEL,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrC,oBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;wBAC9B,QAAQ,GAAG,YAAY,CAAC;wBACxB,MAAM;qBACP;AACD,oBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBACxC;aACF;AAID,YAAA,IAAI,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE;gBACrC,IAAI,WAAW,GAAG,WAAW,CAAC;gBAK9B,IAAI,QAAQ,EAAE;AACZ,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;AAChC,oBAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;iBAC/B;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;AAChC,oBAAA,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC;iBAC/B;AAED,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9E,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,gBAAA,IAAI,UAAU,IAAI,CAAC,EAAE;oBACnB,QAAQ,GAAG,CAAC,CAAC;AACb,oBAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,wBAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/C,wBAAA,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;4BAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;gCACnC,QAAQ,GAAG,CAAC,CAAC;gCACb,MAAM;6BACP;yBACF;qBACF;iBACF;gBAED,IAAI,QAAQ,EAAE;oBACZ,IAAI,IAAI,GAAG,SAAS,CAAC;AAErB,oBAAA,OAAO,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;wBACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACtB,4BAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAGjB,4BAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,gCAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oCAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;AACxB,oCAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iCAClB;qCAAM;AACL,oCAAA,OAAO,IAAI,UAAU,CAAC,UAAU,GAAG,mBAAmB,GAAG,mBAAmB,CAAC,CAAC;iCAC/E;6BACF;yBACF;6BAAM;4BACL,MAAM;yBACP;qBACF;iBACF;aACF;SACF;aAAM;YACL,OAAO,QAAQ,GAAG,YAAY,IAAI,aAAa,GAAG,OAAO,EAAE;AAEzD,gBAAA,IAAI,SAAS,KAAK,CAAC,EAAE;AACnB,oBAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;wBAC3B,QAAQ,GAAG,YAAY,CAAC;wBACxB,MAAM;qBACP;AAED,oBAAA,UAAU,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;iBAClD;AAED,gBAAA,IAAI,aAAa,GAAG,OAAO,EAAE;AAC3B,oBAAA,IACE,cAAc,CAAC,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG;wBACxE,iBAAiB,KAAK,CAAC,EACvB;AACA,wBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;qBAChD;AAED,oBAAA,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;iBACvB;qBAAM;AACL,oBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAC3B,wBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;qBAChD;AAED,oBAAA,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;iBAC3B;AAED,gBAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAC3B,oBAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;iBACzB;qBAAM;AACL,oBAAA,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;iBACxC;aACF;AAID,YAAA,IAAI,SAAS,GAAG,CAAC,GAAG,iBAAiB,EAAE;gBAIrC,IAAI,QAAQ,EAAE;AACZ,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;iBACjC;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC;iBACjC;AAED,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,GAAG,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE9E,gBAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,oBAAA,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;iBAChD;aACF;SACF;AAID,QAAA,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAGpC,QAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;AAC3B,YAAA,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACrC;AAAM,aAAA,IAAI,SAAS,GAAG,EAAE,EAAE;YACzB,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjC,YAAA,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE;AAChC,gBAAA,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,gBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpE;SACF;aAAM;YACL,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAElD,OAAO,IAAI,IAAI,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE;AACrC,gBAAA,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,gBAAA,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtE;YAED,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEjD,YAAA,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,EAAE;AAChC,gBAAA,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9D,gBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpE;SACF;AAED,QAAA,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACzF,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEtD,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE;AAC7C,YAAA,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7D;AAGD,QAAA,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;QAC1C,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AAGlE,QAAA,IACE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAC1F;YAEA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3D,YAAA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CACpB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAC3E,CAAC;YACF,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SAC/E;aAAM;YACL,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;SAChF;AAED,QAAA,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;QAG1B,IAAI,UAAU,EAAE;AACd,YAAA,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC;SAChE;QAGD,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,GAAG,CAAC,CAAC;AAIV,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;AAC5C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AACtC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAI9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;AACtC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;AAC7C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACvC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAC/C,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAG/C,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;KAC/B;IAED,QAAQ,GAAA;AAKN,QAAA,IAAI,eAAe,CAAC;QAEpB,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAE3B,QAAA,MAAM,WAAW,GAAG,IAAI,KAAK,CAAS,EAAE,CAAC,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhE,IAAI,KAAK,GAAG,CAAC,CAAC;QAGd,IAAI,OAAO,GAAG,KAAK,CAAC;AAGpB,QAAA,IAAI,eAAe,CAAC;AAEpB,QAAA,IAAI,cAAc,GAAgD,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAE1F,IAAI,CAAC,EAAE,CAAC,CAAC;QAGT,MAAM,MAAM,GAAa,EAAE,CAAC;QAG5B,KAAK,GAAG,CAAC,CAAC;AAGV,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAI1B,QAAA,MAAM,GAAG,GACP,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAI/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/F,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAG/F,KAAK,GAAG,CAAC,CAAC;AAGV,QAAA,MAAM,GAAG,GAAG;AACV,YAAA,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;SAC3B,CAAC;QAEF,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAChC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAClB;QAID,MAAM,WAAW,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,gBAAgB,CAAC;AAEpD,QAAA,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,EAAE;AAE1B,YAAA,IAAI,WAAW,KAAK,oBAAoB,EAAE;gBACxC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;aACrC;AAAM,iBAAA,IAAI,WAAW,KAAK,eAAe,EAAE;AAC1C,gBAAA,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,aAAa,CAAC;AAC/C,gBAAA,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;aAChD;SACF;aAAM;YACL,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;YACtC,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,aAAa,CAAC;SAChD;AAGD,QAAA,MAAM,QAAQ,GAAG,eAAe,GAAG,aAAa,CAAC;QAOjD,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,eAAe,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;AAC5E,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC/B,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC/B,QAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAE9B,QAAA,IACE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7B,YAAA,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC7B,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAC7B;YACA,OAAO,GAAG,IAAI,CAAC;SAChB;aAAM;YACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,gBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAC1C,gBAAA,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,gBAAA,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAI9B,gBAAA,IAAI,CAAC,YAAY;oBAAE,SAAS;gBAE5B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;oBAEvB,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,GAAG,EAAE,CAAC;oBAE3C,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;iBAC9C;aACF;SACF;QAMD,IAAI,OAAO,EAAE;YACX,kBAAkB,GAAG,CAAC,CAAC;AACvB,YAAA,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACxB;aAAM;YACL,kBAAkB,GAAG,EAAE,CAAC;AACxB,YAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AAC1B,gBAAA,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AAC5C,gBAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACnB;SACF;AAGD,QAAA,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC;AAS9D,QAAA,IAAI,mBAAmB,IAAI,EAAE,IAAI,mBAAmB,IAAI,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE;AAM1E,YAAA,IAAI,kBAAkB,GAAG,EAAE,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC;gBACpB,IAAI,QAAQ,GAAG,CAAC;AAAE,oBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAA,CAAE,CAAC,CAAC;qBAC1C,IAAI,QAAQ,GAAG,CAAC;AAAE,oBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAA,CAAE,CAAC,CAAC;AACnD,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACxB;YAED,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;AACvC,YAAA,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC;YAE5C,IAAI,kBAAkB,EAAE;AACtB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;AAED,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE;gBAC3C,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;aACxC;AAGD,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjB,YAAA,IAAI,mBAAmB,GAAG,CAAC,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAA,CAAE,CAAC,CAAC;aACxC;iBAAM;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAA,CAAE,CAAC,CAAC;aACvC;SACF;aAAM;AAEL,YAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE;oBAC3C,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;iBACxC;aACF;iBAAM;AACL,gBAAA,IAAI,cAAc,GAAG,kBAAkB,GAAG,QAAQ,CAAC;AAGnD,gBAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;wBACvC,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;qBACxC;iBACF;qBAAM;AACL,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClB;AAED,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEjB,gBAAA,OAAO,cAAc,EAAE,GAAG,CAAC,EAAE;AAC3B,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAClB;gBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC7E,MAAM,CAAC,IAAI,CAAC,CAAG,EAAA,WAAW,CAAC,KAAK,EAAE,CAAC,CAAE,CAAA,CAAC,CAAC;iBACxC;aACF;SACF;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACxB;IAED,MAAM,GAAA;QACJ,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5C;IAGD,cAAc,GAAA;QACZ,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5C;IAGD,OAAO,gBAAgB,CAAC,GAAuB,EAAA;QAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;KAClD;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,CAAG,CAAC;KACxC;AACF;;ACv0BK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;AAQD,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAK,KAAiB,YAAY,MAAM,EAAE;AACxC,YAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACzB;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;KACrB;IAeD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,SAAS,CAAC,UAAU,KAAK,CAAA,iCAAA,CAAmC,CAAC,CAAC;SACzE;AACD,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE;AAC1B,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,qBAAA,CAAuB,CAAC,CAAC;SAC9D;AACD,QAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,wBAAA,CAA0B,CAAC,CAAC;SACjD;AACD,QAAA,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,2CAAA,CAA6C,CAAC,CAAC;SACpF;AACD,QAAA,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;KACjC;IAOD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED,IAAA,QAAQ,CAAC,KAAc,EAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACnC;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;AAED,QAAA,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAGxC,YAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;SAClC;QAED,OAAO;AACL,YAAA,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;SAC5F,CAAC;KACH;AAGD,IAAA,OAAO,gBAAgB,CAAC,GAAmB,EAAE,OAAsB,EAAA;QACjE,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAClD,QAAA,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,WAAW,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;KAC3E;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,WAAA,EAAc,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KACtD;AACF;;ACjGK,MAAO,KAAM,SAAQ,SAAS,CAAA;AAClC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,OAAO,CAAC;KAChB;AAQD,IAAA,WAAA,CAAY,KAAsB,EAAA;AAChC,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAK,KAAiB,YAAY,MAAM,EAAE;AACxC,YAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;SACzB;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;KACzB;IAeD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,YAAY,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;AAE9D,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnC,QAAA,IAAI,cAAc,GAAG,YAAY,EAAE;AACjC,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,4CAAA,CAA8C,CAAC,CAAC;SACrF;AAAM,aAAA,IAAI,cAAc,GAAG,YAAY,EAAE;AACxC,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACtF;aAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;AAC9C,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,uBAAA,CAAyB,CAAC,CAAC;SAChE;AAAM,aAAA,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,YAAY,EAAE;AAEnD,YAAA,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,CAAA,6BAAA,CAA+B,CAAC,CAAC;SACtE;AACD,QAAA,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;KAChC;IAOD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAED,IAAA,QAAQ,CAAC,KAAc,EAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACnC;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACtE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC9C;AAGD,IAAA,OAAO,gBAAgB,CAAC,GAAkB,EAAE,OAAsB,EAAA;QAChE,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KAC9F;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,UAAA,EAAa,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KACrD;AACF;;ACxFK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACvB;AAGD,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO,IAAI,MAAM,EAAE,CAAC;KACrB;IAED,OAAO,GAAA;AACL,QAAA,OAAO,cAAc,CAAC;KACvB;AACF;;AClBK,MAAO,MAAO,SAAQ,SAAS,CAAA;AACnC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,QAAQ,CAAC;KACjB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACvB;AAGD,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO,IAAI,MAAM,EAAE,CAAC;KACrB;IAED,OAAO,GAAA;AACL,QAAA,OAAO,cAAc,CAAC;KACvB;AACF;;AC9BD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAClC,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAGd,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AA8BlC,MAAM,WAAW,GAAgB;IACtC,qBAAqB,CAAC,MAAkB,EAAE,MAAc,EAAA;QACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE;AAC5B,YAAA,MAAM,IAAI,UAAU,CAAC,sCAAsC,MAAM,CAAA,CAAE,CAAC,CAAC;SACtE;AACD,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;aACb,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;aACxB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAC1B;KACH;IAGD,UAAU,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC3C,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;aACb,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;aACxB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAC1B;KACH;IAGD,WAAW,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC5C,QAAA,QACE,MAAM,CAAC,MAAM,CAAC;AACd,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;AACxB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK;YAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,EAC7B;KACH;IAGD,WAAW,CAAC,MAAkB,EAAE,MAAc,EAAA;AAC5C,QAAA,QACE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAClB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;AACxB,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK;AAC1B,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,EACzB;KACH;IAGD,aAAa,CAAC,MAAkB,EAAE,MAAc,EAAA;QAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAMvD,QAAA,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;KAChD;AAGD,IAAA,YAAY,EAAE,WAAW;AACvB,UAAE,CAAC,MAAkB,EAAE,MAAc,KAAI;YACrC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;AACH,UAAE,CAAC,MAAkB,EAAE,MAAc,KAAI;YACrC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;SACjB;AAGL,IAAA,UAAU,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAC/D,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAC5B,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,UAAU,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAC/D,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QAC5B,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC;AACb,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAChC,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,aAAa,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,EAAA;AAElE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAW,CAAC,CAAC;QAGvC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;AACpC,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACzB,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAQ7B,QAAA,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC;AACpD,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,KAAK,CAAC,CAAC;AACT,QAAA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAE7B,QAAA,OAAO,CAAC,CAAC;KACV;AAGD,IAAA,YAAY,EAAE,WAAW;UACrB,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,KAAI;AACzD,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,YAAA,OAAO,CAAC,CAAC;SACV;UACD,CAAC,WAAuB,EAAE,MAAc,EAAE,KAAa,KAAI;AACzD,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,WAAW,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACrC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzC,YAAA,OAAO,CAAC,CAAC;SACV;CACN;;AChMD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAG1D,IAAI,cAAc,GAAsB,IAAI,CAAC;AAmBvC,MAAO,QAAS,SAAQ,SAAS,CAAA;AACrC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,UAAU,CAAC;KACnB;AAwDD,IAAA,WAAA,CAAY,OAAgE,EAAA;AAC1E,QAAA,KAAK,EAAE,CAAC;AAER,QAAA,IAAI,SAAS,CAAC;QACd,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE;AAC7D,YAAA,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;AACrE,gBAAA,MAAM,IAAI,SAAS,CAAC,qEAAqE,CAAC,CAAC;aAC5F;YACD,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE;gBACzE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;aACtD;iBAAM;AACL,gBAAA,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;aACxB;SACF;aAAM;YACL,SAAS,GAAG,OAAO,CAAC;SACrB;QAGD,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAGtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,SAAS,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;SACxF;AAAM,aAAA,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE,EAAE;YAEvE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;SACtD;AAAM,aAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACxC,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBAChE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;aAC5C;iBAAM;AACL,gBAAA,MAAM,IAAI,SAAS,CACjB,4EAA4E,CAC7E,CAAC;aACH;SACF;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;SAC7E;AAED,QAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACtC;KACF;AAMD,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;KACpB;IAED,IAAI,EAAE,CAAC,KAAiB,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,QAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpC;KACF;IAGD,WAAW,GAAA;QACT,IAAI,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE;YACxC,OAAO,IAAI,CAAC,IAAI,CAAC;SAClB;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACzC,YAAA,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;SACvB;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;AAMO,IAAA,OAAO,MAAM,GAAA;AACnB,QAAA,QAAQ,QAAQ,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,EAAE;KAC3D;IAOD,OAAO,QAAQ,CAAC,IAAa,EAAA;AAC3B,QAAA,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE;AAC5B,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;SACtC;AAED,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAG5C,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAGxC,QAAA,IAAI,cAAc,KAAK,IAAI,EAAE;AAC3B,YAAA,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SAC3C;QAGD,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AAG9B,QAAA,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC;AAE/B,QAAA,OAAO,MAAM,CAAC;KACf;AAMD,IAAA,QAAQ,CAAC,QAA2B,EAAA;QAElC,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;IAGD,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3B;IAGO,OAAO,EAAE,CAAC,QAAiB,EAAA;QACjC,QACE,QAAQ,IAAI,IAAI;YAChB,OAAO,QAAQ,KAAK,QAAQ;AAC5B,YAAA,WAAW,IAAI,QAAQ;AACvB,YAAA,QAAQ,CAAC,SAAS,KAAK,UAAU,EACjC;KACH;AAOD,IAAA,MAAM,CAAC,OAA4D,EAAA;QACjE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;AAC7C,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;AACxB,YAAA,QACE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EACvF;SACH;AAED,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;SACrD;AAED,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE;AAC5E,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AAC5C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC;SAC1F;AAED,QAAA,OAAO,KAAK,CAAC;KACd;IAGD,YAAY,GAAA;AACV,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACrD,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3C,QAAA,OAAO,SAAS,CAAC;KAClB;AAGD,IAAA,OAAO,QAAQ,GAAA;QACb,OAAO,IAAI,QAAQ,EAAE,CAAC;KACvB;IAGD,aAAa,CAAC,UAAsB,EAAE,KAAa,EAAA;QACjD,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACvC,QAAA,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzC,QAAA,OAAO,EAAE,CAAC;KACX;IAOD,OAAO,cAAc,CAAC,IAAY,EAAA;QAChC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAAE,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE5C,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAExC,QAAA,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC7B;IAOD,OAAO,mBAAmB,CAAC,SAAiB,EAAA;AAC1C,QAAA,IAAI,SAAS,EAAE,MAAM,KAAK,EAAE,EAAE;AAC5B,YAAA,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;SACzD;QAED,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;KACnD;IAGD,OAAO,gBAAgB,CAAC,MAAc,EAAA;AACpC,QAAA,IAAI,MAAM,EAAE,MAAM,KAAK,EAAE,EAAE;AACzB,YAAA,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;SAC5D;QAED,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;KACnD;IAMD,OAAO,OAAO,CAAC,EAA0D,EAAA;QACvE,IAAI,EAAE,IAAI,IAAI;AAAE,YAAA,OAAO,KAAK,CAAC;AAE7B,QAAA,IAAI;AACF,YAAA,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjB,YAAA,OAAO,IAAI,CAAC;SACb;AAAC,QAAA,MAAM;AACN,YAAA,OAAO,KAAK,CAAC;SACd;KACF;IAGD,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;KACvC;IAGD,OAAO,gBAAgB,CAAC,GAAqB,EAAA;AAC3C,QAAA,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC/B;AAOD,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,aAAA,EAAgB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KAChE;;AApUc,QAAA,CAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;;SC5B7C,2BAA2B,CACzC,MAAgB,EAChB,kBAA4B,EAC5B,eAAyB,EAAA;AAEzB,IAAA,IAAI,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;AAExB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,WAAW,IAAI,gBAAgB,CAC7B,CAAC,CAAC,QAAQ,EAAE,EACZ,MAAM,CAAC,CAAC,CAAC,EACT,kBAAkB,EAClB,IAAI,EACJ,eAAe,CAChB,CAAC;SACH;KACF;SAAM;AAGL,QAAA,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE;AACxC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;SAC1B;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,WAAW,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;SAC/F;KACF;AAED,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAGD,SAAS,gBAAgB,CACvB,IAAY,EAEZ,KAAU,EACV,kBAAkB,GAAG,KAAK,EAC1B,OAAO,GAAG,KAAK,EACf,eAAe,GAAG,KAAK,EAAA;AAGvB,IAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,QAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;KACxB;IAED,QAAQ,OAAO,KAAK;AAClB,QAAA,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1F,QAAA,KAAK,QAAQ;AACX,YAAA,IACE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;gBAC3B,KAAK,IAAIC,UAAoB;AAC7B,gBAAA,KAAK,IAAIC,UAAoB,EAC7B;AACA,gBAAA,IAAI,KAAK,IAAIC,cAAwB,IAAI,KAAK,IAAIC,cAAwB,EAAE;oBAE1E,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;iBAC1E;qBAAM;oBACL,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;iBAC1E;aACF;iBAAM;gBAEL,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AACH,QAAA,KAAK,WAAW;YACd,IAAI,OAAO,IAAI,CAAC,eAAe;gBAC7B,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrE,YAAA,OAAO,CAAC,CAAC;AACX,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3E,QAAA,KAAK,QAAQ;YACX,IACE,KAAK,IAAI,IAAI;AACb,gBAAA,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;AACnC,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKC,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACxF,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACpE;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aAC3E;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AAAM,iBAAA,IACL,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;AACzB,gBAAA,KAAK,YAAY,WAAW;AAC5B,gBAAA,gBAAgB,CAAC,KAAK,CAAC,EACvB;AACA,gBAAA,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,EACxF;aACH;AAAM,iBAAA,IACL,KAAK,CAAC,SAAS,KAAK,MAAM;gBAC1B,KAAK,CAAC,SAAS,KAAK,QAAQ;AAC5B,gBAAA,KAAK,CAAC,SAAS,KAAK,WAAW,EAC/B;gBACA,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1E;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;aAC3E;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;AAErC,gBAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9D,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBACtD,CAAC;wBACD,CAAC;wBACD,CAAC;wBACD,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAC/C,CAAC;wBACD,2BAA2B,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAC7E;iBACH;qBAAM;oBACL,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBACtD,CAAC;wBACD,CAAC;wBACD,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC/C,wBAAA,CAAC,EACD;iBACH;aACF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,MAAM,MAAM,GAAW,KAAK,CAAC;gBAE7B,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACjD,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,yBAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACjC;iBACH;qBAAM;AACL,oBAAA,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACvF;iBACH;aACF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;oBACrC,CAAC;oBACD,CAAC;AACD,oBAAA,CAAC,EACD;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAEtC,gBAAA,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC;oBACE,IAAI,EAAE,KAAK,CAAC,UAAU;oBACtB,GAAG,EAAE,KAAK,CAAC,GAAG;AACf,iBAAA,EACD,KAAK,CAAC,MAAM,CACb,CAAC;AAGF,gBAAA,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;AACpB,oBAAA,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;iBAClC;gBAED,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;oBACD,2BAA2B,CAAC,cAAc,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAChF;aACH;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;oBACtC,CAAC;qBACA,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;qBACrB,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;qBACzB,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;AACzB,oBAAA,CAAC,EACD;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;oBACvC,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;AACvC,oBAAA,CAAC,EACD;aACH;iBAAM;gBACL,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtD,oBAAA,2BAA2B,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,CAAC;AACvE,oBAAA,CAAC,EACD;aACH;AACH,QAAA,KAAK,UAAU;YACb,IAAI,kBAAkB,EAAE;gBACtB,QACE,CAAC,IAAI,IAAI,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBACtD,CAAC;oBACD,CAAC;AACD,oBAAA,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1C,oBAAA,CAAC,EACD;aACH;KACJ;AAED,IAAA,OAAO,CAAC,CAAC;AACX;;AC7MA,SAAS,WAAW,CAAC,GAAW,EAAA;AAC9B,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAqBK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;IAQD,WAAY,CAAA,OAAe,EAAE,OAAgB,EAAA;AAC3C,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AAE1C,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,sDAAA,EAAyD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CACxF,CAAC;SACH;AACD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,qDAAA,EAAwD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA,CAAE,CACvF,CAAC;SACH;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IACE,EACE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBACvB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CACxB,EACD;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,+BAAA,EAAkC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAoB,kBAAA,CAAA,CAAC,CAAC;aAC5F;SACF;KACF;IAED,OAAO,YAAY,CAAC,OAAgB,EAAA;QAClC,OAAO,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;KACzD;AAGD,IAAA,cAAc,CAAC,OAAsB,EAAA;AACnC,QAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AACxB,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;SACzD;AACD,QAAA,OAAO,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;KACjF;IAGD,OAAO,gBAAgB,CAAC,GAAkD,EAAA;AACxE,QAAA,IAAI,QAAQ,IAAI,GAAG,EAAE;AACnB,YAAA,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE;gBAElC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,YAAY,EAAE;AACzC,oBAAA,OAAO,GAA4B,CAAC;iBACrC;aACF;iBAAM;AACL,gBAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC1E;SACF;AACD,QAAA,IAAI,oBAAoB,IAAI,GAAG,EAAE;YAC/B,OAAO,IAAI,UAAU,CACnB,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CACxD,CAAC;SACH;AACD,QAAA,MAAM,IAAI,SAAS,CAAC,CAAA,yCAAA,EAA4C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAE,CAAA,CAAC,CAAC;KACxF;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;AAC5D,QAAA,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO,KAAK,cAAc,CAAC;AAC3B,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvD,QAAA,OAAO,CAAkB,eAAA,EAAA,OAAO,CAAK,EAAA,EAAA,KAAK,GAAG,CAAC;KAC/C;AACF;;ACpGK,MAAO,UAAW,SAAQ,SAAS,CAAA;AACvC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,YAAY,CAAC;KACrB;AAMD,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;KACpB;IAGD,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAGD,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;KAChC;IAGD,OAAO,gBAAgB,CAAC,GAAuB,EAAA;AAC7C,QAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACpC;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;QAC3B,OAAO,CAAA,eAAA,EAAkB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA,CAAA,CAAG,CAAC;KAC1D;AACF;;ACtCM,MAAM,yBAAyB,GACpC,IAAuC,CAAC;AAcpC,MAAO,SAAU,SAAQ,yBAAyB,CAAA;AACtD,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,WAAW,CAAC;KACpB;AAgBD,IAAA,WAAA,CAAY,GAA8D,EAAA;AACxE,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SACnB;AAAM,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAClC,YAAA,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SAClB;AAAM,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YAC3B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAChC;AAAM,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;YAC9D,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;AAC3F,gBAAA,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;aACvF;YACD,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE;AAC3F,gBAAA,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;aACvF;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAC5B,gBAAA,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;aACtF;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;AAC5B,gBAAA,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;aACtF;AACD,YAAA,IAAI,CAAC,GAAG,UAAW,EAAE;AACnB,gBAAA,MAAM,IAAI,SAAS,CACjB,kFAAkF,CACnF,CAAC;aACH;AACD,YAAA,IAAI,CAAC,GAAG,UAAW,EAAE;AACnB,gBAAA,MAAM,IAAI,SAAS,CACjB,kFAAkF,CACnF,CAAC;aACH;AAED,YAAA,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SACnB;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CACjB,qFAAqF,CACtF,CAAC;SACH;KACF;IAED,MAAM,GAAA;QACJ,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC5B,CAAC;KACH;IAGD,OAAO,OAAO,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACjD;IAGD,OAAO,UAAU,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACpD;AAQD,IAAA,OAAO,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAA;AAC/C,QAAA,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;KACnD;AAQD,IAAA,OAAO,UAAU,CAAC,GAAW,EAAE,QAAgB,EAAA;AAC7C,QAAA,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;KAC5D;IAGD,cAAc,GAAA;QACZ,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;KAClE;IAGD,OAAO,gBAAgB,CAAC,GAAsB,EAAA;QAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;cACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,EAAE;AACvC,cAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;cACnC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,EAAE;AACvC,cAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAChC;AAED,IAAA,OAAO,CAAC,KAAc,EAAE,OAAiB,EAAE,OAAmB,EAAA;QAC5D,OAAO,KAAK,cAAc,CAAC;AAC3B,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAsB,mBAAA,EAAA,CAAC,CAAQ,KAAA,EAAA,CAAC,KAAK,CAAC;KAC9C;;AAjHe,SAAA,CAAA,SAAS,GAAG,IAAI,CAAC,kBAAkB;;AC8CrD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAACH,UAAoB,CAAC,CAAC;AAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAACD,UAAoB,CAAC,CAAC;SAE9C,mBAAmB,CACjC,MAAkB,EAClB,OAA2B,EAC3B,OAAiB,EAAA;AAEjB,IAAA,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC;AACzC,IAAA,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnD,IAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACZ,QAAA,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAA,CAAE,CAAC,CAAC;KAC3D;IAED,IAAI,OAAO,CAAC,gCAAgC,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE;QACpE,MAAM,IAAI,SAAS,CAAC,CAAiB,cAAA,EAAA,MAAM,CAAC,MAAM,CAAyB,sBAAA,EAAA,IAAI,CAAE,CAAA,CAAC,CAAC;KACpF;IAED,IAAI,CAAC,OAAO,CAAC,gCAAgC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,SAAS,CAAC,CAAiB,cAAA,EAAA,MAAM,CAAC,MAAM,CAAuB,oBAAA,EAAA,IAAI,CAAE,CAAA,CAAC,CAAC;KAClF;IAED,IAAI,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,IAAI,SAAS,CACjB,CAAA,WAAA,EAAc,IAAI,CAAA,iBAAA,EAAoB,KAAK,CAAA,0BAAA,EAA6B,MAAM,CAAC,UAAU,CAAA,CAAA,CAAG,CAC7F,CAAC;KACH;IAGD,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE;AAClC,QAAA,MAAM,IAAI,SAAS,CACjB,6EAA6E,CAC9E,CAAC;KACH;IAGD,OAAO,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,SAAS,iBAAiB,CACxB,MAAkB,EAClB,KAAa,EACb,OAA2B,EAC3B,OAAO,GAAG,KAAK,EAAA;AAEf,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAGnF,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAG5D,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;AAG9F,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;AACvD,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;AAClD,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;AACpD,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;AAEjD,IAAA,IAAI,WAAW,IAAI,CAAC,aAAa,EAAE;AACjC,QAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;KACrF;AAED,IAAA,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;KACrF;IAGD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAGpF,IAAI,mBAAmB,GAAG,IAAI,CAAC;AAE/B,IAAA,IAAI,iBAA0B,CAAC;AAE/B,IAAA,IAAI,WAAW,CAAC;AAGhB,IAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC;AAC1C,IAAA,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE;QAC1C,iBAAiB,GAAG,iBAAiB,CAAC;KACvC;SAAM;QACL,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,EAAA;AAC3E,YAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;AACrC,YAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;SACjE;QACD,IAAI,OAAO,oBAAoB,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;AAChD,YAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;SACrF;AACD,QAAA,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAE5C,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,iBAAiB,CAAC,EAAE;AACnE,YAAA,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;SAC7F;KACF;IAGD,IAAI,CAAC,mBAAmB,EAAE;AACxB,QAAA,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAExB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAChD,YAAA,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SACtB;KACF;IAGD,MAAM,UAAU,GAAG,KAAK,CAAC;AAGzB,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAGlF,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,CAAC;IAGX,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAGlF,MAAM,MAAM,GAAa,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC;IAE3C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC;IAEnB,IAAI,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;IAG7C,OAAO,CAAC,IAAI,EAAE;AAEZ,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAGpC,IAAI,WAAW,KAAK,CAAC;YAAE,MAAM;QAG7B,IAAI,CAAC,GAAG,KAAK,CAAC;AAEd,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,YAAA,CAAC,EAAE,CAAC;SACL;AAGD,QAAA,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAGtF,MAAM,IAAI,GAAG,OAAO,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAGhF,IAAI,iBAAiB,GAAG,IAAI,CAAC;QAC7B,IAAI,mBAAmB,IAAI,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;YACjD,iBAAiB,GAAG,iBAAiB,CAAC;SACvC;aAAM;YACL,iBAAiB,GAAG,CAAC,iBAAiB,CAAC;SACxC;QAED,IAAI,eAAe,KAAK,KAAK,IAAK,IAAe,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5D,YAAA,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;SACzD;AACD,QAAA,IAAI,KAAK,CAAC;AAEV,QAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAEd,QAAA,IAAI,WAAW,KAAKK,gBAA0B,EAAE;YAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AACnF,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,aAAuB,EAAE;YAClD,MAAM,GAAG,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACxD,YAAA,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1B,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;SACpB;aAAM,IAAI,WAAW,KAAKC,aAAuB,IAAI,aAAa,KAAK,KAAK,EAAE;AAC7E,YAAA,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKA,aAAuB,EAAE;YAClD,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChD,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,aAAa,KAAK,KAAK;AAAE,gBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3D,KAAK,IAAI,CAAC,CAAC;AAEX,YAAA,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC1D;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAC5C,gBAAA,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACpD,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;SAC/B;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEzD,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;AACvD,gBAAA,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;YAG9D,IAAI,GAAG,EAAE;gBACP,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;aACjD;iBAAM;gBACL,IAAI,aAAa,GAAG,OAAO,CAAC;gBAC5B,IAAI,CAAC,mBAAmB,EAAE;AACxB,oBAAA,aAAa,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;iBACzE;gBACD,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;aACjE;AAED,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,eAAyB,EAAE;YACpD,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,YAAY,GAAuB,OAAO,CAAC;AAG/C,YAAA,MAAM,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAGrC,YAAA,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;gBACpC,YAAY,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;aAC1C;YAED,IAAI,CAAC,mBAAmB,EAAE;AACxB,gBAAA,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,CAAC;aAC7E;YACD,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9D,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAE3B,YAAA,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;YAClF,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;SACtE;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YACxD,KAAK,GAAG,SAAS,CAAC;SACnB;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,KAAK,GAAG,IAAI,CAAC;SACd;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,IAAI,WAAW,EAAE;gBACf,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,CAAC;aACZ;iBAAM;gBAEL,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACtD,gBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC3D,KAAK,IAAI,CAAC,CAAC;gBAEX,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEzC,gBAAA,IAAI,YAAY,IAAI,aAAa,KAAK,IAAI,EAAE;oBAC1C,KAAK;wBACH,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAC/E,8BAAE,IAAI,CAAC,QAAQ,EAAE;8BACf,IAAI,CAAC;iBACZ;qBAAM;oBACL,KAAK,GAAG,IAAI,CAAC;iBACd;aACF;SACF;AAAM,aAAA,IAAI,WAAW,KAAKC,oBAA8B,EAAE;YAEzD,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAE1D,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAEnB,YAAA,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;SAC/B;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAGhC,IAAI,UAAU,GAAG,CAAC;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;AAGnF,YAAA,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU;AAChC,gBAAA,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;AAGpE,YAAA,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE;AAE3B,gBAAA,IAAI,OAAO,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACzC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC;oBACX,IAAI,UAAU,GAAG,CAAC;AAChB,wBAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;AAClF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;AACrF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;iBACvF;AAED,gBAAA,IAAI,cAAc,IAAI,aAAa,EAAE;AACnC,oBAAA,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;iBAC9E;qBAAM;AACL,oBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,oBAAA,IAAI,OAAO,KAAKC,4BAAsC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7E,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;qBACxB;iBACF;aACF;iBAAM;AAEL,gBAAA,IAAI,OAAO,KAAK,MAAM,CAAC,kBAAkB,EAAE;oBACzC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC;oBACX,IAAI,UAAU,GAAG,CAAC;AAChB,wBAAA,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;AAClF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;AACrF,oBAAA,IAAI,UAAU,GAAG,eAAe,GAAG,CAAC;AAClC,wBAAA,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;iBACvF;AAED,gBAAA,IAAI,cAAc,IAAI,aAAa,EAAE;AACnC,oBAAA,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBAE7C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;wBAC/B,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;qBAC9B;iBACF;qBAAM;AACL,oBAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,oBAAA,IAAI,OAAO,KAAKA,4BAAsC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7E,wBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;qBACxB;iBACF;aACF;AAGD,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;aAAM,IAAI,WAAW,KAAKC,gBAA0B,IAAI,UAAU,KAAK,KAAK,EAAE;YAE7E,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAEzD,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAChE,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAGrD,YAAA,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzC,gBAAA,QAAQ,aAAa,CAAC,CAAC,CAAC;AACtB,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;AACR,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;AACR,oBAAA,KAAK,GAAG;AACN,wBAAA,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,MAAM;iBACT;aACF;AAED,YAAA,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;SACnD;aAAM,IAAI,WAAW,KAAKA,gBAA0B,IAAI,UAAU,KAAK,IAAI,EAAE;YAE5E,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,CAAC,GAAG,KAAK,CAAC;AAEV,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;AAC9C,gBAAA,CAAC,EAAE,CAAC;aACL;AAED,YAAA,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;AAAE,gBAAA,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;AAElF,YAAA,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAChE,YAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAGd,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;SAC/C;AAAM,aAAA,IAAI,WAAW,KAAKC,gBAA0B,EAAE;YACrD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC1F,YAAA,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;AACxD,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YACxD,KAAK,GAAG,IAAI,SAAS,CAAC;gBACpB,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;gBACzC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;AAC9C,aAAA,CAAC,CAAC;YACH,KAAK,IAAI,CAAC,CAAC;SACZ;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;SACtB;AAAM,aAAA,IAAI,WAAW,KAAKC,iBAA2B,EAAE;AACtD,YAAA,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;SACtB;AAAM,aAAA,IAAI,WAAW,KAAKC,cAAwB,EAAE;YACnD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YACX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AACD,YAAA,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,MAAM,EACN,KAAK,EACL,KAAK,GAAG,UAAU,GAAG,CAAC,EACtB,iBAAiB,CAClB,CAAC;AAEF,YAAA,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC;AAGjC,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;SAC5B;AAAM,aAAA,IAAI,WAAW,KAAKC,sBAAgC,EAAE;YAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC;YAGX,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAC7B,gBAAA,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;aAChF;YAGD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YAEX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,EACpC;AACA,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;aAClD;AAGD,YAAA,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,MAAM,EACN,KAAK,EACL,KAAK,GAAG,UAAU,GAAG,CAAC,EACtB,iBAAiB,CAClB,CAAC;AAEF,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAE3B,MAAM,MAAM,GAAG,KAAK,CAAC;YAErB,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzD,YAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAEtE,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAG3B,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE;AAC/C,gBAAA,MAAM,IAAI,SAAS,CAAC,wDAAwD,CAAC,CAAC;aAC/E;YAGD,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE;AAC/C,gBAAA,MAAM,IAAI,SAAS,CAAC,2DAA2D,CAAC,CAAC;aAClF;YAED,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;SAC/C;AAAM,aAAA,IAAI,WAAW,KAAKC,mBAA6B,EAAE;YAExD,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,IAAI,CAAC,CAAC;YAEX,IACE,UAAU,IAAI,CAAC;AACf,gBAAA,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;gBAClC,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC;AAEpC,gBAAA,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;AAEnD,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAE7F,YAAA,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;YAG3B,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9D,YAAA,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AAGpC,YAAA,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;YAGnB,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;SACnC;aAAM;AACL,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,2BAAA,EAA8B,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA,CAAG,CACjF,CAAC;SACH;AACD,QAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,YAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE;gBAClC,KAAK;AACL,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC,CAAC;SACJ;aAAM;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;SACtB;KACF;AAGD,IAAA,IAAI,IAAI,KAAK,KAAK,GAAG,UAAU,EAAE;AAC/B,QAAA,IAAI,OAAO;AAAE,YAAA,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;AACvD,QAAA,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;KAC5C;AAGD,IAAA,IAAI,CAAC,eAAe;AAAE,QAAA,OAAO,MAAM,CAAC;AAEpC,IAAA,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAuB,CAAC;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC;AAChB,QAAA,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KAC7D;AAED,IAAA,OAAO,MAAM,CAAC;AAChB;;AClmBA,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;AAQnE,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGrB,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,GAAG,CAAC,CAAC;AACzC,IAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAEhE,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAEhD,IAAA,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;AAEzB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IACpF,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,IAAI,GACR,CAAC,cAAc;AACf,QAAA,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAC3B,KAAK,IAAIF,cAAwB;QACjC,KAAK,IAAID,cAAwB;UAC7BK,aAAuB;AACzB,UAAEC,gBAA0B,CAAC;AAEjC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAC1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,IAAI,IAAI,KAAKD,aAAuB,EAAE;QACpC,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KACvD;SAAM;QACL,KAAK,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;KACzD;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IACpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGQ,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAE1E,KAAK,IAAI,oBAAoB,CAAC;AAC9B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,CAAU,EAAE,KAAa,EAAA;IAE/E,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAG3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAc,EAAE,KAAa,EAAA;IAEtF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGJ,iBAA2B,CAAC;AAE9C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAW,EAAE,KAAa,EAAA;IAEhF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAGpB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,IAAA,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;AACzC,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAE3C,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGU,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QACtD,MAAM,IAAI,SAAS,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,8BAA8B,CAAC,CAAC;KAC/E;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEvB,IAAI,KAAK,CAAC,UAAU;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,SAAS;AAAE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAG5C,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AACvB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAE5F,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGA,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAGpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QAGvC,MAAM,IAAI,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,8BAA8B,CAAC,CAAC;KAClF;AAGD,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAEvB,IAAA,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9D,IAAA,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAEvE,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AACvB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAsB,EAAE,KAAa,EAAA;AAE7F,IAAA,IAAI,KAAK,KAAK,IAAI,EAAE;QAClB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGL,cAAwB,CAAC;KAC5C;AAAM,SAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;QACvC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGQ,iBAA2B,CAAC;KAC/C;SAAM;QACL,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,iBAA2B,CAAC;KAC/C;AAGD,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAe,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGjB,aAAuB,CAAC;AAE1C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAG5C,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGW,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAE1B,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGU,2BAAqC,CAAC;AAExD,IAAA,IAAI,IAAI,IAAI,EAAE,EAAE;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;KAC7D;SAAM;AACL,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KAC1B;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AACrB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,MAAkB,EAClB,GAAW,EACX,KAAe,EACf,KAAa,EACb,SAAkB,EAClB,KAAa,EACb,kBAA2B,EAC3B,eAAwB,EACxB,IAAmB,EAAA;AAEnB,IAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnB,QAAA,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;KAClE;AAED,IAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAGhB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAGf,eAAyB,GAAGD,gBAA0B,CAAC;AAEhG,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,KAAK,EACL,SAAS,EACT,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AAEF,IAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnB,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAC5F,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGK,oBAA8B,CAAC;AAEjD,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;AAAE,QAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,KAAK,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAW,EAAE,KAAa,EAAA;IAEhF,MAAM,CAAC,KAAK,EAAE,CAAC;AACb,QAAA,KAAK,CAAC,SAAS,KAAK,MAAM,GAAGD,cAAwB,GAAGM,mBAA6B,CAAC;AAExF,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;AACnC,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAErC,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAExD,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAqB,EAAE,KAAa,EAAA;AAC3F,IAAA,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAExB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGd,aAAuB,CAAC;AAE1C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,gBAA0B,CAAC;AAG7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAGpB,IAAA,KAAK,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAE9D,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAe,EAAE,KAAa,EAAA;IACxF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGgB,cAAwB,CAAC;AAE3C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;AAGxC,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE7E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CACpB,MAAkB,EAClB,GAAW,EACX,KAAW,EACX,KAAa,EACb,SAAS,GAAG,KAAK,EACjB,KAAK,GAAG,CAAC,EACT,kBAAkB,GAAG,KAAK,EAC1B,eAAe,GAAG,IAAI,EACtB,IAAmB,EAAA;IAEnB,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;QAElD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGC,sBAAgC,CAAC;AAEnD,QAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,QAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAGpB,IAAI,UAAU,GAAG,KAAK,CAAC;AAIvB,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;AAElC,QAAA,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAElB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEjF,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAErC,QAAA,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;QAG7B,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,SAAS,EACT,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AACF,QAAA,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AAGrB,QAAA,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;QAGxC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEpE,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;KACrB;SAAM;QACL,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGD,cAAwB,CAAC;AAE3C,QAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,QAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QAEpB,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAE7C,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAE7E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,QAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;KACrB;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAA;IAEpF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGP,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAE1B,IAAA,IAAI,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;AAE1B,IAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB;AAAE,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IAElE,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IAGjC,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;KACtD;AAED,IAAA,IAAI,IAAI,IAAI,EAAE,EAAE;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5D;SAAM;AACL,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACzB;AAED,IAAA,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;AAC/B,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,GAAW,EAAE,KAAiB,EAAE,KAAa,EAAA;IAExF,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGG,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAEpB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1E,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5C,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAE7B,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,MAAkB,EAClB,GAAW,EACX,KAAY,EACZ,KAAa,EACb,KAAa,EACb,kBAA2B,EAC3B,IAAmB,EAAA;IAGnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAGT,gBAA0B,CAAC;AAE7C,IAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAG1E,IAAA,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC;AACrC,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAEpB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAA,IAAI,MAAM,GAAc;AACtB,QAAA,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;QACzC,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;AAEF,IAAA,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;AACpB,QAAA,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;KACvB;IAED,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAC5B,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GAAG,CAAC,EACT,kBAAkB,EAClB,IAAI,EACJ,IAAI,CACL,CAAC;AAGF,IAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;IAEnC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAE1D,IAAA,OAAO,QAAQ,CAAC;AAClB,CAAC;SAEe,aAAa,CAC3B,MAAkB,EAClB,MAAgB,EAChB,SAAkB,EAClB,aAAqB,EACrB,KAAa,EACb,kBAA2B,EAC3B,eAAwB,EACxB,IAA0B,EAAA;AAE1B,IAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAEhB,QAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAGlB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAEjB,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjB,YAAA,OAAO,CAAC,CAAC;SACV;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;SAC9E;AACD,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,YAAA,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;SAChF;aAAM,IAAI,WAAW,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE;AACxE,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,6CAAA,CAA+C,CAAC,CAAC;SACtE;aAAM,IACL,MAAM,CAAC,MAAM,CAAC;YACd,QAAQ,CAAC,MAAM,CAAC;YAChB,YAAY,CAAC,MAAM,CAAC;AACpB,YAAA,gBAAgB,CAAC,MAAM,CAAC,EACxB;AACA,YAAA,MAAM,IAAI,SAAS,CAAC,CAAA,kEAAA,CAAoE,CAAC,CAAC;SAC3F;AAED,QAAA,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;KAClB;AAGD,IAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAGjB,IAAA,IAAI,KAAK,GAAG,aAAa,GAAG,CAAC,CAAC;AAG9B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAEzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,GAAG,GAAG,CAAG,EAAA,CAAC,EAAE,CAAC;AACnB,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAGtB,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAED,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;gBACrC,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBAC9B,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzB,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBAC/D,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKP,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;SAAM,IAAI,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;AACjD,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,OAAO,CAAC,IAAI,EAAE;AAEZ,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC9B,YAAA,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAEpB,YAAA,IAAI,IAAI;gBAAE,SAAS;YAGnB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3B,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAGD,YAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAG1B,YAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACnD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;oBAG7B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,8BAA8B,CAAC,CAAC;iBACpE;gBAED,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;wBAClB,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,0BAA0B,CAAC,CAAC;qBAChE;AAAM,yBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC5B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,CAAC;qBAC7D;iBACF;aACF;AAED,YAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrB,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBAC7B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,eAAe,KAAK,KAAK,CAAC,EAAE;gBAC/E,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBACvD,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKA,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAChE,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;SAAM;AACL,QAAA,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE;AAExC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAChD,gBAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;aACjE;SACF;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAExB,YAAA,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE;AACvC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aACxB;AAGD,YAAA,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;AAG1B,YAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACnD,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;oBAG7B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,8BAA8B,CAAC,CAAC;iBACpE;gBAED,IAAI,SAAS,EAAE;AACb,oBAAA,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;wBAClB,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,0BAA0B,CAAC,CAAC;qBAChE;AAAM,yBAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;wBAC5B,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,CAAC;qBAC7D;iBACF;aACF;AAED,YAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrB,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;gBAC5B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;gBAC7B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACrD;iBAAM,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjD,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBAC9B,IAAI,eAAe,KAAK,KAAK;oBAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACjF;AAAM,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBACzB,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC9B,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACrD,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE;gBACvD,KAAK,GAAG,eAAe,CACrB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;iBAAM,IACL,OAAO,KAAK,KAAK,QAAQ;AACzB,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAKA,kBAA4B,EACxE;gBACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;aAC9B;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;gBACzC,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAChE,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;gBACxE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aAClD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBACrC,KAAK,GAAG,aAAa,CACnB,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,SAAS,EACT,KAAK,EACL,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;aACH;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,kBAAkB,EAAE;gBAC5D,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACtD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvC,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACtC,gBAAA,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;aACpF;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE;gBAC3C,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACxD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;gBACtC,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACnD;AAAM,iBAAA,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;gBACvE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;aACpD;AAAM,iBAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,EAAE;AACjD,gBAAA,MAAM,IAAI,SAAS,CAAC,CAAA,mCAAA,EAAsC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAE,CAAA,CAAC,CAAC;aACtF;SACF;KACF;AAGD,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAGpB,IAAA,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;AAGvB,IAAA,MAAM,IAAI,GAAG,KAAK,GAAG,aAAa,CAAC;IAEnC,aAAa,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;AACrE,IAAA,OAAO,KAAK,CAAC;AACf;;ACn3BA,SAAS,UAAU,CAAC,KAAc,EAAA;IAChC,QACE,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,WAAW,IAAI,KAAK;AACpB,QAAA,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EACnC;AACJ,CAAC;AAID,MAAM,YAAY,GAAG;AACnB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,OAAO,EAAE,UAAU;AACnB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,cAAc,EAAE,UAAU;AAC1B,IAAA,aAAa,EAAE,MAAM;AACrB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,kBAAkB,EAAE,UAAU;AAC9B,IAAA,UAAU,EAAE,SAAS;CACb,CAAC;AAGX,SAAS,gBAAgB,CAAC,KAAU,EAAE,UAAwB,EAAE,EAAA;AAC9D,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAE7B,MAAM,YAAY,GAAG,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,CAAC;QACxE,MAAM,YAAY,GAAG,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,CAAC;QAExE,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;AACrC,YAAA,OAAO,KAAK,CAAC;SACd;AAED,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAEpD,IAAI,YAAY,EAAE;AAChB,gBAAA,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AAEvB,oBAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;iBACtB;AACD,gBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC/B;SACF;AAGD,QAAA,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;KAC1B;AAGD,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK,CAAC;IAG7D,IAAI,KAAK,CAAC,UAAU;AAAE,QAAA,OAAO,IAAI,CAAC;AAElC,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CACpC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CACV,CAAC;AACnC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;KAClD;AAED,IAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAExB,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;iBACvD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;gBACnD,MAAM,IAAI,gBAAgB,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;SAClF;aAAM;YACL,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,iBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/C,iBAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBAC9D,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;gBACnD,MAAM,IAAI,gBAAgB,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,CAAA,CAAE,CAAC,CAAC;SAClF;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC9C;AAED,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KACrC;IAED,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE;AAC1C,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QAIhD,IAAI,CAAC,YAAY,KAAK;AAAE,YAAA,OAAO,CAAC,CAAC;QAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,GAAG,IAAI,CAAC;AACjB,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,IAAG;AACrB,YAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC;AAC9D,SAAC,CAAC,CAAC;AAGH,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;KAC7C;AAED,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,SAAS,cAAc,CAAC,KAAY,EAAE,OAA8B,EAAA;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,KAAa,KAAI;AAC7C,QAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAS,MAAA,EAAA,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AACxE,QAAA,IAAI;AACF,YAAA,OAAO,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;SACnC;gBAAS;AACR,YAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;SAC3B;AACH,KAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAU,EAAA;AAC9B,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAElC,OAAO,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AAC9E,CAAC;AAGD,SAAS,cAAc,CAAC,KAAU,EAAE,OAA8B,EAAA;IAChE,IAAI,KAAK,YAAY,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;QACxC,MAAM,GAAG,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE;AAC1B,YAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACzB,gBAAA,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;aACjE;AACD,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACZ;AAED,QAAA,OAAO,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;KACrC;AAED,IAAA,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI,EAAE;AAChF,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;AAC1E,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,KAAK;AACtB,iBAAA,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;iBACf,GAAG,CAAC,IAAI,IAAI,CAAG,EAAA,IAAI,MAAM,CAAC;iBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,YAAY,GAChB,MAAM;gBACN,KAAK;qBACF,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;qBAClC,GAAG,CAAC,IAAI,IAAI,CAAG,EAAA,IAAI,MAAM,CAAC;qBAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACxC,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CACvB,YAAY,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CACpE,CAAC;YAEF,MAAM,IAAI,SAAS,CACjB,2CAA2C;AACzC,gBAAA,CAAA,IAAA,EAAO,WAAW,CAAG,EAAA,WAAW,GAAG,YAAY,CAAA,EAAG,OAAO,CAAI,EAAA,CAAA;AAC7D,gBAAA,CAAA,IAAA,EAAO,YAAY,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,CAAG,CACpC,CAAC;SACH;AACD,QAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;KACjE;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI,CAAC;IAErC,IAAI,KAAK,YAAY,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,EAE7B,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,eAAe,CAAC;AAEtD,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO;kBAC7B,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE;kBAC1B,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;SACpC;AACD,QAAA,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO;cAC7B,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE;AAChC,cAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;KAC5D;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;AACvE,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;YAEpD,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,EAAE;gBACtD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;aACzC;YACD,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,cAAc,EAAE;gBAEtD,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;aAC1C;SACF;QACD,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;KAC5E;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAE7B,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,YAAA,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC7D;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;KAEzC;IAED,IAAI,KAAK,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AAC9C,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;aAClB;SACF;QAED,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,QAAA,OAAO,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACnC;AAED,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACzF,IAAA,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,kBAAkB,GAAG;AACzB,IAAA,MAAM,EAAE,CAAC,CAAS,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC;AACxD,IAAA,IAAI,EAAE,CAAC,CAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AAC5C,IAAA,KAAK,EAAE,CAAC,CAAQ,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAClF,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,IAAA,MAAM,EAAE,CAAC,CAAS,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,IAAA,KAAK,EAAE,CAAC,CAAQ,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,IAAA,IAAI,EAAE,CACJ,CAIC,KAED,IAAI,CAAC,QAAQ,CAEX,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAC9B,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAChC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CACzC;AACH,IAAA,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE;AAC1B,IAAA,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE;IAC1B,QAAQ,EAAE,CAAC,CAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;AAC1C,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AACnE,IAAA,UAAU,EAAE,CAAC,CAAa,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,IAAA,SAAS,EAAE,CAAC,CAAY,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC;CACtD,CAAC;AAGX,SAAS,iBAAiB,CAAC,GAAQ,EAAE,OAA8B,EAAA;AACjE,IAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAE1F,IAAA,MAAM,QAAQ,GAA0B,GAAG,CAAC,SAAS,CAAC;AACtD,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;QAEnC,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,YAAA,IAAI;gBACF,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACjD,gBAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,oBAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE;wBAChC,KAAK;AACL,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,YAAY,EAAE,IAAI;AACnB,qBAAA,CAAC,CAAC;iBACJ;qBAAM;AACL,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;iBACpB;aACF;oBAAS;AACR,gBAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;aAC3B;SACF;AACD,QAAA,OAAO,IAAI,CAAC;KACb;SAAM,IACL,GAAG,IAAI,IAAI;QACX,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,kBAAkB,EAC5D;QACA,MAAM,IAAI,gBAAgB,EAAE,CAAC;KAC9B;AAAM,SAAA,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE;QAG1B,IAAI,MAAM,GAAQ,GAAG,CAAC;AACtB,QAAA,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU,EAAE;YAK/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,IAAI,SAAS,CAAC,qCAAqC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;aAC5E;AACD,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;SACzB;QAGD,IAAI,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE;AACvC,YAAA,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;SACvE;aAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE;AAC7C,YAAA,MAAM,GAAG,IAAI,KAAK,CAChB,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAC1C,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EACnC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,EAClC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACvC,CAAC;SACH;AAED,QAAA,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACvC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,uCAAuC,GAAG,OAAO,QAAQ,CAAC,CAAC;KAChF;AACH,CAAC;AAmBD,SAAS,KAAK,CAAC,IAAY,EAAE,OAAsB,EAAA;AACjD,IAAA,MAAM,YAAY,GAAG;AACnB,QAAA,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK;AAC1C,QAAA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;AACjC,QAAA,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK;KACjC,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,KAAI;QACrC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAC9B,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,4DAAA,EAA+D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAE,CAAA,CACrF,CAAC;SACH;AACD,QAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC/C,KAAC,CAAC,CAAC;AACL,CAAC;AAyBD,SAAS,SAAS,CAEhB,KAAU,EAEV,QAA6F,EAC7F,KAAuB,EACvB,OAAsB,EAAA;IAEtB,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC9C,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;KACX;AACD,IAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAChF,OAAO,GAAG,QAAQ,CAAC;QACnB,QAAQ,GAAG,SAAS,CAAC;QACrB,KAAK,GAAG,CAAC,CAAC;KACX;AACD,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE;QAChF,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACrD,KAAA,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAA4C,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC;AASD,SAAS,cAAc,CAAC,KAAU,EAAE,OAAsB,EAAA;AACxD,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AASD,SAAS,gBAAgB,CAAC,KAAe,EAAE,OAAsB,EAAA;AAC/D,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAGK,MAAA,KAAK,GAKP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;AAC5B,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;AACjC,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;ACldpB,SAAS,OAAO,CAAC,MAAkB,EAAE,MAAc,EAAA;AACjD,IAAA,IAAI;QACF,OAAO,WAAW,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC1D;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;KAC9E;AACH,CAAC;AAOD,SAAS,QAAQ,CAAC,KAAiB,EAAE,MAAc,EAAA;IACjD,IAAI,oBAAoB,GAAG,MAAM,CAAC;IAElC,OAAO,KAAK,CAAC,oBAAoB,CAAC,KAAK,IAAI,EAAE,oBAAoB,EAAE;QAAC,CAAC;IAErE,IAAI,oBAAoB,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAE7C,QAAA,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;KAChE;AAED,IAAA,OAAO,oBAAoB,CAAC;AAC9B,CAAC;SAMe,eAAe,CAC7B,KAAiB,EACjB,cAA6B,CAAC,EAAA;IAE9B,WAAW,KAAK,CAAC,CAAC;AAElB,IAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,IAAI,eAAe,CACvB,CAAuC,oCAAA,EAAA,KAAK,CAAC,MAAM,CAAQ,MAAA,CAAA,EAC3D,WAAW,CACZ,CAAC;KACH;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE;AAC7C,QAAA,MAAM,IAAI,eAAe,CACvB,CAAA,qBAAA,EAAwB,YAAY,CAAA,qCAAA,EAAwC,KAAK,CAAC,MAAM,CAAA,OAAA,CAAS,EACjG,WAAW,CACZ,CAAC;KACH;IAED,IAAI,KAAK,CAAC,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC;KAC1F;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;AACnC,IAAA,IAAI,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC;AAE7B,IAAA,OAAO,MAAM,IAAI,YAAY,GAAG,WAAW,EAAE;AAC3C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,CAAC;AAEZ,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,YAAA,IAAI,MAAM,GAAG,WAAW,KAAK,YAAY,EAAE;AACzC,gBAAA,MAAM,IAAI,eAAe,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;aAC7D;YACD,MAAM;SACP;QAED,MAAM,UAAU,GAAG,MAAM,CAAC;QAC1B,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC;AACxD,QAAA,MAAM,IAAI,UAAU,GAAG,CAAC,CAAC;AAEzB,QAAA,IAAI,MAAc,CAAC;AAEnB,QAAA,IACE,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAAyB,EAAA;AAC7B,YAAA,IAAI,KAAyB,CAAA;YAC7B,IAAI,KAAA,EAA8B,EAClC;YACA,MAAM,GAAG,CAAC,CAAC;SACZ;aAAM,IAAI,IAAI,KAAwB,EAAA,EAAE;YACvC,MAAM,GAAG,CAAC,CAAC;SACZ;aAAM,IAAI,IAAI,KAA6B,CAAA,EAAE;YAC5C,MAAM,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,IAAI,KAA4B,EAAA,EAAE;YAC3C,MAAM,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,IAAI,KAAyB,CAAA,EAAE;YACxC,MAAM,GAAG,CAAC,CAAC;SACZ;AAAM,aAAA,IACL,IAAI,KAAyB,EAAA;AAC7B,YAAA,IAAI,KAA8B,CAAA;AAClC,YAAA,IAAI,KAA2B,GAAA;YAC/B,IAAI,KAAA,GAA2B,EAC/B;YACA,MAAM,GAAG,CAAC,CAAC;SACZ;aAEI,IAAI,IAAI,KAA0B,EAAA,EAAE;AACvC,YAAA,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;SACpE;AAAM,aAAA,IACL,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAA0B,CAAA;YAC9B,IAAI,KAAA,EAAwC,EAC5C;AACA,YAAA,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACjC;AAAM,aAAA,IACL,IAAI,KAA2B,CAAA;AAC/B,YAAA,IAAI,KAA4B,CAAA;AAChC,YAAA,IAAI,KAA8B,EAAA;AAClC,YAAA,IAAI,KAA+B,EAAA;YACnC,IAAI,KAAA,EAA2B,EAC/B;YACA,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,IAAI,KAA4B,CAAA,EAAE;gBAEpC,MAAM,IAAI,CAAC,CAAC;aACb;YACD,IAAI,IAAI,KAA8B,EAAA,EAAE;gBAEtC,MAAM,IAAI,EAAE,CAAC;aACd;SACF;aAAM;YACL,MAAM,IAAI,eAAe,CACvB,CAAA,UAAA,EAAa,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAY,UAAA,CAAA,EAC3D,MAAM,CACP,CAAC;SACH;AAED,QAAA,IAAI,MAAM,GAAG,YAAY,EAAE;AACzB,YAAA,MAAM,IAAI,eAAe,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAC;SAChF;AAED,QAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,MAAM,CAAC;KAClB;AAED,IAAA,OAAO,QAAQ,CAAC;AAClB;;ACpKM,MAAA,QAAQ,GAAa,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;AAE/C,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;AAC3C,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;AAC/B,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;AAEnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;;ACqCvB,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAGjC,IAAI,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAQnC,SAAU,qBAAqB,CAAC,IAAY,EAAA;AAEhD,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE;AACxB,QAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KACnC;AACH,CAAC;SASe,SAAS,CAAC,MAAgB,EAAE,UAA4B,EAAE,EAAA;AAExE,IAAA,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;AACrF,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;AAChF,IAAA,MAAM,qBAAqB,GACzB,OAAO,OAAO,CAAC,qBAAqB,KAAK,QAAQ,GAAG,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC;AAG9F,IAAA,IAAI,MAAM,CAAC,MAAM,GAAG,qBAAqB,EAAE;AACzC,QAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;KACpD;IAGD,MAAM,kBAAkB,GAAG,aAAa,CACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,CAAC,EACD,CAAC,EACD,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;IAGF,MAAM,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAGpE,IAAA,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;AAG9D,IAAA,OAAO,cAAc,CAAC;AACxB,CAAC;AAWK,SAAU,2BAA2B,CACzC,MAAgB,EAChB,WAAuB,EACvB,UAA4B,EAAE,EAAA;AAG9B,IAAA,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;AACrF,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;AAChF,IAAA,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAGzE,MAAM,kBAAkB,GAAG,aAAa,CACtC,MAAM,EACN,MAAM,EACN,SAAS,EACT,CAAC,EACD,CAAC,EACD,kBAAkB,EAClB,eAAe,EACf,IAAI,CACL,CAAC;AAEF,IAAA,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;AAGpE,IAAA,OAAO,UAAU,GAAG,kBAAkB,GAAG,CAAC,CAAC;AAC7C,CAAC;SASe,WAAW,CAAC,MAAkB,EAAE,UAA8B,EAAE,EAAA;IAC9E,OAAO,mBAAmB,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;SAee,mBAAmB,CACjC,MAAgB,EAChB,UAAsC,EAAE,EAAA;AAExC,IAAA,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;AAExB,IAAA,MAAM,kBAAkB,GACtB,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAAC;AACvF,IAAA,MAAM,eAAe,GACnB,OAAO,OAAO,CAAC,eAAe,KAAK,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAEhF,OAAO,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;AAClF,CAAC;AAce,SAAA,iBAAiB,CAC/B,IAA8B,EAC9B,UAAkB,EAClB,iBAAyB,EACzB,SAAqB,EACrB,aAAqB,EACrB,OAA2B,EAAA;AAE3B,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC,EAAE,gCAAgC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EACpD,OAAO,CACR,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAErD,IAAI,KAAK,GAAG,UAAU,CAAC;AAEvB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE;QAE1C,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAEvD,QAAA,eAAe,CAAC,KAAK,GAAG,KAAK,CAAC;AAE9B,QAAA,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,mBAAmB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAEhF,QAAA,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;KACtB;AAGD,IAAA,OAAO,KAAK,CAAC;AACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/user-service/node_modules/bson/package.json b/user-service/node_modules/bson/package.json new file mode 100644 index 0000000000..80ce4ee2a3 --- /dev/null +++ b/user-service/node_modules/bson/package.json @@ -0,0 +1,119 @@ +{ + "name": "bson", + "description": "A bson parser for node.js and the browser", + "keywords": [ + "mongodb", + "bson", + "parser" + ], + "files": [ + "lib", + "src", + "bson.d.ts", + "etc/prepare.js", + "vendor" + ], + "types": "bson.d.ts", + "version": "6.8.0", + "author": { + "name": "The MongoDB NodeJS Team", + "email": "dbx-node@mongodb.com" + }, + "license": "Apache-2.0", + "contributors": [], + "repository": "mongodb/js-bson", + "bugs": { + "url": "https://jira.mongodb.org/projects/NODE/issues/" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@microsoft/api-extractor": "^7.43.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.6", + "@types/chai": "^4.3.14", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.7", + "@types/sinon": "^17.0.3", + "@types/sinon-chai": "^3.2.12", + "@typescript-eslint/eslint-plugin": "^7.7.0", + "@typescript-eslint/parser": "^7.7.0", + "benchmark": "^2.1.4", + "chai": "^4.4.1", + "chalk": "^5.3.0", + "dbx-js-tools": "github:mongodb-js/dbx-js-tools", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-no-bigint-usage": "file:etc/eslint/no-bigint-usage", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-tsdoc": "^0.2.17", + "magic-string": "^0.30.10", + "mocha": "^10.4.0", + "node-fetch": "^3.3.2", + "nyc": "^15.1.0", + "prettier": "^3.2.5", + "rollup": "^4.14.3", + "sinon": "^17.0.1", + "sinon-chai": "^3.7.0", + "source-map-support": "^0.5.21", + "standard-version": "^9.5.0", + "tar": "^7.0.1", + "ts-node": "^10.9.2", + "tsd": "^0.31.0", + "typescript": "5.3", + "typescript-cached-transpile": "0.0.6", + "uuid": "^9.0.1" + }, + "tsd": { + "directory": "test/types", + "compilerOptions": { + "strict": true, + "target": "esnext", + "module": "commonjs", + "moduleResolution": "node" + } + }, + "config": { + "native": false + }, + "main": "./lib/bson.cjs", + "module": "./lib/bson.mjs", + "exports": { + "import": { + "types": "./bson.d.ts", + "default": "./lib/bson.mjs" + }, + "require": { + "types": "./bson.d.ts", + "default": "./lib/bson.cjs" + }, + "react-native": "./lib/bson.rn.cjs", + "browser": "./lib/bson.mjs" + }, + "compass:exports": { + "import": "./lib/bson.cjs", + "require": "./lib/bson.cjs" + }, + "engines": { + "node": ">=16.20.1" + }, + "scripts": { + "pretest": "npm run build", + "test": "npm run check:node && npm run check:web && npm run check:web-no-bigint", + "check:node": "WEB=false mocha test/node", + "check:tsd": "npm run build:dts && tsd", + "check:web": "WEB=true mocha test/node", + "check:web-no-bigint": "WEB=true NO_BIGINT=true mocha test/node", + "check:granular-bench": "npm run build:bench && node ./test/bench/etc/run_granular_benchmarks.js", + "check:spec-bench": "npm run build:bench && node ./test/bench/lib/spec/bsonBench.js", + "build:bench": "cd test/bench && npx tsc", + "build:ts": "node ./node_modules/typescript/bin/tsc", + "build:dts": "npm run build:ts && api-extractor run --typescript-compiler-folder node_modules/typescript --local && node etc/clean_definition_files.cjs", + "build:bundle": "rollup -c rollup.config.mjs", + "build": "npm run build:dts && npm run build:bundle", + "check:lint": "eslint -v && eslint --ext '.js,.ts' --max-warnings=0 src test && npm run build:dts && npm run check:tsd", + "format": "eslint --ext '.js,.ts' src test --fix", + "check:coverage": "nyc --check-coverage npm run check:node", + "prepare": "node etc/prepare.js", + "release": "standard-version -i HISTORY.md" + } +} diff --git a/user-service/node_modules/bson/src/binary.ts b/user-service/node_modules/bson/src/binary.ts new file mode 100644 index 0000000000..6a892b00a8 --- /dev/null +++ b/user-service/node_modules/bson/src/binary.ts @@ -0,0 +1,472 @@ +import { type InspectFn, defaultInspect, isAnyArrayBuffer, isUint8Array } from './parser/utils'; +import type { EJSONOptions } from './extended_json'; +import { BSONError } from './error'; +import { BSON_BINARY_SUBTYPE_UUID_NEW } from './constants'; +import { ByteUtils } from './utils/byte_utils'; +import { BSONValue } from './bson_value'; + +/** @public */ +export type BinarySequence = Uint8Array | number[]; + +/** @public */ +export interface BinaryExtendedLegacy { + $type: string; + $binary: string; +} + +/** @public */ +export interface BinaryExtended { + $binary: { + subType: string; + base64: string; + }; +} + +/** + * A class representation of the BSON Binary type. + * @public + * @category BSONType + */ +export class Binary extends BSONValue { + get _bsontype(): 'Binary' { + return 'Binary'; + } + + /** + * Binary default subtype + * @internal + */ + private static readonly BSON_BINARY_SUBTYPE_DEFAULT = 0; + + /** Initial buffer default size */ + static readonly BUFFER_SIZE = 256; + /** Default BSON type */ + static readonly SUBTYPE_DEFAULT = 0; + /** Function BSON type */ + static readonly SUBTYPE_FUNCTION = 1; + /** Byte Array BSON type */ + static readonly SUBTYPE_BYTE_ARRAY = 2; + /** Deprecated UUID BSON type @deprecated Please use SUBTYPE_UUID */ + static readonly SUBTYPE_UUID_OLD = 3; + /** UUID BSON type */ + static readonly SUBTYPE_UUID = 4; + /** MD5 BSON type */ + static readonly SUBTYPE_MD5 = 5; + /** Encrypted BSON type */ + static readonly SUBTYPE_ENCRYPTED = 6; + /** Column BSON type */ + static readonly SUBTYPE_COLUMN = 7; + /** Sensitive BSON type */ + static readonly SUBTYPE_SENSITIVE = 8; + /** User BSON type */ + static readonly SUBTYPE_USER_DEFINED = 128; + + buffer!: Uint8Array; + sub_type!: number; + position!: number; + + /** + * Create a new Binary instance. + * @param buffer - a buffer object containing the binary data. + * @param subType - the option binary type. + */ + constructor(buffer?: BinarySequence, subType?: number) { + super(); + if ( + !(buffer == null) && + typeof buffer === 'string' && + !ArrayBuffer.isView(buffer) && + !isAnyArrayBuffer(buffer) && + !Array.isArray(buffer) + ) { + throw new BSONError('Binary can only be constructed from Uint8Array or number[]'); + } + + this.sub_type = subType ?? Binary.BSON_BINARY_SUBTYPE_DEFAULT; + + if (buffer == null) { + // create an empty binary buffer + this.buffer = ByteUtils.allocate(Binary.BUFFER_SIZE); + this.position = 0; + } else { + this.buffer = Array.isArray(buffer) + ? ByteUtils.fromNumberArray(buffer) + : ByteUtils.toLocalBufferType(buffer); + this.position = this.buffer.byteLength; + } + } + + /** + * Updates this binary with byte_value. + * + * @param byteValue - a single byte we wish to write. + */ + put(byteValue: string | number | Uint8Array | number[]): void { + // If it's a string and a has more than one character throw an error + if (typeof byteValue === 'string' && byteValue.length !== 1) { + throw new BSONError('only accepts single character String'); + } else if (typeof byteValue !== 'number' && byteValue.length !== 1) + throw new BSONError('only accepts single character Uint8Array or Array'); + + // Decode the byte value once + let decodedByte: number; + if (typeof byteValue === 'string') { + decodedByte = byteValue.charCodeAt(0); + } else if (typeof byteValue === 'number') { + decodedByte = byteValue; + } else { + decodedByte = byteValue[0]; + } + + if (decodedByte < 0 || decodedByte > 255) { + throw new BSONError('only accepts number in a valid unsigned byte range 0-255'); + } + + if (this.buffer.byteLength > this.position) { + this.buffer[this.position++] = decodedByte; + } else { + const newSpace = ByteUtils.allocate(Binary.BUFFER_SIZE + this.buffer.length); + newSpace.set(this.buffer, 0); + this.buffer = newSpace; + this.buffer[this.position++] = decodedByte; + } + } + + /** + * Writes a buffer to the binary. + * + * @param sequence - a string or buffer to be written to the Binary BSON object. + * @param offset - specify the binary of where to write the content. + */ + write(sequence: BinarySequence, offset: number): void { + offset = typeof offset === 'number' ? offset : this.position; + + // If the buffer is to small let's extend the buffer + if (this.buffer.byteLength < offset + sequence.length) { + const newSpace = ByteUtils.allocate(this.buffer.byteLength + sequence.length); + newSpace.set(this.buffer, 0); + + // Assign the new buffer + this.buffer = newSpace; + } + + if (ArrayBuffer.isView(sequence)) { + this.buffer.set(ByteUtils.toLocalBufferType(sequence), offset); + this.position = + offset + sequence.byteLength > this.position ? offset + sequence.length : this.position; + } else if (typeof sequence === 'string') { + throw new BSONError('input cannot be string'); + } + } + + /** + * Reads **length** bytes starting at **position**. + * + * @param position - read from the given position in the Binary. + * @param length - the number of bytes to read. + */ + read(position: number, length: number): BinarySequence { + length = length && length > 0 ? length : this.position; + + // Let's return the data based on the type we have + return this.buffer.slice(position, position + length); + } + + /** returns a view of the binary value as a Uint8Array */ + value(): Uint8Array { + // Optimize to serialize for the situation where the data == size of buffer + return this.buffer.length === this.position + ? this.buffer + : this.buffer.subarray(0, this.position); + } + + /** the length of the binary sequence */ + length(): number { + return this.position; + } + + toJSON(): string { + return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + } + + toString(encoding?: 'hex' | 'base64' | 'utf8' | 'utf-8'): string { + if (encoding === 'hex') return ByteUtils.toHex(this.buffer.subarray(0, this.position)); + if (encoding === 'base64') return ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + if (encoding === 'utf8' || encoding === 'utf-8') + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + return ByteUtils.toUTF8(this.buffer, 0, this.position, false); + } + + /** @internal */ + toExtendedJSON(options?: EJSONOptions): BinaryExtendedLegacy | BinaryExtended { + options = options || {}; + const base64String = ByteUtils.toBase64(this.buffer); + + const subType = Number(this.sub_type).toString(16); + if (options.legacy) { + return { + $binary: base64String, + $type: subType.length === 1 ? '0' + subType : subType + }; + } + return { + $binary: { + base64: base64String, + subType: subType.length === 1 ? '0' + subType : subType + } + }; + } + + toUUID(): UUID { + if (this.sub_type === Binary.SUBTYPE_UUID) { + return new UUID(this.buffer.slice(0, this.position)); + } + + throw new BSONError( + `Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Binary.SUBTYPE_UUID}" is currently supported.` + ); + } + + /** Creates an Binary instance from a hex digit string */ + static createFromHexString(hex: string, subType?: number): Binary { + return new Binary(ByteUtils.fromHex(hex), subType); + } + + /** Creates an Binary instance from a base64 string */ + static createFromBase64(base64: string, subType?: number): Binary { + return new Binary(ByteUtils.fromBase64(base64), subType); + } + + /** @internal */ + static fromExtendedJSON( + doc: BinaryExtendedLegacy | BinaryExtended | UUIDExtended, + options?: EJSONOptions + ): Binary { + options = options || {}; + let data: Uint8Array | undefined; + let type; + if ('$binary' in doc) { + if (options.legacy && typeof doc.$binary === 'string' && '$type' in doc) { + type = doc.$type ? parseInt(doc.$type, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary); + } else { + if (typeof doc.$binary !== 'string') { + type = doc.$binary.subType ? parseInt(doc.$binary.subType, 16) : 0; + data = ByteUtils.fromBase64(doc.$binary.base64); + } + } + } else if ('$uuid' in doc) { + type = 4; + data = UUID.bytesFromString(doc.$uuid); + } + if (!data) { + throw new BSONError(`Unexpected Binary Extended JSON format ${JSON.stringify(doc)}`); + } + return type === BSON_BINARY_SUBTYPE_UUID_NEW ? new UUID(data) : new Binary(data, type); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + const base64 = ByteUtils.toBase64(this.buffer.subarray(0, this.position)); + const base64Arg = inspect(base64, options); + const subTypeArg = inspect(this.sub_type, options); + return `Binary.createFromBase64(${base64Arg}, ${subTypeArg})`; + } +} + +/** @public */ +export type UUIDExtended = { + $uuid: string; +}; + +const UUID_BYTE_LENGTH = 16; +const UUID_WITHOUT_DASHES = /^[0-9A-F]{32}$/i; +const UUID_WITH_DASHES = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; + +/** + * A class representation of the BSON UUID type. + * @public + */ +export class UUID extends Binary { + /** + * Create a UUID type + * + * When the argument to the constructor is omitted a random v4 UUID will be generated. + * + * @param input - Can be a 32 or 36 character hex string (dashes excluded/included) or a 16 byte binary Buffer. + */ + constructor(input?: string | Uint8Array | UUID) { + let bytes: Uint8Array; + if (input == null) { + bytes = UUID.generate(); + } else if (input instanceof UUID) { + bytes = ByteUtils.toLocalBufferType(new Uint8Array(input.buffer)); + } else if (ArrayBuffer.isView(input) && input.byteLength === UUID_BYTE_LENGTH) { + bytes = ByteUtils.toLocalBufferType(input); + } else if (typeof input === 'string') { + bytes = UUID.bytesFromString(input); + } else { + throw new BSONError( + 'Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).' + ); + } + super(bytes, BSON_BINARY_SUBTYPE_UUID_NEW); + } + + /** + * The UUID bytes + * @readonly + */ + get id(): Uint8Array { + return this.buffer; + } + + set id(value: Uint8Array) { + this.buffer = value; + } + + /** + * Returns the UUID id as a 32 or 36 character hex string representation, excluding/including dashes (defaults to 36 character dash separated) + * @param includeDashes - should the string exclude dash-separators. + */ + toHexString(includeDashes = true): string { + if (includeDashes) { + return [ + ByteUtils.toHex(this.buffer.subarray(0, 4)), + ByteUtils.toHex(this.buffer.subarray(4, 6)), + ByteUtils.toHex(this.buffer.subarray(6, 8)), + ByteUtils.toHex(this.buffer.subarray(8, 10)), + ByteUtils.toHex(this.buffer.subarray(10, 16)) + ].join('-'); + } + return ByteUtils.toHex(this.buffer); + } + + /** + * Converts the id into a 36 character (dashes included) hex string, unless a encoding is specified. + */ + toString(encoding?: 'hex' | 'base64'): string { + if (encoding === 'hex') return ByteUtils.toHex(this.id); + if (encoding === 'base64') return ByteUtils.toBase64(this.id); + return this.toHexString(); + } + + /** + * Converts the id into its JSON string representation. + * A 36 character (dashes included) hex string in the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + */ + toJSON(): string { + return this.toHexString(); + } + + /** + * Compares the equality of this UUID with `otherID`. + * + * @param otherId - UUID instance to compare against. + */ + equals(otherId: string | Uint8Array | UUID): boolean { + if (!otherId) { + return false; + } + + if (otherId instanceof UUID) { + return ByteUtils.equals(otherId.id, this.id); + } + + try { + return ByteUtils.equals(new UUID(otherId).id, this.id); + } catch { + return false; + } + } + + /** + * Creates a Binary instance from the current UUID. + */ + toBinary(): Binary { + return new Binary(this.id, Binary.SUBTYPE_UUID); + } + + /** + * Generates a populated buffer containing a v4 uuid + */ + static generate(): Uint8Array { + const bytes = ByteUtils.randomBytes(UUID_BYTE_LENGTH); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + // Kindly borrowed from https://github.com/uuidjs/uuid/blob/master/src/v4.js + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + return bytes; + } + + /** + * Checks if a value is a valid bson UUID + * @param input - UUID, string or Buffer to validate. + */ + static isValid(input: string | Uint8Array | UUID | Binary): boolean { + if (!input) { + return false; + } + + if (typeof input === 'string') { + return UUID.isValidUUIDString(input); + } + + if (isUint8Array(input)) { + return input.byteLength === UUID_BYTE_LENGTH; + } + + return ( + input._bsontype === 'Binary' && + input.sub_type === this.SUBTYPE_UUID && + input.buffer.byteLength === 16 + ); + } + + /** + * Creates an UUID from a hex string representation of an UUID. + * @param hexString - 32 or 36 character hex string (dashes excluded/included). + */ + static override createFromHexString(hexString: string): UUID { + const buffer = UUID.bytesFromString(hexString); + return new UUID(buffer); + } + + /** Creates an UUID from a base64 string representation of an UUID. */ + static override createFromBase64(base64: string): UUID { + return new UUID(ByteUtils.fromBase64(base64)); + } + + /** @internal */ + static bytesFromString(representation: string) { + if (!UUID.isValidUUIDString(representation)) { + throw new BSONError( + 'UUID string representation must be 32 hex digits or canonical hyphenated representation' + ); + } + return ByteUtils.fromHex(representation.replace(/-/g, '')); + } + + /** + * @internal + * + * Validates a string to be a hex digit sequence with or without dashes. + * The canonical hyphenated representation of a uuid is hex in 8-4-4-4-12 groups. + */ + static isValidUUIDString(representation: string) { + return UUID_WITHOUT_DASHES.test(representation) || UUID_WITH_DASHES.test(representation); + } + + /** + * Converts to a string representation of this Id. + * + * @returns return the 36 character hex string representation. + * + */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + return `new UUID(${inspect(this.toHexString(), options)})`; + } +} diff --git a/user-service/node_modules/bson/src/bson.ts b/user-service/node_modules/bson/src/bson.ts new file mode 100644 index 0000000000..0dc8346e89 --- /dev/null +++ b/user-service/node_modules/bson/src/bson.ts @@ -0,0 +1,248 @@ +import { Binary, UUID } from './binary'; +import { Code } from './code'; +import { DBRef } from './db_ref'; +import { Decimal128 } from './decimal128'; +import { Double } from './double'; +import { Int32 } from './int_32'; +import { Long } from './long'; +import { MaxKey } from './max_key'; +import { MinKey } from './min_key'; +import { ObjectId } from './objectid'; +import { internalCalculateObjectSize } from './parser/calculate_size'; +// Parts of the parser +import { internalDeserialize, type DeserializeOptions } from './parser/deserializer'; +import { serializeInto, type SerializeOptions } from './parser/serializer'; +import { BSONRegExp } from './regexp'; +import { BSONSymbol } from './symbol'; +import { Timestamp } from './timestamp'; +import { ByteUtils } from './utils/byte_utils'; +import { NumberUtils } from './utils/number_utils'; +export type { UUIDExtended, BinaryExtended, BinaryExtendedLegacy, BinarySequence } from './binary'; +export type { CodeExtended } from './code'; +export type { DBRefLike } from './db_ref'; +export type { Decimal128Extended } from './decimal128'; +export type { DoubleExtended } from './double'; +export type { EJSONOptions } from './extended_json'; +export type { Int32Extended } from './int_32'; +export type { LongExtended } from './long'; +export type { MaxKeyExtended } from './max_key'; +export type { MinKeyExtended } from './min_key'; +export type { ObjectIdExtended, ObjectIdLike } from './objectid'; +export type { BSONRegExpExtended, BSONRegExpExtendedLegacy } from './regexp'; +export type { BSONSymbolExtended } from './symbol'; +export type { LongWithoutOverrides, TimestampExtended, TimestampOverrides } from './timestamp'; +export type { LongWithoutOverridesClass } from './timestamp'; +export type { SerializeOptions, DeserializeOptions }; + +export { + Code, + BSONSymbol, + DBRef, + Binary, + ObjectId, + UUID, + Long, + Timestamp, + Double, + Int32, + MinKey, + MaxKey, + BSONRegExp, + Decimal128 +}; +export { BSONValue } from './bson_value'; +export { BSONError, BSONVersionError, BSONRuntimeError, BSONOffsetError } from './error'; +export { BSONType } from './constants'; +export { EJSON } from './extended_json'; +export { onDemand, type OnDemand } from './parser/on_demand/index'; + +/** @public */ +export interface Document { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [key: string]: any; +} + +/** @internal */ +// Default Max Size +const MAXSIZE = 1024 * 1024 * 17; + +// Current Internal Temporary Serialization Buffer +let buffer = ByteUtils.allocate(MAXSIZE); + +/** + * Sets the size of the internal serialization buffer. + * + * @param size - The desired size for the internal serialization buffer in bytes + * @public + */ +export function setInternalBufferSize(size: number): void { + // Resize the internal serialization buffer if needed + if (buffer.length < size) { + buffer = ByteUtils.allocate(size); + } +} + +/** + * Serialize a Javascript object. + * + * @param object - the Javascript object to serialize. + * @returns Buffer object containing the serialized object. + * @public + */ +export function serialize(object: Document, options: SerializeOptions = {}): Uint8Array { + // Unpack the options + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const minInternalBufferSize = + typeof options.minInternalBufferSize === 'number' ? options.minInternalBufferSize : MAXSIZE; + + // Resize the internal serialization buffer if needed + if (buffer.length < minInternalBufferSize) { + buffer = ByteUtils.allocate(minInternalBufferSize); + } + + // Attempt to serialize + const serializationIndex = serializeInto( + buffer, + object, + checkKeys, + 0, + 0, + serializeFunctions, + ignoreUndefined, + null + ); + + // Create the final buffer + const finishedBuffer = ByteUtils.allocateUnsafe(serializationIndex); + + // Copy into the finished buffer + finishedBuffer.set(buffer.subarray(0, serializationIndex), 0); + + // Return the buffer + return finishedBuffer; +} + +/** + * Serialize a Javascript object using a predefined Buffer and index into the buffer, + * useful when pre-allocating the space for serialization. + * + * @param object - the Javascript object to serialize. + * @param finalBuffer - the Buffer you pre-allocated to store the serialized BSON object. + * @returns the index pointing to the last written byte in the buffer. + * @public + */ +export function serializeWithBufferAndIndex( + object: Document, + finalBuffer: Uint8Array, + options: SerializeOptions = {} +): number { + // Unpack the options + const checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + const serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + const startIndex = typeof options.index === 'number' ? options.index : 0; + + // Attempt to serialize + const serializationIndex = serializeInto( + buffer, + object, + checkKeys, + 0, + 0, + serializeFunctions, + ignoreUndefined, + null + ); + + finalBuffer.set(buffer.subarray(0, serializationIndex), startIndex); + + // Return the index + return startIndex + serializationIndex - 1; +} + +/** + * Deserialize data as BSON. + * + * @param buffer - the buffer containing the serialized set of BSON documents. + * @returns returns the deserialized Javascript Object. + * @public + */ +export function deserialize(buffer: Uint8Array, options: DeserializeOptions = {}): Document { + return internalDeserialize(ByteUtils.toLocalBufferType(buffer), options); +} + +/** @public */ +export type CalculateObjectSizeOptions = Pick< + SerializeOptions, + 'serializeFunctions' | 'ignoreUndefined' +>; + +/** + * Calculate the bson size for a passed in Javascript object. + * + * @param object - the Javascript object to calculate the BSON byte size for + * @returns size of BSON object in bytes + * @public + */ +export function calculateObjectSize( + object: Document, + options: CalculateObjectSizeOptions = {} +): number { + options = options || {}; + + const serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : true; + + return internalCalculateObjectSize(object, serializeFunctions, ignoreUndefined); +} + +/** + * Deserialize stream data as BSON documents. + * + * @param data - the buffer containing the serialized set of BSON documents. + * @param startIndex - the start index in the data Buffer where the deserialization is to start. + * @param numberOfDocuments - number of documents to deserialize. + * @param documents - an array where to store the deserialized documents. + * @param docStartIndex - the index in the documents array from where to start inserting documents. + * @param options - additional options used for the deserialization. + * @returns next index in the buffer after deserialization **x** numbers of documents. + * @public + */ +export function deserializeStream( + data: Uint8Array | ArrayBuffer, + startIndex: number, + numberOfDocuments: number, + documents: Document[], + docStartIndex: number, + options: DeserializeOptions +): number { + const internalOptions = Object.assign( + { allowObjectSmallerThanBufferSize: true, index: 0 }, + options + ); + const bufferData = ByteUtils.toLocalBufferType(data); + + let index = startIndex; + // Loop over all documents + for (let i = 0; i < numberOfDocuments; i++) { + // Find size of the document + const size = NumberUtils.getInt32LE(bufferData, index); + // Update options with index + internalOptions.index = index; + // Parse the document at this point + documents[docStartIndex + i] = internalDeserialize(bufferData, internalOptions); + // Adjust index by the document size + index = index + size; + } + + // Return object containing end index of parsing and list of documents + return index; +} diff --git a/user-service/node_modules/bson/src/bson_value.ts b/user-service/node_modules/bson/src/bson_value.ts new file mode 100644 index 0000000000..069764d8c6 --- /dev/null +++ b/user-service/node_modules/bson/src/bson_value.ts @@ -0,0 +1,31 @@ +import { BSON_MAJOR_VERSION } from './constants'; +import { type InspectFn } from './parser/utils'; + +/** @public */ +export abstract class BSONValue { + /** @public */ + public abstract get _bsontype(): string; + + /** @internal */ + get [Symbol.for('@@mdb.bson.version')](): typeof BSON_MAJOR_VERSION { + return BSON_MAJOR_VERSION; + } + + [Symbol.for('nodejs.util.inspect.custom')]( + depth?: number, + options?: unknown, + inspect?: InspectFn + ): string { + return this.inspect(depth, options, inspect); + } + + /** + * @public + * Prints a human-readable string of BSON value information + * If invoked manually without node.js.inspect function, this will default to a modified JSON.stringify + */ + public abstract inspect(depth?: number, options?: unknown, inspect?: InspectFn): string; + + /** @internal */ + abstract toExtendedJSON(): unknown; +} diff --git a/user-service/node_modules/bson/src/code.ts b/user-service/node_modules/bson/src/code.ts new file mode 100644 index 0000000000..98b1ede9a6 --- /dev/null +++ b/user-service/node_modules/bson/src/code.ts @@ -0,0 +1,69 @@ +import type { Document } from './bson'; +import { BSONValue } from './bson_value'; +import { type InspectFn, defaultInspect } from './parser/utils'; + +/** @public */ +export interface CodeExtended { + $code: string; + $scope?: Document; +} + +/** + * A class representation of the BSON Code type. + * @public + * @category BSONType + */ +export class Code extends BSONValue { + get _bsontype(): 'Code' { + return 'Code'; + } + + code: string; + + // a code instance having a null scope is what determines whether + // it is BSONType 0x0D (just code) / 0x0F (code with scope) + scope: Document | null; + + /** + * @param code - a string or function. + * @param scope - an optional scope for the function. + */ + constructor(code: string | Function, scope?: Document | null) { + super(); + this.code = code.toString(); + this.scope = scope ?? null; + } + + toJSON(): { code: string; scope?: Document } { + if (this.scope != null) { + return { code: this.code, scope: this.scope }; + } + + return { code: this.code }; + } + + /** @internal */ + toExtendedJSON(): CodeExtended { + if (this.scope) { + return { $code: this.code, $scope: this.scope }; + } + + return { $code: this.code }; + } + + /** @internal */ + static fromExtendedJSON(doc: CodeExtended): Code { + return new Code(doc.$code, doc.$scope); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + let parametersString = inspect(this.code, options); + const multiLineFn = parametersString.includes('\n'); + if (this.scope != null) { + parametersString += `,${multiLineFn ? '\n' : ' '}${inspect(this.scope, options)}`; + } + const endingNewline = multiLineFn && this.scope === null; + return `new Code(${multiLineFn ? '\n' : ''}${parametersString}${endingNewline ? '\n' : ''})`; + } +} diff --git a/user-service/node_modules/bson/src/constants.ts b/user-service/node_modules/bson/src/constants.ts new file mode 100644 index 0000000000..7f273948bc --- /dev/null +++ b/user-service/node_modules/bson/src/constants.ts @@ -0,0 +1,144 @@ +/** @internal */ +export const BSON_MAJOR_VERSION = 6; + +/** @internal */ +export const BSON_INT32_MAX = 0x7fffffff; +/** @internal */ +export const BSON_INT32_MIN = -0x80000000; +/** @internal */ +export const BSON_INT64_MAX = Math.pow(2, 63) - 1; +/** @internal */ +export const BSON_INT64_MIN = -Math.pow(2, 63); + +/** + * Any integer up to 2^53 can be precisely represented by a double. + * @internal + */ +export const JS_INT_MAX = Math.pow(2, 53); + +/** + * Any integer down to -2^53 can be precisely represented by a double. + * @internal + */ +export const JS_INT_MIN = -Math.pow(2, 53); + +/** Number BSON Type @internal */ +export const BSON_DATA_NUMBER = 1; + +/** String BSON Type @internal */ +export const BSON_DATA_STRING = 2; + +/** Object BSON Type @internal */ +export const BSON_DATA_OBJECT = 3; + +/** Array BSON Type @internal */ +export const BSON_DATA_ARRAY = 4; + +/** Binary BSON Type @internal */ +export const BSON_DATA_BINARY = 5; + +/** Binary BSON Type @internal */ +export const BSON_DATA_UNDEFINED = 6; + +/** ObjectId BSON Type @internal */ +export const BSON_DATA_OID = 7; + +/** Boolean BSON Type @internal */ +export const BSON_DATA_BOOLEAN = 8; + +/** Date BSON Type @internal */ +export const BSON_DATA_DATE = 9; + +/** null BSON Type @internal */ +export const BSON_DATA_NULL = 10; + +/** RegExp BSON Type @internal */ +export const BSON_DATA_REGEXP = 11; + +/** Code BSON Type @internal */ +export const BSON_DATA_DBPOINTER = 12; + +/** Code BSON Type @internal */ +export const BSON_DATA_CODE = 13; + +/** Symbol BSON Type @internal */ +export const BSON_DATA_SYMBOL = 14; + +/** Code with Scope BSON Type @internal */ +export const BSON_DATA_CODE_W_SCOPE = 15; + +/** 32 bit Integer BSON Type @internal */ +export const BSON_DATA_INT = 16; + +/** Timestamp BSON Type @internal */ +export const BSON_DATA_TIMESTAMP = 17; + +/** Long BSON Type @internal */ +export const BSON_DATA_LONG = 18; + +/** Decimal128 BSON Type @internal */ +export const BSON_DATA_DECIMAL128 = 19; + +/** MinKey BSON Type @internal */ +export const BSON_DATA_MIN_KEY = 0xff; + +/** MaxKey BSON Type @internal */ +export const BSON_DATA_MAX_KEY = 0x7f; + +/** Binary Default Type @internal */ +export const BSON_BINARY_SUBTYPE_DEFAULT = 0; + +/** Binary Function Type @internal */ +export const BSON_BINARY_SUBTYPE_FUNCTION = 1; + +/** Binary Byte Array Type @internal */ +export const BSON_BINARY_SUBTYPE_BYTE_ARRAY = 2; + +/** Binary Deprecated UUID Type @deprecated Please use BSON_BINARY_SUBTYPE_UUID_NEW @internal */ +export const BSON_BINARY_SUBTYPE_UUID = 3; + +/** Binary UUID Type @internal */ +export const BSON_BINARY_SUBTYPE_UUID_NEW = 4; + +/** Binary MD5 Type @internal */ +export const BSON_BINARY_SUBTYPE_MD5 = 5; + +/** Encrypted BSON type @internal */ +export const BSON_BINARY_SUBTYPE_ENCRYPTED = 6; + +/** Column BSON type @internal */ +export const BSON_BINARY_SUBTYPE_COLUMN = 7; + +/** Sensitive BSON type @internal */ +export const BSON_BINARY_SUBTYPE_SENSITIVE = 8; + +/** Binary User Defined Type @internal */ +export const BSON_BINARY_SUBTYPE_USER_DEFINED = 128; + +/** @public */ +export const BSONType = Object.freeze({ + double: 1, + string: 2, + object: 3, + array: 4, + binData: 5, + undefined: 6, + objectId: 7, + bool: 8, + date: 9, + null: 10, + regex: 11, + dbPointer: 12, + javascript: 13, + symbol: 14, + javascriptWithScope: 15, + int: 16, + timestamp: 17, + long: 18, + decimal: 19, + minKey: -1, + maxKey: 127 +} as const); + +/** @public */ +export type BSONType = (typeof BSONType)[keyof typeof BSONType]; diff --git a/user-service/node_modules/bson/src/db_ref.ts b/user-service/node_modules/bson/src/db_ref.ts new file mode 100644 index 0000000000..fbb751f8aa --- /dev/null +++ b/user-service/node_modules/bson/src/db_ref.ts @@ -0,0 +1,128 @@ +import type { Document } from './bson'; +import { BSONValue } from './bson_value'; +import type { EJSONOptions } from './extended_json'; +import type { ObjectId } from './objectid'; +import { type InspectFn, defaultInspect } from './parser/utils'; + +/** @public */ +export interface DBRefLike { + $ref: string; + $id: ObjectId; + $db?: string; +} + +/** @internal */ +export function isDBRefLike(value: unknown): value is DBRefLike { + return ( + value != null && + typeof value === 'object' && + '$id' in value && + value.$id != null && + '$ref' in value && + typeof value.$ref === 'string' && + // If '$db' is defined it MUST be a string, otherwise it should be absent + (!('$db' in value) || ('$db' in value && typeof value.$db === 'string')) + ); +} + +/** + * A class representation of the BSON DBRef type. + * @public + * @category BSONType + */ +export class DBRef extends BSONValue { + get _bsontype(): 'DBRef' { + return 'DBRef'; + } + + collection!: string; + oid!: ObjectId; + db?: string; + fields!: Document; + + /** + * @param collection - the collection name. + * @param oid - the reference ObjectId. + * @param db - optional db name, if omitted the reference is local to the current db. + */ + constructor(collection: string, oid: ObjectId, db?: string, fields?: Document) { + super(); + // check if namespace has been provided + const parts = collection.split('.'); + if (parts.length === 2) { + db = parts.shift(); + collection = parts.shift()!; + } + + this.collection = collection; + this.oid = oid; + this.db = db; + this.fields = fields || {}; + } + + // Property provided for compatibility with the 1.x parser + // the 1.x parser used a "namespace" property, while 4.x uses "collection" + + /** @internal */ + get namespace(): string { + return this.collection; + } + + set namespace(value: string) { + this.collection = value; + } + + toJSON(): DBRefLike & Document { + const o = Object.assign( + { + $ref: this.collection, + $id: this.oid + }, + this.fields + ); + + if (this.db != null) o.$db = this.db; + return o; + } + + /** @internal */ + toExtendedJSON(options?: EJSONOptions): DBRefLike { + options = options || {}; + let o: DBRefLike = { + $ref: this.collection, + $id: this.oid + }; + + if (options.legacy) { + return o; + } + + if (this.db) o.$db = this.db; + o = Object.assign(o, this.fields); + return o; + } + + /** @internal */ + static fromExtendedJSON(doc: DBRefLike): DBRef { + const copy = Object.assign({}, doc) as Partial; + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(doc.$ref, doc.$id, doc.$db, copy); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + + const args = [ + inspect(this.namespace, options), + inspect(this.oid, options), + ...(this.db ? [inspect(this.db, options)] : []), + ...(Object.keys(this.fields).length > 0 ? [inspect(this.fields, options)] : []) + ]; + + args[1] = inspect === defaultInspect ? `new ObjectId(${args[1]})` : args[1]; + + return `new DBRef(${args.join(', ')})`; + } +} diff --git a/user-service/node_modules/bson/src/decimal128.ts b/user-service/node_modules/bson/src/decimal128.ts new file mode 100644 index 0000000000..806938e30e --- /dev/null +++ b/user-service/node_modules/bson/src/decimal128.ts @@ -0,0 +1,855 @@ +import { BSONValue } from './bson_value'; +import { BSONError } from './error'; +import { Long } from './long'; +import { type InspectFn, defaultInspect, isUint8Array } from './parser/utils'; +import { ByteUtils } from './utils/byte_utils'; + +const PARSE_STRING_REGEXP = /^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/; +const PARSE_INF_REGEXP = /^(\+|-)?(Infinity|inf)$/i; +const PARSE_NAN_REGEXP = /^(\+|-)?NaN$/i; + +const EXPONENT_MAX = 6111; +const EXPONENT_MIN = -6176; +const EXPONENT_BIAS = 6176; +const MAX_DIGITS = 34; + +// Nan value bits as 32 bit values (due to lack of longs) +const NAN_BUFFER = ByteUtils.fromNumberArray( + [ + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ].reverse() +); +// Infinity value bits 32 bit values (due to lack of longs) +const INF_NEGATIVE_BUFFER = ByteUtils.fromNumberArray( + [ + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ].reverse() +); +const INF_POSITIVE_BUFFER = ByteUtils.fromNumberArray( + [ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ].reverse() +); + +const EXPONENT_REGEX = /^([-+])?(\d+)?$/; + +// Extract least significant 5 bits +const COMBINATION_MASK = 0x1f; +// Extract least significant 14 bits +const EXPONENT_MASK = 0x3fff; +// Value of combination field for Inf +const COMBINATION_INFINITY = 30; +// Value of combination field for NaN +const COMBINATION_NAN = 31; + +// Detect if the value is a digit +function isDigit(value: string): boolean { + return !isNaN(parseInt(value, 10)); +} + +// Divide two uint128 values +function divideu128(value: { parts: [number, number, number, number] }) { + const DIVISOR = Long.fromNumber(1000 * 1000 * 1000); + let _rem = Long.fromNumber(0); + + if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { + return { quotient: value, rem: _rem }; + } + + for (let i = 0; i <= 3; i++) { + // Adjust remainder to match value of next dividend + _rem = _rem.shiftLeft(32); + // Add the divided to _rem + _rem = _rem.add(new Long(value.parts[i], 0)); + value.parts[i] = _rem.div(DIVISOR).low; + _rem = _rem.modulo(DIVISOR); + } + + return { quotient: value, rem: _rem }; +} + +// Multiply two Long values and return the 128 bit value +function multiply64x2(left: Long, right: Long): { high: Long; low: Long } { + if (!left && !right) { + return { high: Long.fromNumber(0), low: Long.fromNumber(0) }; + } + + const leftHigh = left.shiftRightUnsigned(32); + const leftLow = new Long(left.getLowBits(), 0); + const rightHigh = right.shiftRightUnsigned(32); + const rightLow = new Long(right.getLowBits(), 0); + + let productHigh = leftHigh.multiply(rightHigh); + let productMid = leftHigh.multiply(rightLow); + const productMid2 = leftLow.multiply(rightHigh); + let productLow = leftLow.multiply(rightLow); + + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productMid = new Long(productMid.getLowBits(), 0) + .add(productMid2) + .add(productLow.shiftRightUnsigned(32)); + + productHigh = productHigh.add(productMid.shiftRightUnsigned(32)); + productLow = productMid.shiftLeft(32).add(new Long(productLow.getLowBits(), 0)); + + // Return the 128 bit result + return { high: productHigh, low: productLow }; +} + +function lessThan(left: Long, right: Long): boolean { + // Make values unsigned + const uhleft = left.high >>> 0; + const uhright = right.high >>> 0; + + // Compare high bits first + if (uhleft < uhright) { + return true; + } else if (uhleft === uhright) { + const ulleft = left.low >>> 0; + const ulright = right.low >>> 0; + if (ulleft < ulright) return true; + } + + return false; +} + +function invalidErr(string: string, message: string) { + throw new BSONError(`"${string}" is not a valid Decimal128 string - ${message}`); +} + +/** @public */ +export interface Decimal128Extended { + $numberDecimal: string; +} + +/** + * A class representation of the BSON Decimal128 type. + * @public + * @category BSONType + */ +export class Decimal128 extends BSONValue { + get _bsontype(): 'Decimal128' { + return 'Decimal128'; + } + + readonly bytes!: Uint8Array; + + /** + * @param bytes - a buffer containing the raw Decimal128 bytes in little endian order, + * or a string representation as returned by .toString() + */ + constructor(bytes: Uint8Array | string) { + super(); + if (typeof bytes === 'string') { + this.bytes = Decimal128.fromString(bytes).bytes; + } else if (isUint8Array(bytes)) { + if (bytes.byteLength !== 16) { + throw new BSONError('Decimal128 must take a Buffer of 16 bytes'); + } + this.bytes = bytes; + } else { + throw new BSONError('Decimal128 must take a Buffer or string'); + } + } + + /** + * Create a Decimal128 instance from a string representation + * + * @param representation - a numeric string representation. + */ + static fromString(representation: string): Decimal128 { + return Decimal128._fromString(representation, { allowRounding: false }); + } + + /** + * Create a Decimal128 instance from a string representation, allowing for rounding to 34 + * significant digits + * + * @example Example of a number that will be rounded + * ```ts + * > let d = Decimal128.fromString('37.499999999999999196428571428571375') + * Uncaught: + * BSONError: "37.499999999999999196428571428571375" is not a valid Decimal128 string - inexact rounding + * at invalidErr (/home/wajames/js-bson/lib/bson.cjs:1402:11) + * at Decimal128.fromStringInternal (/home/wajames/js-bson/lib/bson.cjs:1633:25) + * at Decimal128.fromString (/home/wajames/js-bson/lib/bson.cjs:1424:27) + * + * > d = Decimal128.fromStringWithRounding('37.499999999999999196428571428571375') + * new Decimal128("37.49999999999999919642857142857138") + * ``` + * @param representation - a numeric string representation. + */ + static fromStringWithRounding(representation: string): Decimal128 { + return Decimal128._fromString(representation, { allowRounding: true }); + } + + private static _fromString(representation: string, options: { allowRounding: boolean }) { + // Parse state tracking + let isNegative = false; + let sawSign = false; + let sawRadix = false; + let foundNonZero = false; + + // Total number of significant digits (no leading or trailing zero) + let significantDigits = 0; + // Total number of significand digits read + let nDigitsRead = 0; + // Total number of digits (no leading zeros) + let nDigits = 0; + // The number of the digits after radix + let radixPosition = 0; + // The index of the first non-zero in *str* + let firstNonZero = 0; + + // Digits Array + const digits = [0]; + // The number of digits in digits + let nDigitsStored = 0; + // Insertion pointer for digits + let digitsInsert = 0; + // The index of the last digit + let lastDigit = 0; + + // Exponent + let exponent = 0; + // The high 17 digits of the significand + let significandHigh = new Long(0, 0); + // The low 17 digits of the significand + let significandLow = new Long(0, 0); + // The biased exponent + let biasedExponent = 0; + + // Read index + let index = 0; + + // Naively prevent against REDOS attacks. + // TODO: implementing a custom parsing for this, or refactoring the regex would yield + // further gains. + if (representation.length >= 7000) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + + // Results + const stringMatch = representation.match(PARSE_STRING_REGEXP); + const infMatch = representation.match(PARSE_INF_REGEXP); + const nanMatch = representation.match(PARSE_NAN_REGEXP); + + // Validate the string + if ((!stringMatch && !infMatch && !nanMatch) || representation.length === 0) { + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + } + + if (stringMatch) { + // full_match = stringMatch[0] + // sign = stringMatch[1] + + const unsignedNumber = stringMatch[2]; + // stringMatch[3] is undefined if a whole number (ex "1", 12") + // but defined if a number w/ decimal in it (ex "1.0, 12.2") + + const e = stringMatch[4]; + const expSign = stringMatch[5]; + const expNumber = stringMatch[6]; + + // they provided e, but didn't give an exponent number. for ex "1e" + if (e && expNumber === undefined) invalidErr(representation, 'missing exponent power'); + + // they provided e, but didn't give a number before it. for ex "e1" + if (e && unsignedNumber === undefined) invalidErr(representation, 'missing exponent base'); + + if (e === undefined && (expSign || expNumber)) { + invalidErr(representation, 'missing e before exponent'); + } + } + + // Get the negative or positive sign + if (representation[index] === '+' || representation[index] === '-') { + sawSign = true; + isNegative = representation[index++] === '-'; + } + + // Check if user passed Infinity or NaN + if (!isDigit(representation[index]) && representation[index] !== '.') { + if (representation[index] === 'i' || representation[index] === 'I') { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } else if (representation[index] === 'N') { + return new Decimal128(NAN_BUFFER); + } + } + + // Read all the digits + while (isDigit(representation[index]) || representation[index] === '.') { + if (representation[index] === '.') { + if (sawRadix) invalidErr(representation, 'contains multiple periods'); + + sawRadix = true; + index = index + 1; + continue; + } + + if (nDigitsStored < MAX_DIGITS) { + if (representation[index] !== '0' || foundNonZero) { + if (!foundNonZero) { + firstNonZero = nDigitsRead; + } + + foundNonZero = true; + + // Only store 34 digits + digits[digitsInsert++] = parseInt(representation[index], 10); + nDigitsStored = nDigitsStored + 1; + } + } + + if (foundNonZero) nDigits = nDigits + 1; + if (sawRadix) radixPosition = radixPosition + 1; + + nDigitsRead = nDigitsRead + 1; + index = index + 1; + } + + if (sawRadix && !nDigitsRead) + throw new BSONError('' + representation + ' not a valid Decimal128 string'); + + // Read exponent if exists + if (representation[index] === 'e' || representation[index] === 'E') { + // Read exponent digits + const match = representation.substr(++index).match(EXPONENT_REGEX); + + // No digits read + if (!match || !match[2]) return new Decimal128(NAN_BUFFER); + + // Get exponent + exponent = parseInt(match[0], 10); + + // Adjust the index + index = index + match[0].length; + } + + // Return not a number + if (representation[index]) return new Decimal128(NAN_BUFFER); + + // Done reading input + // Find first non-zero digit in digits + if (!nDigitsStored) { + digits[0] = 0; + nDigits = 1; + nDigitsStored = 1; + significantDigits = 0; + } else { + lastDigit = nDigitsStored - 1; + significantDigits = nDigits; + if (significantDigits !== 1) { + while ( + representation[ + firstNonZero + significantDigits - 1 + Number(sawSign) + Number(sawRadix) + ] === '0' + ) { + significantDigits = significantDigits - 1; + } + } + } + + // Normalization of exponent + // Correct exponent based on radix position, and shift significand as needed + // to represent user input + + // Overflow prevention + if (exponent <= radixPosition && radixPosition > exponent + (1 << 14)) { + exponent = EXPONENT_MIN; + } else { + exponent = exponent - radixPosition; + } + + // Attempt to normalize the exponent + while (exponent > EXPONENT_MAX) { + // Shift exponent to significand and decrease + lastDigit = lastDigit + 1; + if (lastDigit >= MAX_DIGITS) { + // Check if we have a zero then just hard clamp, otherwise fail + if (significantDigits === 0) { + exponent = EXPONENT_MAX; + break; + } + + invalidErr(representation, 'overflow'); + } + exponent = exponent - 1; + } + + if (options.allowRounding) { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + // Shift last digit. can only do this if < significant digits than # stored. + if (lastDigit === 0 && significantDigits < nDigitsStored) { + exponent = EXPONENT_MIN; + significantDigits = 0; + break; + } + + if (nDigitsStored < nDigits) { + // adjust to match digits not stored + nDigits = nDigits - 1; + } else { + // adjust to round + lastDigit = lastDigit - 1; + } + + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } else { + // Check if we have a zero then just hard clamp, otherwise fail + const digitsString = digits.join(''); + if (digitsString.match(/^0+$/)) { + exponent = EXPONENT_MAX; + break; + } + invalidErr(representation, 'overflow'); + } + } + + // Round + // We've normalized the exponent, but might still need to round. + if (lastDigit + 1 < significantDigits) { + let endOfString = nDigitsRead; + + // If we have seen a radix point, 'string' is 1 longer than we have + // documented with ndigits_read, so inc the position of the first nonzero + // digit and the position that digits are read to. + if (sawRadix) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + // if negative, we need to increment again to account for - sign at start. + if (sawSign) { + firstNonZero = firstNonZero + 1; + endOfString = endOfString + 1; + } + + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + let roundBit = 0; + + if (roundDigit >= 5) { + roundBit = 1; + if (roundDigit === 5) { + roundBit = digits[lastDigit] % 2 === 1 ? 1 : 0; + for (let i = firstNonZero + lastDigit + 2; i < endOfString; i++) { + if (parseInt(representation[i], 10)) { + roundBit = 1; + break; + } + } + } + } + + if (roundBit) { + let dIdx = lastDigit; + + for (; dIdx >= 0; dIdx--) { + if (++digits[dIdx] > 9) { + digits[dIdx] = 0; + + // overflowed most significant digit + if (dIdx === 0) { + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + digits[dIdx] = 1; + } else { + return new Decimal128(isNegative ? INF_NEGATIVE_BUFFER : INF_POSITIVE_BUFFER); + } + } + } else { + break; + } + } + } + } + } else { + while (exponent < EXPONENT_MIN || nDigitsStored < nDigits) { + // Shift last digit. can only do this if < significant digits than # stored. + if (lastDigit === 0) { + if (significantDigits === 0) { + exponent = EXPONENT_MIN; + break; + } + + invalidErr(representation, 'exponent underflow'); + } + + if (nDigitsStored < nDigits) { + if ( + representation[nDigits - 1 + Number(sawSign) + Number(sawRadix)] !== '0' && + significantDigits !== 0 + ) { + invalidErr(representation, 'inexact rounding'); + } + // adjust to match digits not stored + nDigits = nDigits - 1; + } else { + if (digits[lastDigit] !== 0) { + invalidErr(representation, 'inexact rounding'); + } + // adjust to round + lastDigit = lastDigit - 1; + } + + if (exponent < EXPONENT_MAX) { + exponent = exponent + 1; + } else { + invalidErr(representation, 'overflow'); + } + } + + // Round + // We've normalized the exponent, but might still need to round. + if (lastDigit + 1 < significantDigits) { + // If we have seen a radix point, 'string' is 1 longer than we have + // documented with ndigits_read, so inc the position of the first nonzero + // digit and the position that digits are read to. + if (sawRadix) { + firstNonZero = firstNonZero + 1; + } + // if saw sign, we need to increment again to account for - or + sign at start. + if (sawSign) { + firstNonZero = firstNonZero + 1; + } + + const roundDigit = parseInt(representation[firstNonZero + lastDigit + 1], 10); + + if (roundDigit !== 0) { + invalidErr(representation, 'inexact rounding'); + } + } + } + + // Encode significand + // The high 17 digits of the significand + significandHigh = Long.fromNumber(0); + // The low 17 digits of the significand + significandLow = Long.fromNumber(0); + + // read a zero + if (significantDigits === 0) { + significandHigh = Long.fromNumber(0); + significandLow = Long.fromNumber(0); + } else if (lastDigit < 17) { + let dIdx = 0; + significandLow = Long.fromNumber(digits[dIdx++]); + significandHigh = new Long(0, 0); + + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } else { + let dIdx = 0; + significandHigh = Long.fromNumber(digits[dIdx++]); + + for (; dIdx <= lastDigit - 17; dIdx++) { + significandHigh = significandHigh.multiply(Long.fromNumber(10)); + significandHigh = significandHigh.add(Long.fromNumber(digits[dIdx])); + } + + significandLow = Long.fromNumber(digits[dIdx++]); + + for (; dIdx <= lastDigit; dIdx++) { + significandLow = significandLow.multiply(Long.fromNumber(10)); + significandLow = significandLow.add(Long.fromNumber(digits[dIdx])); + } + } + + const significand = multiply64x2(significandHigh, Long.fromString('100000000000000000')); + significand.low = significand.low.add(significandLow); + + if (lessThan(significand.low, significandLow)) { + significand.high = significand.high.add(Long.fromNumber(1)); + } + + // Biased exponent + biasedExponent = exponent + EXPONENT_BIAS; + const dec = { low: Long.fromNumber(0), high: Long.fromNumber(0) }; + + // Encode combination, exponent, and significand. + if ( + significand.high.shiftRightUnsigned(49).and(Long.fromNumber(1)).equals(Long.fromNumber(1)) + ) { + // Encode '11' into bits 1 to 3 + dec.high = dec.high.or(Long.fromNumber(0x3).shiftLeft(61)); + dec.high = dec.high.or( + Long.fromNumber(biasedExponent).and(Long.fromNumber(0x3fff).shiftLeft(47)) + ); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x7fffffffffff))); + } else { + dec.high = dec.high.or(Long.fromNumber(biasedExponent & 0x3fff).shiftLeft(49)); + dec.high = dec.high.or(significand.high.and(Long.fromNumber(0x1ffffffffffff))); + } + + dec.low = significand.low; + + // Encode sign + if (isNegative) { + dec.high = dec.high.or(Long.fromString('9223372036854775808')); + } + + // Encode into a buffer + const buffer = ByteUtils.allocateUnsafe(16); + index = 0; + + // Encode the low 64 bits of the decimal + // Encode low bits + buffer[index++] = dec.low.low & 0xff; + buffer[index++] = (dec.low.low >> 8) & 0xff; + buffer[index++] = (dec.low.low >> 16) & 0xff; + buffer[index++] = (dec.low.low >> 24) & 0xff; + // Encode high bits + buffer[index++] = dec.low.high & 0xff; + buffer[index++] = (dec.low.high >> 8) & 0xff; + buffer[index++] = (dec.low.high >> 16) & 0xff; + buffer[index++] = (dec.low.high >> 24) & 0xff; + + // Encode the high 64 bits of the decimal + // Encode low bits + buffer[index++] = dec.high.low & 0xff; + buffer[index++] = (dec.high.low >> 8) & 0xff; + buffer[index++] = (dec.high.low >> 16) & 0xff; + buffer[index++] = (dec.high.low >> 24) & 0xff; + // Encode high bits + buffer[index++] = dec.high.high & 0xff; + buffer[index++] = (dec.high.high >> 8) & 0xff; + buffer[index++] = (dec.high.high >> 16) & 0xff; + buffer[index++] = (dec.high.high >> 24) & 0xff; + + // Return the new Decimal128 + return new Decimal128(buffer); + } + /** Create a string representation of the raw Decimal128 value */ + toString(): string { + // Note: bits in this routine are referred to starting at 0, + // from the sign bit, towards the coefficient. + + // decoded biased exponent (14 bits) + let biased_exponent; + // the number of significand digits + let significand_digits = 0; + // the base-10 digits in the significand + const significand = new Array(36); + for (let i = 0; i < significand.length; i++) significand[i] = 0; + // read pointer into significand + let index = 0; + + // true if the number is zero + let is_zero = false; + + // the most significant significand bits (50-46) + let significand_msb; + // temporary storage for significand decoding + let significand128: { parts: [number, number, number, number] } = { parts: [0, 0, 0, 0] }; + // indexing variables + let j, k; + + // Output string + const string: string[] = []; + + // Unpack index + index = 0; + + // Buffer reference + const buffer = this.bytes; + + // Unpack the low 64bits into a long + // bits 96 - 127 + const low = + buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + // bits 64 - 95 + const midl = + buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + + // Unpack the high 64bits into a long + // bits 32 - 63 + const midh = + buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + // bits 0 - 31 + const high = + buffer[index++] | (buffer[index++] << 8) | (buffer[index++] << 16) | (buffer[index++] << 24); + + // Unpack index + index = 0; + + // Create the state of the decimal + const dec = { + low: new Long(low, midl), + high: new Long(midh, high) + }; + + if (dec.high.lessThan(Long.ZERO)) { + string.push('-'); + } + + // Decode combination field and exponent + // bits 1 - 5 + const combination = (high >> 26) & COMBINATION_MASK; + + if (combination >> 3 === 3) { + // Check for 'special' values + if (combination === COMBINATION_INFINITY) { + return string.join('') + 'Infinity'; + } else if (combination === COMBINATION_NAN) { + return 'NaN'; + } else { + biased_exponent = (high >> 15) & EXPONENT_MASK; + significand_msb = 0x08 + ((high >> 14) & 0x01); + } + } else { + significand_msb = (high >> 14) & 0x07; + biased_exponent = (high >> 17) & EXPONENT_MASK; + } + + // unbiased exponent + const exponent = biased_exponent - EXPONENT_BIAS; + + // Create string of significand digits + + // Convert the 114-bit binary number represented by + // (significand_high, significand_low) to at most 34 decimal + // digits through modulo and division. + significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xf) << 14); + significand128.parts[1] = midh; + significand128.parts[2] = midl; + significand128.parts[3] = low; + + if ( + significand128.parts[0] === 0 && + significand128.parts[1] === 0 && + significand128.parts[2] === 0 && + significand128.parts[3] === 0 + ) { + is_zero = true; + } else { + for (k = 3; k >= 0; k--) { + let least_digits = 0; + // Perform the divide + const result = divideu128(significand128); + significand128 = result.quotient; + least_digits = result.rem.low; + + // We now have the 9 least significant digits (in base 2). + // Convert and output to string. + if (!least_digits) continue; + + for (j = 8; j >= 0; j--) { + // significand[k * 9 + j] = Math.round(least_digits % 10); + significand[k * 9 + j] = least_digits % 10; + // least_digits = Math.round(least_digits / 10); + least_digits = Math.floor(least_digits / 10); + } + } + } + + // Output format options: + // Scientific - [-]d.dddE(+/-)dd or [-]dE(+/-)dd + // Regular - ddd.ddd + + if (is_zero) { + significand_digits = 1; + significand[index] = 0; + } else { + significand_digits = 36; + while (!significand[index]) { + significand_digits = significand_digits - 1; + index = index + 1; + } + } + + // the exponent if scientific notation is used + const scientific_exponent = significand_digits - 1 + exponent; + + // The scientific exponent checks are dictated by the string conversion + // specification and are somewhat arbitrary cutoffs. + // + // We must check exponent > 0, because if this is the case, the number + // has trailing zeros. However, we *cannot* output these trailing zeros, + // because doing so would change the precision of the value, and would + // change stored data if the string converted number is round tripped. + if (scientific_exponent >= 34 || scientific_exponent <= -7 || exponent > 0) { + // Scientific format + + // if there are too many significant digits, we should just be treating numbers + // as + or - 0 and using the non-scientific exponent (this is for the "invalid + // representation should be treated as 0/-0" spec cases in decimal128-1.json) + if (significand_digits > 34) { + string.push(`${0}`); + if (exponent > 0) string.push(`E+${exponent}`); + else if (exponent < 0) string.push(`E${exponent}`); + return string.join(''); + } + + string.push(`${significand[index++]}`); + significand_digits = significand_digits - 1; + + if (significand_digits) { + string.push('.'); + } + + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + + // Exponent + string.push('E'); + if (scientific_exponent > 0) { + string.push(`+${scientific_exponent}`); + } else { + string.push(`${scientific_exponent}`); + } + } else { + // Regular format with no decimal place + if (exponent >= 0) { + for (let i = 0; i < significand_digits; i++) { + string.push(`${significand[index++]}`); + } + } else { + let radix_position = significand_digits + exponent; + + // non-zero digits before radix + if (radix_position > 0) { + for (let i = 0; i < radix_position; i++) { + string.push(`${significand[index++]}`); + } + } else { + string.push('0'); + } + + string.push('.'); + // add leading zeros after radix + while (radix_position++ < 0) { + string.push('0'); + } + + for (let i = 0; i < significand_digits - Math.max(radix_position - 1, 0); i++) { + string.push(`${significand[index++]}`); + } + } + } + + return string.join(''); + } + + toJSON(): Decimal128Extended { + return { $numberDecimal: this.toString() }; + } + + /** @internal */ + toExtendedJSON(): Decimal128Extended { + return { $numberDecimal: this.toString() }; + } + + /** @internal */ + static fromExtendedJSON(doc: Decimal128Extended): Decimal128 { + return Decimal128.fromString(doc.$numberDecimal); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + const d128string = inspect(this.toString(), options); + return `new Decimal128(${d128string})`; + } +} diff --git a/user-service/node_modules/bson/src/double.ts b/user-service/node_modules/bson/src/double.ts new file mode 100644 index 0000000000..4a3d129828 --- /dev/null +++ b/user-service/node_modules/bson/src/double.ts @@ -0,0 +1,115 @@ +import { BSONValue } from './bson_value'; +import { BSONError } from './error'; +import type { EJSONOptions } from './extended_json'; +import { type InspectFn, defaultInspect } from './parser/utils'; + +/** @public */ +export interface DoubleExtended { + $numberDouble: string; +} + +/** + * A class representation of the BSON Double type. + * @public + * @category BSONType + */ +export class Double extends BSONValue { + get _bsontype(): 'Double' { + return 'Double'; + } + + value!: number; + /** + * Create a Double type + * + * @param value - the number we want to represent as a double. + */ + constructor(value: number) { + super(); + if ((value as unknown) instanceof Number) { + value = value.valueOf(); + } + + this.value = +value; + } + + /** + * Attempt to create an double type from string. + * + * This method will throw a BSONError on any string input that is not representable as a IEEE-754 64-bit double. + * Notably, this method will also throw on the following string formats: + * - Strings in non-decimal and non-exponential formats (binary, hex, or octal digits) + * - Strings with characters other than numeric, floating point, or leading sign characters (Note: 'Infinity', '-Infinity', and 'NaN' input strings are still allowed) + * - Strings with leading and/or trailing whitespace + * + * Strings with leading zeros, however, are also allowed + * + * @param value - the string we want to represent as a double. + */ + static fromString(value: string): Double { + const coercedValue = Number(value); + + if (value === 'NaN') return new Double(NaN); + if (value === 'Infinity') return new Double(Infinity); + if (value === '-Infinity') return new Double(-Infinity); + + if (!Number.isFinite(coercedValue)) { + throw new BSONError(`Input: ${value} is not representable as a Double`); + } + if (value.trim() !== value) { + throw new BSONError(`Input: '${value}' contains whitespace`); + } + if (value === '') { + throw new BSONError(`Input is an empty string`); + } + if (/[^-0-9.+eE]/.test(value)) { + throw new BSONError(`Input: '${value}' is not in decimal or exponential notation`); + } + return new Double(coercedValue); + } + + /** + * Access the number value. + * + * @returns returns the wrapped double number. + */ + valueOf(): number { + return this.value; + } + + toJSON(): number { + return this.value; + } + + toString(radix?: number): string { + return this.value.toString(radix); + } + + /** @internal */ + toExtendedJSON(options?: EJSONOptions): number | DoubleExtended { + if (options && (options.legacy || (options.relaxed && isFinite(this.value)))) { + return this.value; + } + + if (Object.is(Math.sign(this.value), -0)) { + // NOTE: JavaScript has +0 and -0, apparently to model limit calculations. If a user + // explicitly provided `-0` then we need to ensure the sign makes it into the output + return { $numberDouble: '-0.0' }; + } + + return { + $numberDouble: Number.isInteger(this.value) ? this.value.toFixed(1) : this.value.toString() + }; + } + + /** @internal */ + static fromExtendedJSON(doc: DoubleExtended, options?: EJSONOptions): number | Double { + const doubleValue = parseFloat(doc.$numberDouble); + return options && options.relaxed ? doubleValue : new Double(doubleValue); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + return `new Double(${inspect(this.value, options)})`; + } +} diff --git a/user-service/node_modules/bson/src/error.ts b/user-service/node_modules/bson/src/error.ts new file mode 100644 index 0000000000..ef5184a4ac --- /dev/null +++ b/user-service/node_modules/bson/src/error.ts @@ -0,0 +1,105 @@ +import { BSON_MAJOR_VERSION } from './constants'; + +/** + * @public + * @category Error + * + * `BSONError` objects are thrown when BSON encounters an error. + * + * This is the parent class for all the other errors thrown by this library. + */ +export class BSONError extends Error { + /** + * @internal + * The underlying algorithm for isBSONError may change to improve how strict it is + * about determining if an input is a BSONError. But it must remain backwards compatible + * with previous minors & patches of the current major version. + */ + protected get bsonError(): true { + return true; + } + + override get name(): string { + return 'BSONError'; + } + + constructor(message: string, options?: { cause?: unknown }) { + super(message, options); + } + + /** + * @public + * + * All errors thrown from the BSON library inherit from `BSONError`. + * This method can assist with determining if an error originates from the BSON library + * even if it does not pass an `instanceof` check against this class' constructor. + * + * @param value - any javascript value that needs type checking + */ + public static isBSONError(value: unknown): value is BSONError { + return ( + value != null && + typeof value === 'object' && + 'bsonError' in value && + value.bsonError === true && + // Do not access the following properties, just check existence + 'name' in value && + 'message' in value && + 'stack' in value + ); + } +} + +/** + * @public + * @category Error + */ +export class BSONVersionError extends BSONError { + get name(): 'BSONVersionError' { + return 'BSONVersionError'; + } + + constructor() { + super(`Unsupported BSON version, bson types must be from bson ${BSON_MAJOR_VERSION}.x.x`); + } +} + +/** + * @public + * @category Error + * + * An error generated when BSON functions encounter an unexpected input + * or reaches an unexpected/invalid internal state + * + */ +export class BSONRuntimeError extends BSONError { + get name(): 'BSONRuntimeError' { + return 'BSONRuntimeError'; + } + + constructor(message: string) { + super(message); + } +} + +/** + * @public + * @category Error + * + * @experimental + * + * An error generated when BSON bytes are invalid. + * Reports the offset the parser was able to reach before encountering the error. + */ +export class BSONOffsetError extends BSONError { + public get name(): 'BSONOffsetError' { + return 'BSONOffsetError'; + } + + public offset: number; + + constructor(message: string, offset: number, options?: { cause?: unknown }) { + super(`${message}. offset: ${offset}`, options); + this.offset = offset; + } +} diff --git a/user-service/node_modules/bson/src/extended_json.ts b/user-service/node_modules/bson/src/extended_json.ts new file mode 100644 index 0000000000..eb08b3c1f0 --- /dev/null +++ b/user-service/node_modules/bson/src/extended_json.ts @@ -0,0 +1,515 @@ +import { Binary } from './binary'; +import type { Document } from './bson'; +import { Code } from './code'; +import { + BSON_INT32_MAX, + BSON_INT32_MIN, + BSON_INT64_MAX, + BSON_INT64_MIN, + BSON_MAJOR_VERSION +} from './constants'; +import { DBRef, isDBRefLike } from './db_ref'; +import { Decimal128 } from './decimal128'; +import { Double } from './double'; +import { BSONError, BSONRuntimeError, BSONVersionError } from './error'; +import { Int32 } from './int_32'; +import { Long } from './long'; +import { MaxKey } from './max_key'; +import { MinKey } from './min_key'; +import { ObjectId } from './objectid'; +import { isDate, isRegExp, isMap } from './parser/utils'; +import { BSONRegExp } from './regexp'; +import { BSONSymbol } from './symbol'; +import { Timestamp } from './timestamp'; + +/** @public */ +export type EJSONOptions = { + /** + * Output using the Extended JSON v1 spec + * @defaultValue `false` + */ + legacy?: boolean; + /** + * Enable Extended JSON's `relaxed` mode, which attempts to return native JS types where possible, rather than BSON types + * @defaultValue `false` */ + relaxed?: boolean; + /** + * Enable native bigint support + * @defaultValue `false` + */ + useBigInt64?: boolean; +}; + +/** @internal */ +type BSONType = + | Binary + | Code + | DBRef + | Decimal128 + | Double + | Int32 + | Long + | MaxKey + | MinKey + | ObjectId + | BSONRegExp + | BSONSymbol + | Timestamp; + +function isBSONType(value: unknown): value is BSONType { + return ( + value != null && + typeof value === 'object' && + '_bsontype' in value && + typeof value._bsontype === 'string' + ); +} + +// all the types where we don't need to do any special processing and can just pass the EJSON +//straight to type.fromExtendedJSON +const keysToCodecs = { + $oid: ObjectId, + $binary: Binary, + $uuid: Binary, + $symbol: BSONSymbol, + $numberInt: Int32, + $numberDecimal: Decimal128, + $numberDouble: Double, + $numberLong: Long, + $minKey: MinKey, + $maxKey: MaxKey, + $regex: BSONRegExp, + $regularExpression: BSONRegExp, + $timestamp: Timestamp +} as const; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function deserializeValue(value: any, options: EJSONOptions = {}) { + if (typeof value === 'number') { + // TODO(NODE-4377): EJSON js number handling diverges from BSON + const in32BitRange = value <= BSON_INT32_MAX && value >= BSON_INT32_MIN; + const in64BitRange = value <= BSON_INT64_MAX && value >= BSON_INT64_MIN; + + if (options.relaxed || options.legacy) { + return value; + } + + if (Number.isInteger(value) && !Object.is(value, -0)) { + // interpret as being of the smallest BSON integer type that can represent the number exactly + if (in32BitRange) { + return new Int32(value); + } + if (in64BitRange) { + if (options.useBigInt64) { + // eslint-disable-next-line no-restricted-globals -- This is allowed here as useBigInt64=true + return BigInt(value); + } + return Long.fromNumber(value); + } + } + + // If the number is a non-integer or out of integer range, should interpret as BSON Double. + return new Double(value); + } + + // from here on out we're looking for bson types, so bail if its not an object + if (value == null || typeof value !== 'object') return value; + + // upgrade deprecated undefined to null + if (value.$undefined) return null; + + const keys = Object.keys(value).filter( + k => k.startsWith('$') && value[k] != null + ) as (keyof typeof keysToCodecs)[]; + for (let i = 0; i < keys.length; i++) { + const c = keysToCodecs[keys[i]]; + if (c) return c.fromExtendedJSON(value, options); + } + + if (value.$date != null) { + const d = value.$date; + const date = new Date(); + + if (options.legacy) { + if (typeof d === 'number') date.setTime(d); + else if (typeof d === 'string') date.setTime(Date.parse(d)); + else if (typeof d === 'bigint') date.setTime(Number(d)); + else throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } else { + if (typeof d === 'string') date.setTime(Date.parse(d)); + else if (Long.isLong(d)) date.setTime(d.toNumber()); + else if (typeof d === 'number' && options.relaxed) date.setTime(d); + else if (typeof d === 'bigint') date.setTime(Number(d)); + else throw new BSONRuntimeError(`Unrecognized type for EJSON date: ${typeof d}`); + } + return date; + } + + if (value.$code != null) { + const copy = Object.assign({}, value); + if (value.$scope) { + copy.$scope = deserializeValue(value.$scope); + } + + return Code.fromExtendedJSON(value); + } + + if (isDBRefLike(value) || value.$dbPointer) { + const v = value.$ref ? value : value.$dbPointer; + + // we run into this in a "degenerate EJSON" case (with $id and $ref order flipped) + // because of the order JSON.parse goes through the document + if (v instanceof DBRef) return v; + + const dollarKeys = Object.keys(v).filter(k => k.startsWith('$')); + let valid = true; + dollarKeys.forEach(k => { + if (['$ref', '$id', '$db'].indexOf(k) === -1) valid = false; + }); + + // only make DBRef if $ keys are all valid + if (valid) return DBRef.fromExtendedJSON(v); + } + + return value; +} + +type EJSONSerializeOptions = EJSONOptions & { + seenObjects: { obj: unknown; propertyName: string }[]; +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function serializeArray(array: any[], options: EJSONSerializeOptions): any[] { + return array.map((v: unknown, index: number) => { + options.seenObjects.push({ propertyName: `index ${index}`, obj: null }); + try { + return serializeValue(v, options); + } finally { + options.seenObjects.pop(); + } + }); +} + +function getISOString(date: Date) { + const isoStr = date.toISOString(); + // we should only show milliseconds in timestamp if they're non-zero + return date.getUTCMilliseconds() !== 0 ? isoStr : isoStr.slice(0, -5) + 'Z'; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function serializeValue(value: any, options: EJSONSerializeOptions): any { + if (value instanceof Map || isMap(value)) { + const obj: Record = Object.create(null); + for (const [k, v] of value) { + if (typeof k !== 'string') { + throw new BSONError('Can only serialize maps with string keys'); + } + obj[k] = v; + } + + return serializeValue(obj, options); + } + + if ((typeof value === 'object' || typeof value === 'function') && value !== null) { + const index = options.seenObjects.findIndex(entry => entry.obj === value); + if (index !== -1) { + const props = options.seenObjects.map(entry => entry.propertyName); + const leadingPart = props + .slice(0, index) + .map(prop => `${prop} -> `) + .join(''); + const alreadySeen = props[index]; + const circularPart = + ' -> ' + + props + .slice(index + 1, props.length - 1) + .map(prop => `${prop} -> `) + .join(''); + const current = props[props.length - 1]; + const leadingSpace = ' '.repeat(leadingPart.length + alreadySeen.length / 2); + const dashes = '-'.repeat( + circularPart.length + (alreadySeen.length + current.length) / 2 - 1 + ); + + throw new BSONError( + 'Converting circular structure to EJSON:\n' + + ` ${leadingPart}${alreadySeen}${circularPart}${current}\n` + + ` ${leadingSpace}\\${dashes}/` + ); + } + options.seenObjects[options.seenObjects.length - 1].obj = value; + } + + if (Array.isArray(value)) return serializeArray(value, options); + + if (value === undefined) return null; + + if (value instanceof Date || isDate(value)) { + const dateNum = value.getTime(), + // is it in year range 1970-9999? + inRange = dateNum > -1 && dateNum < 253402318800000; + + if (options.legacy) { + return options.relaxed && inRange + ? { $date: value.getTime() } + : { $date: getISOString(value) }; + } + return options.relaxed && inRange + ? { $date: getISOString(value) } + : { $date: { $numberLong: value.getTime().toString() } }; + } + + if (typeof value === 'number' && (!options.relaxed || !isFinite(value))) { + if (Number.isInteger(value) && !Object.is(value, -0)) { + // interpret as being of the smallest BSON integer type that can represent the number exactly + if (value >= BSON_INT32_MIN && value <= BSON_INT32_MAX) { + return { $numberInt: value.toString() }; + } + if (value >= BSON_INT64_MIN && value <= BSON_INT64_MAX) { + // TODO(NODE-4377): EJSON js number handling diverges from BSON + return { $numberLong: value.toString() }; + } + } + return { $numberDouble: Object.is(value, -0) ? '-0.0' : value.toString() }; + } + + if (typeof value === 'bigint') { + /* eslint-disable no-restricted-globals -- This is allowed as we are accepting a bigint as input */ + if (!options.relaxed) { + return { $numberLong: BigInt.asIntN(64, value).toString() }; + } + return Number(BigInt.asIntN(64, value)); + /* eslint-enable */ + } + + if (value instanceof RegExp || isRegExp(value)) { + let flags = value.flags; + if (flags === undefined) { + const match = value.toString().match(/[gimuy]*$/); + if (match) { + flags = match[0]; + } + } + + const rx = new BSONRegExp(value.source, flags); + return rx.toExtendedJSON(options); + } + + if (value != null && typeof value === 'object') return serializeDocument(value, options); + return value; +} + +const BSON_TYPE_MAPPINGS = { + Binary: (o: Binary) => new Binary(o.value(), o.sub_type), + Code: (o: Code) => new Code(o.code, o.scope), + DBRef: (o: DBRef) => new DBRef(o.collection || o.namespace, o.oid, o.db, o.fields), // "namespace" for 1.x library backwards compat + Decimal128: (o: Decimal128) => new Decimal128(o.bytes), + Double: (o: Double) => new Double(o.value), + Int32: (o: Int32) => new Int32(o.value), + Long: ( + o: Long & { + low_: number; + high_: number; + unsigned_: boolean | undefined; + } + ) => + Long.fromBits( + // underscore variants for 1.x backwards compatibility + o.low != null ? o.low : o.low_, + o.low != null ? o.high : o.high_, + o.low != null ? o.unsigned : o.unsigned_ + ), + MaxKey: () => new MaxKey(), + MinKey: () => new MinKey(), + ObjectId: (o: ObjectId) => new ObjectId(o), + BSONRegExp: (o: BSONRegExp) => new BSONRegExp(o.pattern, o.options), + BSONSymbol: (o: BSONSymbol) => new BSONSymbol(o.value), + Timestamp: (o: Timestamp) => Timestamp.fromBits(o.low, o.high) +} as const; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function serializeDocument(doc: any, options: EJSONSerializeOptions) { + if (doc == null || typeof doc !== 'object') throw new BSONError('not an object instance'); + + const bsontype: BSONType['_bsontype'] = doc._bsontype; + if (typeof bsontype === 'undefined') { + // It's a regular object. Recursively serialize its property values. + const _doc: Document = {}; + for (const name of Object.keys(doc)) { + options.seenObjects.push({ propertyName: name, obj: null }); + try { + const value = serializeValue(doc[name], options); + if (name === '__proto__') { + Object.defineProperty(_doc, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } else { + _doc[name] = value; + } + } finally { + options.seenObjects.pop(); + } + } + return _doc; + } else if ( + doc != null && + typeof doc === 'object' && + typeof doc._bsontype === 'string' && + doc[Symbol.for('@@mdb.bson.version')] !== BSON_MAJOR_VERSION + ) { + throw new BSONVersionError(); + } else if (isBSONType(doc)) { + // the "document" is really just a BSON type object + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let outDoc: any = doc; + if (typeof outDoc.toExtendedJSON !== 'function') { + // There's no EJSON serialization function on the object. It's probably an + // object created by a previous version of this library (or another library) + // that's duck-typing objects to look like they were generated by this library). + // Copy the object into this library's version of that type. + const mapper = BSON_TYPE_MAPPINGS[doc._bsontype]; + if (!mapper) { + throw new BSONError('Unrecognized or invalid _bsontype: ' + doc._bsontype); + } + outDoc = mapper(outDoc); + } + + // Two BSON types may have nested objects that may need to be serialized too + if (bsontype === 'Code' && outDoc.scope) { + outDoc = new Code(outDoc.code, serializeValue(outDoc.scope, options)); + } else if (bsontype === 'DBRef' && outDoc.oid) { + outDoc = new DBRef( + serializeValue(outDoc.collection, options), + serializeValue(outDoc.oid, options), + serializeValue(outDoc.db, options), + serializeValue(outDoc.fields, options) + ); + } + + return outDoc.toExtendedJSON(options); + } else { + throw new BSONError('_bsontype must be a string, but was: ' + typeof bsontype); + } +} + +/** + * Parse an Extended JSON string, constructing the JavaScript value or object described by that + * string. + * + * @example + * ```js + * const { EJSON } = require('bson'); + * const text = '{ "int32": { "$numberInt": "10" } }'; + * + * // prints { int32: { [String: '10'] _bsontype: 'Int32', value: '10' } } + * console.log(EJSON.parse(text, { relaxed: false })); + * + * // prints { int32: 10 } + * console.log(EJSON.parse(text)); + * ``` + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function parse(text: string, options?: EJSONOptions): any { + const ejsonOptions = { + useBigInt64: options?.useBigInt64 ?? false, + relaxed: options?.relaxed ?? true, + legacy: options?.legacy ?? false + }; + return JSON.parse(text, (key, value) => { + if (key.indexOf('\x00') !== -1) { + throw new BSONError( + `BSON Document field names cannot contain null bytes, found: ${JSON.stringify(key)}` + ); + } + return deserializeValue(value, ejsonOptions); + }); +} + +/** + * Converts a BSON document to an Extended JSON string, optionally replacing values if a replacer + * function is specified or optionally including only the specified properties if a replacer array + * is specified. + * + * @param value - The value to convert to extended JSON + * @param replacer - A function that alters the behavior of the stringification process, or an array of String and Number objects that serve as a whitelist for selecting/filtering the properties of the value object to be included in the JSON string. If this value is null or not provided, all properties of the object are included in the resulting JSON string + * @param space - A String or Number object that's used to insert white space into the output JSON string for readability purposes. + * @param options - Optional settings + * + * @example + * ```js + * const { EJSON } = require('bson'); + * const Int32 = require('mongodb').Int32; + * const doc = { int32: new Int32(10) }; + * + * // prints '{"int32":{"$numberInt":"10"}}' + * console.log(EJSON.stringify(doc, { relaxed: false })); + * + * // prints '{"int32":10}' + * console.log(EJSON.stringify(doc)); + * ``` + */ +function stringify( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + replacer?: (number | string)[] | ((this: any, key: string, value: any) => any) | EJSONOptions, + space?: string | number, + options?: EJSONOptions +): string { + if (space != null && typeof space === 'object') { + options = space; + space = 0; + } + if (replacer != null && typeof replacer === 'object' && !Array.isArray(replacer)) { + options = replacer; + replacer = undefined; + space = 0; + } + const serializeOptions = Object.assign({ relaxed: true, legacy: false }, options, { + seenObjects: [{ propertyName: '(root)', obj: null }] + }); + + const doc = serializeValue(value, serializeOptions); + return JSON.stringify(doc, replacer as Parameters[1], space); +} + +/** + * Serializes an object to an Extended JSON string, and reparse it as a JavaScript object. + * + * @param value - The object to serialize + * @param options - Optional settings passed to the `stringify` function + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function EJSONserialize(value: any, options?: EJSONOptions): Document { + options = options || {}; + return JSON.parse(stringify(value, options)); +} + +/** + * Deserializes an Extended JSON object into a plain JavaScript object with native/BSON types + * + * @param ejson - The Extended JSON object to deserialize + * @param options - Optional settings passed to the parse method + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function EJSONdeserialize(ejson: Document, options?: EJSONOptions): any { + options = options || {}; + return parse(JSON.stringify(ejson), options); +} + +/** @public */ +const EJSON: { + parse: typeof parse; + stringify: typeof stringify; + serialize: typeof EJSONserialize; + deserialize: typeof EJSONdeserialize; +} = Object.create(null); +EJSON.parse = parse; +EJSON.stringify = stringify; +EJSON.serialize = EJSONserialize; +EJSON.deserialize = EJSONdeserialize; +Object.freeze(EJSON); +export { EJSON }; diff --git a/user-service/node_modules/bson/src/index.ts b/user-service/node_modules/bson/src/index.ts new file mode 100644 index 0000000000..5ef415756a --- /dev/null +++ b/user-service/node_modules/bson/src/index.ts @@ -0,0 +1,19 @@ +import * as BSON from './bson'; + +// Export all named properties from BSON to support +// import { ObjectId, serialize } from 'bson'; +// const { ObjectId, serialize } = require('bson'); +export * from './bson'; + +// Export BSON as a namespace to support: +// import { BSON } from 'bson'; +// const { BSON } = require('bson'); +export { BSON }; + +// BSON does **NOT** have a default export + +// The following will crash in es module environments +// import BSON from 'bson'; + +// The following will work as expected, BSON as a namespace of all the APIs (BSON.ObjectId, BSON.serialize) +// const BSON = require('bson'); diff --git a/user-service/node_modules/bson/src/int_32.ts b/user-service/node_modules/bson/src/int_32.ts new file mode 100644 index 0000000000..7c95027ce5 --- /dev/null +++ b/user-service/node_modules/bson/src/int_32.ts @@ -0,0 +1,101 @@ +import { BSONValue } from './bson_value'; +import { BSON_INT32_MAX, BSON_INT32_MIN } from './constants'; +import { BSONError } from './error'; +import type { EJSONOptions } from './extended_json'; +import { type InspectFn, defaultInspect } from './parser/utils'; +import { removeLeadingZerosAndExplicitPlus } from './utils/string_utils'; + +/** @public */ +export interface Int32Extended { + $numberInt: string; +} + +/** + * A class representation of a BSON Int32 type. + * @public + * @category BSONType + */ +export class Int32 extends BSONValue { + get _bsontype(): 'Int32' { + return 'Int32'; + } + + value!: number; + /** + * Create an Int32 type + * + * @param value - the number we want to represent as an int32. + */ + constructor(value: number | string) { + super(); + if ((value as unknown) instanceof Number) { + value = value.valueOf(); + } + + this.value = +value | 0; + } + + /** + * Attempt to create an Int32 type from string. + * + * This method will throw a BSONError on any string input that is not representable as an Int32. + * Notably, this method will also throw on the following string formats: + * - Strings in non-decimal formats (exponent notation, binary, hex, or octal digits) + * - Strings non-numeric and non-leading sign characters (ex: '2.0', '24,000') + * - Strings with leading and/or trailing whitespace + * + * Strings with leading zeros, however, are allowed. + * + * @param value - the string we want to represent as an int32. + */ + static fromString(value: string): Int32 { + const cleanedValue = removeLeadingZerosAndExplicitPlus(value); + + const coercedValue = Number(value); + + if (BSON_INT32_MAX < coercedValue) { + throw new BSONError(`Input: '${value}' is larger than the maximum value for Int32`); + } else if (BSON_INT32_MIN > coercedValue) { + throw new BSONError(`Input: '${value}' is smaller than the minimum value for Int32`); + } else if (!Number.isSafeInteger(coercedValue)) { + throw new BSONError(`Input: '${value}' is not a safe integer`); + } else if (coercedValue.toString() !== cleanedValue) { + // catch all case + throw new BSONError(`Input: '${value}' is not a valid Int32 string`); + } + return new Int32(coercedValue); + } + + /** + * Access the number value. + * + * @returns returns the wrapped int32 number. + */ + valueOf(): number { + return this.value; + } + + toString(radix?: number): string { + return this.value.toString(radix); + } + + toJSON(): number { + return this.value; + } + + /** @internal */ + toExtendedJSON(options?: EJSONOptions): number | Int32Extended { + if (options && (options.relaxed || options.legacy)) return this.value; + return { $numberInt: this.value.toString() }; + } + + /** @internal */ + static fromExtendedJSON(doc: Int32Extended, options?: EJSONOptions): number | Int32 { + return options && options.relaxed ? parseInt(doc.$numberInt, 10) : new Int32(doc.$numberInt); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + return `new Int32(${inspect(this.value, options)})`; + } +} diff --git a/user-service/node_modules/bson/src/long.ts b/user-service/node_modules/bson/src/long.ts new file mode 100644 index 0000000000..07b2b2db1f --- /dev/null +++ b/user-service/node_modules/bson/src/long.ts @@ -0,0 +1,1246 @@ +import { BSONValue } from './bson_value'; +import { BSONError } from './error'; +import type { EJSONOptions } from './extended_json'; +import { type InspectFn, defaultInspect } from './parser/utils'; +import type { Timestamp } from './timestamp'; +import * as StringUtils from './utils/string_utils'; + +interface LongWASMHelpers { + /** Gets the high bits of the last operation performed */ + get_high(this: void): number; + div_u( + this: void, + lowBits: number, + highBits: number, + lowBitsDivisor: number, + highBitsDivisor: number + ): number; + div_s( + this: void, + lowBits: number, + highBits: number, + lowBitsDivisor: number, + highBitsDivisor: number + ): number; + rem_u( + this: void, + lowBits: number, + highBits: number, + lowBitsDivisor: number, + highBitsDivisor: number + ): number; + rem_s( + this: void, + lowBits: number, + highBits: number, + lowBitsDivisor: number, + highBitsDivisor: number + ): number; + mul( + this: void, + lowBits: number, + highBits: number, + lowBitsMultiplier: number, + highBitsMultiplier: number + ): number; +} + +/** + * wasm optimizations, to do native i64 multiplication and divide + */ +let wasm: LongWASMHelpers | undefined = undefined; + +/* We do not want to have to include DOM types just for this check */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const WebAssembly: any; + +try { + wasm = new WebAssembly.Instance( + new WebAssembly.Module( + // prettier-ignore + new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11]) + ), + {} + ).exports as unknown as LongWASMHelpers; +} catch { + // no wasm support +} + +const TWO_PWR_16_DBL = 1 << 16; +const TWO_PWR_24_DBL = 1 << 24; +const TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; +const TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; +const TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; + +/** A cache of the Long representations of small integer values. */ +const INT_CACHE: { [key: number]: Long } = {}; + +/** A cache of the Long representations of small unsigned integer values. */ +const UINT_CACHE: { [key: number]: Long } = {}; + +const MAX_INT64_STRING_LENGTH = 20; + +const DECIMAL_REG_EX = /^(\+?0|(\+|-)?[1-9][0-9]*)$/; + +/** @public */ +export interface LongExtended { + $numberLong: string; +} + +/** + * A class representing a 64-bit integer + * @public + * @category BSONType + * @remarks + * The internal representation of a long is the two given signed, 32-bit values. + * We use 32-bit pieces because these are the size of integers on which + * Javascript performs bit-operations. For operations like addition and + * multiplication, we split each number into 16 bit pieces, which can easily be + * multiplied within Javascript's floating-point representation without overflow + * or change in sign. + * In the algorithms below, we frequently reduce the negative case to the + * positive case by negating the input(s) and then post-processing the result. + * Note that we must ALWAYS check specially whether those values are MIN_VALUE + * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as + * a positive number, it overflows back into a negative). Not handling this + * case would often result in infinite recursion. + * Common constant values ZERO, ONE, NEG_ONE, etc. are found as static properties on this class. + */ +export class Long extends BSONValue { + get _bsontype(): 'Long' { + return 'Long'; + } + + /** An indicator used to reliably determine if an object is a Long or not. */ + get __isLong__(): boolean { + return true; + } + + /** + * The high 32 bits as a signed value. + */ + high: number; + + /** + * The low 32 bits as a signed value. + */ + low: number; + + /** + * Whether unsigned or not. + */ + unsigned: boolean; + + /** + * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. + * + * @param low - The low (signed) 32 bits of the long + * @param high - The high (signed) 32 bits of the long + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(low: number, high?: number, unsigned?: boolean); + /** + * Constructs a 64 bit two's-complement integer, given a bigint representation. + * + * @param value - BigInt representation of the long value + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(value: bigint, unsigned?: boolean); + /** + * Constructs a 64 bit two's-complement integer, given a string representation. + * + * @param value - String representation of the long value + * @param unsigned - Whether unsigned or not, defaults to signed + */ + constructor(value: string, unsigned?: boolean); + constructor( + lowOrValue: number | bigint | string = 0, + highOrUnsigned?: number | boolean, + unsigned?: boolean + ) { + super(); + const unsignedBool = typeof highOrUnsigned === 'boolean' ? highOrUnsigned : Boolean(unsigned); + const high = typeof highOrUnsigned === 'number' ? highOrUnsigned : 0; + const res = + typeof lowOrValue === 'string' + ? Long.fromString(lowOrValue, unsignedBool) + : typeof lowOrValue === 'bigint' + ? Long.fromBigInt(lowOrValue, unsignedBool) + : { low: lowOrValue | 0, high: high | 0, unsigned: unsignedBool }; + this.low = res.low; + this.high = res.high; + this.unsigned = res.unsigned; + } + + static TWO_PWR_24 = Long.fromInt(TWO_PWR_24_DBL); + + /** Maximum unsigned value. */ + static MAX_UNSIGNED_VALUE = Long.fromBits(0xffffffff | 0, 0xffffffff | 0, true); + /** Signed zero */ + static ZERO = Long.fromInt(0); + /** Unsigned zero. */ + static UZERO = Long.fromInt(0, true); + /** Signed one. */ + static ONE = Long.fromInt(1); + /** Unsigned one. */ + static UONE = Long.fromInt(1, true); + /** Signed negative one. */ + static NEG_ONE = Long.fromInt(-1); + /** Maximum signed value. */ + static MAX_VALUE = Long.fromBits(0xffffffff | 0, 0x7fffffff | 0, false); + /** Minimum signed value. */ + static MIN_VALUE = Long.fromBits(0, 0x80000000 | 0, false); + + /** + * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. + * Each is assumed to use 32 bits. + * @param lowBits - The low 32 bits + * @param highBits - The high 32 bits + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBits(lowBits: number, highBits: number, unsigned?: boolean): Long { + return new Long(lowBits, highBits, unsigned); + } + + /** + * Returns a Long representing the given 32 bit integer value. + * @param value - The 32 bit integer in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromInt(value: number, unsigned?: boolean): Long { + let obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if ((cache = 0 <= value && value < 256)) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) return cachedObj; + } + obj = Long.fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) UINT_CACHE[value] = obj; + return obj; + } else { + value |= 0; + if ((cache = -128 <= value && value < 128)) { + cachedObj = INT_CACHE[value]; + if (cachedObj) return cachedObj; + } + obj = Long.fromBits(value, value < 0 ? -1 : 0, false); + if (cache) INT_CACHE[value] = obj; + return obj; + } + } + + /** + * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. + * @param value - The number in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromNumber(value: number, unsigned?: boolean): Long { + if (isNaN(value)) return unsigned ? Long.UZERO : Long.ZERO; + if (unsigned) { + if (value < 0) return Long.UZERO; + if (value >= TWO_PWR_64_DBL) return Long.MAX_UNSIGNED_VALUE; + } else { + if (value <= -TWO_PWR_63_DBL) return Long.MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) return Long.MAX_VALUE; + } + if (value < 0) return Long.fromNumber(-value, unsigned).neg(); + return Long.fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); + } + + /** + * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. + * @param value - The number in question + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBigInt(value: bigint, unsigned?: boolean): Long { + // eslint-disable-next-line no-restricted-globals + const FROM_BIGINT_BIT_MASK = BigInt(0xffffffff); + // eslint-disable-next-line no-restricted-globals + const FROM_BIGINT_BIT_SHIFT = BigInt(32); + return new Long( + Number(value & FROM_BIGINT_BIT_MASK), + Number((value >> FROM_BIGINT_BIT_SHIFT) & FROM_BIGINT_BIT_MASK), + unsigned + ); + } + + /** + * @internal + * Returns a Long representation of the given string, written using the specified radix. + * Throws an error if `throwsError` is set to true and any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + private static _fromString(str: string, unsigned: boolean, radix: number): Long { + if (str.length === 0) throw new BSONError('empty string'); + if (radix < 2 || 36 < radix) throw new BSONError('radix'); + + let p; + if ((p = str.indexOf('-')) > 0) throw new BSONError('interior hyphen'); + else if (p === 0) { + return Long._fromString(str.substring(1), unsigned, radix).neg(); + } + + // Do several (8) digits each time through the loop, so as to + // minimize the calls to the very expensive emulated div. + const radixToPower = Long.fromNumber(Math.pow(radix, 8)); + + let result = Long.ZERO; + for (let i = 0; i < str.length; i += 8) { + const size = Math.min(8, str.length - i), + value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + const power = Long.fromNumber(Math.pow(radix, size)); + result = result.mul(power).add(Long.fromNumber(value)); + } else { + result = result.mul(radixToPower); + result = result.add(Long.fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + + /** + * Returns a signed Long representation of the given string, written using radix 10. + * Will throw an error if the given text is not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the radix 10 + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @returns The corresponding Long value + */ + static fromStringStrict(str: string): Long; + /** + * Returns a Long representation of the given string, written using the radix 10. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, unsigned?: boolean): Long; + /** + * Returns a signed Long representation of the given string, written using the specified radix. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, radix?: boolean): Long; + /** + * Returns a Long representation of the given string, written using the specified radix. + * Will throw an error if the given parameters are not exactly representable as a Long. + * Throws an error if any of the following conditions are true: + * - the string contains invalid characters for the given radix + * - the string contains whitespace + * - the value the string represents is too large or too small to be a Long + * Unlike Long.fromString, this method does not coerce '+/-Infinity' and 'NaN' to Long.Zero + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromStringStrict(str: string, unsigned?: boolean, radix?: number): Long; + static fromStringStrict(str: string, unsignedOrRadix?: boolean | number, radix?: number): Long { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + // For goog.math.long compatibility + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + + if (str.trim() !== str) { + throw new BSONError(`Input: '${str}' contains leading and/or trailing whitespace`); + } + if (!StringUtils.validateStringCharacters(str, radix)) { + throw new BSONError(`Input: '${str}' contains invalid characters for radix: ${radix}`); + } + + // remove leading zeros (for later string comparison and to make math faster) + const cleanedStr = StringUtils.removeLeadingZerosAndExplicitPlus(str); + + // check roundtrip result + const result = Long._fromString(cleanedStr, unsigned, radix); + if (result.toString(radix).toLowerCase() !== cleanedStr.toLowerCase()) { + throw new BSONError( + `Input: ${str} is not representable as ${result.unsigned ? 'an unsigned' : 'a signed'} 64-bit Long ${radix != null ? `with radix: ${radix}` : ''}` + ); + } + return result; + } + + /** + * Returns a signed Long representation of the given string, written using radix 10. + * + * If the input string is empty, this function will throw a BSONError. + * + * If input string does not have valid signed 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit signed long will be coerced to Long.MAX_VALUE and Long.MIN_VALUE respectively + * - 'NaN' or '+/-Infinity' are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * + * @param str - The textual representation of the Long + * @returns The corresponding Long value + */ + static fromString(str: string): Long; + /** + * Returns a signed Long representation of the given string, written using the provided radix. + * + * If the input string is empty or a provided radix is not within (2-36), this function will throw a BSONError. + * + * If input parameters do not have valid signed 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit signed long will be coerced to Long.MAX_VALUE and Long.MIN_VALUE respectively + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromString(str: string, radix?: number): Long; + /** + * Returns a Long representation of the given string, written using radix 10. + * + * If the input string is empty, this function will throw a BSONError. + * + * If input parameters do not have a valid 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit long will be coerced to max or min (if signed) values + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromString(str: string, unsigned?: boolean): Long; + /** + * Returns a Long representation of the given string, written using the specified radix. + * + * If the input string is empty or a provided radix is not within (2-36), this function will throw a BSONError. + * + * If input parameters do not have a valid 64-bit Long representation, this method will return a coerced value: + * - inputs that overflow 64-bit long will be coerced to max or min (if signed) values + * - if the radix is less than 24, 'NaN' is coerced to Long.ZERO + * - if the radix is less than 35, '+/-Infinity' inputs are coerced to Long.ZERO + * - other invalid characters sequences have variable behavior + * @param str - The textual representation of the Long + * @param unsigned - Whether unsigned or not, defaults to signed + * @param radix - The radix in which the text is written (2-36), defaults to 10 + * @returns The corresponding Long value + */ + static fromString(str: string, unsigned?: boolean, radix?: number): Long; + static fromString(str: string, unsignedOrRadix?: boolean | number, radix?: number): Long { + let unsigned = false; + if (typeof unsignedOrRadix === 'number') { + // For goog.math.long compatibility + (radix = unsignedOrRadix), (unsignedOrRadix = false); + } else { + unsigned = !!unsignedOrRadix; + } + radix ??= 10; + if (str === 'NaN' && radix < 24) { + // radix does not support n, so coerce to zero + return Long.ZERO; + } else if ((str === 'Infinity' || str === '+Infinity' || str === '-Infinity') && radix < 35) { + // radix does not support y, so coerce to zero + return Long.ZERO; + } + return Long._fromString(str, unsigned, radix); + } + + /** + * Creates a Long from its byte representation. + * @param bytes - Byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @param le - Whether little or big endian, defaults to big endian + * @returns The corresponding Long value + */ + static fromBytes(bytes: number[], unsigned?: boolean, le?: boolean): Long { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + } + + /** + * Creates a Long from its little endian byte representation. + * @param bytes - Little endian byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBytesLE(bytes: number[], unsigned?: boolean): Long { + return new Long( + bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24), + bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24), + unsigned + ); + } + + /** + * Creates a Long from its big endian byte representation. + * @param bytes - Big endian byte representation + * @param unsigned - Whether unsigned or not, defaults to signed + * @returns The corresponding Long value + */ + static fromBytesBE(bytes: number[], unsigned?: boolean): Long { + return new Long( + (bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7], + (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3], + unsigned + ); + } + + /** + * Tests if the specified object is a Long. + */ + static isLong(value: unknown): value is Long { + return ( + value != null && + typeof value === 'object' && + '__isLong__' in value && + value.__isLong__ === true + ); + } + + /** + * Converts the specified value to a Long. + * @param unsigned - Whether unsigned or not, defaults to signed + */ + static fromValue( + val: number | string | { low: number; high: number; unsigned?: boolean }, + unsigned?: boolean + ): Long { + if (typeof val === 'number') return Long.fromNumber(val, unsigned); + if (typeof val === 'string') return Long.fromString(val, unsigned); + // Throws for non-objects, converts non-instanceof Long: + return Long.fromBits( + val.low, + val.high, + typeof unsigned === 'boolean' ? unsigned : val.unsigned + ); + } + + /** Returns the sum of this and the specified Long. */ + add(addend: string | number | Long | Timestamp): Long { + if (!Long.isLong(addend)) addend = Long.fromValue(addend); + + // Divide each number into 4 chunks of 16 bits, and then sum the chunks. + + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + + const b48 = addend.high >>> 16; + const b32 = addend.high & 0xffff; + const b16 = addend.low >>> 16; + const b00 = addend.low & 0xffff; + + let c48 = 0, + c32 = 0, + c16 = 0, + c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 + b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + + /** + * Returns the sum of this and the specified Long. + * @returns Sum + */ + and(other: string | number | Long | Timestamp): Long { + if (!Long.isLong(other)) other = Long.fromValue(other); + return Long.fromBits(this.low & other.low, this.high & other.high, this.unsigned); + } + + /** + * Compares this Long's value with the specified's. + * @returns 0 if they are the same, 1 if the this is greater and -1 if the given one is greater + */ + compare(other: string | number | Long | Timestamp): 0 | 1 | -1 { + if (!Long.isLong(other)) other = Long.fromValue(other); + if (this.eq(other)) return 0; + const thisNeg = this.isNegative(), + otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) return -1; + if (!thisNeg && otherNeg) return 1; + // At this point the sign bits are the same + if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1; + // Both are positive if at least one is unsigned + return other.high >>> 0 > this.high >>> 0 || + (other.high === this.high && other.low >>> 0 > this.low >>> 0) + ? -1 + : 1; + } + + /** This is an alias of {@link Long.compare} */ + comp(other: string | number | Long | Timestamp): 0 | 1 | -1 { + return this.compare(other); + } + + /** + * Returns this Long divided by the specified. The result is signed if this Long is signed or unsigned if this Long is unsigned. + * @returns Quotient + */ + divide(divisor: string | number | Long | Timestamp): Long { + if (!Long.isLong(divisor)) divisor = Long.fromValue(divisor); + if (divisor.isZero()) throw new BSONError('division by zero'); + + // use wasm support if present + if (wasm) { + // guard against signed division overflow: the largest + // negative number / -1 would be 1 larger than the largest + // positive number, due to two's complement. + if ( + !this.unsigned && + this.high === -0x80000000 && + divisor.low === -1 && + divisor.high === -1 + ) { + // be consistent with non-wasm code path + return this; + } + const low = (this.unsigned ? wasm.div_u : wasm.div_s)( + this.low, + this.high, + divisor.low, + divisor.high + ); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + + if (this.isZero()) return this.unsigned ? Long.UZERO : Long.ZERO; + let approx, rem, res; + if (!this.unsigned) { + // This section is only relevant for signed longs and is derived from the + // closure library as a whole. + if (this.eq(Long.MIN_VALUE)) { + if (divisor.eq(Long.ONE) || divisor.eq(Long.NEG_ONE)) return Long.MIN_VALUE; + // recall that -MIN_VALUE == MIN_VALUE + else if (divisor.eq(Long.MIN_VALUE)) return Long.ONE; + else { + // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. + const halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(Long.ZERO)) { + return divisor.isNegative() ? Long.ONE : Long.NEG_ONE; + } else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } else if (divisor.eq(Long.MIN_VALUE)) return this.unsigned ? Long.UZERO : Long.ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } else if (divisor.isNegative()) return this.div(divisor.neg()).neg(); + res = Long.ZERO; + } else { + // The algorithm below has not been made for unsigned longs. It's therefore + // required to take special care of the MSB prior to running it. + if (!divisor.unsigned) divisor = divisor.toUnsigned(); + if (divisor.gt(this)) return Long.UZERO; + if (divisor.gt(this.shru(1))) + // 15 >>> 1 = 7 ; with divisor = 8 ; true + return Long.UONE; + res = Long.UZERO; + } + + // Repeat the following until the remainder is less than other: find a + // floating-point that approximates remainder / other *from below*, add this + // into the result, and subtract it from the remainder. It is critical that + // the approximate value is less than or equal to the real value so that the + // remainder never becomes negative. + // eslint-disable-next-line @typescript-eslint/no-this-alias + rem = this; + while (rem.gte(divisor)) { + // Approximate the result of division. This may be a little greater or + // smaller than the actual value. + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + + // We will tweak the approximate result by changing it in the 48-th digit or + // the smallest non-fractional digit, whichever is larger. + const log2 = Math.ceil(Math.log(approx) / Math.LN2); + const delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); + // Decrease the approximation until it is smaller than the remainder. Note + // that if it is too large, the product overflows and is negative. + let approxRes = Long.fromNumber(approx); + let approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = Long.fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + + // We know the answer can't be zero... and actually, zero would cause + // infinite recursion since we would make no progress. + if (approxRes.isZero()) approxRes = Long.ONE; + + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + } + + /**This is an alias of {@link Long.divide} */ + div(divisor: string | number | Long | Timestamp): Long { + return this.divide(divisor); + } + + /** + * Tests if this Long's value equals the specified's. + * @param other - Other value + */ + equals(other: string | number | Long | Timestamp): boolean { + if (!Long.isLong(other)) other = Long.fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + } + + /** This is an alias of {@link Long.equals} */ + eq(other: string | number | Long | Timestamp): boolean { + return this.equals(other); + } + + /** Gets the high 32 bits as a signed integer. */ + getHighBits(): number { + return this.high; + } + + /** Gets the high 32 bits as an unsigned integer. */ + getHighBitsUnsigned(): number { + return this.high >>> 0; + } + + /** Gets the low 32 bits as a signed integer. */ + getLowBits(): number { + return this.low; + } + + /** Gets the low 32 bits as an unsigned integer. */ + getLowBitsUnsigned(): number { + return this.low >>> 0; + } + + /** Gets the number of bits needed to represent the absolute value of this Long. */ + getNumBitsAbs(): number { + if (this.isNegative()) { + // Unsigned Longs are never negative + return this.eq(Long.MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + } + const val = this.high !== 0 ? this.high : this.low; + let bit: number; + for (bit = 31; bit > 0; bit--) if ((val & (1 << bit)) !== 0) break; + return this.high !== 0 ? bit + 33 : bit + 1; + } + + /** Tests if this Long's value is greater than the specified's. */ + greaterThan(other: string | number | Long | Timestamp): boolean { + return this.comp(other) > 0; + } + + /** This is an alias of {@link Long.greaterThan} */ + gt(other: string | number | Long | Timestamp): boolean { + return this.greaterThan(other); + } + + /** Tests if this Long's value is greater than or equal the specified's. */ + greaterThanOrEqual(other: string | number | Long | Timestamp): boolean { + return this.comp(other) >= 0; + } + + /** This is an alias of {@link Long.greaterThanOrEqual} */ + gte(other: string | number | Long | Timestamp): boolean { + return this.greaterThanOrEqual(other); + } + /** This is an alias of {@link Long.greaterThanOrEqual} */ + ge(other: string | number | Long | Timestamp): boolean { + return this.greaterThanOrEqual(other); + } + + /** Tests if this Long's value is even. */ + isEven(): boolean { + return (this.low & 1) === 0; + } + + /** Tests if this Long's value is negative. */ + isNegative(): boolean { + return !this.unsigned && this.high < 0; + } + + /** Tests if this Long's value is odd. */ + isOdd(): boolean { + return (this.low & 1) === 1; + } + + /** Tests if this Long's value is positive. */ + isPositive(): boolean { + return this.unsigned || this.high >= 0; + } + + /** Tests if this Long's value equals zero. */ + isZero(): boolean { + return this.high === 0 && this.low === 0; + } + + /** Tests if this Long's value is less than the specified's. */ + lessThan(other: string | number | Long | Timestamp): boolean { + return this.comp(other) < 0; + } + + /** This is an alias of {@link Long#lessThan}. */ + lt(other: string | number | Long | Timestamp): boolean { + return this.lessThan(other); + } + + /** Tests if this Long's value is less than or equal the specified's. */ + lessThanOrEqual(other: string | number | Long | Timestamp): boolean { + return this.comp(other) <= 0; + } + + /** This is an alias of {@link Long.lessThanOrEqual} */ + lte(other: string | number | Long | Timestamp): boolean { + return this.lessThanOrEqual(other); + } + + /** Returns this Long modulo the specified. */ + modulo(divisor: string | number | Long | Timestamp): Long { + if (!Long.isLong(divisor)) divisor = Long.fromValue(divisor); + + // use wasm support if present + if (wasm) { + const low = (this.unsigned ? wasm.rem_u : wasm.rem_s)( + this.low, + this.high, + divisor.low, + divisor.high + ); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + + return this.sub(this.div(divisor).mul(divisor)); + } + + /** This is an alias of {@link Long.modulo} */ + mod(divisor: string | number | Long | Timestamp): Long { + return this.modulo(divisor); + } + /** This is an alias of {@link Long.modulo} */ + rem(divisor: string | number | Long | Timestamp): Long { + return this.modulo(divisor); + } + + /** + * Returns the product of this and the specified Long. + * @param multiplier - Multiplier + * @returns Product + */ + multiply(multiplier: string | number | Long | Timestamp): Long { + if (this.isZero()) return Long.ZERO; + if (!Long.isLong(multiplier)) multiplier = Long.fromValue(multiplier); + + // use wasm support if present + if (wasm) { + const low = wasm.mul(this.low, this.high, multiplier.low, multiplier.high); + return Long.fromBits(low, wasm.get_high(), this.unsigned); + } + + if (multiplier.isZero()) return Long.ZERO; + if (this.eq(Long.MIN_VALUE)) return multiplier.isOdd() ? Long.MIN_VALUE : Long.ZERO; + if (multiplier.eq(Long.MIN_VALUE)) return this.isOdd() ? Long.MIN_VALUE : Long.ZERO; + + if (this.isNegative()) { + if (multiplier.isNegative()) return this.neg().mul(multiplier.neg()); + else return this.neg().mul(multiplier).neg(); + } else if (multiplier.isNegative()) return this.mul(multiplier.neg()).neg(); + + // If both longs are small, use float multiplication + if (this.lt(Long.TWO_PWR_24) && multiplier.lt(Long.TWO_PWR_24)) + return Long.fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + + // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. + // We can skip products that would overflow. + + const a48 = this.high >>> 16; + const a32 = this.high & 0xffff; + const a16 = this.low >>> 16; + const a00 = this.low & 0xffff; + + const b48 = multiplier.high >>> 16; + const b32 = multiplier.high & 0xffff; + const b16 = multiplier.low >>> 16; + const b00 = multiplier.low & 0xffff; + + let c48 = 0, + c32 = 0, + c16 = 0, + c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 0xffff; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 0xffff; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 0xffff; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 0xffff; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 0xffff; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 0xffff; + return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); + } + + /** This is an alias of {@link Long.multiply} */ + mul(multiplier: string | number | Long | Timestamp): Long { + return this.multiply(multiplier); + } + + /** Returns the Negation of this Long's value. */ + negate(): Long { + if (!this.unsigned && this.eq(Long.MIN_VALUE)) return Long.MIN_VALUE; + return this.not().add(Long.ONE); + } + + /** This is an alias of {@link Long.negate} */ + neg(): Long { + return this.negate(); + } + + /** Returns the bitwise NOT of this Long. */ + not(): Long { + return Long.fromBits(~this.low, ~this.high, this.unsigned); + } + + /** Tests if this Long's value differs from the specified's. */ + notEquals(other: string | number | Long | Timestamp): boolean { + return !this.equals(other); + } + + /** This is an alias of {@link Long.notEquals} */ + neq(other: string | number | Long | Timestamp): boolean { + return this.notEquals(other); + } + /** This is an alias of {@link Long.notEquals} */ + ne(other: string | number | Long | Timestamp): boolean { + return this.notEquals(other); + } + + /** + * Returns the bitwise OR of this Long and the specified. + */ + or(other: number | string | Long): Long { + if (!Long.isLong(other)) other = Long.fromValue(other); + return Long.fromBits(this.low | other.low, this.high | other.high, this.unsigned); + } + + /** + * Returns this Long with bits shifted to the left by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftLeft(numBits: number | Long): Long { + if (Long.isLong(numBits)) numBits = numBits.toInt(); + if ((numBits &= 63) === 0) return this; + else if (numBits < 32) + return Long.fromBits( + this.low << numBits, + (this.high << numBits) | (this.low >>> (32 - numBits)), + this.unsigned + ); + else return Long.fromBits(0, this.low << (numBits - 32), this.unsigned); + } + + /** This is an alias of {@link Long.shiftLeft} */ + shl(numBits: number | Long): Long { + return this.shiftLeft(numBits); + } + + /** + * Returns this Long with bits arithmetically shifted to the right by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftRight(numBits: number | Long): Long { + if (Long.isLong(numBits)) numBits = numBits.toInt(); + if ((numBits &= 63) === 0) return this; + else if (numBits < 32) + return Long.fromBits( + (this.low >>> numBits) | (this.high << (32 - numBits)), + this.high >> numBits, + this.unsigned + ); + else return Long.fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); + } + + /** This is an alias of {@link Long.shiftRight} */ + shr(numBits: number | Long): Long { + return this.shiftRight(numBits); + } + + /** + * Returns this Long with bits logically shifted to the right by the given amount. + * @param numBits - Number of bits + * @returns Shifted Long + */ + shiftRightUnsigned(numBits: Long | number): Long { + if (Long.isLong(numBits)) numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) return this; + else { + const high = this.high; + if (numBits < 32) { + const low = this.low; + return Long.fromBits( + (low >>> numBits) | (high << (32 - numBits)), + high >>> numBits, + this.unsigned + ); + } else if (numBits === 32) return Long.fromBits(high, 0, this.unsigned); + else return Long.fromBits(high >>> (numBits - 32), 0, this.unsigned); + } + } + + /** This is an alias of {@link Long.shiftRightUnsigned} */ + shr_u(numBits: number | Long): Long { + return this.shiftRightUnsigned(numBits); + } + /** This is an alias of {@link Long.shiftRightUnsigned} */ + shru(numBits: number | Long): Long { + return this.shiftRightUnsigned(numBits); + } + + /** + * Returns the difference of this and the specified Long. + * @param subtrahend - Subtrahend + * @returns Difference + */ + subtract(subtrahend: string | number | Long | Timestamp): Long { + if (!Long.isLong(subtrahend)) subtrahend = Long.fromValue(subtrahend); + return this.add(subtrahend.neg()); + } + + /** This is an alias of {@link Long.subtract} */ + sub(subtrahend: string | number | Long | Timestamp): Long { + return this.subtract(subtrahend); + } + + /** Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. */ + toInt(): number { + return this.unsigned ? this.low >>> 0 : this.low; + } + + /** Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). */ + toNumber(): number { + if (this.unsigned) return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + } + + /** Converts the Long to a BigInt (arbitrary precision). */ + toBigInt(): bigint { + // eslint-disable-next-line no-restricted-globals -- This is allowed here as it is explicitly requesting a bigint + return BigInt(this.toString()); + } + + /** + * Converts this Long to its byte representation. + * @param le - Whether little or big endian, defaults to big endian + * @returns Byte representation + */ + toBytes(le?: boolean): number[] { + return le ? this.toBytesLE() : this.toBytesBE(); + } + + /** + * Converts this Long to its little endian byte representation. + * @returns Little endian byte representation + */ + toBytesLE(): number[] { + const hi = this.high, + lo = this.low; + return [ + lo & 0xff, + (lo >>> 8) & 0xff, + (lo >>> 16) & 0xff, + lo >>> 24, + hi & 0xff, + (hi >>> 8) & 0xff, + (hi >>> 16) & 0xff, + hi >>> 24 + ]; + } + + /** + * Converts this Long to its big endian byte representation. + * @returns Big endian byte representation + */ + toBytesBE(): number[] { + const hi = this.high, + lo = this.low; + return [ + hi >>> 24, + (hi >>> 16) & 0xff, + (hi >>> 8) & 0xff, + hi & 0xff, + lo >>> 24, + (lo >>> 16) & 0xff, + (lo >>> 8) & 0xff, + lo & 0xff + ]; + } + + /** + * Converts this Long to signed. + */ + toSigned(): Long { + if (!this.unsigned) return this; + return Long.fromBits(this.low, this.high, false); + } + + /** + * Converts the Long to a string written in the specified radix. + * @param radix - Radix (2-36), defaults to 10 + * @throws RangeError If `radix` is out of range + */ + toString(radix?: number): string { + radix = radix || 10; + if (radix < 2 || 36 < radix) throw new BSONError('radix'); + if (this.isZero()) return '0'; + if (this.isNegative()) { + // Unsigned Longs are never negative + if (this.eq(Long.MIN_VALUE)) { + // We need to change the Long value before it can be negated, so we remove + // the bottom-most digit in this base and then recurse to do the rest. + const radixLong = Long.fromNumber(radix), + div = this.div(radixLong), + rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } else return '-' + this.neg().toString(radix); + } + + // Do several (6) digits each time through the loop, so as to + // minimize the calls to the very expensive emulated div. + const radixToPower = Long.fromNumber(Math.pow(radix, 6), this.unsigned); + // eslint-disable-next-line @typescript-eslint/no-this-alias + let rem: Long = this; + let result = ''; + // eslint-disable-next-line no-constant-condition + while (true) { + const remDiv = rem.div(radixToPower); + const intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0; + let digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) { + return digits + result; + } else { + while (digits.length < 6) digits = '0' + digits; + result = '' + digits + result; + } + } + } + + /** Converts this Long to unsigned. */ + toUnsigned(): Long { + if (this.unsigned) return this; + return Long.fromBits(this.low, this.high, true); + } + + /** Returns the bitwise XOR of this Long and the given one. */ + xor(other: Long | number | string): Long { + if (!Long.isLong(other)) other = Long.fromValue(other); + return Long.fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + } + + /** This is an alias of {@link Long.isZero} */ + eqz(): boolean { + return this.isZero(); + } + + /** This is an alias of {@link Long.lessThanOrEqual} */ + le(other: string | number | Long | Timestamp): boolean { + return this.lessThanOrEqual(other); + } + + /* + **************************************************************** + * BSON SPECIFIC ADDITIONS * + **************************************************************** + */ + toExtendedJSON(options?: EJSONOptions): number | LongExtended { + if (options && options.relaxed) return this.toNumber(); + return { $numberLong: this.toString() }; + } + static fromExtendedJSON( + doc: { $numberLong: string }, + options?: EJSONOptions + ): number | Long | bigint { + const { useBigInt64 = false, relaxed = true } = { ...options }; + + if (doc.$numberLong.length > MAX_INT64_STRING_LENGTH) { + throw new BSONError('$numberLong string is too long'); + } + + if (!DECIMAL_REG_EX.test(doc.$numberLong)) { + throw new BSONError(`$numberLong string "${doc.$numberLong}" is in an invalid format`); + } + + if (useBigInt64) { + /* eslint-disable no-restricted-globals -- Can use BigInt here as useBigInt64=true */ + const bigIntResult = BigInt(doc.$numberLong); + return BigInt.asIntN(64, bigIntResult); + /* eslint-enable */ + } + + const longResult = Long.fromString(doc.$numberLong); + if (relaxed) { + return longResult.toNumber(); + } + return longResult; + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + const longVal = inspect(this.toString(), options); + const unsignedVal = this.unsigned ? `, ${inspect(this.unsigned, options)}` : ''; + return `new Long(${longVal}${unsignedVal})`; + } +} diff --git a/user-service/node_modules/bson/src/max_key.ts b/user-service/node_modules/bson/src/max_key.ts new file mode 100644 index 0000000000..903f1d1656 --- /dev/null +++ b/user-service/node_modules/bson/src/max_key.ts @@ -0,0 +1,31 @@ +import { BSONValue } from './bson_value'; + +/** @public */ +export interface MaxKeyExtended { + $maxKey: 1; +} + +/** + * A class representation of the BSON MaxKey type. + * @public + * @category BSONType + */ +export class MaxKey extends BSONValue { + get _bsontype(): 'MaxKey' { + return 'MaxKey'; + } + + /** @internal */ + toExtendedJSON(): MaxKeyExtended { + return { $maxKey: 1 }; + } + + /** @internal */ + static fromExtendedJSON(): MaxKey { + return new MaxKey(); + } + + inspect(): string { + return 'new MaxKey()'; + } +} diff --git a/user-service/node_modules/bson/src/min_key.ts b/user-service/node_modules/bson/src/min_key.ts new file mode 100644 index 0000000000..244e645ab5 --- /dev/null +++ b/user-service/node_modules/bson/src/min_key.ts @@ -0,0 +1,31 @@ +import { BSONValue } from './bson_value'; + +/** @public */ +export interface MinKeyExtended { + $minKey: 1; +} + +/** + * A class representation of the BSON MinKey type. + * @public + * @category BSONType + */ +export class MinKey extends BSONValue { + get _bsontype(): 'MinKey' { + return 'MinKey'; + } + + /** @internal */ + toExtendedJSON(): MinKeyExtended { + return { $minKey: 1 }; + } + + /** @internal */ + static fromExtendedJSON(): MinKey { + return new MinKey(); + } + + inspect(): string { + return 'new MinKey()'; + } +} diff --git a/user-service/node_modules/bson/src/objectid.ts b/user-service/node_modules/bson/src/objectid.ts new file mode 100644 index 0000000000..98daecc882 --- /dev/null +++ b/user-service/node_modules/bson/src/objectid.ts @@ -0,0 +1,361 @@ +import { BSONValue } from './bson_value'; +import { BSONError } from './error'; +import { type InspectFn, defaultInspect } from './parser/utils'; +import { ByteUtils } from './utils/byte_utils'; +import { NumberUtils } from './utils/number_utils'; + +// Regular expression that checks for hex value +const checkForHexRegExp = new RegExp('^[0-9a-fA-F]{24}$'); + +// Unique sequence for the current process (initialized on first use) +let PROCESS_UNIQUE: Uint8Array | null = null; + +/** @public */ +export interface ObjectIdLike { + id: string | Uint8Array; + __id?: string; + toHexString(): string; +} + +/** @public */ +export interface ObjectIdExtended { + $oid: string; +} + +/** + * A class representation of the BSON ObjectId type. + * @public + * @category BSONType + */ +export class ObjectId extends BSONValue { + get _bsontype(): 'ObjectId' { + return 'ObjectId'; + } + + /** @internal */ + private static index = Math.floor(Math.random() * 0xffffff); + + static cacheHexString: boolean; + + /** ObjectId Bytes @internal */ + private buffer!: Uint8Array; + /** ObjectId hexString cache @internal */ + private __id?: string; + + /** + * Create ObjectId from a number. + * + * @param inputId - A number. + * @deprecated Instead, use `static createFromTime()` to set a numeric value for the new ObjectId. + */ + constructor(inputId: number); + /** + * Create ObjectId from a 24 character hex string. + * + * @param inputId - A 24 character hex string. + */ + constructor(inputId: string); + /** + * Create ObjectId from the BSON ObjectId type. + * + * @param inputId - The BSON ObjectId type. + */ + constructor(inputId: ObjectId); + /** + * Create ObjectId from the object type that has the toHexString method. + * + * @param inputId - The ObjectIdLike type. + */ + constructor(inputId: ObjectIdLike); + /** + * Create ObjectId from a 12 byte binary Buffer. + * + * @param inputId - A 12 byte binary Buffer. + */ + constructor(inputId: Uint8Array); + /** To generate a new ObjectId, use ObjectId() with no argument. */ + constructor(); + /** + * Implementation overload. + * + * @param inputId - All input types that are used in the constructor implementation. + */ + constructor(inputId?: string | number | ObjectId | ObjectIdLike | Uint8Array); + /** + * Create a new ObjectId. + * + * @param inputId - An input value to create a new ObjectId from. + */ + constructor(inputId?: string | number | ObjectId | ObjectIdLike | Uint8Array) { + super(); + // workingId is set based on type of input and whether valid id exists for the input + let workingId; + if (typeof inputId === 'object' && inputId && 'id' in inputId) { + if (typeof inputId.id !== 'string' && !ArrayBuffer.isView(inputId.id)) { + throw new BSONError('Argument passed in must have an id that is of type string or Buffer'); + } + if ('toHexString' in inputId && typeof inputId.toHexString === 'function') { + workingId = ByteUtils.fromHex(inputId.toHexString()); + } else { + workingId = inputId.id; + } + } else { + workingId = inputId; + } + + // The following cases use workingId to construct an ObjectId + if (workingId == null || typeof workingId === 'number') { + // The most common use case (blank id, new objectId instance) + // Generate a new id + this.buffer = ObjectId.generate(typeof workingId === 'number' ? workingId : undefined); + } else if (ArrayBuffer.isView(workingId) && workingId.byteLength === 12) { + // If intstanceof matches we can escape calling ensure buffer in Node.js environments + this.buffer = ByteUtils.toLocalBufferType(workingId); + } else if (typeof workingId === 'string') { + if (workingId.length === 24 && checkForHexRegExp.test(workingId)) { + this.buffer = ByteUtils.fromHex(workingId); + } else { + throw new BSONError( + 'input must be a 24 character hex string, 12 byte Uint8Array, or an integer' + ); + } + } else { + throw new BSONError('Argument passed in does not match the accepted types'); + } + // If we are caching the hex string + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(this.id); + } + } + + /** + * The ObjectId bytes + * @readonly + */ + get id(): Uint8Array { + return this.buffer; + } + + set id(value: Uint8Array) { + this.buffer = value; + if (ObjectId.cacheHexString) { + this.__id = ByteUtils.toHex(value); + } + } + + /** Returns the ObjectId id as a 24 lowercase character hex string representation */ + toHexString(): string { + if (ObjectId.cacheHexString && this.__id) { + return this.__id; + } + + const hexString = ByteUtils.toHex(this.id); + + if (ObjectId.cacheHexString && !this.__id) { + this.__id = hexString; + } + + return hexString; + } + + /** + * Update the ObjectId index + * @internal + */ + private static getInc(): number { + return (ObjectId.index = (ObjectId.index + 1) % 0xffffff); + } + + /** + * Generate a 12 byte id buffer used in ObjectId's + * + * @param time - pass in a second based timestamp. + */ + static generate(time?: number): Uint8Array { + if ('number' !== typeof time) { + time = Math.floor(Date.now() / 1000); + } + + const inc = ObjectId.getInc(); + const buffer = ByteUtils.allocateUnsafe(12); + + // 4-byte timestamp + NumberUtils.setInt32BE(buffer, 0, time); + + // set PROCESS_UNIQUE if yet not initialized + if (PROCESS_UNIQUE === null) { + PROCESS_UNIQUE = ByteUtils.randomBytes(5); + } + + // 5-byte process unique + buffer[4] = PROCESS_UNIQUE[0]; + buffer[5] = PROCESS_UNIQUE[1]; + buffer[6] = PROCESS_UNIQUE[2]; + buffer[7] = PROCESS_UNIQUE[3]; + buffer[8] = PROCESS_UNIQUE[4]; + + // 3-byte counter + buffer[11] = inc & 0xff; + buffer[10] = (inc >> 8) & 0xff; + buffer[9] = (inc >> 16) & 0xff; + + return buffer; + } + + /** + * Converts the id into a 24 character hex string for printing, unless encoding is provided. + * @param encoding - hex or base64 + */ + toString(encoding?: 'hex' | 'base64'): string { + // Is the id a buffer then use the buffer toString method to return the format + if (encoding === 'base64') return ByteUtils.toBase64(this.id); + if (encoding === 'hex') return this.toHexString(); + return this.toHexString(); + } + + /** Converts to its JSON the 24 character hex string representation. */ + toJSON(): string { + return this.toHexString(); + } + + /** @internal */ + private static is(variable: unknown): variable is ObjectId { + return ( + variable != null && + typeof variable === 'object' && + '_bsontype' in variable && + variable._bsontype === 'ObjectId' + ); + } + + /** + * Compares the equality of this ObjectId with `otherID`. + * + * @param otherId - ObjectId instance to compare against. + */ + equals(otherId: string | ObjectId | ObjectIdLike | undefined | null): boolean { + if (otherId === undefined || otherId === null) { + return false; + } + + if (ObjectId.is(otherId)) { + return ( + this.buffer[11] === otherId.buffer[11] && ByteUtils.equals(this.buffer, otherId.buffer) + ); + } + + if (typeof otherId === 'string') { + return otherId.toLowerCase() === this.toHexString(); + } + + if (typeof otherId === 'object' && typeof otherId.toHexString === 'function') { + const otherIdString = otherId.toHexString(); + const thisIdString = this.toHexString(); + return typeof otherIdString === 'string' && otherIdString.toLowerCase() === thisIdString; + } + + return false; + } + + /** Returns the generation date (accurate up to the second) that this ID was generated. */ + getTimestamp(): Date { + const timestamp = new Date(); + const time = NumberUtils.getUint32BE(this.buffer, 0); + timestamp.setTime(Math.floor(time) * 1000); + return timestamp; + } + + /** @internal */ + static createPk(): ObjectId { + return new ObjectId(); + } + + /** @internal */ + serializeInto(uint8array: Uint8Array, index: number): 12 { + uint8array[index] = this.buffer[0]; + uint8array[index + 1] = this.buffer[1]; + uint8array[index + 2] = this.buffer[2]; + uint8array[index + 3] = this.buffer[3]; + uint8array[index + 4] = this.buffer[4]; + uint8array[index + 5] = this.buffer[5]; + uint8array[index + 6] = this.buffer[6]; + uint8array[index + 7] = this.buffer[7]; + uint8array[index + 8] = this.buffer[8]; + uint8array[index + 9] = this.buffer[9]; + uint8array[index + 10] = this.buffer[10]; + uint8array[index + 11] = this.buffer[11]; + return 12; + } + + /** + * Creates an ObjectId from a second based number, with the rest of the ObjectId zeroed out. Used for comparisons or sorting the ObjectId. + * + * @param time - an integer number representing a number of seconds. + */ + static createFromTime(time: number): ObjectId { + const buffer = ByteUtils.allocate(12); + for (let i = 11; i >= 4; i--) buffer[i] = 0; + // Encode time into first 4 bytes + NumberUtils.setInt32BE(buffer, 0, time); + // Return the new objectId + return new ObjectId(buffer); + } + + /** + * Creates an ObjectId from a hex string representation of an ObjectId. + * + * @param hexString - create a ObjectId from a passed in 24 character hexstring. + */ + static createFromHexString(hexString: string): ObjectId { + if (hexString?.length !== 24) { + throw new BSONError('hex string must be 24 characters'); + } + + return new ObjectId(ByteUtils.fromHex(hexString)); + } + + /** Creates an ObjectId instance from a base64 string */ + static createFromBase64(base64: string): ObjectId { + if (base64?.length !== 16) { + throw new BSONError('base64 string must be 16 characters'); + } + + return new ObjectId(ByteUtils.fromBase64(base64)); + } + + /** + * Checks if a value can be used to create a valid bson ObjectId + * @param id - any JS value + */ + static isValid(id: string | number | ObjectId | ObjectIdLike | Uint8Array): boolean { + if (id == null) return false; + + try { + new ObjectId(id); + return true; + } catch { + return false; + } + } + + /** @internal */ + toExtendedJSON(): ObjectIdExtended { + if (this.toHexString) return { $oid: this.toHexString() }; + return { $oid: this.toString('hex') }; + } + + /** @internal */ + static fromExtendedJSON(doc: ObjectIdExtended): ObjectId { + return new ObjectId(doc.$oid); + } + + /** + * Converts to a string representation of this Id. + * + * @returns return the 24 character hex string representation. + */ + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + return `new ObjectId(${inspect(this.toHexString(), options)})`; + } +} diff --git a/user-service/node_modules/bson/src/parse_utf8.ts b/user-service/node_modules/bson/src/parse_utf8.ts new file mode 100644 index 0000000000..045a9080be --- /dev/null +++ b/user-service/node_modules/bson/src/parse_utf8.ts @@ -0,0 +1,35 @@ +import { BSONError } from './error'; + +type TextDecoder = { + readonly encoding: string; + readonly fatal: boolean; + readonly ignoreBOM: boolean; + decode(input?: Uint8Array): string; +}; +type TextDecoderConstructor = { + new (label: 'utf8', options: { fatal: boolean; ignoreBOM?: boolean }): TextDecoder; +}; + +// parse utf8 globals +declare const TextDecoder: TextDecoderConstructor; +let TextDecoderFatal: TextDecoder; +let TextDecoderNonFatal: TextDecoder; + +/** + * Determines if the passed in bytes are valid utf8 + * @param bytes - An array of 8-bit bytes. Must be indexable and have length property + * @param start - The index to start validating + * @param end - The index to end validating + */ +export function parseUtf8(buffer: Uint8Array, start: number, end: number, fatal: boolean): string { + if (fatal) { + TextDecoderFatal ??= new TextDecoder('utf8', { fatal: true }); + try { + return TextDecoderFatal.decode(buffer.subarray(start, end)); + } catch (cause) { + throw new BSONError('Invalid UTF-8 string in BSON document', { cause }); + } + } + TextDecoderNonFatal ??= new TextDecoder('utf8', { fatal: false }); + return TextDecoderNonFatal.decode(buffer.subarray(start, end)); +} diff --git a/user-service/node_modules/bson/src/parser/calculate_size.ts b/user-service/node_modules/bson/src/parser/calculate_size.ts new file mode 100644 index 0000000000..fd1e4a0294 --- /dev/null +++ b/user-service/node_modules/bson/src/parser/calculate_size.ts @@ -0,0 +1,211 @@ +import { Binary } from '../binary'; +import type { Document } from '../bson'; +import { BSONVersionError } from '../error'; +import * as constants from '../constants'; +import { ByteUtils } from '../utils/byte_utils'; +import { isAnyArrayBuffer, isDate, isRegExp } from './utils'; + +export function internalCalculateObjectSize( + object: Document, + serializeFunctions?: boolean, + ignoreUndefined?: boolean +): number { + let totalLength = 4 + 1; + + if (Array.isArray(object)) { + for (let i = 0; i < object.length; i++) { + totalLength += calculateElement( + i.toString(), + object[i], + serializeFunctions, + true, + ignoreUndefined + ); + } + } else { + // If we have toBSON defined, override the current object + + if (typeof object?.toBSON === 'function') { + object = object.toBSON(); + } + + // Calculate size + for (const key of Object.keys(object)) { + totalLength += calculateElement(key, object[key], serializeFunctions, false, ignoreUndefined); + } + } + + return totalLength; +} + +/** @internal */ +function calculateElement( + name: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any, + serializeFunctions = false, + isArray = false, + ignoreUndefined = false +) { + // If we have toBSON defined, override the current object + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + + switch (typeof value) { + case 'string': + return 1 + ByteUtils.utf8ByteLength(name) + 1 + 4 + ByteUtils.utf8ByteLength(value) + 1; + case 'number': + if ( + Math.floor(value) === value && + value >= constants.JS_INT_MIN && + value <= constants.JS_INT_MAX + ) { + if (value >= constants.BSON_INT32_MIN && value <= constants.BSON_INT32_MAX) { + // 32 bit + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (4 + 1); + } else { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + } else { + // 64 bit + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } + case 'undefined': + if (isArray || !ignoreUndefined) + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + return 0; + case 'boolean': + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 1); + case 'object': + if ( + value != null && + typeof value._bsontype === 'string' && + value[Symbol.for('@@mdb.bson.version')] !== constants.BSON_MAJOR_VERSION + ) { + throw new BSONVersionError(); + } else if (value == null || value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + 1; + } else if (value._bsontype === 'ObjectId') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (12 + 1); + } else if (value instanceof Date || isDate(value)) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } else if ( + ArrayBuffer.isView(value) || + value instanceof ArrayBuffer || + isAnyArrayBuffer(value) + ) { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (1 + 4 + 1) + value.byteLength + ); + } else if ( + value._bsontype === 'Long' || + value._bsontype === 'Double' || + value._bsontype === 'Timestamp' + ) { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (8 + 1); + } else if (value._bsontype === 'Decimal128') { + return (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (16 + 1); + } else if (value._bsontype === 'Code') { + // Calculate size depending on the availability of a scope + if (value.scope != null && Object.keys(value.scope).length > 0) { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + + internalCalculateObjectSize(value.scope, serializeFunctions, ignoreUndefined) + ); + } else { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.code.toString()) + + 1 + ); + } + } else if (value._bsontype === 'Binary') { + const binary: Binary = value; + // Check what kind of subtype we have + if (binary.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + (binary.position + 1 + 4 + 1 + 4) + ); + } else { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + (binary.position + 1 + 4 + 1) + ); + } + } else if (value._bsontype === 'Symbol') { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + ByteUtils.utf8ByteLength(value.value) + + 4 + + 1 + + 1 + ); + } else if (value._bsontype === 'DBRef') { + // Set up correct object for serialization + const ordered_values = Object.assign( + { + $ref: value.collection, + $id: value.oid + }, + value.fields + ); + + // Add db reference if it exists + if (value.db != null) { + ordered_values['$db'] = value.db; + } + + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + internalCalculateObjectSize(ordered_values, serializeFunctions, ignoreUndefined) + ); + } else if (value instanceof RegExp || isRegExp(value)) { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.source) + + 1 + + (value.global ? 1 : 0) + + (value.ignoreCase ? 1 : 0) + + (value.multiline ? 1 : 0) + + 1 + ); + } else if (value._bsontype === 'BSONRegExp') { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + ByteUtils.utf8ByteLength(value.pattern) + + 1 + + ByteUtils.utf8ByteLength(value.options) + + 1 + ); + } else { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + internalCalculateObjectSize(value, serializeFunctions, ignoreUndefined) + + 1 + ); + } + case 'function': + if (serializeFunctions) { + return ( + (name != null ? ByteUtils.utf8ByteLength(name) + 1 : 0) + + 1 + + 4 + + ByteUtils.utf8ByteLength(value.toString()) + + 1 + ); + } + } + + return 0; +} diff --git a/user-service/node_modules/bson/src/parser/deserializer.ts b/user-service/node_modules/bson/src/parser/deserializer.ts new file mode 100644 index 0000000000..165a529cf7 --- /dev/null +++ b/user-service/node_modules/bson/src/parser/deserializer.ts @@ -0,0 +1,655 @@ +import { Binary, UUID } from '../binary'; +import type { Document } from '../bson'; +import { Code } from '../code'; +import * as constants from '../constants'; +import { DBRef, type DBRefLike, isDBRefLike } from '../db_ref'; +import { Decimal128 } from '../decimal128'; +import { Double } from '../double'; +import { BSONError } from '../error'; +import { Int32 } from '../int_32'; +import { Long } from '../long'; +import { MaxKey } from '../max_key'; +import { MinKey } from '../min_key'; +import { ObjectId } from '../objectid'; +import { BSONRegExp } from '../regexp'; +import { BSONSymbol } from '../symbol'; +import { Timestamp } from '../timestamp'; +import { ByteUtils } from '../utils/byte_utils'; +import { NumberUtils } from '../utils/number_utils'; + +/** @public */ +export interface DeserializeOptions { + /** + * when deserializing a Long return as a BigInt. + * @defaultValue `false` + */ + useBigInt64?: boolean; + /** + * when deserializing a Long will fit it into a Number if it's smaller than 53 bits. + * @defaultValue `true` + */ + promoteLongs?: boolean; + /** + * when deserializing a Binary will return it as a node.js Buffer instance. + * @defaultValue `false` + */ + promoteBuffers?: boolean; + /** + * when deserializing will promote BSON values to their Node.js closest equivalent types. + * @defaultValue `true` + */ + promoteValues?: boolean; + /** + * allow to specify if there what fields we wish to return as unserialized raw buffer. + * @defaultValue `null` + */ + fieldsAsRaw?: Document; + /** + * return BSON regular expressions as BSONRegExp instances. + * @defaultValue `false` + */ + bsonRegExp?: boolean; + /** + * allows the buffer to be larger than the parsed BSON object. + * @defaultValue `false` + */ + allowObjectSmallerThanBufferSize?: boolean; + /** + * Offset into buffer to begin reading document from + * @defaultValue `0` + */ + index?: number; + + raw?: boolean; + /** Allows for opt-out utf-8 validation for all keys or + * specified keys. Must be all true or all false. + * + * @example + * ```js + * // disables validation on all keys + * validation: { utf8: false } + * + * // enables validation only on specified keys a, b, and c + * validation: { utf8: { a: true, b: true, c: true } } + * + * // disables validation only on specified keys a, b + * validation: { utf8: { a: false, b: false } } + * ``` + */ + validation?: { utf8: boolean | Record | Record }; +} + +// Internal long versions +const JS_INT_MAX_LONG = Long.fromNumber(constants.JS_INT_MAX); +const JS_INT_MIN_LONG = Long.fromNumber(constants.JS_INT_MIN); + +export function internalDeserialize( + buffer: Uint8Array, + options: DeserializeOptions, + isArray?: boolean +): Document { + options = options == null ? {} : options; + const index = options && options.index ? options.index : 0; + // Read the document size + const size = NumberUtils.getInt32LE(buffer, index); + + if (size < 5) { + throw new BSONError(`bson size must be >= 5, is ${size}`); + } + + if (options.allowObjectSmallerThanBufferSize && buffer.length < size) { + throw new BSONError(`buffer length ${buffer.length} must be >= bson size ${size}`); + } + + if (!options.allowObjectSmallerThanBufferSize && buffer.length !== size) { + throw new BSONError(`buffer length ${buffer.length} must === bson size ${size}`); + } + + if (size + index > buffer.byteLength) { + throw new BSONError( + `(bson size ${size} + options.index ${index} must be <= buffer length ${buffer.byteLength})` + ); + } + + // Illegal end value + if (buffer[index + size - 1] !== 0) { + throw new BSONError( + "One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00" + ); + } + + // Start deserialization + return deserializeObject(buffer, index, options, isArray); +} + +const allowedDBRefKeys = /^\$ref$|^\$id$|^\$db$/; + +function deserializeObject( + buffer: Uint8Array, + index: number, + options: DeserializeOptions, + isArray = false +) { + const fieldsAsRaw = options['fieldsAsRaw'] == null ? null : options['fieldsAsRaw']; + + // Return raw bson buffer instead of parsing it + const raw = options['raw'] == null ? false : options['raw']; + + // Return BSONRegExp objects instead of native regular expressions + const bsonRegExp = typeof options['bsonRegExp'] === 'boolean' ? options['bsonRegExp'] : false; + + // Controls the promotion of values vs wrapper classes + const promoteBuffers = options.promoteBuffers ?? false; + const promoteLongs = options.promoteLongs ?? true; + const promoteValues = options.promoteValues ?? true; + const useBigInt64 = options.useBigInt64 ?? false; + + if (useBigInt64 && !promoteValues) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + + if (useBigInt64 && !promoteLongs) { + throw new BSONError('Must either request bigint or Long for int64 deserialization'); + } + + // Ensures default validation option if none given + const validation = options.validation == null ? { utf8: true } : options.validation; + + // Shows if global utf-8 validation is enabled or disabled + let globalUTFValidation = true; + // Reflects utf-8 validation setting regardless of global or specific key validation + let validationSetting: boolean; + // Set of keys either to enable or disable validation on + let utf8KeysSet; + + // Check for boolean uniformity and empty validation option + const utf8ValidatedKeys = validation.utf8; + if (typeof utf8ValidatedKeys === 'boolean') { + validationSetting = utf8ValidatedKeys; + } else { + globalUTFValidation = false; + const utf8ValidationValues = Object.keys(utf8ValidatedKeys).map(function (key) { + return utf8ValidatedKeys[key]; + }); + if (utf8ValidationValues.length === 0) { + throw new BSONError('UTF-8 validation setting cannot be empty'); + } + if (typeof utf8ValidationValues[0] !== 'boolean') { + throw new BSONError('Invalid UTF-8 validation option, must specify boolean values'); + } + validationSetting = utf8ValidationValues[0]; + // Ensures boolean uniformity in utf-8 validation (all true or all false) + if (!utf8ValidationValues.every(item => item === validationSetting)) { + throw new BSONError('Invalid UTF-8 validation option - keys must be all true or all false'); + } + } + + // Add keys to set that will either be validated or not based on validationSetting + if (!globalUTFValidation) { + utf8KeysSet = new Set(); + + for (const key of Object.keys(utf8ValidatedKeys)) { + utf8KeysSet.add(key); + } + } + + // Set the start index + const startIndex = index; + + // Validate that we have at least 4 bytes of buffer + if (buffer.length < 5) throw new BSONError('corrupt bson message < 5 bytes long'); + + // Read the document size + const size = NumberUtils.getInt32LE(buffer, index); + index += 4; + + // Ensure buffer is valid size + if (size < 5 || size > buffer.length) throw new BSONError('corrupt bson message'); + + // Create holding object + const object: Document = isArray ? [] : {}; + // Used for arrays to skip having to perform utf8 decoding + let arrayIndex = 0; + const done = false; + + let isPossibleDBRef = isArray ? false : null; + + // While we have more left data left keep parsing + while (!done) { + // Read the type + const elementType = buffer[index++]; + + // If we get a zero it's the last byte, exit + if (elementType === 0) break; + + // Get the start search index + let i = index; + // Locate the end of the c string + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + + // If are at the end of the buffer there is a problem with the document + if (i >= buffer.byteLength) throw new BSONError('Bad BSON Document: illegal CString'); + + // Represents the key + const name = isArray ? arrayIndex++ : ByteUtils.toUTF8(buffer, index, i, false); + + // shouldValidateKey is true if the key should be validated, false otherwise + let shouldValidateKey = true; + if (globalUTFValidation || utf8KeysSet?.has(name)) { + shouldValidateKey = validationSetting; + } else { + shouldValidateKey = !validationSetting; + } + + if (isPossibleDBRef !== false && (name as string)[0] === '$') { + isPossibleDBRef = allowedDBRefKeys.test(name as string); + } + let value; + + index = i + 1; + + if (elementType === constants.BSON_DATA_STRING) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if ( + stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0 + ) { + throw new BSONError('bad string length in bson'); + } + value = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + index = index + stringSize; + } else if (elementType === constants.BSON_DATA_OID) { + const oid = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) oid[i] = buffer[index + i]; + value = new ObjectId(oid); + index = index + 12; + } else if (elementType === constants.BSON_DATA_INT && promoteValues === false) { + value = new Int32(NumberUtils.getInt32LE(buffer, index)); + index += 4; + } else if (elementType === constants.BSON_DATA_INT) { + value = NumberUtils.getInt32LE(buffer, index); + index += 4; + } else if (elementType === constants.BSON_DATA_NUMBER) { + value = NumberUtils.getFloat64LE(buffer, index); + index += 8; + if (promoteValues === false) value = new Double(value); + } else if (elementType === constants.BSON_DATA_DATE) { + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + + value = new Date(new Long(lowBits, highBits).toNumber()); + } else if (elementType === constants.BSON_DATA_BOOLEAN) { + if (buffer[index] !== 0 && buffer[index] !== 1) + throw new BSONError('illegal boolean type value'); + value = buffer[index++] === 1; + } else if (elementType === constants.BSON_DATA_OBJECT) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + + if (objectSize <= 0 || objectSize > buffer.length - index) + throw new BSONError('bad embedded document length in bson'); + + // We have a raw value + if (raw) { + value = buffer.slice(index, index + objectSize); + } else { + let objectOptions = options; + if (!globalUTFValidation) { + objectOptions = { ...options, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, objectOptions, false); + } + + index = index + objectSize; + } else if (elementType === constants.BSON_DATA_ARRAY) { + const _index = index; + const objectSize = NumberUtils.getInt32LE(buffer, index); + let arrayOptions: DeserializeOptions = options; + + // Stop index + const stopIndex = index + objectSize; + + // All elements of array to be returned as raw bson + if (fieldsAsRaw && fieldsAsRaw[name]) { + arrayOptions = { ...options, raw: true }; + } + + if (!globalUTFValidation) { + arrayOptions = { ...arrayOptions, validation: { utf8: shouldValidateKey } }; + } + value = deserializeObject(buffer, _index, arrayOptions, true); + index = index + objectSize; + + if (buffer[index - 1] !== 0) throw new BSONError('invalid array terminator byte'); + if (index !== stopIndex) throw new BSONError('corrupted array bson'); + } else if (elementType === constants.BSON_DATA_UNDEFINED) { + value = undefined; + } else if (elementType === constants.BSON_DATA_NULL) { + value = null; + } else if (elementType === constants.BSON_DATA_LONG) { + if (useBigInt64) { + value = NumberUtils.getBigInt64LE(buffer, index); + index += 8; + } else { + // Unpack the low and high bits + const lowBits = NumberUtils.getInt32LE(buffer, index); + const highBits = NumberUtils.getInt32LE(buffer, index + 4); + index += 8; + + const long = new Long(lowBits, highBits); + // Promote the long if possible + if (promoteLongs && promoteValues === true) { + value = + long.lessThanOrEqual(JS_INT_MAX_LONG) && long.greaterThanOrEqual(JS_INT_MIN_LONG) + ? long.toNumber() + : long; + } else { + value = long; + } + } + } else if (elementType === constants.BSON_DATA_DECIMAL128) { + // Buffer to contain the decimal bytes + const bytes = ByteUtils.allocateUnsafe(16); + // Copy the next 16 bytes into the bytes buffer + for (let i = 0; i < 16; i++) bytes[i] = buffer[index + i]; + // Update index + index = index + 16; + // Assign the new Decimal128 value + value = new Decimal128(bytes); + } else if (elementType === constants.BSON_DATA_BINARY) { + let binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + const totalBinarySize = binarySize; + const subType = buffer[index++]; + + // Did we have a negative binary size, throw + if (binarySize < 0) throw new BSONError('Negative binary type element size found'); + + // Is the length longer than the document + if (binarySize > buffer.byteLength) + throw new BSONError('Binary type size larger than document size'); + + // Decode as raw Buffer object if options specifies it + if (buffer['slice'] != null) { + // If we have subtype 2 skip the 4 bytes for the size + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + + if (promoteBuffers && promoteValues) { + value = ByteUtils.toLocalBufferType(buffer.slice(index, index + binarySize)); + } else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === constants.BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } else { + // If we have subtype 2 skip the 4 bytes for the size + if (subType === Binary.SUBTYPE_BYTE_ARRAY) { + binarySize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if (binarySize < 0) + throw new BSONError('Negative binary type element size found for subtype 0x02'); + if (binarySize > totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too long binary size'); + if (binarySize < totalBinarySize - 4) + throw new BSONError('Binary type with subtype 0x02 contains too short binary size'); + } + + if (promoteBuffers && promoteValues) { + value = ByteUtils.allocateUnsafe(binarySize); + // Copy the data + for (i = 0; i < binarySize; i++) { + value[i] = buffer[index + i]; + } + } else { + value = new Binary(buffer.slice(index, index + binarySize), subType); + if (subType === constants.BSON_BINARY_SUBTYPE_UUID_NEW && UUID.isValid(value)) { + value = value.toUUID(); + } + } + } + + // Update the index + index = index + binarySize; + } else if (elementType === constants.BSON_DATA_REGEXP && bsonRegExp === false) { + // Get the start search index + i = index; + // Locate the end of the c string + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + // If are at the end of the buffer there is a problem with the document + if (i >= buffer.length) throw new BSONError('Bad BSON Document: illegal CString'); + // Return the C string + const source = ByteUtils.toUTF8(buffer, index, i, false); + // Create the regexp + index = i + 1; + + // Get the start search index + i = index; + // Locate the end of the c string + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + // If are at the end of the buffer there is a problem with the document + if (i >= buffer.length) throw new BSONError('Bad BSON Document: illegal CString'); + // Return the C string + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + + // For each option add the corresponding one for javascript + const optionsArray = new Array(regExpOptions.length); + + // Parse options + for (i = 0; i < regExpOptions.length; i++) { + switch (regExpOptions[i]) { + case 'm': + optionsArray[i] = 'm'; + break; + case 's': + optionsArray[i] = 'g'; + break; + case 'i': + optionsArray[i] = 'i'; + break; + } + } + + value = new RegExp(source, optionsArray.join('')); + } else if (elementType === constants.BSON_DATA_REGEXP && bsonRegExp === true) { + // Get the start search index + i = index; + // Locate the end of the c string + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + // If are at the end of the buffer there is a problem with the document + if (i >= buffer.length) throw new BSONError('Bad BSON Document: illegal CString'); + // Return the C string + const source = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + + // Get the start search index + i = index; + // Locate the end of the c string + while (buffer[i] !== 0x00 && i < buffer.length) { + i++; + } + // If are at the end of the buffer there is a problem with the document + if (i >= buffer.length) throw new BSONError('Bad BSON Document: illegal CString'); + // Return the C string + const regExpOptions = ByteUtils.toUTF8(buffer, index, i, false); + index = i + 1; + + // Set the object + value = new BSONRegExp(source, regExpOptions); + } else if (elementType === constants.BSON_DATA_SYMBOL) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if ( + stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0 + ) { + throw new BSONError('bad string length in bson'); + } + const symbol = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + value = promoteValues ? symbol : new BSONSymbol(symbol); + index = index + stringSize; + } else if (elementType === constants.BSON_DATA_TIMESTAMP) { + value = new Timestamp({ + i: NumberUtils.getUint32LE(buffer, index), + t: NumberUtils.getUint32LE(buffer, index + 4) + }); + index += 8; + } else if (elementType === constants.BSON_DATA_MIN_KEY) { + value = new MinKey(); + } else if (elementType === constants.BSON_DATA_MAX_KEY) { + value = new MaxKey(); + } else if (elementType === constants.BSON_DATA_CODE) { + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + if ( + stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0 + ) { + throw new BSONError('bad string length in bson'); + } + const functionString = ByteUtils.toUTF8( + buffer, + index, + index + stringSize - 1, + shouldValidateKey + ); + + value = new Code(functionString); + + // Update parse index position + index = index + stringSize; + } else if (elementType === constants.BSON_DATA_CODE_W_SCOPE) { + const totalSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + + // Element cannot be shorter than totalSize + stringSize + documentSize + terminator + if (totalSize < 4 + 4 + 4 + 1) { + throw new BSONError('code_w_scope total size shorter minimum expected length'); + } + + // Get the code string size + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + // Check if we have a valid string + if ( + stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0 + ) { + throw new BSONError('bad string length in bson'); + } + + // Javascript function + const functionString = ByteUtils.toUTF8( + buffer, + index, + index + stringSize - 1, + shouldValidateKey + ); + // Update parse index position + index = index + stringSize; + // Parse the element + const _index = index; + // Decode the size of the object document + const objectSize = NumberUtils.getInt32LE(buffer, index); + // Decode the scope object + const scopeObject = deserializeObject(buffer, _index, options, false); + // Adjust the index + index = index + objectSize; + + // Check if field length is too short + if (totalSize < 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too short, truncating scope'); + } + + // Check if totalSize field is too long + if (totalSize > 4 + 4 + objectSize + stringSize) { + throw new BSONError('code_w_scope total size is too long, clips outer document'); + } + + value = new Code(functionString, scopeObject); + } else if (elementType === constants.BSON_DATA_DBPOINTER) { + // Get the code string size + const stringSize = NumberUtils.getInt32LE(buffer, index); + index += 4; + // Check if we have a valid string + if ( + stringSize <= 0 || + stringSize > buffer.length - index || + buffer[index + stringSize - 1] !== 0 + ) + throw new BSONError('bad string length in bson'); + // Namespace + const namespace = ByteUtils.toUTF8(buffer, index, index + stringSize - 1, shouldValidateKey); + // Update parse index position + index = index + stringSize; + + // Read the oid + const oidBuffer = ByteUtils.allocateUnsafe(12); + for (let i = 0; i < 12; i++) oidBuffer[i] = buffer[index + i]; + const oid = new ObjectId(oidBuffer); + + // Update the index + index = index + 12; + + // Upgrade to DBRef type + value = new DBRef(namespace, oid); + } else { + throw new BSONError( + `Detected unknown BSON type ${elementType.toString(16)} for fieldname "${name}"` + ); + } + if (name === '__proto__') { + Object.defineProperty(object, name, { + value, + writable: true, + enumerable: true, + configurable: true + }); + } else { + object[name] = value; + } + } + + // Check if the deserialization was against a valid array/object + if (size !== index - startIndex) { + if (isArray) throw new BSONError('corrupt array bson'); + throw new BSONError('corrupt object bson'); + } + + // if we did not find "$ref", "$id", "$db", or found an extraneous $key, don't make a DBRef + if (!isPossibleDBRef) return object; + + if (isDBRefLike(object)) { + const copy = Object.assign({}, object) as Partial; + delete copy.$ref; + delete copy.$id; + delete copy.$db; + return new DBRef(object.$ref, object.$id, object.$db, copy); + } + + return object; +} diff --git a/user-service/node_modules/bson/src/parser/on_demand/index.ts b/user-service/node_modules/bson/src/parser/on_demand/index.ts new file mode 100644 index 0000000000..f099c11528 --- /dev/null +++ b/user-service/node_modules/bson/src/parser/on_demand/index.ts @@ -0,0 +1,32 @@ +import { ByteUtils } from '../../utils/byte_utils'; +import { NumberUtils } from '../../utils/number_utils'; +import { type BSONElement, parseToElements } from './parse_to_elements'; +/** + * @experimental + * @public + * + * A new set of BSON APIs that are currently experimental and not intended for production use. + */ +export type OnDemand = { + parseToElements: (this: void, bytes: Uint8Array, startOffset?: number) => Iterable; + // Types + BSONElement: BSONElement; + + // Utils + ByteUtils: ByteUtils; + NumberUtils: NumberUtils; +}; + +/** + * @experimental + * @public + */ +const onDemand: OnDemand = Object.create(null); + +onDemand.parseToElements = parseToElements; +onDemand.ByteUtils = ByteUtils; +onDemand.NumberUtils = NumberUtils; + +Object.freeze(onDemand); + +export { onDemand }; diff --git a/user-service/node_modules/bson/src/parser/on_demand/parse_to_elements.ts b/user-service/node_modules/bson/src/parser/on_demand/parse_to_elements.ts new file mode 100644 index 0000000000..f2c8e6972c --- /dev/null +++ b/user-service/node_modules/bson/src/parser/on_demand/parse_to_elements.ts @@ -0,0 +1,188 @@ +import { BSONOffsetError } from '../../error'; +import { NumberUtils } from '../../utils/number_utils'; + +/** + * @internal + * + * @remarks + * - This enum is const so the code we produce will inline the numbers + * - `minKey` is set to 255 so unsigned comparisons succeed + * - Modify with caution, double check the bundle contains literals + */ +const enum BSONElementType { + double = 1, + string = 2, + object = 3, + array = 4, + binData = 5, + undefined = 6, + objectId = 7, + bool = 8, + date = 9, + null = 10, + regex = 11, + dbPointer = 12, + javascript = 13, + symbol = 14, + javascriptWithScope = 15, + int = 16, + timestamp = 17, + long = 18, + decimal = 19, + minKey = 255, + maxKey = 127 +} + +/** + * @public + * @experimental + */ +export type BSONElement = [ + type: number, + nameOffset: number, + nameLength: number, + offset: number, + length: number +]; + +function getSize(source: Uint8Array, offset: number) { + try { + return NumberUtils.getNonnegativeInt32LE(source, offset); + } catch (cause) { + throw new BSONOffsetError('BSON size cannot be negative', offset, { cause }); + } +} + +/** + * Searches for null terminator of a BSON element's value (Never the document null terminator) + * **Does not** bounds check since this should **ONLY** be used within parseToElements which has asserted that `bytes` ends with a `0x00`. + * So this will at most iterate to the document's terminator and error if that is the offset reached. + */ +function findNull(bytes: Uint8Array, offset: number): number { + let nullTerminatorOffset = offset; + + for (; bytes[nullTerminatorOffset] !== 0x00; nullTerminatorOffset++); + + if (nullTerminatorOffset === bytes.length - 1) { + // We reached the null terminator of the document, not a value's + throw new BSONOffsetError('Null terminator not found', offset); + } + + return nullTerminatorOffset; +} + +/** + * @public + * @experimental + */ +export function parseToElements( + bytes: Uint8Array, + startOffset: number | null = 0 +): Iterable { + startOffset ??= 0; + + if (bytes.length < 5) { + throw new BSONOffsetError( + `Input must be at least 5 bytes, got ${bytes.length} bytes`, + startOffset + ); + } + + const documentSize = getSize(bytes, startOffset); + + if (documentSize > bytes.length - startOffset) { + throw new BSONOffsetError( + `Parsed documentSize (${documentSize} bytes) does not match input length (${bytes.length} bytes)`, + startOffset + ); + } + + if (bytes[startOffset + documentSize - 1] !== 0x00) { + throw new BSONOffsetError('BSON documents must end in 0x00', startOffset + documentSize); + } + + const elements: BSONElement[] = []; + let offset = startOffset + 4; + + while (offset <= documentSize + startOffset) { + const type = bytes[offset]; + offset += 1; + + if (type === 0) { + if (offset - startOffset !== documentSize) { + throw new BSONOffsetError(`Invalid 0x00 type byte`, offset); + } + break; + } + + const nameOffset = offset; + const nameLength = findNull(bytes, offset) - nameOffset; + offset += nameLength + 1; + + let length: number; + + if ( + type === BSONElementType.double || + type === BSONElementType.long || + type === BSONElementType.date || + type === BSONElementType.timestamp + ) { + length = 8; + } else if (type === BSONElementType.int) { + length = 4; + } else if (type === BSONElementType.objectId) { + length = 12; + } else if (type === BSONElementType.decimal) { + length = 16; + } else if (type === BSONElementType.bool) { + length = 1; + } else if ( + type === BSONElementType.null || + type === BSONElementType.undefined || + type === BSONElementType.maxKey || + type === BSONElementType.minKey + ) { + length = 0; + } + // Needs a size calculation + else if (type === BSONElementType.regex) { + length = findNull(bytes, findNull(bytes, offset) + 1) + 1 - offset; + } else if ( + type === BSONElementType.object || + type === BSONElementType.array || + type === BSONElementType.javascriptWithScope + ) { + length = getSize(bytes, offset); + } else if ( + type === BSONElementType.string || + type === BSONElementType.binData || + type === BSONElementType.dbPointer || + type === BSONElementType.javascript || + type === BSONElementType.symbol + ) { + length = getSize(bytes, offset) + 4; + if (type === BSONElementType.binData) { + // binary subtype + length += 1; + } + if (type === BSONElementType.dbPointer) { + // dbPointer's objectId + length += 12; + } + } else { + throw new BSONOffsetError( + `Invalid 0x${type.toString(16).padStart(2, '0')} type byte`, + offset + ); + } + + if (length > documentSize) { + throw new BSONOffsetError('value reports length larger than document', offset); + } + + elements.push([type, nameOffset, nameLength, offset, length]); + offset += length; + } + + return elements; +} diff --git a/user-service/node_modules/bson/src/parser/serializer.ts b/user-service/node_modules/bson/src/parser/serializer.ts new file mode 100644 index 0000000000..86490798e2 --- /dev/null +++ b/user-service/node_modules/bson/src/parser/serializer.ts @@ -0,0 +1,942 @@ +import { Binary } from '../binary'; +import type { BSONSymbol, DBRef, Document, MaxKey } from '../bson'; +import type { Code } from '../code'; +import * as constants from '../constants'; +import type { DBRefLike } from '../db_ref'; +import type { Decimal128 } from '../decimal128'; +import type { Double } from '../double'; +import { BSONError, BSONVersionError } from '../error'; +import type { Int32 } from '../int_32'; +import { Long } from '../long'; +import type { MinKey } from '../min_key'; +import type { ObjectId } from '../objectid'; +import type { BSONRegExp } from '../regexp'; +import { ByteUtils } from '../utils/byte_utils'; +import { NumberUtils } from '../utils/number_utils'; +import { isAnyArrayBuffer, isDate, isMap, isRegExp, isUint8Array } from './utils'; + +/** @public */ +export interface SerializeOptions { + /** + * the serializer will check if keys are valid. + * @defaultValue `false` + */ + checkKeys?: boolean; + /** + * serialize the javascript functions + * @defaultValue `false` + */ + serializeFunctions?: boolean; + /** + * serialize will not emit undefined fields + * note that the driver sets this to `false` + * @defaultValue `true` + */ + ignoreUndefined?: boolean; + /** @internal Resize internal buffer */ + minInternalBufferSize?: number; + /** + * the index in the buffer where we wish to start serializing into + * @defaultValue `0` + */ + index?: number; +} + +const regexp = /\x00/; // eslint-disable-line no-control-regex +const ignoreKeys = new Set(['$db', '$ref', '$id', '$clusterTime']); + +/* + * isArray indicates if we are writing to a BSON array (type 0x04) + * which forces the "key" which really an array index as a string to be written as ascii + * This will catch any errors in index as a string generation + */ + +function serializeString(buffer: Uint8Array, key: string, value: string, index: number) { + // Encode String type + buffer[index++] = constants.BSON_DATA_STRING; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes + 1; + buffer[index - 1] = 0; + // Write the string + const size = ByteUtils.encodeUTF8Into(buffer, value, index + 4); + // Write the size of the string to buffer + NumberUtils.setInt32LE(buffer, index, size + 1); + // Update index + index = index + 4 + size; + // Write zero + buffer[index++] = 0; + return index; +} + +function serializeNumber(buffer: Uint8Array, key: string, value: number, index: number) { + const isNegativeZero = Object.is(value, -0); + + const type = + !isNegativeZero && + Number.isSafeInteger(value) && + value <= constants.BSON_INT32_MAX && + value >= constants.BSON_INT32_MIN + ? constants.BSON_DATA_INT + : constants.BSON_DATA_NUMBER; + + buffer[index++] = type; + + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + index = index + numberOfWrittenBytes; + buffer[index++] = 0x00; + + if (type === constants.BSON_DATA_INT) { + index += NumberUtils.setInt32LE(buffer, index, value); + } else { + index += NumberUtils.setFloat64LE(buffer, index, value); + } + + return index; +} + +function serializeBigInt(buffer: Uint8Array, key: string, value: bigint, index: number) { + buffer[index++] = constants.BSON_DATA_LONG; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index += numberOfWrittenBytes; + buffer[index++] = 0; + + index += NumberUtils.setBigInt64LE(buffer, index, value); + + return index; +} + +function serializeNull(buffer: Uint8Array, key: string, _: unknown, index: number) { + // Set long type + buffer[index++] = constants.BSON_DATA_NULL; + + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} + +function serializeBoolean(buffer: Uint8Array, key: string, value: boolean, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_BOOLEAN; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Encode the boolean value + buffer[index++] = value ? 1 : 0; + return index; +} + +function serializeDate(buffer: Uint8Array, key: string, value: Date, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_DATE; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + // Write the date + const dateInMilis = Long.fromNumber(value.getTime()); + const lowBits = dateInMilis.getLowBits(); + const highBits = dateInMilis.getHighBits(); + // Encode low bits + index += NumberUtils.setInt32LE(buffer, index, lowBits); + // Encode high bits + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} + +function serializeRegExp(buffer: Uint8Array, key: string, value: RegExp, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_REGEXP; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + if (value.source && value.source.match(regexp) != null) { + throw new BSONError('value ' + value.source + ' must not contain null bytes'); + } + // Adjust the index + index = index + ByteUtils.encodeUTF8Into(buffer, value.source, index); + // Write zero + buffer[index++] = 0x00; + // Write the parameters + if (value.ignoreCase) buffer[index++] = 0x69; // i + if (value.global) buffer[index++] = 0x73; // s + if (value.multiline) buffer[index++] = 0x6d; // m + + // Add ending zero + buffer[index++] = 0x00; + return index; +} + +function serializeBSONRegExp(buffer: Uint8Array, key: string, value: BSONRegExp, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_REGEXP; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + // Check the pattern for 0 bytes + if (value.pattern.match(regexp) != null) { + // The BSON spec doesn't allow keys with null bytes because keys are + // null-terminated. + throw new BSONError('pattern ' + value.pattern + ' must not contain null bytes'); + } + + // Adjust the index + index = index + ByteUtils.encodeUTF8Into(buffer, value.pattern, index); + // Write zero + buffer[index++] = 0x00; + // Write the options + const sortedOptions = value.options.split('').sort().join(''); + index = index + ByteUtils.encodeUTF8Into(buffer, sortedOptions, index); + // Add ending zero + buffer[index++] = 0x00; + return index; +} + +function serializeMinMax(buffer: Uint8Array, key: string, value: MinKey | MaxKey, index: number) { + // Write the type of either min or max key + if (value === null) { + buffer[index++] = constants.BSON_DATA_NULL; + } else if (value._bsontype === 'MinKey') { + buffer[index++] = constants.BSON_DATA_MIN_KEY; + } else { + buffer[index++] = constants.BSON_DATA_MAX_KEY; + } + + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + return index; +} + +function serializeObjectId(buffer: Uint8Array, key: string, value: ObjectId, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_OID; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + index += value.serializeInto(buffer, index); + + // Adjust index + return index; +} + +function serializeBuffer(buffer: Uint8Array, key: string, value: Uint8Array, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_BINARY; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Get size of the buffer (current write point) + const size = value.length; + // Write the size of the string to buffer + index += NumberUtils.setInt32LE(buffer, index, size); + // Write the default subtype + buffer[index++] = constants.BSON_BINARY_SUBTYPE_DEFAULT; + // Copy the content form the binary field to the buffer + if (size <= 16) { + for (let i = 0; i < size; i++) buffer[index + i] = value[i]; + } else { + buffer.set(value, index); + } + // Adjust the index + index = index + size; + return index; +} + +function serializeObject( + buffer: Uint8Array, + key: string, + value: Document, + index: number, + checkKeys: boolean, + depth: number, + serializeFunctions: boolean, + ignoreUndefined: boolean, + path: Set +) { + if (path.has(value)) { + throw new BSONError('Cannot convert circular structure to BSON'); + } + + path.add(value); + + // Write the type + buffer[index++] = Array.isArray(value) ? constants.BSON_DATA_ARRAY : constants.BSON_DATA_OBJECT; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + const endIndex = serializeInto( + buffer, + value, + checkKeys, + index, + depth + 1, + serializeFunctions, + ignoreUndefined, + path + ); + + path.delete(value); + + return endIndex; +} + +function serializeDecimal128(buffer: Uint8Array, key: string, value: Decimal128, index: number) { + buffer[index++] = constants.BSON_DATA_DECIMAL128; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Write the data from the value + for (let i = 0; i < 16; i++) buffer[index + i] = value.bytes[i]; + return index + 16; +} + +function serializeLong(buffer: Uint8Array, key: string, value: Long, index: number) { + // Write the type + buffer[index++] = + value._bsontype === 'Long' ? constants.BSON_DATA_LONG : constants.BSON_DATA_TIMESTAMP; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Write the date + const lowBits = value.getLowBits(); + const highBits = value.getHighBits(); + // Encode low bits + index += NumberUtils.setInt32LE(buffer, index, lowBits); + // Encode high bits + index += NumberUtils.setInt32LE(buffer, index, highBits); + return index; +} + +function serializeInt32(buffer: Uint8Array, key: string, value: Int32 | number, index: number) { + value = value.valueOf(); + // Set int type 32 bits or less + buffer[index++] = constants.BSON_DATA_INT; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Write the int value + index += NumberUtils.setInt32LE(buffer, index, value); + return index; +} + +function serializeDouble(buffer: Uint8Array, key: string, value: Double, index: number) { + // Encode as double + buffer[index++] = constants.BSON_DATA_NUMBER; + + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + // Write float + index += NumberUtils.setFloat64LE(buffer, index, value.value); + + return index; +} + +function serializeFunction(buffer: Uint8Array, key: string, value: Function, index: number) { + buffer[index++] = constants.BSON_DATA_CODE; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Function string + const functionString = value.toString(); + + // Write the string + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + // Write the size of the string to buffer + NumberUtils.setInt32LE(buffer, index, size); + // Update index + index = index + 4 + size - 1; + // Write zero + buffer[index++] = 0; + return index; +} + +function serializeCode( + buffer: Uint8Array, + key: string, + value: Code, + index: number, + checkKeys = false, + depth = 0, + serializeFunctions = false, + ignoreUndefined = true, + path: Set +) { + if (value.scope && typeof value.scope === 'object') { + // Write the type + buffer[index++] = constants.BSON_DATA_CODE_W_SCOPE; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + // Starting index + let startIndex = index; + + // Serialize the function + // Get the function string + const functionString = value.code; + // Index adjustment + index = index + 4; + // Write string into buffer + const codeSize = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + // Write the size of the string to buffer + NumberUtils.setInt32LE(buffer, index, codeSize); + // Write end 0 + buffer[index + 4 + codeSize - 1] = 0; + // Write the + index = index + codeSize + 4; + + // Serialize the scope value + const endIndex = serializeInto( + buffer, + value.scope, + checkKeys, + index, + depth + 1, + serializeFunctions, + ignoreUndefined, + path + ); + index = endIndex - 1; + + // Writ the total + const totalSize = endIndex - startIndex; + + // Write the total size of the object + startIndex += NumberUtils.setInt32LE(buffer, startIndex, totalSize); + // Write trailing zero + buffer[index++] = 0; + } else { + buffer[index++] = constants.BSON_DATA_CODE; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Function string + const functionString = value.code.toString(); + // Write the string + const size = ByteUtils.encodeUTF8Into(buffer, functionString, index + 4) + 1; + // Write the size of the string to buffer + NumberUtils.setInt32LE(buffer, index, size); + // Update index + index = index + 4 + size - 1; + // Write zero + buffer[index++] = 0; + } + + return index; +} + +function serializeBinary(buffer: Uint8Array, key: string, value: Binary, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_BINARY; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Extract the buffer + const data = value.buffer; + // Calculate size + let size = value.position; + // Add the deprecated 02 type 4 bytes of size to total + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) size = size + 4; + // Write the size of the string to buffer + index += NumberUtils.setInt32LE(buffer, index, size); + // Write the subtype to the buffer + buffer[index++] = value.sub_type; + + // If we have binary type 2 the 4 first bytes are the size + if (value.sub_type === Binary.SUBTYPE_BYTE_ARRAY) { + size = size - 4; + index += NumberUtils.setInt32LE(buffer, index, size); + } + + if (size <= 16) { + for (let i = 0; i < size; i++) buffer[index + i] = data[i]; + } else { + buffer.set(data, index); + } + // Adjust the index + index = index + value.position; + return index; +} + +function serializeSymbol(buffer: Uint8Array, key: string, value: BSONSymbol, index: number) { + // Write the type + buffer[index++] = constants.BSON_DATA_SYMBOL; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + // Write the string + const size = ByteUtils.encodeUTF8Into(buffer, value.value, index + 4) + 1; + // Write the size of the string to buffer + NumberUtils.setInt32LE(buffer, index, size); + // Update index + index = index + 4 + size - 1; + // Write zero + buffer[index++] = 0; + return index; +} + +function serializeDBRef( + buffer: Uint8Array, + key: string, + value: DBRef, + index: number, + depth: number, + serializeFunctions: boolean, + path: Set +) { + // Write the type + buffer[index++] = constants.BSON_DATA_OBJECT; + // Number of written bytes + const numberOfWrittenBytes = ByteUtils.encodeUTF8Into(buffer, key, index); + + // Encode the name + index = index + numberOfWrittenBytes; + buffer[index++] = 0; + + let startIndex = index; + let output: DBRefLike = { + $ref: value.collection || value.namespace, // "namespace" was what library 1.x called "collection" + $id: value.oid + }; + + if (value.db != null) { + output.$db = value.db; + } + + output = Object.assign(output, value.fields); + const endIndex = serializeInto( + buffer, + output, + false, + index, + depth + 1, + serializeFunctions, + true, + path + ); + + // Calculate object size + const size = endIndex - startIndex; + // Write the size + startIndex += NumberUtils.setInt32LE(buffer, index, size); + // Set index + return endIndex; +} + +export function serializeInto( + buffer: Uint8Array, + object: Document, + checkKeys: boolean, + startingIndex: number, + depth: number, + serializeFunctions: boolean, + ignoreUndefined: boolean, + path: Set | null +): number { + if (path == null) { + // We are at the root input + if (object == null) { + // ONLY the root should turn into an empty document + // BSON Empty document has a size of 5 (LE) + buffer[0] = 0x05; + buffer[1] = 0x00; + buffer[2] = 0x00; + buffer[3] = 0x00; + // All documents end with null terminator + buffer[4] = 0x00; + return 5; + } + + if (Array.isArray(object)) { + throw new BSONError('serialize does not support an array as the root input'); + } + if (typeof object !== 'object') { + throw new BSONError('serialize does not support non-object as the root input'); + } else if ('_bsontype' in object && typeof object._bsontype === 'string') { + throw new BSONError(`BSON types cannot be serialized as a document`); + } else if ( + isDate(object) || + isRegExp(object) || + isUint8Array(object) || + isAnyArrayBuffer(object) + ) { + throw new BSONError(`date, regexp, typedarray, and arraybuffer cannot be BSON documents`); + } + + path = new Set(); + } + + // Push the object to the path + path.add(object); + + // Start place to serialize into + let index = startingIndex + 4; + + // Special case isArray + if (Array.isArray(object)) { + // Get object keys + for (let i = 0; i < object.length; i++) { + const key = `${i}`; + let value = object[i]; + + // Is there an override value + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + + if (typeof value === 'string') { + index = serializeString(buffer, key, value, index); + } else if (typeof value === 'number') { + index = serializeNumber(buffer, key, value, index); + } else if (typeof value === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } else if (typeof value === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } else if (value === undefined) { + index = serializeNull(buffer, key, value, index); + } else if (value === null) { + index = serializeNull(buffer, key, value, index); + } else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } else if (typeof value === 'object' && value._bsontype == null) { + index = serializeObject( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if ( + typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== constants.BSON_MAJOR_VERSION + ) { + throw new BSONVersionError(); + } else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } else if (value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } else if (value._bsontype === 'Code') { + index = serializeCode( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } else if (object instanceof Map || isMap(object)) { + const iterator = object.entries(); + let done = false; + + while (!done) { + // Unpack the next entry + const entry = iterator.next(); + done = !!entry.done; + // Are we done, then skip and terminate + if (done) continue; + + // Get the entry values + const key = entry.value[0]; + let value = entry.value[1]; + + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + + // Check the type of the value + const type = typeof value; + + // Check the key and throw error if it's illegal + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + // The BSON spec doesn't allow keys with null bytes because keys are + // null-terminated. + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } else if (value === null || (value === undefined && ignoreUndefined === false)) { + index = serializeNull(buffer, key, value, index); + } else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } else if (type === 'object' && value._bsontype == null) { + index = serializeObject( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if ( + typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== constants.BSON_MAJOR_VERSION + ) { + throw new BSONVersionError(); + } else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } else if (value._bsontype === 'Code') { + index = serializeCode( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } else { + if (typeof object?.toBSON === 'function') { + // Provided a custom serialization method + object = object.toBSON(); + if (object != null && typeof object !== 'object') { + throw new BSONError('toBSON function did not return an object'); + } + } + + // Iterate over all the keys + for (const key of Object.keys(object)) { + let value = object[key]; + // Is there an override value + if (typeof value?.toBSON === 'function') { + value = value.toBSON(); + } + + // Check the type of the value + const type = typeof value; + + // Check the key and throw error if it's illegal + if (typeof key === 'string' && !ignoreKeys.has(key)) { + if (key.match(regexp) != null) { + // The BSON spec doesn't allow keys with null bytes because keys are + // null-terminated. + throw new BSONError('key ' + key + ' must not contain null bytes'); + } + + if (checkKeys) { + if ('$' === key[0]) { + throw new BSONError('key ' + key + " must not start with '$'"); + } else if (key.includes('.')) { + throw new BSONError('key ' + key + " must not contain '.'"); + } + } + } + + if (type === 'string') { + index = serializeString(buffer, key, value, index); + } else if (type === 'number') { + index = serializeNumber(buffer, key, value, index); + } else if (type === 'bigint') { + index = serializeBigInt(buffer, key, value, index); + } else if (type === 'boolean') { + index = serializeBoolean(buffer, key, value, index); + } else if (value instanceof Date || isDate(value)) { + index = serializeDate(buffer, key, value, index); + } else if (value === undefined) { + if (ignoreUndefined === false) index = serializeNull(buffer, key, value, index); + } else if (value === null) { + index = serializeNull(buffer, key, value, index); + } else if (isUint8Array(value)) { + index = serializeBuffer(buffer, key, value, index); + } else if (value instanceof RegExp || isRegExp(value)) { + index = serializeRegExp(buffer, key, value, index); + } else if (type === 'object' && value._bsontype == null) { + index = serializeObject( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if ( + typeof value === 'object' && + value[Symbol.for('@@mdb.bson.version')] !== constants.BSON_MAJOR_VERSION + ) { + throw new BSONVersionError(); + } else if (value._bsontype === 'ObjectId') { + index = serializeObjectId(buffer, key, value, index); + } else if (type === 'object' && value._bsontype === 'Decimal128') { + index = serializeDecimal128(buffer, key, value, index); + } else if (value._bsontype === 'Long' || value._bsontype === 'Timestamp') { + index = serializeLong(buffer, key, value, index); + } else if (value._bsontype === 'Double') { + index = serializeDouble(buffer, key, value, index); + } else if (value._bsontype === 'Code') { + index = serializeCode( + buffer, + key, + value, + index, + checkKeys, + depth, + serializeFunctions, + ignoreUndefined, + path + ); + } else if (typeof value === 'function' && serializeFunctions) { + index = serializeFunction(buffer, key, value, index); + } else if (value._bsontype === 'Binary') { + index = serializeBinary(buffer, key, value, index); + } else if (value._bsontype === 'BSONSymbol') { + index = serializeSymbol(buffer, key, value, index); + } else if (value._bsontype === 'DBRef') { + index = serializeDBRef(buffer, key, value, index, depth, serializeFunctions, path); + } else if (value._bsontype === 'BSONRegExp') { + index = serializeBSONRegExp(buffer, key, value, index); + } else if (value._bsontype === 'Int32') { + index = serializeInt32(buffer, key, value, index); + } else if (value._bsontype === 'MinKey' || value._bsontype === 'MaxKey') { + index = serializeMinMax(buffer, key, value, index); + } else if (typeof value._bsontype !== 'undefined') { + throw new BSONError(`Unrecognized or invalid _bsontype: ${String(value._bsontype)}`); + } + } + } + + // Remove the path + path.delete(object); + + // Final padding byte for object + buffer[index++] = 0x00; + + // Final size + const size = index - startingIndex; + // Write the size of the object + startingIndex += NumberUtils.setInt32LE(buffer, startingIndex, size); + return index; +} diff --git a/user-service/node_modules/bson/src/parser/utils.ts b/user-service/node_modules/bson/src/parser/utils.ts new file mode 100644 index 0000000000..0b27249eec --- /dev/null +++ b/user-service/node_modules/bson/src/parser/utils.ts @@ -0,0 +1,56 @@ +export function isAnyArrayBuffer(value: unknown): value is ArrayBuffer { + return ['[object ArrayBuffer]', '[object SharedArrayBuffer]'].includes( + Object.prototype.toString.call(value) + ); +} + +export function isUint8Array(value: unknown): value is Uint8Array { + return Object.prototype.toString.call(value) === '[object Uint8Array]'; +} + +export function isBigInt64Array(value: unknown): value is BigInt64Array { + return Object.prototype.toString.call(value) === '[object BigInt64Array]'; +} + +export function isBigUInt64Array(value: unknown): value is BigUint64Array { + return Object.prototype.toString.call(value) === '[object BigUint64Array]'; +} + +export function isRegExp(d: unknown): d is RegExp { + return Object.prototype.toString.call(d) === '[object RegExp]'; +} + +export function isMap(d: unknown): d is Map { + return Object.prototype.toString.call(d) === '[object Map]'; +} + +export function isDate(d: unknown): d is Date { + return Object.prototype.toString.call(d) === '[object Date]'; +} + +export type InspectFn = (x: unknown, options?: unknown) => string; +export function defaultInspect(x: unknown, _options?: unknown): string { + return JSON.stringify(x, (k: string, v: unknown) => { + if (typeof v === 'bigint') { + return { $numberLong: `${v}` }; + } else if (isMap(v)) { + return Object.fromEntries(v); + } + return v; + }); +} + +/** @internal */ +type StylizeFunction = (x: string, style: string) => string; +/** @internal */ +export function getStylizeFunction(options?: unknown): StylizeFunction | undefined { + const stylizeExists = + options != null && + typeof options === 'object' && + 'stylize' in options && + typeof options.stylize === 'function'; + + if (stylizeExists) { + return options.stylize as StylizeFunction; + } +} diff --git a/user-service/node_modules/bson/src/regexp.ts b/user-service/node_modules/bson/src/regexp.ts new file mode 100644 index 0000000000..e401a29093 --- /dev/null +++ b/user-service/node_modules/bson/src/regexp.ts @@ -0,0 +1,114 @@ +import { BSONValue } from './bson_value'; +import { BSONError } from './error'; +import type { EJSONOptions } from './extended_json'; +import { type InspectFn, defaultInspect, getStylizeFunction } from './parser/utils'; + +function alphabetize(str: string): string { + return str.split('').sort().join(''); +} + +/** @public */ +export interface BSONRegExpExtendedLegacy { + $regex: string | BSONRegExp; + $options: string; +} + +/** @public */ +export interface BSONRegExpExtended { + $regularExpression: { + pattern: string; + options: string; + }; +} + +/** + * A class representation of the BSON RegExp type. + * @public + * @category BSONType + */ +export class BSONRegExp extends BSONValue { + get _bsontype(): 'BSONRegExp' { + return 'BSONRegExp'; + } + + pattern!: string; + options!: string; + /** + * @param pattern - The regular expression pattern to match + * @param options - The regular expression options + */ + constructor(pattern: string, options?: string) { + super(); + this.pattern = pattern; + this.options = alphabetize(options ?? ''); + + if (this.pattern.indexOf('\x00') !== -1) { + throw new BSONError( + `BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}` + ); + } + if (this.options.indexOf('\x00') !== -1) { + throw new BSONError( + `BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}` + ); + } + + // Validate options + for (let i = 0; i < this.options.length; i++) { + if ( + !( + this.options[i] === 'i' || + this.options[i] === 'm' || + this.options[i] === 'x' || + this.options[i] === 'l' || + this.options[i] === 's' || + this.options[i] === 'u' + ) + ) { + throw new BSONError(`The regular expression option [${this.options[i]}] is not supported`); + } + } + } + + static parseOptions(options?: string): string { + return options ? options.split('').sort().join('') : ''; + } + + /** @internal */ + toExtendedJSON(options?: EJSONOptions): BSONRegExpExtendedLegacy | BSONRegExpExtended { + options = options || {}; + if (options.legacy) { + return { $regex: this.pattern, $options: this.options }; + } + return { $regularExpression: { pattern: this.pattern, options: this.options } }; + } + + /** @internal */ + static fromExtendedJSON(doc: BSONRegExpExtendedLegacy | BSONRegExpExtended): BSONRegExp { + if ('$regex' in doc) { + if (typeof doc.$regex !== 'string') { + // This is for $regex query operators that have extended json values. + if (doc.$regex._bsontype === 'BSONRegExp') { + return doc as unknown as BSONRegExp; + } + } else { + return new BSONRegExp(doc.$regex, BSONRegExp.parseOptions(doc.$options)); + } + } + if ('$regularExpression' in doc) { + return new BSONRegExp( + doc.$regularExpression.pattern, + BSONRegExp.parseOptions(doc.$regularExpression.options) + ); + } + throw new BSONError(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(doc)}`); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + const stylize = getStylizeFunction(options) ?? (v => v); + inspect ??= defaultInspect; + const pattern = stylize(inspect(this.pattern), 'regexp'); + const flags = stylize(inspect(this.options), 'regexp'); + return `new BSONRegExp(${pattern}, ${flags})`; + } +} diff --git a/user-service/node_modules/bson/src/symbol.ts b/user-service/node_modules/bson/src/symbol.ts new file mode 100644 index 0000000000..6835ab9599 --- /dev/null +++ b/user-service/node_modules/bson/src/symbol.ts @@ -0,0 +1,55 @@ +import { BSONValue } from './bson_value'; +import { type InspectFn, defaultInspect } from './parser/utils'; + +/** @public */ +export interface BSONSymbolExtended { + $symbol: string; +} + +/** + * A class representation of the BSON Symbol type. + * @public + * @category BSONType + */ +export class BSONSymbol extends BSONValue { + get _bsontype(): 'BSONSymbol' { + return 'BSONSymbol'; + } + + value!: string; + /** + * @param value - the string representing the symbol. + */ + constructor(value: string) { + super(); + this.value = value; + } + + /** Access the wrapped string value. */ + valueOf(): string { + return this.value; + } + + toString(): string { + return this.value; + } + + toJSON(): string { + return this.value; + } + + /** @internal */ + toExtendedJSON(): BSONSymbolExtended { + return { $symbol: this.value }; + } + + /** @internal */ + static fromExtendedJSON(doc: BSONSymbolExtended): BSONSymbol { + return new BSONSymbol(doc.$symbol); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + return `new BSONSymbol(${inspect(this.value, options)})`; + } +} diff --git a/user-service/node_modules/bson/src/timestamp.ts b/user-service/node_modules/bson/src/timestamp.ts new file mode 100644 index 0000000000..9d1e205ce7 --- /dev/null +++ b/user-service/node_modules/bson/src/timestamp.ts @@ -0,0 +1,151 @@ +import { BSONError } from './error'; +import type { Int32 } from './int_32'; +import { Long } from './long'; +import { type InspectFn, defaultInspect } from './parser/utils'; + +/** @public */ +export type TimestampOverrides = '_bsontype' | 'toExtendedJSON' | 'fromExtendedJSON' | 'inspect'; +/** @public */ +export type LongWithoutOverrides = new ( + low: unknown, + high?: number | boolean, + unsigned?: boolean +) => { + [P in Exclude]: Long[P]; +}; +/** @public */ +export const LongWithoutOverridesClass: LongWithoutOverrides = + Long as unknown as LongWithoutOverrides; + +/** @public */ +export interface TimestampExtended { + $timestamp: { + t: number; + i: number; + }; +} + +/** + * @public + * @category BSONType + */ +export class Timestamp extends LongWithoutOverridesClass { + get _bsontype(): 'Timestamp' { + return 'Timestamp'; + } + + static readonly MAX_VALUE = Long.MAX_UNSIGNED_VALUE; + + /** + * @param int - A 64-bit bigint representing the Timestamp. + */ + constructor(int: bigint); + /** + * @param long - A 64-bit Long representing the Timestamp. + */ + constructor(long: Long); + /** + * @param value - A pair of two values indicating timestamp and increment. + */ + constructor(value: { t: number; i: number }); + constructor(low?: bigint | Long | { t: number | Int32; i: number | Int32 }) { + if (low == null) { + super(0, 0, true); + } else if (typeof low === 'bigint') { + super(low, true); + } else if (Long.isLong(low)) { + super(low.low, low.high, true); + } else if (typeof low === 'object' && 't' in low && 'i' in low) { + if (typeof low.t !== 'number' && (typeof low.t !== 'object' || low.t._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide t as a number'); + } + if (typeof low.i !== 'number' && (typeof low.i !== 'object' || low.i._bsontype !== 'Int32')) { + throw new BSONError('Timestamp constructed from { t, i } must provide i as a number'); + } + const t = Number(low.t); + const i = Number(low.i); + if (t < 0 || Number.isNaN(t)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive t'); + } + if (i < 0 || Number.isNaN(i)) { + throw new BSONError('Timestamp constructed from { t, i } must provide a positive i'); + } + if (t > 0xffff_ffff) { + throw new BSONError( + 'Timestamp constructed from { t, i } must provide t equal or less than uint32 max' + ); + } + if (i > 0xffff_ffff) { + throw new BSONError( + 'Timestamp constructed from { t, i } must provide i equal or less than uint32 max' + ); + } + + super(i, t, true); + } else { + throw new BSONError( + 'A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }' + ); + } + } + + toJSON(): { $timestamp: string } { + return { + $timestamp: this.toString() + }; + } + + /** Returns a Timestamp represented by the given (32-bit) integer value. */ + static fromInt(value: number): Timestamp { + return new Timestamp(Long.fromInt(value, true)); + } + + /** Returns a Timestamp representing the given number value, provided that it is a finite number. Otherwise, zero is returned. */ + static fromNumber(value: number): Timestamp { + return new Timestamp(Long.fromNumber(value, true)); + } + + /** + * Returns a Timestamp for the given high and low bits. Each is assumed to use 32 bits. + * + * @param lowBits - the low 32-bits. + * @param highBits - the high 32-bits. + */ + static fromBits(lowBits: number, highBits: number): Timestamp { + return new Timestamp({ i: lowBits, t: highBits }); + } + + /** + * Returns a Timestamp from the given string, optionally using the given radix. + * + * @param str - the textual representation of the Timestamp. + * @param optRadix - the radix in which the text is written. + */ + static fromString(str: string, optRadix: number): Timestamp { + return new Timestamp(Long.fromString(str, true, optRadix)); + } + + /** @internal */ + toExtendedJSON(): TimestampExtended { + return { $timestamp: { t: this.high >>> 0, i: this.low >>> 0 } }; + } + + /** @internal */ + static fromExtendedJSON(doc: TimestampExtended): Timestamp { + // The Long check is necessary because extended JSON has different behavior given the size of the input number + const i = Long.isLong(doc.$timestamp.i) + ? doc.$timestamp.i.getLowBitsUnsigned() // Need to fetch the least significant 32 bits + : doc.$timestamp.i; + const t = Long.isLong(doc.$timestamp.t) + ? doc.$timestamp.t.getLowBitsUnsigned() // Need to fetch the least significant 32 bits + : doc.$timestamp.t; + return new Timestamp({ t, i }); + } + + inspect(depth?: number, options?: unknown, inspect?: InspectFn): string { + inspect ??= defaultInspect; + const t = inspect(this.high >>> 0, options); + const i = inspect(this.low >>> 0, options); + return `new Timestamp({ t: ${t}, i: ${i} })`; + } +} diff --git a/user-service/node_modules/bson/src/utils/byte_utils.ts b/user-service/node_modules/bson/src/utils/byte_utils.ts new file mode 100644 index 0000000000..f3da53fdaf --- /dev/null +++ b/user-service/node_modules/bson/src/utils/byte_utils.ts @@ -0,0 +1,61 @@ +import { nodeJsByteUtils } from './node_byte_utils'; +import { webByteUtils } from './web_byte_utils'; + +/** + * @public + * @experimental + * + * A collection of functions that help work with data in a Uint8Array. + * ByteUtils is configured at load time to use Node.js or Web based APIs for the internal implementations. + */ +export type ByteUtils = { + /** Transforms the input to an instance of Buffer if running on node, otherwise Uint8Array */ + toLocalBufferType: (buffer: Uint8Array | ArrayBufferView | ArrayBuffer) => Uint8Array; + /** Create empty space of size */ + allocate: (size: number) => Uint8Array; + /** Create empty space of size, use pooled memory when available */ + allocateUnsafe: (size: number) => Uint8Array; + /** Check if two Uint8Arrays are deep equal */ + equals: (a: Uint8Array, b: Uint8Array) => boolean; + /** Check if two Uint8Arrays are deep equal */ + fromNumberArray: (array: number[]) => Uint8Array; + /** Create a Uint8Array from a base64 string */ + fromBase64: (base64: string) => Uint8Array; + /** Create a base64 string from bytes */ + toBase64: (buffer: Uint8Array) => string; + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + fromISO88591: (codePoints: string) => Uint8Array; + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + toISO88591: (buffer: Uint8Array) => string; + /** Create a Uint8Array from a hex string */ + fromHex: (hex: string) => Uint8Array; + /** Create a lowercase hex string from bytes */ + toHex: (buffer: Uint8Array) => string; + /** Create a string from utf8 code units, fatal=true will throw an error if UTF-8 bytes are invalid, fatal=false will insert replacement characters */ + toUTF8: (buffer: Uint8Array, start: number, end: number, fatal: boolean) => string; + /** Get the utf8 code unit count from a string if it were to be transformed to utf8 */ + utf8ByteLength: (input: string) => number; + /** Encode UTF8 bytes generated from `source` string into `destination` at byteOffset. Returns the number of bytes encoded. */ + encodeUTF8Into: (destination: Uint8Array, source: string, byteOffset: number) => number; + /** Generate a Uint8Array filled with random bytes with byteLength */ + randomBytes: (byteLength: number) => Uint8Array; +}; + +declare const Buffer: { new (): unknown; prototype?: { _isBuffer?: boolean } } | undefined; + +/** + * Check that a global Buffer exists that is a function and + * does not have a '_isBuffer' property defined on the prototype + * (this is to prevent using the npm buffer) + */ +const hasGlobalBuffer = typeof Buffer === 'function' && Buffer.prototype?._isBuffer !== true; + +/** + * This is the only ByteUtils that should be used across the rest of the BSON library. + * + * The type annotation is important here, it asserts that each of the platform specific + * utils implementations are compatible with the common one. + * + * @internal + */ +export const ByteUtils: ByteUtils = hasGlobalBuffer ? nodeJsByteUtils : webByteUtils; diff --git a/user-service/node_modules/bson/src/utils/latin.ts b/user-service/node_modules/bson/src/utils/latin.ts new file mode 100644 index 0000000000..5dd5c91f69 --- /dev/null +++ b/user-service/node_modules/bson/src/utils/latin.ts @@ -0,0 +1,104 @@ +/** + * This function is an optimization for small basic latin strings. + * @internal + * @remarks + * ### Important characteristics: + * - If the uint8array or distance between start and end is 0 this function returns an empty string + * - If the byteLength of the string is 1, 2, or 3 we invoke String.fromCharCode and manually offset into the buffer + * - If the byteLength of the string is less than or equal to 20 an array of bytes is built and `String.fromCharCode.apply` is called with the result + * - If any byte exceeds 128 this function returns null + * + * @param uint8array - A sequence of bytes that may contain basic latin characters + * @param start - The start index from which to search the uint8array + * @param end - The index to stop searching the uint8array + * @returns string if all bytes are within the basic latin range, otherwise null + */ +export function tryReadBasicLatin( + uint8array: Uint8Array, + start: number, + end: number +): string | null { + if (uint8array.length === 0) { + return ''; + } + + const stringByteLength = end - start; + if (stringByteLength === 0) { + return ''; + } + + if (stringByteLength > 20) { + return null; + } + + if (stringByteLength === 1 && uint8array[start] < 128) { + return String.fromCharCode(uint8array[start]); + } + + if (stringByteLength === 2 && uint8array[start] < 128 && uint8array[start + 1] < 128) { + return String.fromCharCode(uint8array[start]) + String.fromCharCode(uint8array[start + 1]); + } + + if ( + stringByteLength === 3 && + uint8array[start] < 128 && + uint8array[start + 1] < 128 && + uint8array[start + 2] < 128 + ) { + return ( + String.fromCharCode(uint8array[start]) + + String.fromCharCode(uint8array[start + 1]) + + String.fromCharCode(uint8array[start + 2]) + ); + } + + const latinBytes = []; + for (let i = start; i < end; i++) { + const byte = uint8array[i]; + if (byte > 127) { + return null; + } + latinBytes.push(byte); + } + + return String.fromCharCode(...latinBytes); +} + +/** + * This function is an optimization for writing small basic latin strings. + * @internal + * @remarks + * ### Important characteristics: + * - If the string length is 0 return 0, do not perform any work + * - If a string is longer than 25 code units return null + * - If any code unit exceeds 128 this function returns null + * + * @param destination - The uint8array to serialize the string to + * @param source - The string to turn into UTF-8 bytes if it fits in the basic latin range + * @param offset - The position in the destination to begin writing bytes to + * @returns the number of bytes written to destination if all code units are below 128, otherwise null + */ +export function tryWriteBasicLatin( + destination: Uint8Array, + source: string, + offset: number +): number | null { + if (source.length === 0) return 0; + + if (source.length > 25) return null; + + if (destination.length - offset < source.length) return null; + + for ( + let charOffset = 0, destinationOffset = offset; + charOffset < source.length; + charOffset++, destinationOffset++ + ) { + const char = source.charCodeAt(charOffset); + if (char > 127) return null; + + destination[destinationOffset] = char; + } + + return source.length; +} diff --git a/user-service/node_modules/bson/src/utils/node_byte_utils.ts b/user-service/node_modules/bson/src/utils/node_byte_utils.ts new file mode 100644 index 0000000000..ca1482ca01 --- /dev/null +++ b/user-service/node_modules/bson/src/utils/node_byte_utils.ts @@ -0,0 +1,163 @@ +import { BSONError } from '../error'; +import { parseUtf8 } from '../parse_utf8'; +import { tryReadBasicLatin, tryWriteBasicLatin } from './latin'; + +type NodeJsEncoding = 'base64' | 'hex' | 'utf8' | 'binary'; +type NodeJsBuffer = ArrayBufferView & + Uint8Array & { + write(string: string, offset: number, length: undefined, encoding: 'utf8'): number; + copy(target: Uint8Array, targetStart: number, sourceStart: number, sourceEnd: number): number; + toString: (this: Uint8Array, encoding: NodeJsEncoding, start?: number, end?: number) => string; + equals: (this: Uint8Array, other: Uint8Array) => boolean; + }; +type NodeJsBufferConstructor = Omit & { + alloc: (size: number) => NodeJsBuffer; + allocUnsafe: (size: number) => NodeJsBuffer; + from(array: number[]): NodeJsBuffer; + from(array: Uint8Array): NodeJsBuffer; + from(array: ArrayBuffer): NodeJsBuffer; + from(array: ArrayBuffer, byteOffset: number, byteLength: number): NodeJsBuffer; + from(base64: string, encoding: NodeJsEncoding): NodeJsBuffer; + byteLength(input: string, encoding: 'utf8'): number; + isBuffer(value: unknown): value is NodeJsBuffer; +}; + +// This can be nullish, but we gate the nodejs functions on being exported whether or not this exists +// Node.js global +declare const Buffer: NodeJsBufferConstructor; +declare const require: (mod: 'crypto') => { randomBytes: (byteLength: number) => Uint8Array }; + +/** @internal */ +export function nodejsMathRandomBytes(byteLength: number) { + return nodeJsByteUtils.fromNumberArray( + Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256)) + ); +} + +/** + * @internal + * WARNING: REQUIRE WILL BE REWRITTEN + * + * This code is carefully used by require_rewriter.mjs any modifications must be reflected in the plugin. + * + * @remarks + * "crypto" is the only dependency BSON needs. This presents a problem for creating a bundle of the BSON library + * in an es module format that can be used both on the browser and in Node.js. In Node.js when BSON is imported as + * an es module, there will be no global require function defined, making the code below fallback to the much less desireable math.random bytes. + * In order to make our es module bundle work as expected on Node.js we need to change this `require()` to a dynamic import, and the dynamic + * import must be top-level awaited since es modules are async. So we rely on a custom rollup plugin to seek out the following lines of code + * and replace `require` with `await import` and the IIFE line (`nodejsRandomBytes = (() => { ... })()`) with `nodejsRandomBytes = await (async () => { ... })()` + * when generating an es module bundle. + */ +const nodejsRandomBytes: (byteLength: number) => Uint8Array = (() => { + try { + return require('crypto').randomBytes; + } catch { + return nodejsMathRandomBytes; + } +})(); + +/** @internal */ +export const nodeJsByteUtils = { + toLocalBufferType(potentialBuffer: Uint8Array | NodeJsBuffer | ArrayBuffer): NodeJsBuffer { + if (Buffer.isBuffer(potentialBuffer)) { + return potentialBuffer; + } + + if (ArrayBuffer.isView(potentialBuffer)) { + return Buffer.from( + potentialBuffer.buffer, + potentialBuffer.byteOffset, + potentialBuffer.byteLength + ); + } + + const stringTag = + potentialBuffer?.[Symbol.toStringTag] ?? Object.prototype.toString.call(potentialBuffer); + if ( + stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]' + ) { + return Buffer.from(potentialBuffer); + } + + throw new BSONError(`Cannot create Buffer from ${String(potentialBuffer)}`); + }, + + allocate(size: number): NodeJsBuffer { + return Buffer.alloc(size); + }, + + allocateUnsafe(size: number): NodeJsBuffer { + return Buffer.allocUnsafe(size); + }, + + equals(a: Uint8Array, b: Uint8Array): boolean { + return nodeJsByteUtils.toLocalBufferType(a).equals(b); + }, + + fromNumberArray(array: number[]): NodeJsBuffer { + return Buffer.from(array); + }, + + fromBase64(base64: string): NodeJsBuffer { + return Buffer.from(base64, 'base64'); + }, + + toBase64(buffer: Uint8Array): string { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('base64'); + }, + + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + fromISO88591(codePoints: string): NodeJsBuffer { + return Buffer.from(codePoints, 'binary'); + }, + + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + toISO88591(buffer: Uint8Array): string { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('binary'); + }, + + fromHex(hex: string): NodeJsBuffer { + return Buffer.from(hex, 'hex'); + }, + + toHex(buffer: Uint8Array): string { + return nodeJsByteUtils.toLocalBufferType(buffer).toString('hex'); + }, + + toUTF8(buffer: Uint8Array, start: number, end: number, fatal: boolean): string { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(buffer, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + + const string = nodeJsByteUtils.toLocalBufferType(buffer).toString('utf8', start, end); + if (fatal) { + for (let i = 0; i < string.length; i++) { + if (string.charCodeAt(i) === 0xfffd) { + parseUtf8(buffer, start, end, true); + break; + } + } + } + return string; + }, + + utf8ByteLength(input: string): number { + return Buffer.byteLength(input, 'utf8'); + }, + + encodeUTF8Into(buffer: Uint8Array, source: string, byteOffset: number): number { + const latinBytesWritten = tryWriteBasicLatin(buffer, source, byteOffset); + if (latinBytesWritten != null) { + return latinBytesWritten; + } + + return nodeJsByteUtils.toLocalBufferType(buffer).write(source, byteOffset, undefined, 'utf8'); + }, + + randomBytes: nodejsRandomBytes +}; diff --git a/user-service/node_modules/bson/src/utils/number_utils.ts b/user-service/node_modules/bson/src/utils/number_utils.ts new file mode 100644 index 0000000000..32f6f5cc0e --- /dev/null +++ b/user-service/node_modules/bson/src/utils/number_utils.ts @@ -0,0 +1,200 @@ +const FLOAT = new Float64Array(1); +const FLOAT_BYTES = new Uint8Array(FLOAT.buffer, 0, 8); + +FLOAT[0] = -1; +// Little endian [0, 0, 0, 0, 0, 0, 240, 191] +// Big endian [191, 240, 0, 0, 0, 0, 0, 0] +const isBigEndian = FLOAT_BYTES[7] === 0; + +/** + * @experimental + * @public + * + * A collection of functions that get or set various numeric types and bit widths from a Uint8Array. + */ +export type NumberUtils = { + /** + * Parses a signed int32 at offset. Throws a `RangeError` if value is negative. + */ + getNonnegativeInt32LE: (source: Uint8Array, offset: number) => number; + getInt32LE: (source: Uint8Array, offset: number) => number; + getUint32LE: (source: Uint8Array, offset: number) => number; + getUint32BE: (source: Uint8Array, offset: number) => number; + getBigInt64LE: (source: Uint8Array, offset: number) => bigint; + getFloat64LE: (source: Uint8Array, offset: number) => number; + setInt32BE: (destination: Uint8Array, offset: number, value: number) => 4; + setInt32LE: (destination: Uint8Array, offset: number, value: number) => 4; + setBigInt64LE: (destination: Uint8Array, offset: number, value: bigint) => 8; + setFloat64LE: (destination: Uint8Array, offset: number, value: number) => 8; +}; + +/** + * Number parsing and serializing utilities. + * + * @experimental + * @public + */ +export const NumberUtils: NumberUtils = { + getNonnegativeInt32LE(source: Uint8Array, offset: number): number { + if (source[offset + 3] > 127) { + throw new RangeError(`Size cannot be negative at offset: ${offset}`); + } + return ( + source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24) + ); + }, + + /** Reads a little-endian 32-bit integer from source */ + getInt32LE(source: Uint8Array, offset: number): number { + return ( + source[offset] | + (source[offset + 1] << 8) | + (source[offset + 2] << 16) | + (source[offset + 3] << 24) + ); + }, + + /** Reads a little-endian 32-bit unsigned integer from source */ + getUint32LE(source: Uint8Array, offset: number): number { + return ( + source[offset] + + source[offset + 1] * 256 + + source[offset + 2] * 65536 + + source[offset + 3] * 16777216 + ); + }, + + /** Reads a big-endian 32-bit integer from source */ + getUint32BE(source: Uint8Array, offset: number): number { + return ( + source[offset + 3] + + source[offset + 2] * 256 + + source[offset + 1] * 65536 + + source[offset] * 16777216 + ); + }, + + /** Reads a little-endian 64-bit integer from source */ + getBigInt64LE(source: Uint8Array, offset: number): bigint { + const lo = NumberUtils.getUint32LE(source, offset); + const hi = NumberUtils.getUint32LE(source, offset + 4); + + /* + eslint-disable-next-line no-restricted-globals + -- This is allowed since this helper should not be called unless bigint features are enabled + */ + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }, + + /** Reads a little-endian 64-bit float from source */ + getFloat64LE: isBigEndian + ? (source: Uint8Array, offset: number) => { + FLOAT_BYTES[7] = source[offset]; + FLOAT_BYTES[6] = source[offset + 1]; + FLOAT_BYTES[5] = source[offset + 2]; + FLOAT_BYTES[4] = source[offset + 3]; + FLOAT_BYTES[3] = source[offset + 4]; + FLOAT_BYTES[2] = source[offset + 5]; + FLOAT_BYTES[1] = source[offset + 6]; + FLOAT_BYTES[0] = source[offset + 7]; + return FLOAT[0]; + } + : (source: Uint8Array, offset: number) => { + FLOAT_BYTES[0] = source[offset]; + FLOAT_BYTES[1] = source[offset + 1]; + FLOAT_BYTES[2] = source[offset + 2]; + FLOAT_BYTES[3] = source[offset + 3]; + FLOAT_BYTES[4] = source[offset + 4]; + FLOAT_BYTES[5] = source[offset + 5]; + FLOAT_BYTES[6] = source[offset + 6]; + FLOAT_BYTES[7] = source[offset + 7]; + return FLOAT[0]; + }, + + /** Writes a big-endian 32-bit integer to destination, can be signed or unsigned */ + setInt32BE(destination: Uint8Array, offset: number, value: number): 4 { + destination[offset + 3] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset] = value; + return 4; + }, + + /** Writes a little-endian 32-bit integer to destination, can be signed or unsigned */ + setInt32LE(destination: Uint8Array, offset: number, value: number): 4 { + destination[offset] = value; + value >>>= 8; + destination[offset + 1] = value; + value >>>= 8; + destination[offset + 2] = value; + value >>>= 8; + destination[offset + 3] = value; + return 4; + }, + + /** Write a little-endian 64-bit integer to source */ + setBigInt64LE(destination: Uint8Array, offset: number, value: bigint): 8 { + /* eslint-disable-next-line no-restricted-globals -- This is allowed here as useBigInt64=true */ + const mask32bits = BigInt(0xffff_ffff); + + /** lower 32 bits */ + let lo = Number(value & mask32bits); + destination[offset] = lo; + lo >>= 8; + destination[offset + 1] = lo; + lo >>= 8; + destination[offset + 2] = lo; + lo >>= 8; + destination[offset + 3] = lo; + + /* + eslint-disable-next-line no-restricted-globals + -- This is allowed here as useBigInt64=true + + upper 32 bits + */ + let hi = Number((value >> BigInt(32)) & mask32bits); + destination[offset + 4] = hi; + hi >>= 8; + destination[offset + 5] = hi; + hi >>= 8; + destination[offset + 6] = hi; + hi >>= 8; + destination[offset + 7] = hi; + + return 8; + }, + + /** Writes a little-endian 64-bit float to destination */ + setFloat64LE: isBigEndian + ? (destination: Uint8Array, offset: number, value: number) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[7]; + destination[offset + 1] = FLOAT_BYTES[6]; + destination[offset + 2] = FLOAT_BYTES[5]; + destination[offset + 3] = FLOAT_BYTES[4]; + destination[offset + 4] = FLOAT_BYTES[3]; + destination[offset + 5] = FLOAT_BYTES[2]; + destination[offset + 6] = FLOAT_BYTES[1]; + destination[offset + 7] = FLOAT_BYTES[0]; + return 8; + } + : (destination: Uint8Array, offset: number, value: number) => { + FLOAT[0] = value; + destination[offset] = FLOAT_BYTES[0]; + destination[offset + 1] = FLOAT_BYTES[1]; + destination[offset + 2] = FLOAT_BYTES[2]; + destination[offset + 3] = FLOAT_BYTES[3]; + destination[offset + 4] = FLOAT_BYTES[4]; + destination[offset + 5] = FLOAT_BYTES[5]; + destination[offset + 6] = FLOAT_BYTES[6]; + destination[offset + 7] = FLOAT_BYTES[7]; + return 8; + } +}; diff --git a/user-service/node_modules/bson/src/utils/string_utils.ts b/user-service/node_modules/bson/src/utils/string_utils.ts new file mode 100644 index 0000000000..1ffb118e9d --- /dev/null +++ b/user-service/node_modules/bson/src/utils/string_utils.ts @@ -0,0 +1,44 @@ +/** + * @internal + * Removes leading zeros and explicit plus from textual representation of a number. + */ +export function removeLeadingZerosAndExplicitPlus(str: string): string { + if (str === '') { + return str; + } + + let startIndex = 0; + + const isNegative = str[startIndex] === '-'; + const isExplicitlyPositive = str[startIndex] === '+'; + + if (isExplicitlyPositive || isNegative) { + startIndex += 1; + } + + let foundInsignificantZero = false; + + for (; startIndex < str.length && str[startIndex] === '0'; ++startIndex) { + foundInsignificantZero = true; + } + + if (!foundInsignificantZero) { + return isExplicitlyPositive ? str.slice(1) : str; + } + + return `${isNegative ? '-' : ''}${str.length === startIndex ? '0' : str.slice(startIndex)}`; +} + +/** + * @internal + * Returns false for an string that contains invalid characters for its radix, else returns the original string. + * @param str - The textual representation of the Long + * @param radix - The radix in which the text is written (2-36), defaults to 10 + */ +export function validateStringCharacters(str: string, radix?: number): false | string { + radix = radix ?? 10; + const validCharacters = '0123456789abcdefghijklmnopqrstuvwxyz'.slice(0, radix); + // regex is case insensitive and checks that each character within the string is one of the validCharacters + const regex = new RegExp(`[^-+${validCharacters}]`, 'i'); + return regex.test(str) ? false : str; +} diff --git a/user-service/node_modules/bson/src/utils/web_byte_utils.ts b/user-service/node_modules/bson/src/utils/web_byte_utils.ts new file mode 100644 index 0000000000..0f79f0df3e --- /dev/null +++ b/user-service/node_modules/bson/src/utils/web_byte_utils.ts @@ -0,0 +1,197 @@ +import { BSONError } from '../error'; +import { tryReadBasicLatin } from './latin'; +import { parseUtf8 } from '../parse_utf8'; + +type TextDecoder = { + readonly encoding: string; + readonly fatal: boolean; + readonly ignoreBOM: boolean; + decode(input?: Uint8Array): string; +}; +type TextDecoderConstructor = { + new (label: 'utf8', options: { fatal: boolean; ignoreBOM?: boolean }): TextDecoder; +}; + +type TextEncoder = { + readonly encoding: string; + encode(input?: string): Uint8Array; +}; +type TextEncoderConstructor = { + new (): TextEncoder; +}; + +// Web global +declare const TextDecoder: TextDecoderConstructor; +declare const TextEncoder: TextEncoderConstructor; +declare const atob: (base64: string) => string; +declare const btoa: (binary: string) => string; + +type ArrayBufferViewWithTag = ArrayBufferView & { + [Symbol.toStringTag]?: string; +}; + +function isReactNative() { + const { navigator } = globalThis as { navigator?: { product?: string } }; + return typeof navigator === 'object' && navigator.product === 'ReactNative'; +} + +/** @internal */ +export function webMathRandomBytes(byteLength: number) { + if (byteLength < 0) { + throw new RangeError(`The argument 'byteLength' is invalid. Received ${byteLength}`); + } + return webByteUtils.fromNumberArray( + Array.from({ length: byteLength }, () => Math.floor(Math.random() * 256)) + ); +} + +/** @internal */ +const webRandomBytes: (byteLength: number) => Uint8Array = (() => { + const { crypto } = globalThis as { + crypto?: { getRandomValues?: (space: Uint8Array) => Uint8Array }; + }; + if (crypto != null && typeof crypto.getRandomValues === 'function') { + return (byteLength: number) => { + // @ts-expect-error: crypto.getRandomValues cannot actually be null here + // You cannot separate getRandomValues from crypto (need to have this === crypto) + return crypto.getRandomValues(webByteUtils.allocate(byteLength)); + }; + } else { + if (isReactNative()) { + const { console } = globalThis as { console?: { warn?: (message: string) => void } }; + console?.warn?.( + 'BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.' + ); + } + return webMathRandomBytes; + } +})(); + +const HEX_DIGIT = /(\d|[a-f])/i; + +/** @internal */ +export const webByteUtils = { + toLocalBufferType( + potentialUint8array: Uint8Array | ArrayBufferViewWithTag | ArrayBuffer + ): Uint8Array { + const stringTag = + potentialUint8array?.[Symbol.toStringTag] ?? + Object.prototype.toString.call(potentialUint8array); + + if (stringTag === 'Uint8Array') { + return potentialUint8array as Uint8Array; + } + + if (ArrayBuffer.isView(potentialUint8array)) { + return new Uint8Array( + potentialUint8array.buffer.slice( + potentialUint8array.byteOffset, + potentialUint8array.byteOffset + potentialUint8array.byteLength + ) + ); + } + + if ( + stringTag === 'ArrayBuffer' || + stringTag === 'SharedArrayBuffer' || + stringTag === '[object ArrayBuffer]' || + stringTag === '[object SharedArrayBuffer]' + ) { + return new Uint8Array(potentialUint8array); + } + + throw new BSONError(`Cannot make a Uint8Array from ${String(potentialUint8array)}`); + }, + + allocate(size: number): Uint8Array { + if (typeof size !== 'number') { + throw new TypeError(`The "size" argument must be of type number. Received ${String(size)}`); + } + return new Uint8Array(size); + }, + + allocateUnsafe(size: number): Uint8Array { + return webByteUtils.allocate(size); + }, + + equals(a: Uint8Array, b: Uint8Array): boolean { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + }, + + fromNumberArray(array: number[]): Uint8Array { + return Uint8Array.from(array); + }, + + fromBase64(base64: string): Uint8Array { + return Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + }, + + toBase64(uint8array: Uint8Array): string { + return btoa(webByteUtils.toISO88591(uint8array)); + }, + + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + fromISO88591(codePoints: string): Uint8Array { + return Uint8Array.from(codePoints, c => c.charCodeAt(0) & 0xff); + }, + + /** **Legacy** binary strings are an outdated method of data transfer. Do not add public API support for interpreting this format */ + toISO88591(uint8array: Uint8Array): string { + return Array.from(Uint16Array.from(uint8array), b => String.fromCharCode(b)).join(''); + }, + + fromHex(hex: string): Uint8Array { + const evenLengthHex = hex.length % 2 === 0 ? hex : hex.slice(0, hex.length - 1); + const buffer = []; + + for (let i = 0; i < evenLengthHex.length; i += 2) { + const firstDigit = evenLengthHex[i]; + const secondDigit = evenLengthHex[i + 1]; + + if (!HEX_DIGIT.test(firstDigit)) { + break; + } + if (!HEX_DIGIT.test(secondDigit)) { + break; + } + + const hexDigit = Number.parseInt(`${firstDigit}${secondDigit}`, 16); + buffer.push(hexDigit); + } + + return Uint8Array.from(buffer); + }, + + toHex(uint8array: Uint8Array): string { + return Array.from(uint8array, byte => byte.toString(16).padStart(2, '0')).join(''); + }, + + toUTF8(uint8array: Uint8Array, start: number, end: number, fatal: boolean): string { + const basicLatin = end - start <= 20 ? tryReadBasicLatin(uint8array, start, end) : null; + if (basicLatin != null) { + return basicLatin; + } + + return parseUtf8(uint8array, start, end, fatal); + }, + + utf8ByteLength(input: string): number { + return new TextEncoder().encode(input).byteLength; + }, + + encodeUTF8Into(uint8array: Uint8Array, source: string, byteOffset: number): number { + const bytes = new TextEncoder().encode(source); + uint8array.set(bytes, byteOffset); + return bytes.byteLength; + }, + + randomBytes: webRandomBytes +}; diff --git a/user-service/node_modules/bson/vendor/base64/LICENSE-MIT.txt b/user-service/node_modules/bson/vendor/base64/LICENSE-MIT.txt new file mode 100644 index 0000000000..a41e0a7ef9 --- /dev/null +++ b/user-service/node_modules/bson/vendor/base64/LICENSE-MIT.txt @@ -0,0 +1,20 @@ +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/bson/vendor/base64/README.md b/user-service/node_modules/bson/vendor/base64/README.md new file mode 100644 index 0000000000..ab0ef251e3 --- /dev/null +++ b/user-service/node_modules/bson/vendor/base64/README.md @@ -0,0 +1,112 @@ +# base64 [![Build status](https://travis-ci.org/mathiasbynens/base64.svg?branch=master)](https://travis-ci.org/mathiasbynens/base64) [![Code coverage status](http://img.shields.io/coveralls/mathiasbynens/base64/master.svg)](https://coveralls.io/r/mathiasbynens/base64) + +_base64_ is a robust base64 encoder/decoder that is fully compatible with [`atob()` and `btoa()`](https://html.spec.whatwg.org/multipage/webappapis.html#atob), written in JavaScript. The base64-encoding and -decoding algorithms it uses are fully [RFC 4648](https://tools.ietf.org/html/rfc4648#section-4) compliant. + +## Installation + +Via [npm](https://www.npmjs.com/): + +```bash +npm install base-64 +``` + +In a browser: + +```html + +``` + +In [Narwhal](http://narwhaljs.org/), [Node.js](https://nodejs.org/), and [RingoJS](http://ringojs.org/): + +```js +var base64 = require('base-64'); +``` + +In [Rhino](http://www.mozilla.org/rhino/): + +```js +load('base64.js'); +``` + +Using an AMD loader like [RequireJS](http://requirejs.org/): + +```js +require( + { + 'paths': { + 'base64': 'path/to/base64' + } + }, + ['base64'], + function(base64) { + console.log(base64); + } +); +``` + +## API + +### `base64.version` + +A string representing the semantic version number. + +### `base64.encode(input)` + +This function takes a byte string (the `input` parameter) and encodes it according to base64. The input data must be in the form of a string containing only characters in the range from U+0000 to U+00FF, each representing a binary byte with values `0x00` to `0xFF`. The `base64.encode()` function is designed to be fully compatible with [`btoa()` as described in the HTML Standard](https://html.spec.whatwg.org/multipage/webappapis.html#dom-windowbase64-btoa). + +```js +var encodedData = base64.encode(input); +``` + +To base64-encode any Unicode string, [encode it as UTF-8 first](https://github.com/mathiasbynens/utf8.js#utf8encodestring): + +```js +var base64 = require('base-64'); +var utf8 = require('utf8'); + +var text = 'foo © bar 𝌆 baz'; +var bytes = utf8.encode(text); +var encoded = base64.encode(bytes); +console.log(encoded); +// → 'Zm9vIMKpIGJhciDwnYyGIGJheg==' +``` + +### `base64.decode(input)` + +This function takes a base64-encoded string (the `input` parameter) and decodes it. The return value is in the form of a string containing only characters in the range from U+0000 to U+00FF, each representing a binary byte with values `0x00` to `0xFF`. The `base64.decode()` function is designed to be fully compatible with [`atob()` as described in the HTML Standard](https://html.spec.whatwg.org/multipage/webappapis.html#dom-windowbase64-atob). + +```js +var decodedData = base64.decode(encodedData); +``` + +To base64-decode UTF-8-encoded data back into a Unicode string, [UTF-8-decode it](https://github.com/mathiasbynens/utf8.js#utf8decodebytestring) after base64-decoding it: + +```js +var encoded = 'Zm9vIMKpIGJhciDwnYyGIGJheg=='; +var bytes = base64.decode(encoded); +var text = utf8.decode(bytes); +console.log(text); +// → 'foo © bar 𝌆 baz' +``` + +## Support + +_base64_ is designed to work in at least Node.js v0.10.0, Narwhal 0.3.2, RingoJS 0.8-0.9, PhantomJS 1.9.0, Rhino 1.7RC4, as well as old and modern versions of Chrome, Firefox, Safari, Opera, and Internet Explorer. + +## Unit tests & code coverage + +After cloning this repository, run `npm install` to install the dependencies needed for development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`. + +Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, and web browsers as well, use `grunt test`. + +To generate the code coverage report, use `grunt cover`. + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | + +## License + +_base64_ is available under the [MIT](https://mths.be/mit) license. diff --git a/user-service/node_modules/bson/vendor/base64/base64.js b/user-service/node_modules/bson/vendor/base64/base64.js new file mode 100644 index 0000000000..611b4461f3 --- /dev/null +++ b/user-service/node_modules/bson/vendor/base64/base64.js @@ -0,0 +1,157 @@ +/*! https://mths.be/base64 v1.0.0 by @mathias | MIT license */ +;(function(root) { + + // Detect free variables `exports`. + var freeExports = typeof exports == 'object' && exports; + + // Detect free variable `module`. + var freeModule = typeof module == 'object' && module && + module.exports == freeExports && module; + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function(message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function(message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function(input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function(input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '1.0.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define(function() { + return base64; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = base64; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in base64) { + base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); + } + } + } else { // in Rhino or a web browser + root.base64 = base64; + } + +}(this)); diff --git a/user-service/node_modules/bson/vendor/base64/package.json b/user-service/node_modules/bson/vendor/base64/package.json new file mode 100644 index 0000000000..479b0a180c --- /dev/null +++ b/user-service/node_modules/bson/vendor/base64/package.json @@ -0,0 +1,43 @@ +{ + "name": "base-64", + "version": "1.0.0", + "description": "A robust base64 encoder/decoder that is fully compatible with `atob()` and `btoa()`, written in JavaScript.", + "homepage": "https://mths.be/base64", + "main": "base64.js", + "keywords": [ + "codec", + "decoder", + "encoder", + "base64", + "atob", + "btoa" + ], + "license": "MIT", + "author": { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + "repository": { + "type": "git", + "url": "https://github.com/mathiasbynens/base64.git" + }, + "bugs": "https://github.com/mathiasbynens/base64/issues", + "files": [ + "LICENSE-MIT.txt", + "base64.js" + ], + "scripts": { + "test": "mocha tests/tests.js", + "build": "grunt build" + }, + "devDependencies": { + "coveralls": "^2.11.4", + "grunt": "^0.4.5", + "grunt-cli": "^1.3.2", + "grunt-shell": "^1.1.2", + "grunt-template": "^0.2.3", + "istanbul": "^0.4.0", + "mocha": "^6.2.0", + "regenerate": "^1.2.1" + } +} diff --git a/user-service/node_modules/bson/vendor/text-encoding/LICENSE.md b/user-service/node_modules/bson/vendor/text-encoding/LICENSE.md new file mode 100644 index 0000000000..5ab10466b8 --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/LICENSE.md @@ -0,0 +1,237 @@ +The encoding indexes, algorithms, and many comments in the code +derive from the Encoding Standard https://encoding.spec.whatwg.org/ + +Otherwise, the code of this repository is released under the Unlicense +license and is also dual-licensed under an Apache 2.0 license. Both +are included below. + +# Unlicense + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +# Apache 2.0 License + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/user-service/node_modules/bson/vendor/text-encoding/README.md b/user-service/node_modules/bson/vendor/text-encoding/README.md new file mode 100644 index 0000000000..b9af0e3111 --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/README.md @@ -0,0 +1,111 @@ +text-encoding +============== + +This is a polyfill for the [Encoding Living +Standard](https://encoding.spec.whatwg.org/) API for the Web, allowing +encoding and decoding of textual data to and from Typed Array buffers +for binary data in JavaScript. + +By default it adheres to the spec and does not support *encoding* to +legacy encodings, only *decoding*. It is also implemented to match the +specification's algorithms, rather than for performance. The intended +use is within Web pages, so it has no dependency on server frameworks +or particular module schemes. + +Basic examples and tests are included. + +### Install ### + +There are a few ways you can get and use the `text-encoding` library. + +### HTML Page Usage ### + +Clone the repo and include the files directly: + +```html + + + +``` + +This is the only use case the developer cares about. If you want those +fancy module and/or package manager things that are popular these days +you should probably use a different library. + +#### Package Managers #### + +The package is published to **npm** and **bower** as `text-encoding`. +Use through these is not really supported, since they aren't used by +the developer of the library. Using `require()` in interesting ways +probably breaks. Patches welcome, as long as they don't break the +basic use of the files via ` +``` + +To support the legacy encodings (which may be stateful), the +TextEncoder `encode()` method accepts an optional dictionary and +`stream` option, e.g. `encoder.encode(string, {stream: true});` This +is not needed for standard encoding since the input is always in +complete code points. diff --git a/user-service/node_modules/bson/vendor/text-encoding/index.js b/user-service/node_modules/bson/vendor/text-encoding/index.js new file mode 100644 index 0000000000..cc57d658fa --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/index.js @@ -0,0 +1,9 @@ +// This is free and unencumbered software released into the public domain. +// See LICENSE.md for more information. + +var encoding = require("./lib/encoding.js"); + +module.exports = { + TextEncoder: encoding.TextEncoder, + TextDecoder: encoding.TextDecoder, +}; diff --git a/user-service/node_modules/bson/vendor/text-encoding/lib/encoding-indexes.js b/user-service/node_modules/bson/vendor/text-encoding/lib/encoding-indexes.js new file mode 100644 index 0000000000..4f170c3bb2 --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/lib/encoding-indexes.js @@ -0,0 +1,47 @@ +(function(global) { + 'use strict'; + + if (typeof module !== "undefined" && module.exports) { + module.exports = global; + } + + global["encoding-indexes"] = +{ + "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188], + "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565], + "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]], + "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160], + "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729], + "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729], + "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119], + "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null], + "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312], + "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217], + "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255], + "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255], + "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711], + "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null], + "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103], + "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255], + "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746], + "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729], + "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], + "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] +}; + +// For strict environments where `this` inside the global scope +// is `undefined`, take a pure object instead +}(this || {})); \ No newline at end of file diff --git a/user-service/node_modules/bson/vendor/text-encoding/lib/encoding.js b/user-service/node_modules/bson/vendor/text-encoding/lib/encoding.js new file mode 100644 index 0000000000..f01991a8ee --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/lib/encoding.js @@ -0,0 +1,3301 @@ +// This is free and unencumbered software released into the public domain. +// See LICENSE.md for more information. + +/** + * @fileoverview Global |this| required for resolving indexes in node. + * @suppress {globalThis} + */ +(function(global) { + 'use strict'; + + // + // Utilities + // + + /** + * @param {number} a The number to test. + * @param {number} min The minimum value in the range, inclusive. + * @param {number} max The maximum value in the range, inclusive. + * @return {boolean} True if a >= min and a <= max. + */ + function inRange(a, min, max) { + return min <= a && a <= max; + } + + /** + * @param {!Array.<*>} array The array to check. + * @param {*} item The item to look for in the array. + * @return {boolean} True if the item appears in the array. + */ + function includes(array, item) { + return array.indexOf(item) !== -1; + } + + var floor = Math.floor; + + /** + * @param {*} o + * @return {Object} + */ + function ToDictionary(o) { + if (o === undefined) return {}; + if (o === Object(o)) return o; + throw TypeError('Could not convert argument to dictionary'); + } + + /** + * @param {string} string Input string of UTF-16 code units. + * @return {!Array.} Code points. + */ + function stringToCodePoints(string) { + // https://heycam.github.io/webidl/#dfn-obtain-unicode + + // 1. Let S be the DOMString value. + var s = String(string); + + // 2. Let n be the length of S. + var n = s.length; + + // 3. Initialize i to 0. + var i = 0; + + // 4. Initialize U to be an empty sequence of Unicode characters. + var u = []; + + // 5. While i < n: + while (i < n) { + + // 1. Let c be the code unit in S at index i. + var c = s.charCodeAt(i); + + // 2. Depending on the value of c: + + // c < 0xD800 or c > 0xDFFF + if (c < 0xD800 || c > 0xDFFF) { + // Append to U the Unicode character with code point c. + u.push(c); + } + + // 0xDC00 ≤ c ≤ 0xDFFF + else if (0xDC00 <= c && c <= 0xDFFF) { + // Append to U a U+FFFD REPLACEMENT CHARACTER. + u.push(0xFFFD); + } + + // 0xD800 ≤ c ≤ 0xDBFF + else if (0xD800 <= c && c <= 0xDBFF) { + // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT + // CHARACTER. + if (i === n - 1) { + u.push(0xFFFD); + } + // 2. Otherwise, i < n−1: + else { + // 1. Let d be the code unit in S at index i+1. + var d = s.charCodeAt(i + 1); + + // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then: + if (0xDC00 <= d && d <= 0xDFFF) { + // 1. Let a be c & 0x3FF. + var a = c & 0x3FF; + + // 2. Let b be d & 0x3FF. + var b = d & 0x3FF; + + // 3. Append to U the Unicode character with code point + // 2^16+2^10*a+b. + u.push(0x10000 + (a << 10) + b); + + // 4. Set i to i+1. + i += 1; + } + + // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a + // U+FFFD REPLACEMENT CHARACTER. + else { + u.push(0xFFFD); + } + } + } + + // 3. Set i to i+1. + i += 1; + } + + // 6. Return U. + return u; + } + + /** + * @param {!Array.} code_points Array of code points. + * @return {string} string String of UTF-16 code units. + */ + function codePointsToString(code_points) { + var s = ''; + for (var i = 0; i < code_points.length; ++i) { + var cp = code_points[i]; + if (cp <= 0xFFFF) { + s += String.fromCharCode(cp); + } else { + cp -= 0x10000; + s += String.fromCharCode((cp >> 10) + 0xD800, + (cp & 0x3FF) + 0xDC00); + } + } + return s; + } + + + // + // Implementation of Encoding specification + // https://encoding.spec.whatwg.org/ + // + + // + // 4. Terminology + // + + /** + * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive. + * @param {number} a The number to test. + * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive. + */ + function isASCIIByte(a) { + return 0x00 <= a && a <= 0x7F; + } + + /** + * An ASCII code point is a code point in the range U+0000 to + * U+007F, inclusive. + */ + var isASCIICodePoint = isASCIIByte; + + + /** + * End-of-stream is a special token that signifies no more tokens + * are in the stream. + * @const + */ var end_of_stream = -1; + + /** + * A stream represents an ordered sequence of tokens. + * + * @constructor + * @param {!(Array.|Uint8Array)} tokens Array of tokens that provide + * the stream. + */ + function Stream(tokens) { + /** @type {!Array.} */ + this.tokens = [].slice.call(tokens); + // Reversed as push/pop is more efficient than shift/unshift. + this.tokens.reverse(); + } + + Stream.prototype = { + /** + * @return {boolean} True if end-of-stream has been hit. + */ + endOfStream: function() { + return !this.tokens.length; + }, + + /** + * When a token is read from a stream, the first token in the + * stream must be returned and subsequently removed, and + * end-of-stream must be returned otherwise. + * + * @return {number} Get the next token from the stream, or + * end_of_stream. + */ + read: function() { + if (!this.tokens.length) + return end_of_stream; + return this.tokens.pop(); + }, + + /** + * When one or more tokens are prepended to a stream, those tokens + * must be inserted, in given order, before the first token in the + * stream. + * + * @param {(number|!Array.)} token The token(s) to prepend to the + * stream. + */ + prepend: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.push(tokens.pop()); + } else { + this.tokens.push(token); + } + }, + + /** + * When one or more tokens are pushed to a stream, those tokens + * must be inserted, in given order, after the last token in the + * stream. + * + * @param {(number|!Array.)} token The tokens(s) to push to the + * stream. + */ + push: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.unshift(tokens.shift()); + } else { + this.tokens.unshift(token); + } + } + }; + + // + // 5. Encodings + // + + // 5.1 Encoders and decoders + + /** @const */ + var finished = -1; + + /** + * @param {boolean} fatal If true, decoding errors raise an exception. + * @param {number=} opt_code_point Override the standard fallback code point. + * @return {number} The code point to insert on a decoding error. + */ + function decoderError(fatal, opt_code_point) { + if (fatal) + throw TypeError('Decoder error'); + return opt_code_point || 0xFFFD; + } + + /** + * @param {number} code_point The code point that could not be encoded. + * @return {number} Always throws, no value is actually returned. + */ + function encoderError(code_point) { + throw TypeError('The code point ' + code_point + ' could not be encoded.'); + } + + /** @interface */ + function Decoder() {} + Decoder.prototype = { + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point, or |finished|. + */ + handler: function(stream, bite) {} + }; + + /** @interface */ + function Encoder() {} + Encoder.prototype = { + /** + * @param {Stream} stream The stream of code points being encoded. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit, or |finished|. + */ + handler: function(stream, code_point) {} + }; + + // 5.2 Names and labels + + // TODO: Define @typedef for Encoding: {name:string,labels:Array.} + // https://github.com/google/closure-compiler/issues/247 + + /** + * @param {string} label The encoding label. + * @return {?{name:string,labels:Array.}} + */ + function getEncoding(label) { + // 1. Remove any leading and trailing ASCII whitespace from label. + label = String(label).trim().toLowerCase(); + + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, return the corresponding + // encoding, and failure otherwise. + if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) { + return label_to_encoding[label]; + } + return null; + } + + /** + * Encodings table: https://encoding.spec.whatwg.org/encodings.json + * @const + * @type {!Array.<{ + * heading: string, + * encodings: Array.<{name:string,labels:Array.}> + * }>} + */ + var encodings = [ + { + "encodings": [ + { + "labels": [ + "unicode-1-1-utf-8", + "utf-8", + "utf8" + ], + "name": "UTF-8" + } + ], + "heading": "The Encoding" + }, + { + "encodings": [ + { + "labels": [ + "866", + "cp866", + "csibm866", + "ibm866" + ], + "name": "IBM866" + }, + { + "labels": [ + "csisolatin2", + "iso-8859-2", + "iso-ir-101", + "iso8859-2", + "iso88592", + "iso_8859-2", + "iso_8859-2:1987", + "l2", + "latin2" + ], + "name": "ISO-8859-2" + }, + { + "labels": [ + "csisolatin3", + "iso-8859-3", + "iso-ir-109", + "iso8859-3", + "iso88593", + "iso_8859-3", + "iso_8859-3:1988", + "l3", + "latin3" + ], + "name": "ISO-8859-3" + }, + { + "labels": [ + "csisolatin4", + "iso-8859-4", + "iso-ir-110", + "iso8859-4", + "iso88594", + "iso_8859-4", + "iso_8859-4:1988", + "l4", + "latin4" + ], + "name": "ISO-8859-4" + }, + { + "labels": [ + "csisolatincyrillic", + "cyrillic", + "iso-8859-5", + "iso-ir-144", + "iso8859-5", + "iso88595", + "iso_8859-5", + "iso_8859-5:1988" + ], + "name": "ISO-8859-5" + }, + { + "labels": [ + "arabic", + "asmo-708", + "csiso88596e", + "csiso88596i", + "csisolatinarabic", + "ecma-114", + "iso-8859-6", + "iso-8859-6-e", + "iso-8859-6-i", + "iso-ir-127", + "iso8859-6", + "iso88596", + "iso_8859-6", + "iso_8859-6:1987" + ], + "name": "ISO-8859-6" + }, + { + "labels": [ + "csisolatingreek", + "ecma-118", + "elot_928", + "greek", + "greek8", + "iso-8859-7", + "iso-ir-126", + "iso8859-7", + "iso88597", + "iso_8859-7", + "iso_8859-7:1987", + "sun_eu_greek" + ], + "name": "ISO-8859-7" + }, + { + "labels": [ + "csiso88598e", + "csisolatinhebrew", + "hebrew", + "iso-8859-8", + "iso-8859-8-e", + "iso-ir-138", + "iso8859-8", + "iso88598", + "iso_8859-8", + "iso_8859-8:1988", + "visual" + ], + "name": "ISO-8859-8" + }, + { + "labels": [ + "csiso88598i", + "iso-8859-8-i", + "logical" + ], + "name": "ISO-8859-8-I" + }, + { + "labels": [ + "csisolatin6", + "iso-8859-10", + "iso-ir-157", + "iso8859-10", + "iso885910", + "l6", + "latin6" + ], + "name": "ISO-8859-10" + }, + { + "labels": [ + "iso-8859-13", + "iso8859-13", + "iso885913" + ], + "name": "ISO-8859-13" + }, + { + "labels": [ + "iso-8859-14", + "iso8859-14", + "iso885914" + ], + "name": "ISO-8859-14" + }, + { + "labels": [ + "csisolatin9", + "iso-8859-15", + "iso8859-15", + "iso885915", + "iso_8859-15", + "l9" + ], + "name": "ISO-8859-15" + }, + { + "labels": [ + "iso-8859-16" + ], + "name": "ISO-8859-16" + }, + { + "labels": [ + "cskoi8r", + "koi", + "koi8", + "koi8-r", + "koi8_r" + ], + "name": "KOI8-R" + }, + { + "labels": [ + "koi8-ru", + "koi8-u" + ], + "name": "KOI8-U" + }, + { + "labels": [ + "csmacintosh", + "mac", + "macintosh", + "x-mac-roman" + ], + "name": "macintosh" + }, + { + "labels": [ + "dos-874", + "iso-8859-11", + "iso8859-11", + "iso885911", + "tis-620", + "windows-874" + ], + "name": "windows-874" + }, + { + "labels": [ + "cp1250", + "windows-1250", + "x-cp1250" + ], + "name": "windows-1250" + }, + { + "labels": [ + "cp1251", + "windows-1251", + "x-cp1251" + ], + "name": "windows-1251" + }, + { + "labels": [ + "ansi_x3.4-1968", + "ascii", + "cp1252", + "cp819", + "csisolatin1", + "ibm819", + "iso-8859-1", + "iso-ir-100", + "iso8859-1", + "iso88591", + "iso_8859-1", + "iso_8859-1:1987", + "l1", + "latin1", + "us-ascii", + "windows-1252", + "x-cp1252" + ], + "name": "windows-1252" + }, + { + "labels": [ + "cp1253", + "windows-1253", + "x-cp1253" + ], + "name": "windows-1253" + }, + { + "labels": [ + "cp1254", + "csisolatin5", + "iso-8859-9", + "iso-ir-148", + "iso8859-9", + "iso88599", + "iso_8859-9", + "iso_8859-9:1989", + "l5", + "latin5", + "windows-1254", + "x-cp1254" + ], + "name": "windows-1254" + }, + { + "labels": [ + "cp1255", + "windows-1255", + "x-cp1255" + ], + "name": "windows-1255" + }, + { + "labels": [ + "cp1256", + "windows-1256", + "x-cp1256" + ], + "name": "windows-1256" + }, + { + "labels": [ + "cp1257", + "windows-1257", + "x-cp1257" + ], + "name": "windows-1257" + }, + { + "labels": [ + "cp1258", + "windows-1258", + "x-cp1258" + ], + "name": "windows-1258" + }, + { + "labels": [ + "x-mac-cyrillic", + "x-mac-ukrainian" + ], + "name": "x-mac-cyrillic" + } + ], + "heading": "Legacy single-byte encodings" + }, + { + "encodings": [ + { + "labels": [ + "chinese", + "csgb2312", + "csiso58gb231280", + "gb2312", + "gb_2312", + "gb_2312-80", + "gbk", + "iso-ir-58", + "x-gbk" + ], + "name": "GBK" + }, + { + "labels": [ + "gb18030" + ], + "name": "gb18030" + } + ], + "heading": "Legacy multi-byte Chinese (simplified) encodings" + }, + { + "encodings": [ + { + "labels": [ + "big5", + "big5-hkscs", + "cn-big5", + "csbig5", + "x-x-big5" + ], + "name": "Big5" + } + ], + "heading": "Legacy multi-byte Chinese (traditional) encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseucpkdfmtjapanese", + "euc-jp", + "x-euc-jp" + ], + "name": "EUC-JP" + }, + { + "labels": [ + "csiso2022jp", + "iso-2022-jp" + ], + "name": "ISO-2022-JP" + }, + { + "labels": [ + "csshiftjis", + "ms932", + "ms_kanji", + "shift-jis", + "shift_jis", + "sjis", + "windows-31j", + "x-sjis" + ], + "name": "Shift_JIS" + } + ], + "heading": "Legacy multi-byte Japanese encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseuckr", + "csksc56011987", + "euc-kr", + "iso-ir-149", + "korean", + "ks_c_5601-1987", + "ks_c_5601-1989", + "ksc5601", + "ksc_5601", + "windows-949" + ], + "name": "EUC-KR" + } + ], + "heading": "Legacy multi-byte Korean encodings" + }, + { + "encodings": [ + { + "labels": [ + "csiso2022kr", + "hz-gb-2312", + "iso-2022-cn", + "iso-2022-cn-ext", + "iso-2022-kr" + ], + "name": "replacement" + }, + { + "labels": [ + "utf-16be" + ], + "name": "UTF-16BE" + }, + { + "labels": [ + "utf-16", + "utf-16le" + ], + "name": "UTF-16LE" + }, + { + "labels": [ + "x-user-defined" + ], + "name": "x-user-defined" + } + ], + "heading": "Legacy miscellaneous encodings" + } + ]; + + // Label to encoding registry. + /** @type {Object.}>} */ + var label_to_encoding = {}; + encodings.forEach(function(category) { + category.encodings.forEach(function(encoding) { + encoding.labels.forEach(function(label) { + label_to_encoding[label] = encoding; + }); + }); + }); + + // Registry of of encoder/decoder factories, by encoding name. + /** @type {Object.} */ + var encoders = {}; + /** @type {Object.} */ + var decoders = {}; + + // + // 6. Indexes + // + + /** + * @param {number} pointer The |pointer| to search for. + * @param {(!Array.|undefined)} index The |index| to search within. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in |index|. + */ + function indexCodePointFor(pointer, index) { + if (!index) return null; + return index[pointer] || null; + } + + /** + * @param {number} code_point The |code point| to search for. + * @param {!Array.} index The |index| to search within. + * @return {?number} The first pointer corresponding to |code point| in + * |index|, or null if |code point| is not in |index|. + */ + function indexPointerFor(code_point, index) { + var pointer = index.indexOf(code_point); + return pointer === -1 ? null : pointer; + } + + /** + * @param {string} name Name of the index. + * @return {(!Array.|!Array.>)} + * */ + function index(name) { + if (!('encoding-indexes' in global)) { + throw Error("Indexes missing." + + " Did you forget to include encoding-indexes.js first?"); + } + return global['encoding-indexes'][name]; + } + + /** + * @param {number} pointer The |pointer| to search for in the gb18030 index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the gb18030 index. + */ + function indexGB18030RangesCodePointFor(pointer) { + // 1. If pointer is greater than 39419 and less than 189000, or + // pointer is greater than 1237575, return null. + if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) + return null; + + // 2. If pointer is 7457, return code point U+E7C7. + if (pointer === 7457) return 0xE7C7; + + // 3. Let offset be the last pointer in index gb18030 ranges that + // is equal to or less than pointer and let code point offset be + // its corresponding code point. + var offset = 0; + var code_point_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[0] <= pointer) { + offset = entry[0]; + code_point_offset = entry[1]; + } else { + break; + } + } + + // 4. Return a code point whose value is code point offset + + // pointer − offset. + return code_point_offset + pointer - offset; + } + + /** + * @param {number} code_point The |code point| to locate in the gb18030 index. + * @return {number} The first pointer corresponding to |code point| in the + * gb18030 index. + */ + function indexGB18030RangesPointerFor(code_point) { + // 1. If code point is U+E7C7, return pointer 7457. + if (code_point === 0xE7C7) return 7457; + + // 2. Let offset be the last code point in index gb18030 ranges + // that is equal to or less than code point and let pointer offset + // be its corresponding pointer. + var offset = 0; + var pointer_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[1] <= code_point) { + offset = entry[1]; + pointer_offset = entry[0]; + } else { + break; + } + } + + // 3. Return a pointer whose value is pointer offset + code point + // − offset. + return pointer_offset + code_point - offset; + } + + /** + * @param {number} code_point The |code_point| to search for in the Shift_JIS + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the Shift_JIS index. + */ + function indexShiftJISPointerFor(code_point) { + // 1. Let index be index jis0208 excluding all entries whose + // pointer is in the range 8272 to 8835, inclusive. + shift_jis_index = shift_jis_index || + index('jis0208').map(function(code_point, pointer) { + return inRange(pointer, 8272, 8835) ? null : code_point; + }); + var index_ = shift_jis_index; + + // 2. Return the index pointer for code point in index. + return index_.indexOf(code_point); + } + var shift_jis_index; + + /** + * @param {number} code_point The |code_point| to search for in the big5 + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the big5 index. + */ + function indexBig5PointerFor(code_point) { + // 1. Let index be index Big5 excluding all entries whose pointer + big5_index_no_hkscs = big5_index_no_hkscs || + index('big5').map(function(code_point, pointer) { + return (pointer < (0xA1 - 0x81) * 157) ? null : code_point; + }); + var index_ = big5_index_no_hkscs; + + // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or + // U+5345, return the last pointer corresponding to code point in + // index. + if (code_point === 0x2550 || code_point === 0x255E || + code_point === 0x2561 || code_point === 0x256A || + code_point === 0x5341 || code_point === 0x5345) { + return index_.lastIndexOf(code_point); + } + + // 3. Return the index pointer for code point in index. + return indexPointerFor(code_point, index_); + } + var big5_index_no_hkscs; + + // + // 8. API + // + + /** @const */ var DEFAULT_ENCODING = 'utf-8'; + + // 8.1 Interface TextDecoder + + /** + * @constructor + * @param {string=} label The label of the encoding; + * defaults to 'utf-8'. + * @param {Object=} options + */ + function TextDecoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextDecoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + options = ToDictionary(options); + + // A TextDecoder object has an associated encoding, decoder, + // stream, ignore BOM flag (initially unset), BOM seen flag + // (initially unset), error mode (initially replacement), and do + // not flush flag (initially unset). + + /** @private */ + this._encoding = null; + /** @private @type {?Decoder} */ + this._decoder = null; + /** @private @type {boolean} */ + this._ignoreBOM = false; + /** @private @type {boolean} */ + this._BOMseen = false; + /** @private @type {string} */ + this._error_mode = 'replacement'; + /** @private @type {boolean} */ + this._do_not_flush = false; + + + // 1. Let encoding be the result of getting an encoding from + // label. + var encoding = getEncoding(label); + + // 2. If encoding is failure or replacement, throw a RangeError. + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!decoders[encoding.name]) { + throw Error('Decoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + + // 3. Let dec be a new TextDecoder object. + var dec = this; + + // 4. Set dec's encoding to encoding. + dec._encoding = encoding; + + // 5. If options's fatal member is true, set dec's error mode to + // fatal. + if (Boolean(options['fatal'])) + dec._error_mode = 'fatal'; + + // 6. If options's ignoreBOM member is true, set dec's ignore BOM + // flag. + if (Boolean(options['ignoreBOM'])) + dec._ignoreBOM = true; + + // For pre-ES5 runtimes: + if (!Object.defineProperty) { + this.encoding = dec._encoding.name.toLowerCase(); + this.fatal = dec._error_mode === 'fatal'; + this.ignoreBOM = dec._ignoreBOM; + } + + // 7. Return dec. + return dec; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextDecoder.prototype, 'encoding', { + /** @this {TextDecoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + + // The fatal attribute's getter must return true if error mode + // is fatal, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'fatal', { + /** @this {TextDecoder} */ + get: function() { return this._error_mode === 'fatal'; } + }); + + // The ignoreBOM attribute's getter must return true if ignore + // BOM flag is set, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', { + /** @this {TextDecoder} */ + get: function() { return this._ignoreBOM; } + }); + } + + /** + * @param {BufferSource=} input The buffer of bytes to decode. + * @param {Object=} options + * @return {string} The decoded string. + */ + TextDecoder.prototype.decode = function decode(input, options) { + var bytes; + if (typeof input === 'object' && input instanceof ArrayBuffer) { + bytes = new Uint8Array(input); + } else if (typeof input === 'object' && 'buffer' in input && + input.buffer instanceof ArrayBuffer) { + bytes = new Uint8Array(input.buffer, + input.byteOffset, + input.byteLength); + } else { + bytes = new Uint8Array(0); + } + + options = ToDictionary(options); + + // 1. If the do not flush flag is unset, set decoder to a new + // encoding's decoder, set stream to a new stream, and unset the + // BOM seen flag. + if (!this._do_not_flush) { + this._decoder = decoders[this._encoding.name]({ + fatal: this._error_mode === 'fatal'}); + this._BOMseen = false; + } + + // 2. If options's stream is true, set the do not flush flag, and + // unset the do not flush flag otherwise. + this._do_not_flush = Boolean(options['stream']); + + // 3. If input is given, push a copy of input to stream. + // TODO: Align with spec algorithm - maintain stream on instance. + var input_stream = new Stream(bytes); + + // 4. Let output be a new stream. + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + + // 5. While true: + while (true) { + // 1. Let token be the result of reading from stream. + var token = input_stream.read(); + + // 2. If token is end-of-stream and the do not flush flag is + // set, return output, serialized. + // TODO: Align with spec algorithm. + if (token === end_of_stream) + break; + + // 3. Otherwise, run these subsubsteps: + + // 1. Let result be the result of processing token for decoder, + // stream, output, and error mode. + result = this._decoder.handler(input_stream, token); + + // 2. If result is finished, return output, serialized. + if (result === finished) + break; + + if (result !== null) { + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + + // 3. Otherwise, if result is error, throw a TypeError. + // (Thrown in handler) + + // 4. Otherwise, do nothing. + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + do { + result = this._decoder.handler(input_stream, input_stream.read()); + if (result === finished) + break; + if (result === null) + continue; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } while (!input_stream.endOfStream()); + this._decoder = null; + } + + // A TextDecoder object also has an associated serialize stream + // algorithm... + /** + * @param {!Array.} stream + * @return {string} + * @this {TextDecoder} + */ + function serializeStream(stream) { + // 1. Let token be the result of reading from stream. + // (Done in-place on array, rather than as a stream) + + // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore + // BOM flag and BOM seen flag are unset, run these subsubsteps: + if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) && + !this._ignoreBOM && !this._BOMseen) { + if (stream.length > 0 && stream[0] === 0xFEFF) { + // 1. If token is U+FEFF, set BOM seen flag. + this._BOMseen = true; + stream.shift(); + } else if (stream.length > 0) { + // 2. Otherwise, if token is not end-of-stream, set BOM seen + // flag and append token to stream. + this._BOMseen = true; + } else { + // 3. Otherwise, if token is not end-of-stream, append token + // to output. + // (no-op) + } + } + // 4. Otherwise, return output. + return codePointsToString(stream); + } + + return serializeStream.call(this, output); + }; + + // 8.2 Interface TextEncoder + + /** + * @constructor + * @param {string=} label The label of the encoding. NONSTANDARD. + * @param {Object=} options NONSTANDARD. + */ + function TextEncoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextEncoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + options = ToDictionary(options); + + // A TextEncoder object has an associated encoding and encoder. + + /** @private */ + this._encoding = null; + /** @private @type {?Encoder} */ + this._encoder = null; + + // Non-standard + /** @private @type {boolean} */ + this._do_not_flush = false; + /** @private @type {string} */ + this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement'; + + // 1. Let enc be a new TextEncoder object. + var enc = this; + + // 2. Set enc's encoding to UTF-8's encoder. + if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) { + // NONSTANDARD behavior. + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + var encoding = getEncoding(label); + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!encoders[encoding.name]) { + throw Error('Encoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + enc._encoding = encoding; + } else { + // Standard behavior. + enc._encoding = getEncoding('utf-8'); + + if (label !== undefined && 'console' in global) { + console.warn('TextEncoder constructor called with encoding label, ' + + 'which is ignored.'); + } + } + + // For pre-ES5 runtimes: + if (!Object.defineProperty) + this.encoding = enc._encoding.name.toLowerCase(); + + // 3. Return enc. + return enc; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextEncoder.prototype, 'encoding', { + /** @this {TextEncoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + } + + /** + * @param {string=} opt_string The string to encode. + * @param {Object=} options + * @return {!Uint8Array} Encoded bytes, as a Uint8Array. + */ + TextEncoder.prototype.encode = function encode(opt_string, options) { + opt_string = opt_string === undefined ? '' : String(opt_string); + options = ToDictionary(options); + + // NOTE: This option is nonstandard. None of the encodings + // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when + // the input is a USVString so streaming is not necessary. + if (!this._do_not_flush) + this._encoder = encoders[this._encoding.name]({ + fatal: this._fatal === 'fatal'}); + this._do_not_flush = Boolean(options['stream']); + + // 1. Convert input to a stream. + var input = new Stream(stringToCodePoints(opt_string)); + + // 2. Let output be a new stream + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + // 3. While true, run these substeps: + while (true) { + // 1. Let token be the result of reading from input. + var token = input.read(); + if (token === end_of_stream) + break; + // 2. Let result be the result of processing token for encoder, + // input, output. + result = this._encoder.handler(input, token); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + while (true) { + result = this._encoder.handler(input, input.read()); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + this._encoder = null; + } + // 3. If result is finished, convert output into a byte sequence, + // and then return a Uint8Array object wrapping an ArrayBuffer + // containing output. + return new Uint8Array(output); + }; + + + // + // 9. The encoding + // + + // 9.1 utf-8 + + // 9.1.1 utf-8 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function UTF8Decoder(options) { + var fatal = options.fatal; + + // utf-8's decoder's has an associated utf-8 code point, utf-8 + // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8 + // lower boundary (initially 0x80), and a utf-8 upper boundary + // (initially 0xBF). + var /** @type {number} */ utf8_code_point = 0, + /** @type {number} */ utf8_bytes_seen = 0, + /** @type {number} */ utf8_bytes_needed = 0, + /** @type {number} */ utf8_lower_boundary = 0x80, + /** @type {number} */ utf8_upper_boundary = 0xBF; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and utf-8 bytes needed is not 0, + // set utf-8 bytes needed to 0 and return error. + if (bite === end_of_stream && utf8_bytes_needed !== 0) { + utf8_bytes_needed = 0; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 3. If utf-8 bytes needed is 0, based on byte: + if (utf8_bytes_needed === 0) { + + // 0x00 to 0x7F + if (inRange(bite, 0x00, 0x7F)) { + // Return a code point whose value is byte. + return bite; + } + + // 0xC2 to 0xDF + else if (inRange(bite, 0xC2, 0xDF)) { + // 1. Set utf-8 bytes needed to 1. + utf8_bytes_needed = 1; + + // 2. Set UTF-8 code point to byte & 0x1F. + utf8_code_point = bite & 0x1F; + } + + // 0xE0 to 0xEF + else if (inRange(bite, 0xE0, 0xEF)) { + // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0. + if (bite === 0xE0) + utf8_lower_boundary = 0xA0; + // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F. + if (bite === 0xED) + utf8_upper_boundary = 0x9F; + // 3. Set utf-8 bytes needed to 2. + utf8_bytes_needed = 2; + // 4. Set UTF-8 code point to byte & 0xF. + utf8_code_point = bite & 0xF; + } + + // 0xF0 to 0xF4 + else if (inRange(bite, 0xF0, 0xF4)) { + // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90. + if (bite === 0xF0) + utf8_lower_boundary = 0x90; + // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F. + if (bite === 0xF4) + utf8_upper_boundary = 0x8F; + // 3. Set utf-8 bytes needed to 3. + utf8_bytes_needed = 3; + // 4. Set UTF-8 code point to byte & 0x7. + utf8_code_point = bite & 0x7; + } + + // Otherwise + else { + // Return error. + return decoderError(fatal); + } + + // Return continue. + return null; + } + + // 4. If byte is not in the range utf-8 lower boundary to utf-8 + // upper boundary, inclusive, run these substeps: + if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) { + + // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8 + // bytes seen to 0, set utf-8 lower boundary to 0x80, and set + // utf-8 upper boundary to 0xBF. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Return error. + return decoderError(fatal); + } + + // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary + // to 0xBF. + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte & + // 0x3F) + utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F); + + // 7. Increase utf-8 bytes seen by one. + utf8_bytes_seen += 1; + + // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed, + // continue. + if (utf8_bytes_seen !== utf8_bytes_needed) + return null; + + // 9. Let code point be utf-8 code point. + var code_point = utf8_code_point; + + // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes + // seen to 0. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + + // 11. Return a code point whose value is code point. + return code_point; + }; + } + + // 9.1.2 utf-8 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function UTF8Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Set count and offset based on the range code point is in: + var count, offset; + // U+0080 to U+07FF, inclusive: + if (inRange(code_point, 0x0080, 0x07FF)) { + // 1 and 0xC0 + count = 1; + offset = 0xC0; + } + // U+0800 to U+FFFF, inclusive: + else if (inRange(code_point, 0x0800, 0xFFFF)) { + // 2 and 0xE0 + count = 2; + offset = 0xE0; + } + // U+10000 to U+10FFFF, inclusive: + else if (inRange(code_point, 0x10000, 0x10FFFF)) { + // 3 and 0xF0 + count = 3; + offset = 0xF0; + } + + // 4. Let bytes be a byte sequence whose first byte is (code + // point >> (6 × count)) + offset. + var bytes = [(code_point >> (6 * count)) + offset]; + + // 5. Run these substeps while count is greater than 0: + while (count > 0) { + + // 1. Set temp to code point >> (6 × (count − 1)). + var temp = code_point >> (6 * (count - 1)); + + // 2. Append to bytes 0x80 | (temp & 0x3F). + bytes.push(0x80 | (temp & 0x3F)); + + // 3. Decrease count by one. + count -= 1; + } + + // 6. Return bytes bytes, in order. + return bytes; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['UTF-8'] = function(options) { + return new UTF8Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['UTF-8'] = function(options) { + return new UTF8Decoder(options); + }; + + // + // 10. Legacy single-byte encodings + // + + // 10.1 single-byte decoder + /** + * @constructor + * @implements {Decoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteDecoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Let code point be the index code point for byte − 0x80 in + // index single-byte. + var code_point = index[bite - 0x80]; + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + }; + } + + // 10.2 single-byte encoder + /** + * @constructor + * @implements {Encoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteEncoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // single-byte. + var pointer = indexPointerFor(code_point, index); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + encoderError(code_point); + + // 5. Return a byte whose value is pointer + 0x80. + return pointer + 0x80; + }; + } + + (function() { + if (!('encoding-indexes' in global)) + return; + encodings.forEach(function(category) { + if (category.heading !== 'Legacy single-byte encodings') + return; + category.encodings.forEach(function(encoding) { + var name = encoding.name; + var idx = index(name.toLowerCase()); + /** @param {{fatal: boolean}} options */ + decoders[name] = function(options) { + return new SingleByteDecoder(idx, options); + }; + /** @param {{fatal: boolean}} options */ + encoders[name] = function(options) { + return new SingleByteEncoder(idx, options); + }; + }); + }); + }()); + + // + // 11. Legacy multi-byte Chinese (simplified) encodings + // + + // 11.1 gbk + + // 11.1.1 gbk decoder + // gbk's decoder is gb18030's decoder. + /** @param {{fatal: boolean}} options */ + decoders['GBK'] = function(options) { + return new GB18030Decoder(options); + }; + + // 11.1.2 gbk encoder + // gbk's encoder is gb18030's encoder with its gbk flag set. + /** @param {{fatal: boolean}} options */ + encoders['GBK'] = function(options) { + return new GB18030Encoder(options, true); + }; + + // 11.2 gb18030 + + // 11.2.1 gb18030 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function GB18030Decoder(options) { + var fatal = options.fatal; + // gb18030's decoder has an associated gb18030 first, gb18030 + // second, and gb18030 third (all initially 0x00). + var /** @type {number} */ gb18030_first = 0x00, + /** @type {number} */ gb18030_second = 0x00, + /** @type {number} */ gb18030_third = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and gb18030 first, gb18030 + // second, and gb18030 third are 0x00, return finished. + if (bite === end_of_stream && gb18030_first === 0x00 && + gb18030_second === 0x00 && gb18030_third === 0x00) { + return finished; + } + // 2. If byte is end-of-stream, and gb18030 first, gb18030 + // second, or gb18030 third is not 0x00, set gb18030 first, + // gb18030 second, and gb18030 third to 0x00, and return error. + if (bite === end_of_stream && + (gb18030_first !== 0x00 || gb18030_second !== 0x00 || + gb18030_third !== 0x00)) { + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + decoderError(fatal); + } + var code_point; + // 3. If gb18030 third is not 0x00, run these substeps: + if (gb18030_third !== 0x00) { + // 1. Let code point be null. + code_point = null; + // 2. If byte is in the range 0x30 to 0x39, inclusive, set + // code point to the index gb18030 ranges code point for + // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) × + // 126 + gb18030 third − 0x81) × 10 + byte − 0x30. + if (inRange(bite, 0x30, 0x39)) { + code_point = indexGB18030RangesCodePointFor( + (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 + + gb18030_third - 0x81) * 10 + bite - 0x30); + } + + // 3. Let buffer be a byte sequence consisting of gb18030 + // second, gb18030 third, and byte, in order. + var buffer = [gb18030_second, gb18030_third, bite]; + + // 4. Set gb18030 first, gb18030 second, and gb18030 third to + // 0x00. + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + + // 5. If code point is null, prepend buffer to stream and + // return error. + if (code_point === null) { + stream.prepend(buffer); + return decoderError(fatal); + } + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 4. If gb18030 second is not 0x00, run these substeps: + if (gb18030_second !== 0x00) { + + // 1. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 third to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_third = bite; + return null; + } + + // 2. Prepend gb18030 second followed by byte to stream, set + // gb18030 first and gb18030 second to 0x00, and return error. + stream.prepend([gb18030_second, bite]); + gb18030_first = 0x00; + gb18030_second = 0x00; + return decoderError(fatal); + } + + // 5. If gb18030 first is not 0x00, run these substeps: + if (gb18030_first !== 0x00) { + + // 1. If byte is in the range 0x30 to 0x39, inclusive, set + // gb18030 second to byte and return continue. + if (inRange(bite, 0x30, 0x39)) { + gb18030_second = bite; + return null; + } + + // 2. Let lead be gb18030 first, let pointer be null, and set + // gb18030 first to 0x00. + var lead = gb18030_first; + var pointer = null; + gb18030_first = 0x00; + + // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x41; + + // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - offset); + + // 5. Let code point be null if pointer is null and the index + // code point for pointer in index gb18030 otherwise. + code_point = pointer === null ? null : + indexCodePointFor(pointer, index('gb18030')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x80, return code point U+20AC. + if (bite === 0x80) + return 0x20AC; + + // 8. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 first to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_first = bite; + return null; + } + + // 9. Return error. + return decoderError(fatal); + }; + } + + // 11.2.2 gb18030 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + * @param {boolean=} gbk_flag + */ + function GB18030Encoder(options, gbk_flag) { + var fatal = options.fatal; + // gb18030's decoder has an associated gbk flag (initially unset). + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+E5E5, return error with code point. + if (code_point === 0xE5E5) + return encoderError(code_point); + + // 4. If the gbk flag is set and code point is U+20AC, return + // byte 0x80. + if (gbk_flag && code_point === 0x20AC) + return 0x80; + + // 5. Let pointer be the index pointer for code point in index + // gb18030. + var pointer = indexPointerFor(code_point, index('gb18030')); + + // 6. If pointer is not null, run these substeps: + if (pointer !== null) { + + // 1. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 2. Let trail be pointer % 190. + var trail = pointer % 190; + + // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise. + var offset = trail < 0x3F ? 0x40 : 0x41; + + // 4. Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + } + + // 7. If gbk flag is set, return error with code point. + if (gbk_flag) + return encoderError(code_point); + + // 8. Set pointer to the index gb18030 ranges pointer for code + // point. + pointer = indexGB18030RangesPointerFor(code_point); + + // 9. Let byte1 be floor(pointer / 10 / 126 / 10). + var byte1 = floor(pointer / 10 / 126 / 10); + + // 10. Set pointer to pointer − byte1 × 10 × 126 × 10. + pointer = pointer - byte1 * 10 * 126 * 10; + + // 11. Let byte2 be floor(pointer / 10 / 126). + var byte2 = floor(pointer / 10 / 126); + + // 12. Set pointer to pointer − byte2 × 10 × 126. + pointer = pointer - byte2 * 10 * 126; + + // 13. Let byte3 be floor(pointer / 10). + var byte3 = floor(pointer / 10); + + // 14. Let byte4 be pointer − byte3 × 10. + var byte4 = pointer - byte3 * 10; + + // 15. Return four bytes whose values are byte1 + 0x81, byte2 + + // 0x30, byte3 + 0x81, byte4 + 0x30. + return [byte1 + 0x81, + byte2 + 0x30, + byte3 + 0x81, + byte4 + 0x30]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['gb18030'] = function(options) { + return new GB18030Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['gb18030'] = function(options) { + return new GB18030Decoder(options); + }; + + + // + // 12. Legacy multi-byte Chinese (traditional) encodings + // + + // 12.1 Big5 + + // 12.1.1 Big5 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function Big5Decoder(options) { + var fatal = options.fatal; + // Big5's decoder has an associated Big5 lead (initially 0x00). + var /** @type {number} */ Big5_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Big5 lead is not 0x00, set + // Big5 lead to 0x00 and return error. + if (bite === end_of_stream && Big5_lead !== 0x00) { + Big5_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Big5 lead is 0x00, return + // finished. + if (bite === end_of_stream && Big5_lead === 0x00) + return finished; + + // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let + // pointer be null, set Big5 lead to 0x00, and then run these + // substeps: + if (Big5_lead !== 0x00) { + var lead = Big5_lead; + var pointer = null; + Big5_lead = 0x00; + + // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x62; + + // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) + pointer = (lead - 0x81) * 157 + (bite - offset); + + // 3. If there is a row in the table below whose first column + // is pointer, return the two code points listed in its second + // column + // Pointer | Code points + // --------+-------------- + // 1133 | U+00CA U+0304 + // 1135 | U+00CA U+030C + // 1164 | U+00EA U+0304 + // 1166 | U+00EA U+030C + switch (pointer) { + case 1133: return [0x00CA, 0x0304]; + case 1135: return [0x00CA, 0x030C]; + case 1164: return [0x00EA, 0x0304]; + case 1166: return [0x00EA, 0x030C]; + } + + // 4. Let code point be null if pointer is null and the index + // code point for pointer in index Big5 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('big5')); + + // 5. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 6. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 7. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5 + // lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + Big5_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 12.1.2 Big5 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function Big5Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index Big5 pointer for code point. + var pointer = indexBig5PointerFor(code_point); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 157) + 0x81. + var lead = floor(pointer / 157) + 0x81; + + // 6. If lead is less than 0xA1, return error with code point. + if (lead < 0xA1) + return encoderError(code_point); + + // 7. Let trail be pointer % 157. + var trail = pointer % 157; + + // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62 + // otherwise. + var offset = trail < 0x3F ? 0x40 : 0x62; + + // Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Big5'] = function(options) { + return new Big5Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Big5'] = function(options) { + return new Big5Decoder(options); + }; + + + // + // 13. Legacy multi-byte Japanese encodings + // + + // 13.1 euc-jp + + // 13.1.1 euc-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCJPDecoder(options) { + var fatal = options.fatal; + + // euc-jp's decoder has an associated euc-jp jis0212 flag + // (initially unset) and euc-jp lead (initially 0x00). + var /** @type {boolean} */ eucjp_jis0212_flag = false, + /** @type {number} */ eucjp_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set + // euc-jp lead to 0x00, and return error. + if (bite === end_of_stream && eucjp_lead !== 0x00) { + eucjp_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-jp lead is 0x00, return + // finished. + if (bite === end_of_stream && eucjp_lead === 0x00) + return finished; + + // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to + // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code + // point whose value is 0xFF61 − 0xA1 + byte. + if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) { + eucjp_lead = 0x00; + return 0xFF61 - 0xA1 + bite; + } + + // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to + // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead + // to byte, and return continue. + if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) { + eucjp_jis0212_flag = true; + eucjp_lead = bite; + return null; + } + + // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set + // euc-jp lead to 0x00, and run these substeps: + if (eucjp_lead !== 0x00) { + var lead = eucjp_lead; + eucjp_lead = 0x00; + + // 1. Let code point be null. + var code_point = null; + + // 2. If lead and byte are both in the range 0xA1 to 0xFE, + // inclusive, set code point to the index code point for (lead + // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp + // jis0212 flag is unset and in index jis0212 otherwise. + if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) { + code_point = indexCodePointFor( + (lead - 0xA1) * 94 + (bite - 0xA1), + index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212')); + } + + // 3. Unset the euc-jp jis0212 flag. + eucjp_jis0212_flag = false; + + // 4. If byte is not in the range 0xA1 to 0xFE, inclusive, + // prepend byte to stream. + if (!inRange(bite, 0xA1, 0xFE)) + stream.prepend(bite); + + // 5. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE, + // inclusive, set euc-jp lead to byte and return continue. + if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) { + eucjp_lead = bite; + return null; + } + + // 8. Return error. + return decoderError(fatal); + }; + } + + // 13.1.2 euc-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCJPEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return two bytes whose values are 0x8E and code point − + // 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return [0x8E, code_point - 0xFF61 + 0xA1]; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 94) + 0xA1. + var lead = floor(pointer / 94) + 0xA1; + + // 10. Let trail be pointer % 94 + 0xA1. + var trail = pointer % 94 + 0xA1; + + // 11. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-JP'] = function(options) { + return new EUCJPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-JP'] = function(options) { + return new EUCJPDecoder(options); + }; + + // 13.2 iso-2022-jp + + // 13.2.1 iso-2022-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPDecoder(options) { + var fatal = options.fatal; + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + Katakana: 2, + LeadByte: 3, + TrailByte: 4, + EscapeStart: 5, + Escape: 6 + }; + // iso-2022-jp's decoder has an associated iso-2022-jp decoder + // state (initially ASCII), iso-2022-jp decoder output state + // (initially ASCII), iso-2022-jp lead (initially 0x00), and + // iso-2022-jp output flag (initially unset). + var /** @type {number} */ iso2022jp_decoder_state = states.ASCII, + /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII, + /** @type {number} */ iso2022jp_lead = 0x00, + /** @type {boolean} */ iso2022jp_output_flag = false; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // switching on iso-2022-jp decoder state: + switch (iso2022jp_decoder_state) { + default: + case states.ASCII: + // ASCII + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E + && bite !== 0x0F && bite !== 0x1B) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Roman: + // Roman + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x5C + if (bite === 0x5C) { + // Unset the iso-2022-jp output flag and return code point + // U+00A5. + iso2022jp_output_flag = false; + return 0x00A5; + } + + // 0x7E + if (bite === 0x7E) { + // Unset the iso-2022-jp output flag and return code point + // U+203E. + iso2022jp_output_flag = false; + return 0x203E; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F + && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Katakana: + // Katakana + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x5F + if (inRange(bite, 0x21, 0x5F)) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is 0xFF61 − 0x21 + byte. + iso2022jp_output_flag = false; + return 0xFF61 - 0x21 + bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.LeadByte: + // Lead byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // Unset the iso-2022-jp output flag, set iso-2022-jp lead + // to byte, iso-2022-jp decoder state to trail byte, and + // return continue. + iso2022jp_output_flag = false; + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.TrailByte; + return null; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.TrailByte: + // Trail byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return decoderError(fatal); + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // 1. Set the iso-2022-jp decoder state to lead byte. + iso2022jp_decoder_state = states.LeadByte; + + // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21. + var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21; + + // 3. Let code point be the index code point for pointer in + // index jis0208. + var code_point = indexCodePointFor(pointer, index('jis0208')); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // end-of-stream + if (bite === end_of_stream) { + // Set the iso-2022-jp decoder state to lead byte, prepend + // byte to stream, and return error. + iso2022jp_decoder_state = states.LeadByte; + stream.prepend(bite); + return decoderError(fatal); + } + + // Otherwise + // Set iso-2022-jp decoder state to lead byte and return + // error. + iso2022jp_decoder_state = states.LeadByte; + return decoderError(fatal); + + case states.EscapeStart: + // Escape start + + // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to + // byte, iso-2022-jp decoder state to escape, and return + // continue. + if (bite === 0x24 || bite === 0x28) { + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.Escape; + return null; + } + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state, and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + + case states.Escape: + // Escape + + // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to + // 0x00. + var lead = iso2022jp_lead; + iso2022jp_lead = 0x00; + + // 2. Let state be null. + var state = null; + + // 3. If lead is 0x28 and byte is 0x42, set state to ASCII. + if (lead === 0x28 && bite === 0x42) + state = states.ASCII; + + // 4. If lead is 0x28 and byte is 0x4A, set state to Roman. + if (lead === 0x28 && bite === 0x4A) + state = states.Roman; + + // 5. If lead is 0x28 and byte is 0x49, set state to Katakana. + if (lead === 0x28 && bite === 0x49) + state = states.Katakana; + + // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set + // state to lead byte. + if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) + state = states.LeadByte; + + // 7. If state is non-null, run these substeps: + if (state !== null) { + // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder + // output state to states. + iso2022jp_decoder_state = iso2022jp_decoder_state = state; + + // 2. Let output flag be the iso-2022-jp output flag. + var output_flag = iso2022jp_output_flag; + + // 3. Set the iso-2022-jp output flag. + iso2022jp_output_flag = true; + + // 4. Return continue, if output flag is unset, and error + // otherwise. + return !output_flag ? null : decoderError(fatal); + } + + // 8. Prepend lead and byte to stream. + stream.prepend([lead, bite]); + + // 9. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + } + }; + } + + // 13.2.2 iso-2022-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPEncoder(options) { + var fatal = options.fatal; + // iso-2022-jp's encoder has an associated iso-2022-jp encoder + // state which is one of ASCII, Roman, and jis0208 (initially + // ASCII). + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + jis0208: 2 + }; + var /** @type {number} */ iso2022jp_state = states.ASCII; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream and iso-2022-jp encoder + // state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (code_point === end_of_stream && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 2. If code point is end-of-stream and iso-2022-jp encoder + // state is ASCII, return finished. + if (code_point === end_of_stream && iso2022jp_state === states.ASCII) + return finished; + + // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code + // point is U+000E, U+000F, or U+001B, return error with U+FFFD. + if ((iso2022jp_state === states.ASCII || + iso2022jp_state === states.Roman) && + (code_point === 0x000E || code_point === 0x000F || + code_point === 0x001B)) { + return encoderError(0xFFFD); + } + + // 4. If iso-2022-jp encoder state is ASCII and code point is an + // ASCII code point, return a byte whose value is code point. + if (iso2022jp_state === states.ASCII && + isASCIICodePoint(code_point)) + return code_point; + + // 5. If iso-2022-jp encoder state is Roman and code point is an + // ASCII code point, excluding U+005C and U+007E, or is U+00A5 + // or U+203E, run these substeps: + if (iso2022jp_state === states.Roman && + ((isASCIICodePoint(code_point) && + code_point !== 0x005C && code_point !== 0x007E) || + (code_point == 0x00A5 || code_point == 0x203E))) { + + // 1. If code point is an ASCII code point, return a byte + // whose value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 2. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 3. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + } + + // 6. If code point is an ASCII code point, and iso-2022-jp + // encoder state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (isASCIICodePoint(code_point) && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp + // encoder state is not Roman, prepend code point to stream, set + // iso-2022-jp encoder state to Roman, and return three bytes + // 0x1B 0x28 0x4A. + if ((code_point === 0x00A5 || code_point === 0x203E) && + iso2022jp_state !== states.Roman) { + stream.prepend(code_point); + iso2022jp_state = states.Roman; + return [0x1B, 0x28, 0x4A]; + } + + // 8. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 9. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 10. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 11. If iso-2022-jp encoder state is not jis0208, prepend code + // point to stream, set iso-2022-jp encoder state to jis0208, + // and return three bytes 0x1B 0x24 0x42. + if (iso2022jp_state !== states.jis0208) { + stream.prepend(code_point); + iso2022jp_state = states.jis0208; + return [0x1B, 0x24, 0x42]; + } + + // 12. Let lead be floor(pointer / 94) + 0x21. + var lead = floor(pointer / 94) + 0x21; + + // 13. Let trail be pointer % 94 + 0x21. + var trail = pointer % 94 + 0x21; + + // 14. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPDecoder(options); + }; + + // 13.3 Shift_JIS + + // 13.3.1 Shift_JIS decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISDecoder(options) { + var fatal = options.fatal; + // Shift_JIS's decoder has an associated Shift_JIS lead (initially + // 0x00). + var /** @type {number} */ Shift_JIS_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00, + // set Shift_JIS lead to 0x00 and return error. + if (bite === end_of_stream && Shift_JIS_lead !== 0x00) { + Shift_JIS_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Shift_JIS lead is 0x00, + // return finished. + if (bite === end_of_stream && Shift_JIS_lead === 0x00) + return finished; + + // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead, + // let pointer be null, set Shift_JIS lead to 0x00, and then run + // these substeps: + if (Shift_JIS_lead !== 0x00) { + var lead = Shift_JIS_lead; + var pointer = null; + Shift_JIS_lead = 0x00; + + // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41 + // otherwise. + var offset = (bite < 0x7F) ? 0x40 : 0x41; + + // 2. Let lead offset be 0x81, if lead is less than 0xA0, and + // 0xC1 otherwise. + var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1; + + // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFC, inclusive, set pointer to (lead − lead offset) × + // 188 + byte − offset. + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) + pointer = (lead - lead_offset) * 188 + bite - offset; + + // 4. If pointer is in the range 8836 to 10715, inclusive, + // return a code point whose value is 0xE000 − 8836 + pointer. + if (inRange(pointer, 8836, 10715)) + return 0xE000 - 8836 + pointer; + + // 5. Let code point be null, if pointer is null, and the + // index code point for pointer in index jis0208 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('jis0208')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte or 0x80, return a code point + // whose value is byte. + if (isASCIIByte(bite) || bite === 0x80) + return bite; + + // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a + // code point whose value is 0xFF61 − 0xA1 + byte. + if (inRange(bite, 0xA1, 0xDF)) + return 0xFF61 - 0xA1 + bite; + + // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0 + // to 0xFC, inclusive, set Shift_JIS lead to byte and return + // continue. + if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) { + Shift_JIS_lead = bite; + return null; + } + + // 7. Return error. + return decoderError(fatal); + }; + } + + // 13.3.2 Shift_JIS encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point or U+0080, return a + // byte whose value is code point. + if (isASCIICodePoint(code_point) || code_point === 0x0080) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return a byte whose value is code point − 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return code_point - 0xFF61 + 0xA1; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index Shift_JIS pointer for code point. + var pointer = indexShiftJISPointerFor(code_point); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 188). + var lead = floor(pointer / 188); + + // 10. Let lead offset be 0x81, if lead is less than 0x1F, and + // 0xC1 otherwise. + var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1; + + // 11. Let trail be pointer % 188. + var trail = pointer % 188; + + // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41 + // otherwise. + var offset = (trail < 0x3F) ? 0x40 : 0x41; + + // 13. Return two bytes whose values are lead + lead offset and + // trail + offset. + return [lead + lead_offset, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Shift_JIS'] = function(options) { + return new ShiftJISEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Shift_JIS'] = function(options) { + return new ShiftJISDecoder(options); + }; + + // + // 14. Legacy multi-byte Korean encodings + // + + // 14.1 euc-kr + + // 14.1.1 euc-kr decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCKRDecoder(options) { + var fatal = options.fatal; + + // euc-kr's decoder has an associated euc-kr lead (initially 0x00). + var /** @type {number} */ euckr_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set + // euc-kr lead to 0x00 and return error. + if (bite === end_of_stream && euckr_lead !== 0) { + euckr_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-kr lead is 0x00, return + // finished. + if (bite === end_of_stream && euckr_lead === 0) + return finished; + + // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let + // pointer be null, set euc-kr lead to 0x00, and then run these + // substeps: + if (euckr_lead !== 0x00) { + var lead = euckr_lead; + var pointer = null; + euckr_lead = 0x00; + + // 1. If byte is in the range 0x41 to 0xFE, inclusive, set + // pointer to (lead − 0x81) × 190 + (byte − 0x41). + if (inRange(bite, 0x41, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - 0x41); + + // 2. Let code point be null, if pointer is null, and the + // index code point for pointer in index euc-kr otherwise. + var code_point = (pointer === null) + ? null : indexCodePointFor(pointer, index('euc-kr')); + + // 3. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (pointer === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set + // euc-kr lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + euckr_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 14.1.2 euc-kr encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCKREncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // euc-kr. + var pointer = indexPointerFor(code_point, index('euc-kr')); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 6. Let trail be pointer % 190 + 0x41. + var trail = (pointer % 190) + 0x41; + + // 7. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-KR'] = function(options) { + return new EUCKREncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-KR'] = function(options) { + return new EUCKRDecoder(options); + }; + + + // + // 15. Legacy miscellaneous encodings + // + + // 15.1 replacement + + // Not needed - API throws RangeError + + // 15.2 Common infrastructure for utf-16be and utf-16le + + /** + * @param {number} code_unit + * @param {boolean} utf16be + * @return {!Array.} bytes + */ + function convertCodeUnitToBytes(code_unit, utf16be) { + // 1. Let byte1 be code unit >> 8. + var byte1 = code_unit >> 8; + + // 2. Let byte2 be code unit & 0x00FF. + var byte2 = code_unit & 0x00FF; + + // 3. Then return the bytes in order: + // utf-16be flag is set: byte1, then byte2. + if (utf16be) + return [byte1, byte2]; + // utf-16be flag is unset: byte2, then byte1. + return [byte2, byte1]; + } + + // 15.2.1 shared utf-16 decoder + /** + * @constructor + * @implements {Decoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Decoder(utf16_be, options) { + var fatal = options.fatal; + var /** @type {?number} */ utf16_lead_byte = null, + /** @type {?number} */ utf16_lead_surrogate = null; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and either utf-16 lead byte or + // utf-16 lead surrogate is not null, set utf-16 lead byte and + // utf-16 lead surrogate to null, and return error. + if (bite === end_of_stream && (utf16_lead_byte !== null || + utf16_lead_surrogate !== null)) { + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and utf-16 lead byte and utf-16 + // lead surrogate are null, return finished. + if (bite === end_of_stream && utf16_lead_byte === null && + utf16_lead_surrogate === null) { + return finished; + } + + // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte + // and return continue. + if (utf16_lead_byte === null) { + utf16_lead_byte = bite; + return null; + } + + // 4. Let code unit be the result of: + var code_unit; + if (utf16_be) { + // utf-16be decoder flag is set + // (utf-16 lead byte << 8) + byte. + code_unit = (utf16_lead_byte << 8) + bite; + } else { + // utf-16be decoder flag is unset + // (byte << 8) + utf-16 lead byte. + code_unit = (bite << 8) + utf16_lead_byte; + } + // Then set utf-16 lead byte to null. + utf16_lead_byte = null; + + // 5. If utf-16 lead surrogate is not null, let lead surrogate + // be utf-16 lead surrogate, set utf-16 lead surrogate to null, + // and then run these substeps: + if (utf16_lead_surrogate !== null) { + var lead_surrogate = utf16_lead_surrogate; + utf16_lead_surrogate = null; + + // 1. If code unit is in the range U+DC00 to U+DFFF, + // inclusive, return a code point whose value is 0x10000 + + // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00). + if (inRange(code_unit, 0xDC00, 0xDFFF)) { + return 0x10000 + (lead_surrogate - 0xD800) * 0x400 + + (code_unit - 0xDC00); + } + + // 2. Prepend the sequence resulting of converting code unit + // to bytes using utf-16be decoder flag to stream and return + // error. + stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be)); + return decoderError(fatal); + } + + // 6. If code unit is in the range U+D800 to U+DBFF, inclusive, + // set utf-16 lead surrogate to code unit and return continue. + if (inRange(code_unit, 0xD800, 0xDBFF)) { + utf16_lead_surrogate = code_unit; + return null; + } + + // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive, + // return error. + if (inRange(code_unit, 0xDC00, 0xDFFF)) + return decoderError(fatal); + + // 8. Return code point code unit. + return code_unit; + }; + } + + // 15.2.2 shared utf-16 encoder + /** + * @constructor + * @implements {Encoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Encoder(utf16_be, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is in the range U+0000 to U+FFFF, inclusive, + // return the sequence resulting of converting code point to + // bytes using utf-16be encoder flag. + if (inRange(code_point, 0x0000, 0xFFFF)) + return convertCodeUnitToBytes(code_point, utf16_be); + + // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800, + // converted to bytes using utf-16be encoder flag. + var lead = convertCodeUnitToBytes( + ((code_point - 0x10000) >> 10) + 0xD800, utf16_be); + + // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00, + // converted to bytes using utf-16be encoder flag. + var trail = convertCodeUnitToBytes( + ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be); + + // 5. Return a byte sequence of lead followed by trail. + return lead.concat(trail); + }; + } + + // 15.3 utf-16be + // 15.3.1 utf-16be decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16BE'] = function(options) { + return new UTF16Encoder(true, options); + }; + // 15.3.2 utf-16be encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16BE'] = function(options) { + return new UTF16Decoder(true, options); + }; + + // 15.4 utf-16le + // 15.4.1 utf-16le decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16LE'] = function(options) { + return new UTF16Encoder(false, options); + }; + // 15.4.2 utf-16le encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16LE'] = function(options) { + return new UTF16Decoder(false, options); + }; + + // 15.5 x-user-defined + + // 15.5.1 x-user-defined decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedDecoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Return a code point whose value is 0xF780 + byte − 0x80. + return 0xF780 + bite - 0x80; + }; + } + + // 15.5.2 x-user-defined encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1.If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is in the range U+F780 to U+F7FF, inclusive, + // return a byte whose value is code point − 0xF780 + 0x80. + if (inRange(code_point, 0xF780, 0xF7FF)) + return code_point - 0xF780 + 0x80; + + // 4. Return error with code point. + return encoderError(code_point); + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['x-user-defined'] = function(options) { + return new XUserDefinedEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['x-user-defined'] = function(options) { + return new XUserDefinedDecoder(options); + }; + + if (typeof module !== "undefined" && module.exports) { + module.exports = { + TextEncoder: TextEncoder, + TextDecoder: TextDecoder, + EncodingIndexes: require("./encoding-indexes.js")["encoding-indexes"] + }; + } + +// For strict environments where `this` inside the global scope +// is `undefined`, take a pure object instead +}(this || {})); diff --git a/user-service/node_modules/bson/vendor/text-encoding/package.json b/user-service/node_modules/bson/vendor/text-encoding/package.json new file mode 100644 index 0000000000..ffc3155aab --- /dev/null +++ b/user-service/node_modules/bson/vendor/text-encoding/package.json @@ -0,0 +1,37 @@ +{ + "name": "text-encoding", + "author": "Joshua Bell ", + "contributors": [ + "Joshua Bell ", + "Rick Eyre ", + "Eugen Podaru ", + "Filip Dupanović ", + "Anne van Kesteren ", + "Author: Francis Avila ", + "Michael J. Ryan ", + "Pierre Queinnec ", + "Zack Weinberg " + ], + "version": "0.7.0", + "description": "Polyfill for the Encoding Living Standard's API.", + "main": "index.js", + "files": [ + "index.js", + "lib/encoding.js", + "lib/encoding-indexes.js" + ], + "repository": { + "type": "git", + "url": "https://github.com/inexorabletash/text-encoding.git" + }, + "keywords": [ + "encoding", + "decoding", + "living standard" + ], + "bugs": { + "url": "https://github.com/inexorabletash/text-encoding/issues" + }, + "homepage": "https://github.com/inexorabletash/text-encoding", + "license": "(Unlicense OR Apache-2.0)" +} diff --git a/user-service/node_modules/buffer-equal-constant-time/.npmignore b/user-service/node_modules/buffer-equal-constant-time/.npmignore new file mode 100644 index 0000000000..34e4f5c298 --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/.npmignore @@ -0,0 +1,2 @@ +.*.sw[mnop] +node_modules/ diff --git a/user-service/node_modules/buffer-equal-constant-time/.travis.yml b/user-service/node_modules/buffer-equal-constant-time/.travis.yml new file mode 100644 index 0000000000..78e1c01462 --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: +- "0.11" +- "0.10" diff --git a/user-service/node_modules/buffer-equal-constant-time/LICENSE.txt b/user-service/node_modules/buffer-equal-constant-time/LICENSE.txt new file mode 100644 index 0000000000..9a064f3f46 --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/user-service/node_modules/buffer-equal-constant-time/README.md b/user-service/node_modules/buffer-equal-constant-time/README.md new file mode 100644 index 0000000000..4f227f58bd --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/README.md @@ -0,0 +1,50 @@ +# buffer-equal-constant-time + +Constant-time `Buffer` comparison for node.js. Should work with browserify too. + +[![Build Status](https://travis-ci.org/goinstant/buffer-equal-constant-time.png?branch=master)](https://travis-ci.org/goinstant/buffer-equal-constant-time) + +```sh + npm install buffer-equal-constant-time +``` + +# Usage + +```js + var bufferEq = require('buffer-equal-constant-time'); + + var a = new Buffer('asdf'); + var b = new Buffer('asdf'); + if (bufferEq(a,b)) { + // the same! + } else { + // different in at least one byte! + } +``` + +If you'd like to install an `.equal()` method onto the node.js `Buffer` and +`SlowBuffer` prototypes: + +```js + require('buffer-equal-constant-time').install(); + + var a = new Buffer('asdf'); + var b = new Buffer('asdf'); + if (a.equal(b)) { + // the same! + } else { + // different in at least one byte! + } +``` + +To get rid of the installed `.equal()` method, call `.restore()`: + +```js + require('buffer-equal-constant-time').restore(); +``` + +# Legal + +© 2013 GoInstant Inc., a salesforce.com company + +Licensed under the BSD 3-clause license. diff --git a/user-service/node_modules/buffer-equal-constant-time/index.js b/user-service/node_modules/buffer-equal-constant-time/index.js new file mode 100644 index 0000000000..5462c1f830 --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/index.js @@ -0,0 +1,41 @@ +/*jshint node:true */ +'use strict'; +var Buffer = require('buffer').Buffer; // browserify +var SlowBuffer = require('buffer').SlowBuffer; + +module.exports = bufferEq; + +function bufferEq(a, b) { + + // shortcutting on type is necessary for correctness + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + return false; + } + + // buffer sizes should be well-known information, so despite this + // shortcutting, it doesn't leak any information about the *contents* of the + // buffers. + if (a.length !== b.length) { + return false; + } + + var c = 0; + for (var i = 0; i < a.length; i++) { + /*jshint bitwise:false */ + c |= a[i] ^ b[i]; // XOR + } + return c === 0; +} + +bufferEq.install = function() { + Buffer.prototype.equal = SlowBuffer.prototype.equal = function equal(that) { + return bufferEq(this, that); + }; +}; + +var origBufEqual = Buffer.prototype.equal; +var origSlowBufEqual = SlowBuffer.prototype.equal; +bufferEq.restore = function() { + Buffer.prototype.equal = origBufEqual; + SlowBuffer.prototype.equal = origSlowBufEqual; +}; diff --git a/user-service/node_modules/buffer-equal-constant-time/package.json b/user-service/node_modules/buffer-equal-constant-time/package.json new file mode 100644 index 0000000000..17c7de22ca --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/package.json @@ -0,0 +1,21 @@ +{ + "name": "buffer-equal-constant-time", + "version": "1.0.1", + "description": "Constant-time comparison of Buffers", + "main": "index.js", + "scripts": { + "test": "mocha test.js" + }, + "repository": "git@github.com:goinstant/buffer-equal-constant-time.git", + "keywords": [ + "buffer", + "equal", + "constant-time", + "crypto" + ], + "author": "GoInstant Inc., a salesforce.com company", + "license": "BSD-3-Clause", + "devDependencies": { + "mocha": "~1.15.1" + } +} diff --git a/user-service/node_modules/buffer-equal-constant-time/test.js b/user-service/node_modules/buffer-equal-constant-time/test.js new file mode 100644 index 0000000000..0bc972d841 --- /dev/null +++ b/user-service/node_modules/buffer-equal-constant-time/test.js @@ -0,0 +1,42 @@ +/*jshint node:true */ +'use strict'; + +var bufferEq = require('./index'); +var assert = require('assert'); + +describe('buffer-equal-constant-time', function() { + var a = new Buffer('asdfasdf123456'); + var b = new Buffer('asdfasdf123456'); + var c = new Buffer('asdfasdf'); + + describe('bufferEq', function() { + it('says a == b', function() { + assert.strictEqual(bufferEq(a, b), true); + }); + + it('says a != c', function() { + assert.strictEqual(bufferEq(a, c), false); + }); + }); + + describe('install/restore', function() { + before(function() { + bufferEq.install(); + }); + after(function() { + bufferEq.restore(); + }); + + it('installed an .equal method', function() { + var SlowBuffer = require('buffer').SlowBuffer; + assert.ok(Buffer.prototype.equal); + assert.ok(SlowBuffer.prototype.equal); + }); + + it('infected existing Buffers', function() { + assert.strictEqual(a.equal(b), true); + assert.strictEqual(a.equal(c), false); + }); + }); + +}); diff --git a/user-service/node_modules/bytes/History.md b/user-service/node_modules/bytes/History.md new file mode 100644 index 0000000000..d60ce0e6df --- /dev/null +++ b/user-service/node_modules/bytes/History.md @@ -0,0 +1,97 @@ +3.1.2 / 2022-01-27 +================== + + * Fix return value for un-parsable strings + +3.1.1 / 2021-11-15 +================== + + * Fix "thousandsSeparator" incorrecting formatting fractional part + +3.1.0 / 2019-01-22 +================== + + * Add petabyte (`pb`) support + +3.0.0 / 2017-08-31 +================== + + * Change "kB" to "KB" in format output + * Remove support for Node.js 0.6 + * Remove support for ComponentJS + +2.5.0 / 2017-03-24 +================== + + * Add option "unit" + +2.4.0 / 2016-06-01 +================== + + * Add option "unitSeparator" + +2.3.0 / 2016-02-15 +================== + + * Drop partial bytes on all parsed units + * Fix non-finite numbers to `.format` to return `null` + * Fix parsing byte string that looks like hex + * perf: hoist regular expressions + +2.2.0 / 2015-11-13 +================== + + * add option "decimalPlaces" + * add option "fixedDecimals" + +2.1.0 / 2015-05-21 +================== + + * add `.format` export + * add `.parse` export + +2.0.2 / 2015-05-20 +================== + + * remove map recreation + * remove unnecessary object construction + +2.0.1 / 2015-05-07 +================== + + * fix browserify require + * remove node.extend dependency + +2.0.0 / 2015-04-12 +================== + + * add option "case" + * add option "thousandsSeparator" + * return "null" on invalid parse input + * support proper round-trip: bytes(bytes(num)) === num + * units no longer case sensitive when parsing + +1.0.0 / 2014-05-05 +================== + + * add negative support. fixes #6 + +0.3.0 / 2014-03-19 +================== + + * added terabyte support + +0.2.1 / 2013-04-01 +================== + + * add .component + +0.2.0 / 2012-10-28 +================== + + * bytes(200).should.eql('200b') + +0.1.0 / 2012-07-04 +================== + + * add bytes to string conversion [yields] diff --git a/user-service/node_modules/bytes/LICENSE b/user-service/node_modules/bytes/LICENSE new file mode 100644 index 0000000000..63e95a9633 --- /dev/null +++ b/user-service/node_modules/bytes/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/bytes/Readme.md b/user-service/node_modules/bytes/Readme.md new file mode 100644 index 0000000000..5790e23e32 --- /dev/null +++ b/user-service/node_modules/bytes/Readme.md @@ -0,0 +1,152 @@ +# Bytes utility + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install bytes +``` + +## Usage + +```js +var bytes = require('bytes'); +``` + +#### bytes(number|string value, [options]): number|string|null + +Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number`|`string` | Number value to format or string value to parse | +| options | `Object` | Conversion options for `format` | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. | + +**Example** + +```js +bytes(1024); +// output: '1KB' + +bytes('1KB'); +// output: 1024 +``` + +#### bytes.format(number value, [options]): string|null + +Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is + rounded. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number` | Value in bytes | +| options | `Object` | Conversion options | + +**Options** + +| Property | Type | Description | +|-------------------|--------|-----------------------------------------------------------------------------------------| +| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | +| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | +| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. | +| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | +| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`null` | Return null upon error. String value otherwise. | + +**Example** + +```js +bytes.format(1024); +// output: '1KB' + +bytes.format(1000); +// output: '1000B' + +bytes.format(1000, {thousandsSeparator: ' '}); +// output: '1 000B' + +bytes.format(1024 * 1.7, {decimalPlaces: 0}); +// output: '2KB' + +bytes.format(1024, {unitSeparator: ' '}); +// output: '1 KB' +``` + +#### bytes.parse(string|number value): number|null + +Parse the string value into an integer in bytes. If no unit is given, or `value` +is a number, it is assumed the value is in bytes. + +Supported units and abbreviations are as follows and are case-insensitive: + + * `b` for bytes + * `kb` for kilobytes + * `mb` for megabytes + * `gb` for gigabytes + * `tb` for terabytes + * `pb` for petabytes + +The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. + +**Arguments** + +| Name | Type | Description | +|---------------|--------|--------------------| +| value | `string`|`number` | String to parse, or number in bytes. | + +**Returns** + +| Name | Type | Description | +|---------|-------------|-------------------------| +| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | + +**Example** + +```js +bytes.parse('1KB'); +// output: 1024 + +bytes.parse('1024'); +// output: 1024 + +bytes.parse(1024); +// output: 1024 +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci +[ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master +[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master +[downloads-image]: https://badgen.net/npm/dm/bytes +[downloads-url]: https://npmjs.org/package/bytes +[npm-image]: https://badgen.net/npm/v/bytes +[npm-url]: https://npmjs.org/package/bytes diff --git a/user-service/node_modules/bytes/index.js b/user-service/node_modules/bytes/index.js new file mode 100644 index 0000000000..6f2d0f89e1 --- /dev/null +++ b/user-service/node_modules/bytes/index.js @@ -0,0 +1,170 @@ +/*! + * bytes + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015 Jed Watson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = bytes; +module.exports.format = format; +module.exports.parse = parse; + +/** + * Module variables. + * @private + */ + +var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; + +var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; + +var map = { + b: 1, + kb: 1 << 10, + mb: 1 << 20, + gb: 1 << 30, + tb: Math.pow(1024, 4), + pb: Math.pow(1024, 5), +}; + +var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i; + +/** + * Convert the given value in bytes into a string or parse to string to an integer in bytes. + * + * @param {string|number} value + * @param {{ + * case: [string], + * decimalPlaces: [number] + * fixedDecimals: [boolean] + * thousandsSeparator: [string] + * unitSeparator: [string] + * }} [options] bytes options. + * + * @returns {string|number|null} + */ + +function bytes(value, options) { + if (typeof value === 'string') { + return parse(value); + } + + if (typeof value === 'number') { + return format(value, options); + } + + return null; +} + +/** + * Format the given value in bytes into a string. + * + * If the value is negative, it is kept as such. If it is a float, + * it is rounded. + * + * @param {number} value + * @param {object} [options] + * @param {number} [options.decimalPlaces=2] + * @param {number} [options.fixedDecimals=false] + * @param {string} [options.thousandsSeparator=] + * @param {string} [options.unit=] + * @param {string} [options.unitSeparator=] + * + * @returns {string|null} + * @public + */ + +function format(value, options) { + if (!Number.isFinite(value)) { + return null; + } + + var mag = Math.abs(value); + var thousandsSeparator = (options && options.thousandsSeparator) || ''; + var unitSeparator = (options && options.unitSeparator) || ''; + var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; + var fixedDecimals = Boolean(options && options.fixedDecimals); + var unit = (options && options.unit) || ''; + + if (!unit || !map[unit.toLowerCase()]) { + if (mag >= map.pb) { + unit = 'PB'; + } else if (mag >= map.tb) { + unit = 'TB'; + } else if (mag >= map.gb) { + unit = 'GB'; + } else if (mag >= map.mb) { + unit = 'MB'; + } else if (mag >= map.kb) { + unit = 'KB'; + } else { + unit = 'B'; + } + } + + var val = value / map[unit.toLowerCase()]; + var str = val.toFixed(decimalPlaces); + + if (!fixedDecimals) { + str = str.replace(formatDecimalsRegExp, '$1'); + } + + if (thousandsSeparator) { + str = str.split('.').map(function (s, i) { + return i === 0 + ? s.replace(formatThousandsRegExp, thousandsSeparator) + : s + }).join('.'); + } + + return str + unitSeparator + unit; +} + +/** + * Parse the string value into an integer in bytes. + * + * If no unit is given, it is assumed the value is in bytes. + * + * @param {number|string} val + * + * @returns {number|null} + * @public + */ + +function parse(val) { + if (typeof val === 'number' && !isNaN(val)) { + return val; + } + + if (typeof val !== 'string') { + return null; + } + + // Test if the string passed is valid + var results = parseRegExp.exec(val); + var floatValue; + var unit = 'b'; + + if (!results) { + // Nothing could be extracted from the given string + floatValue = parseInt(val, 10); + unit = 'b' + } else { + // Retrieve the value and the unit + floatValue = parseFloat(results[1]); + unit = results[4].toLowerCase(); + } + + if (isNaN(floatValue)) { + return null; + } + + return Math.floor(map[unit] * floatValue); +} diff --git a/user-service/node_modules/bytes/package.json b/user-service/node_modules/bytes/package.json new file mode 100644 index 0000000000..f2b6a8b0e3 --- /dev/null +++ b/user-service/node_modules/bytes/package.json @@ -0,0 +1,42 @@ +{ + "name": "bytes", + "description": "Utility to parse a string bytes to bytes and vice-versa", + "version": "3.1.2", + "author": "TJ Holowaychuk (http://tjholowaychuk.com)", + "contributors": [ + "Jed Watson ", + "Théo FIDRY " + ], + "license": "MIT", + "keywords": [ + "byte", + "bytes", + "utility", + "parse", + "parser", + "convert", + "converter" + ], + "repository": "visionmedia/bytes.js", + "devDependencies": { + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "History.md", + "LICENSE", + "Readme.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --check-leaks --reporter spec", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/user-service/node_modules/call-bind/.eslintignore b/user-service/node_modules/call-bind/.eslintignore new file mode 100644 index 0000000000..404abb2212 --- /dev/null +++ b/user-service/node_modules/call-bind/.eslintignore @@ -0,0 +1 @@ +coverage/ diff --git a/user-service/node_modules/call-bind/.eslintrc b/user-service/node_modules/call-bind/.eslintrc new file mode 100644 index 0000000000..dfa9a6cdcf --- /dev/null +++ b/user-service/node_modules/call-bind/.eslintrc @@ -0,0 +1,16 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "func-name-matching": 0, + "id-length": 0, + "new-cap": [2, { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + "no-magic-numbers": 0, + }, +} diff --git a/user-service/node_modules/call-bind/.github/FUNDING.yml b/user-service/node_modules/call-bind/.github/FUNDING.yml new file mode 100644 index 0000000000..c70c2ecdb2 --- /dev/null +++ b/user-service/node_modules/call-bind/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/call-bind +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/user-service/node_modules/call-bind/.nycrc b/user-service/node_modules/call-bind/.nycrc new file mode 100644 index 0000000000..bdd626ce91 --- /dev/null +++ b/user-service/node_modules/call-bind/.nycrc @@ -0,0 +1,9 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "exclude": [ + "coverage", + "test" + ] +} diff --git a/user-service/node_modules/call-bind/CHANGELOG.md b/user-service/node_modules/call-bind/CHANGELOG.md new file mode 100644 index 0000000000..c653f701af --- /dev/null +++ b/user-service/node_modules/call-bind/CHANGELOG.md @@ -0,0 +1,93 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.0.7](https://github.com/ljharb/call-bind/compare/v1.0.6...v1.0.7) - 2024-02-12 + +### Commits + +- [Refactor] use `es-define-property` [`09b76a0`](https://github.com/ljharb/call-bind/commit/09b76a01634440461d44a80c9924ec4b500f3b03) +- [Deps] update `get-intrinsic`, `set-function-length` [`ad5136d`](https://github.com/ljharb/call-bind/commit/ad5136ddda2a45c590959829ad3dce0c9f4e3590) + +## [v1.0.6](https://github.com/ljharb/call-bind/compare/v1.0.5...v1.0.6) - 2024-02-05 + +### Commits + +- [Dev Deps] update `aud`, `npmignore`, `tape` [`d564d5c`](https://github.com/ljharb/call-bind/commit/d564d5ce3e06a19df4d499c77f8d1a9da44e77aa) +- [Deps] update `get-intrinsic`, `set-function-length` [`cfc2bdc`](https://github.com/ljharb/call-bind/commit/cfc2bdca7b633df0e0e689e6b637f668f1c6792e) +- [Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic` [`64cd289`](https://github.com/ljharb/call-bind/commit/64cd289ae5862c250a4ca80aa8d461047c166af5) +- [meta] add missing `engines.node` [`32a4038`](https://github.com/ljharb/call-bind/commit/32a4038857b62179f7f9b7b3df2c5260036be582) + +## [v1.0.5](https://github.com/ljharb/call-bind/compare/v1.0.4...v1.0.5) - 2023-10-19 + +### Commits + +- [Fix] throw an error on non-functions as early as possible [`f262408`](https://github.com/ljharb/call-bind/commit/f262408f822c840fbc268080f3ad7c429611066d) +- [Deps] update `set-function-length` [`3fff271`](https://github.com/ljharb/call-bind/commit/3fff27145a1e3a76a5b74f1d7c3c43d0fa3b9871) + +## [v1.0.4](https://github.com/ljharb/call-bind/compare/v1.0.3...v1.0.4) - 2023-10-19 + +## [v1.0.3](https://github.com/ljharb/call-bind/compare/v1.0.2...v1.0.3) - 2023-10-19 + +### Commits + +- [actions] reuse common workflows [`a994df6`](https://github.com/ljharb/call-bind/commit/a994df69f401f4bf735a4ccd77029b85d1549453) +- [meta] use `npmignore` to autogenerate an npmignore file [`eef3ef2`](https://github.com/ljharb/call-bind/commit/eef3ef21e1f002790837fedb8af2679c761fbdf5) +- [readme] flesh out content [`1845ccf`](https://github.com/ljharb/call-bind/commit/1845ccfd9976a607884cfc7157c93192cc16cf22) +- [actions] use `node/install` instead of `node/run`; use `codecov` action [`5b47d53`](https://github.com/ljharb/call-bind/commit/5b47d53d2fd74af5ea0a44f1d51e503cd42f7a90) +- [Refactor] use `set-function-length` [`a0e165c`](https://github.com/ljharb/call-bind/commit/a0e165c5dc61db781cbc919b586b1c2b8da0b150) +- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`9c50103`](https://github.com/ljharb/call-bind/commit/9c50103f44137279a817317cf6cc421a658f85b4) +- [meta] simplify "exports" [`019c6d0`](https://github.com/ljharb/call-bind/commit/019c6d06b0e1246ceed8e579f57e44441cbbf6d9) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `safe-publish-latest`, `tape` [`23bd718`](https://github.com/ljharb/call-bind/commit/23bd718a288d3b03042062b4ef5153b3cea83f11) +- [actions] update codecov uploader [`62552d7`](https://github.com/ljharb/call-bind/commit/62552d79cc79e05825e99aaba134ae5b37f33da5) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`ec81665`](https://github.com/ljharb/call-bind/commit/ec81665b300f87eabff597afdc8b8092adfa7afd) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`35d67fc`](https://github.com/ljharb/call-bind/commit/35d67fcea883e686650f736f61da5ddca2592de8) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`0266d8d`](https://github.com/ljharb/call-bind/commit/0266d8d2a45086a922db366d0c2932fa463662ff) +- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`43a5b28`](https://github.com/ljharb/call-bind/commit/43a5b28a444e710e1bbf92adb8afb5cf7523a223) +- [Deps] update `define-data-property`, `function-bind`, `get-intrinsic` [`780eb36`](https://github.com/ljharb/call-bind/commit/780eb36552514f8cc99c70821ce698697c2726a5) +- [Dev Deps] update `aud`, `tape` [`90d50ad`](https://github.com/ljharb/call-bind/commit/90d50ad03b061e0268b3380b0065fcaec183dc05) +- [meta] use `prepublishOnly` script for npm 7+ [`44c5433`](https://github.com/ljharb/call-bind/commit/44c5433b7980e02b4870007046407cf6fc543329) +- [Deps] update `get-intrinsic` [`86bfbfc`](https://github.com/ljharb/call-bind/commit/86bfbfcf34afdc6eabc93ce3d408548d0e27d958) +- [Deps] update `get-intrinsic` [`5c53354`](https://github.com/ljharb/call-bind/commit/5c5335489be0294c18cd7a8bb6e08226ee019ff5) +- [actions] update checkout action [`4c393a8`](https://github.com/ljharb/call-bind/commit/4c393a8173b3c8e5b30d5b3297b3b94d48bf87f3) +- [Deps] update `get-intrinsic` [`4e70bde`](https://github.com/ljharb/call-bind/commit/4e70bdec0626acb11616d66250fc14565e716e91) +- [Deps] update `get-intrinsic` [`55ae803`](https://github.com/ljharb/call-bind/commit/55ae803a920bd93c369cd798c20de31f91e9fc60) + +## [v1.0.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11 + +### Commits + +- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d) + +## [v1.0.1](https://github.com/ljharb/call-bind/compare/v1.0.0...v1.0.1) - 2021-01-08 + +### Commits + +- [Tests] migrate tests to Github Actions [`b6db284`](https://github.com/ljharb/call-bind/commit/b6db284c36f8ccd195b88a6764fe84b7223a0da1) +- [meta] do not publish github action workflow files [`ec7fe46`](https://github.com/ljharb/call-bind/commit/ec7fe46e60cfa4764ee943d2755f5e5a366e578e) +- [Fix] preserve original function’s length when possible [`adbceaa`](https://github.com/ljharb/call-bind/commit/adbceaa3cac4b41ea78bb19d7ccdbaaf7e0bdadb) +- [Tests] gather coverage data on every job [`d69e23c`](https://github.com/ljharb/call-bind/commit/d69e23cc65f101ba1d4c19bb07fa8eb0ec624be8) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`2fd3586`](https://github.com/ljharb/call-bind/commit/2fd3586c5d47b335364c14293114c6b625ae1f71) +- [Deps] update `get-intrinsic` [`f23e931`](https://github.com/ljharb/call-bind/commit/f23e9318cc271c2add8bb38cfded85ee7baf8eee) +- [Deps] update `get-intrinsic` [`72d9f44`](https://github.com/ljharb/call-bind/commit/72d9f44e184465ba8dd3fb48260bbcff234985f2) +- [meta] fix FUNDING.yml [`e723573`](https://github.com/ljharb/call-bind/commit/e723573438c5a68dcec31fb5d96ea6b7e4a93be8) +- [eslint] ignore coverage output [`15e76d2`](https://github.com/ljharb/call-bind/commit/15e76d28a5f43e504696401e5b31ebb78ee1b532) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`8fa4dab`](https://github.com/ljharb/call-bind/commit/8fa4dabb23ba3dd7bb92c9571c1241c08b56e4b6) + +## v1.0.0 - 2020-10-30 + +### Commits + +- Initial commit [`306cf98`](https://github.com/ljharb/call-bind/commit/306cf98c7ec9e7ef66b653ec152277ac1381eb50) +- Tests [`e10d0bb`](https://github.com/ljharb/call-bind/commit/e10d0bbdadc7a10ecedc9a1c035112d3e368b8df) +- Implementation [`43852ed`](https://github.com/ljharb/call-bind/commit/43852eda0f187327b7fad2423ca972149a52bd65) +- npm init [`408f860`](https://github.com/ljharb/call-bind/commit/408f860b773a2f610805fd3613d0d71bac1b6249) +- [meta] add Automatic Rebase and Require Allow Edits workflows [`fb349b2`](https://github.com/ljharb/call-bind/commit/fb349b2e48defbec8b5ec8a8395cc8f69f220b13) +- [meta] add `auto-changelog` [`c4001fc`](https://github.com/ljharb/call-bind/commit/c4001fc43031799ef908211c98d3b0fb2b60fde4) +- [meta] add "funding"; create `FUNDING.yml` [`d4d6d29`](https://github.com/ljharb/call-bind/commit/d4d6d2974a14bc2e98830468eda7fe6d6a776717) +- [Tests] add `npm run lint` [`dedfb98`](https://github.com/ljharb/call-bind/commit/dedfb98bd0ecefb08ddb9a94061bd10cde4332af) +- Only apps should have lockfiles [`54ac776`](https://github.com/ljharb/call-bind/commit/54ac77653db45a7361dc153d2f478e743f110650) +- [meta] add `safe-publish-latest` [`9ea8e43`](https://github.com/ljharb/call-bind/commit/9ea8e435b950ce9b705559cd651039f9bf40140f) diff --git a/user-service/node_modules/call-bind/LICENSE b/user-service/node_modules/call-bind/LICENSE new file mode 100644 index 0000000000..48f05d01d0 --- /dev/null +++ b/user-service/node_modules/call-bind/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/call-bind/README.md b/user-service/node_modules/call-bind/README.md new file mode 100644 index 0000000000..48e9047f0c --- /dev/null +++ b/user-service/node_modules/call-bind/README.md @@ -0,0 +1,64 @@ +# call-bind [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +Robustly `.call.bind()` a function. + +## Getting started + +```sh +npm install --save call-bind +``` + +## Usage/Examples + +```js +const assert = require('assert'); +const callBind = require('call-bind'); +const callBound = require('call-bind/callBound'); + +function f(a, b) { + assert.equal(this, 1); + assert.equal(a, 2); + assert.equal(b, 3); + assert.equal(arguments.length, 2); +} + +const fBound = callBind(f); + +const slice = callBound('Array.prototype.slice'); + +delete Function.prototype.call; +delete Function.prototype.bind; + +fBound(1, 2, 3); + +assert.deepEqual(slice([1, 2, 3, 4], 1, -1), [2, 3]); +``` + +## Tests + +Clone the repo, `npm install`, and run `npm test` + +[package-url]: https://npmjs.org/package/call-bind +[npm-version-svg]: https://versionbadg.es/ljharb/call-bind.svg +[deps-svg]: https://david-dm.org/ljharb/call-bind.svg +[deps-url]: https://david-dm.org/ljharb/call-bind +[dev-deps-svg]: https://david-dm.org/ljharb/call-bind/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/call-bind#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/call-bind.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/call-bind.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/call-bind.svg +[downloads-url]: https://npm-stat.com/charts.html?package=call-bind +[codecov-image]: https://codecov.io/gh/ljharb/call-bind/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/call-bind/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bind +[actions-url]: https://github.com/ljharb/call-bind/actions diff --git a/user-service/node_modules/call-bind/callBound.js b/user-service/node_modules/call-bind/callBound.js new file mode 100644 index 0000000000..8374adfd05 --- /dev/null +++ b/user-service/node_modules/call-bind/callBound.js @@ -0,0 +1,15 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); + +var callBind = require('./'); + +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); + +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; diff --git a/user-service/node_modules/call-bind/index.js b/user-service/node_modules/call-bind/index.js new file mode 100644 index 0000000000..01c5b3d4ed --- /dev/null +++ b/user-service/node_modules/call-bind/index.js @@ -0,0 +1,35 @@ +'use strict'; + +var bind = require('function-bind'); +var GetIntrinsic = require('get-intrinsic'); +var setFunctionLength = require('set-function-length'); + +var $TypeError = require('es-errors/type'); +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); + +var $defineProperty = require('es-define-property'); +var $max = GetIntrinsic('%Math.max%'); + +module.exports = function callBind(originalFunction) { + if (typeof originalFunction !== 'function') { + throw new $TypeError('a function is required'); + } + var func = $reflectApply(bind, $call, arguments); + return setFunctionLength( + func, + 1 + $max(0, originalFunction.length - (arguments.length - 1)), + true + ); +}; + +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} diff --git a/user-service/node_modules/call-bind/package.json b/user-service/node_modules/call-bind/package.json new file mode 100644 index 0000000000..5ba88ff852 --- /dev/null +++ b/user-service/node_modules/call-bind/package.json @@ -0,0 +1,95 @@ +{ + "name": "call-bind", + "version": "1.0.7", + "description": "Robustly `.call.bind()` a function", + "main": "index.js", + "exports": { + ".": "./index.js", + "./callBound": "./callBound.js", + "./package.json": "./package.json" + }, + "scripts": { + "prepack": "npmignore --auto --commentLines=auto", + "prepublish": "not-in-publish || npm run prepublishOnly", + "prepublishOnly": "safe-publish-latest", + "lint": "eslint --ext=.js,.mjs .", + "postlint": "evalmd README.md", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "aud --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/call-bind.git" + }, + "keywords": [ + "javascript", + "ecmascript", + "es", + "js", + "callbind", + "callbound", + "call", + "bind", + "bound", + "call-bind", + "call-bound", + "function", + "es-abstract" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/call-bind/issues" + }, + "homepage": "https://github.com/ljharb/call-bind#readme", + "devDependencies": { + "@ljharb/eslint-config": "^21.1.0", + "aud": "^2.0.4", + "auto-changelog": "^2.4.0", + "es-value-fixtures": "^1.4.2", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-strict-mode": "^1.0.1", + "in-publish": "^2.0.1", + "npmignore": "^0.3.1", + "nyc": "^10.3.2", + "object-inspect": "^1.13.1", + "safe-publish-latest": "^2.0.0", + "tape": "^5.7.4" + }, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "testling": { + "files": "test/index.js" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows" + ] + }, + "engines": { + "node": ">= 0.4" + } +} diff --git a/user-service/node_modules/call-bind/test/callBound.js b/user-service/node_modules/call-bind/test/callBound.js new file mode 100644 index 0000000000..c32319d70d --- /dev/null +++ b/user-service/node_modules/call-bind/test/callBound.js @@ -0,0 +1,54 @@ +'use strict'; + +var test = require('tape'); + +var callBound = require('../callBound'); + +test('callBound', function (t) { + // static primitive + t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself'); + t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself'); + + // static non-function object + t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself'); + t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself'); + t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself'); + t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself'); + + // static function + t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself'); + t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself'); + + // prototype primitive + t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself'); + t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself'); + + // prototype function + t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself'); + t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself'); + t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original'); + t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original'); + + t['throws']( + function () { callBound('does not exist'); }, + SyntaxError, + 'nonexistent intrinsic throws' + ); + t['throws']( + function () { callBound('does not exist', true); }, + SyntaxError, + 'allowMissing arg still throws for unknown intrinsic' + ); + + t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) { + st['throws']( + function () { callBound('WeakRef'); }, + TypeError, + 'real but absent intrinsic throws' + ); + st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception'); + st.end(); + }); + + t.end(); +}); diff --git a/user-service/node_modules/call-bind/test/index.js b/user-service/node_modules/call-bind/test/index.js new file mode 100644 index 0000000000..1fd46689ef --- /dev/null +++ b/user-service/node_modules/call-bind/test/index.js @@ -0,0 +1,80 @@ +'use strict'; + +var callBind = require('../'); +var bind = require('function-bind'); +var gOPD = require('gopd'); +var hasStrictMode = require('has-strict-mode')(); +var forEach = require('for-each'); +var inspect = require('object-inspect'); +var v = require('es-value-fixtures'); + +var test = require('tape'); + +/* + * older engines have length nonconfigurable + * in io.js v3, it is configurable except on bound functions, hence the .bind() + */ +var functionsHaveConfigurableLengths = !!( + gOPD + && Object.getOwnPropertyDescriptor + && Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable +); + +test('callBind', function (t) { + forEach(v.nonFunctions, function (nonFunction) { + t['throws']( + function () { callBind(nonFunction); }, + TypeError, + inspect(nonFunction) + ' is not a function' + ); + }); + + var sentinel = { sentinel: true }; + var func = function (a, b) { + // eslint-disable-next-line no-invalid-this + return [!hasStrictMode && this === global ? undefined : this, a, b]; + }; + t.equal(func.length, 2, 'original function length is 2'); + t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args'); + t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args'); + t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args'); + + var bound = callBind(func); + t.equal(bound.length, func.length + 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args'); + t.deepEqual(bound(1, 2), [hasStrictMode ? 1 : Object(1), 2, undefined], 'bound func with right args'); + t.deepEqual(bound(1, 2, 3), [hasStrictMode ? 1 : Object(1), 2, 3], 'bound func with too many args'); + + var boundR = callBind(func, sentinel); + t.equal(boundR.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args'); + t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args'); + t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args'); + + var boundArg = callBind(func, sentinel, 1); + t.equal(boundArg.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths }); + t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args'); + t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg'); + t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args'); + + t.test('callBind.apply', function (st) { + var aBound = callBind.apply(func); + st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args'); + st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + + var aBoundArg = callBind.apply(func); + st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args'); + st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args'); + st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args'); + + var aBoundR = callBind.apply(func, sentinel); + st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args'); + st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args'); + st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args'); + + st.end(); + }); + + t.end(); +}); diff --git a/user-service/node_modules/chokidar/LICENSE b/user-service/node_modules/chokidar/LICENSE new file mode 100644 index 0000000000..fa9162b51a --- /dev/null +++ b/user-service/node_modules/chokidar/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/user-service/node_modules/chokidar/README.md b/user-service/node_modules/chokidar/README.md new file mode 100644 index 0000000000..8e25decb47 --- /dev/null +++ b/user-service/node_modules/chokidar/README.md @@ -0,0 +1,308 @@ +# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar) + +> Minimal and efficient cross-platform file watching library + +[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar) + +## Why? + +Node.js `fs.watch`: + +* Doesn't report filenames on MacOS. +* Doesn't report events at all when using editors like Sublime on MacOS. +* Often reports events twice. +* Emits most changes as `rename`. +* Does not provide an easy way to recursively watch file trees. +* Does not support recursive watching on Linux. + +Node.js `fs.watchFile`: + +* Almost as bad at event handling. +* Also does not provide any recursive watching. +* Results in high CPU utilization. + +Chokidar resolves these problems. + +Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in +[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode), +[gulp](https://github.com/gulpjs/gulp/), +[karma](https://karma-runner.github.io/), +[PM2](https://github.com/Unitech/PM2), +[browserify](http://browserify.org/), +[webpack](https://webpack.github.io/), +[BrowserSync](https://www.browsersync.io/), +and [many others](https://www.npmjs.com/browse/depended/chokidar). +It has proven itself in production environments. + +Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/) + +## How? + +Chokidar does still rely on the Node.js core `fs` module, but when using +`fs.watch` and `fs.watchFile` for watching, it normalizes the events it +receives, often checking for truth by getting file stats and/or dir contents. + +On MacOS, chokidar by default uses a native extension exposing the Darwin +`FSEvents` API. This provides very efficient recursive watching compared with +implementations like `kqueue` available on most \*nix platforms. Chokidar still +does have to do some work to normalize the events received that way as well. + +On most other platforms, the `fs.watch`-based implementation is the default, which +avoids polling and keeps CPU usage down. Be advised that chokidar will initiate +watchers recursively for everything within scope of the paths that have been +specified, so be judicious about not wasting system resources by watching much +more than needed. + +## Getting started + +Install with npm: + +```sh +npm install chokidar +``` + +Then `require` and use it in your code: + +```javascript +const chokidar = require('chokidar'); + +// One-liner for current directory +chokidar.watch('.').on('all', (event, path) => { + console.log(event, path); +}); +``` + +## API + +```javascript +// Example of a more typical implementation structure + +// Initialize watcher. +const watcher = chokidar.watch('file, dir, glob, or array', { + ignored: /(^|[\/\\])\../, // ignore dotfiles + persistent: true +}); + +// Something to use when events are received. +const log = console.log.bind(console); +// Add event listeners. +watcher + .on('add', path => log(`File ${path} has been added`)) + .on('change', path => log(`File ${path} has been changed`)) + .on('unlink', path => log(`File ${path} has been removed`)); + +// More possible events. +watcher + .on('addDir', path => log(`Directory ${path} has been added`)) + .on('unlinkDir', path => log(`Directory ${path} has been removed`)) + .on('error', error => log(`Watcher error: ${error}`)) + .on('ready', () => log('Initial scan complete. Ready for changes')) + .on('raw', (event, path, details) => { // internal + log('Raw event info:', event, path, details); + }); + +// 'add', 'addDir' and 'change' events also receive stat() results as second +// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats +watcher.on('change', (path, stats) => { + if (stats) console.log(`File ${path} changed size to ${stats.size}`); +}); + +// Watch new files. +watcher.add('new-file'); +watcher.add(['new-file-2', 'new-file-3', '**/other-file*']); + +// Get list of actual paths being watched on the filesystem +var watchedPaths = watcher.getWatched(); + +// Un-watch some files. +await watcher.unwatch('new-file*'); + +// Stop watching. +// The method is async! +watcher.close().then(() => console.log('closed')); + +// Full list of options. See below for descriptions. +// Do not use this example! +chokidar.watch('file', { + persistent: true, + + ignored: '*.txt', + ignoreInitial: false, + followSymlinks: true, + cwd: '.', + disableGlobbing: false, + + usePolling: false, + interval: 100, + binaryInterval: 300, + alwaysStat: false, + depth: 99, + awaitWriteFinish: { + stabilityThreshold: 2000, + pollInterval: 100 + }, + + ignorePermissionErrors: false, + atomic: true // or a custom 'atomicity delay', in milliseconds (default 100) +}); + +``` + +`chokidar.watch(paths, [options])` + +* `paths` (string or array of strings). Paths to files, dirs to be watched +recursively, or glob patterns. + - Note: globs must not contain windows separators (`\`), + because that's how they work by the standard — + you'll need to replace them with forward slashes (`/`). + - Note 2: for additional glob documentation, check out low-level + library: [picomatch](https://github.com/micromatch/picomatch). +* `options` (object) Options object as defined below: + +#### Persistence + +* `persistent` (default: `true`). Indicates whether the process +should continue to run as long as files are being watched. If set to +`false` when using `fsevents` to watch, no more events will be emitted +after `ready`, even if the process continues to run. + +#### Path filtering + +* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition) +Defines files/paths to be ignored. The whole relative or absolute path is +tested, not just filename. If a function with two arguments is provided, it +gets called twice per path - once with a single argument (the path), second +time with two arguments (the path and the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object of that path). +* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while +instantiating the watching as chokidar discovers these file paths (before the `ready` event). +* `followSymlinks` (default: `true`). When `false`, only the +symlinks themselves will be watched for changes instead of following +the link references and bubbling events through the link's path. +* `cwd` (no default). The base directory from which watch `paths` are to be +derived. Paths emitted with events will be relative to this. +* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as +literal path names, even if they look like globs. + +#### Performance + +* `usePolling` (default: `false`). +Whether to use fs.watchFile (backed by polling), or fs.watch. If polling +leads to high CPU utilization, consider setting this to `false`. It is +typically necessary to **set this to `true` to successfully watch files over +a network**, and it may be necessary to successfully watch files in other +non-standard situations. Setting to `true` explicitly on MacOS overrides the +`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable +to true (1) or false (0) in order to override this option. +* _Polling-specific settings_ (effective when `usePolling: true`) + * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also + set the CHOKIDAR_INTERVAL env variable to override this option. + * `binaryInterval` (default: `300`). Interval of file system + polling for binary files. + ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) +* `useFsEvents` (default: `true` on MacOS). Whether to use the +`fsevents` watching interface if available. When set to `true` explicitly +and `fsevents` is available this supercedes the `usePolling` setting. When +set to `false` on MacOS, `usePolling: true` becomes the default. +* `alwaysStat` (default: `false`). If relying upon the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object that may get passed with `add`, `addDir`, and `change` events, set +this to `true` to ensure it is provided even in cases where it wasn't +already available from the underlying watch events. +* `depth` (default: `undefined`). If set, limits how many levels of +subdirectories will be traversed. +* `awaitWriteFinish` (default: `false`). +By default, the `add` event will fire when a file first appears on disk, before +the entire file has been written. Furthermore, in some cases some `change` +events will be emitted while the file is being written. In some cases, +especially when watching for large files there will be a need to wait for the +write operation to finish before responding to a file creation or modification. +Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size, +holding its `add` and `change` events until the size does not change for a +configurable amount of time. The appropriate duration setting is heavily +dependent on the OS and hardware. For accurate detection this parameter should +be relatively high, making file watching much less responsive. +Use with caution. + * *`options.awaitWriteFinish` can be set to an object in order to adjust + timing params:* + * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in + milliseconds for a file size to remain constant before emitting its event. + * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds. + +#### Errors + +* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files +that don't have read permissions if possible. If watching fails due to `EPERM` +or `EACCES` with this set to `true`, the errors will be suppressed silently. +* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`). +Automatically filters out artifacts that occur when using editors that use +"atomic writes" instead of writing directly to the source file. If a file is +re-added within 100 ms of being deleted, Chokidar emits a `change` event +rather than `unlink` then `add`. If the default of 100 ms does not work well +for you, you can override it by setting `atomic` to a custom value, in +milliseconds. + +### Methods & Events + +`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`: + +* `.add(path / paths)`: Add files, directories, or glob patterns for tracking. +Takes an array of strings or just one string. +* `.on(event, callback)`: Listen for an FS event. +Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`, +`raw`, `error`. +Additionally `all` is available which gets emitted with the underlying event +name and path for every event other than `ready`, `raw`, and `error`. `raw` is internal, use it carefully. +* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns. +Takes an array of strings or just one string. +* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen. +* `.getWatched()`: Returns an object representing all the paths on the file +system being watched by this `FSWatcher` instance. The object's keys are all the +directories (using absolute paths unless the `cwd` option was used), and the +values are arrays of the names of the items contained in each directory. + +## CLI + +If you need a CLI interface for your file watching, check out +[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to +execute a command on each change, or get a stdio stream of change events. + +## Install Troubleshooting + +* `npm WARN optional dep failed, continuing fsevents@n.n.n` + * This message is normal part of how `npm` handles optional dependencies and is + not indicative of a problem. Even if accompanied by other related error messages, + Chokidar should function properly. + +* `TypeError: fsevents is not a constructor` + * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar. + +* Chokidar is producing `ENOSP` error on Linux, like this: + * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell` + `Error: watch /home/ ENOSPC` + * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal: + `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p` + +## Changelog + +For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md). +- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks. +- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement. +- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method. +- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions. +- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%. +- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher. +- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes. +- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported +- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66) + +## Also + +Why was chokidar named this way? What's the meaning behind it? + +>Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. + +## License + +MIT (c) Paul Miller (), see [LICENSE](LICENSE) file. diff --git a/user-service/node_modules/chokidar/index.js b/user-service/node_modules/chokidar/index.js new file mode 100644 index 0000000000..8752893ca4 --- /dev/null +++ b/user-service/node_modules/chokidar/index.js @@ -0,0 +1,973 @@ +'use strict'; + +const { EventEmitter } = require('events'); +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const readdirp = require('readdirp'); +const anymatch = require('anymatch').default; +const globParent = require('glob-parent'); +const isGlob = require('is-glob'); +const braces = require('braces'); +const normalizePath = require('normalize-path'); + +const NodeFsHandler = require('./lib/nodefs-handler'); +const FsEventsHandler = require('./lib/fsevents-handler'); +const { + EV_ALL, + EV_READY, + EV_ADD, + EV_CHANGE, + EV_UNLINK, + EV_ADD_DIR, + EV_UNLINK_DIR, + EV_RAW, + EV_ERROR, + + STR_CLOSE, + STR_END, + + BACK_SLASH_RE, + DOUBLE_SLASH_RE, + SLASH_OR_BACK_SLASH_RE, + DOT_RE, + REPLACER_RE, + + SLASH, + SLASH_SLASH, + BRACE_START, + BANG, + ONE_DOT, + TWO_DOTS, + GLOBSTAR, + SLASH_GLOBSTAR, + ANYMATCH_OPTS, + STRING_TYPE, + FUNCTION_TYPE, + EMPTY_STR, + EMPTY_FN, + + isWindows, + isMacos, + isIBMi +} = require('./lib/constants'); + +const stat = promisify(fs.stat); +const readdir = promisify(fs.readdir); + +/** + * @typedef {String} Path + * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName + * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType + */ + +/** + * + * @typedef {Object} WatchHelpers + * @property {Boolean} followSymlinks + * @property {'stat'|'lstat'} statMethod + * @property {Path} path + * @property {Path} watchPath + * @property {Function} entryPath + * @property {Boolean} hasGlob + * @property {Object} globFilter + * @property {Function} filterPath + * @property {Function} filterDir + */ + +const arrify = (value = []) => Array.isArray(value) ? value : [value]; +const flatten = (list, result = []) => { + list.forEach(item => { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; +}; + +const unifyPaths = (paths_) => { + /** + * @type {Array} + */ + const paths = flatten(arrify(paths_)); + if (!paths.every(p => typeof p === STRING_TYPE)) { + throw new TypeError(`Non-string provided as watch path: ${paths}`); + } + return paths.map(normalizePathToUnix); +}; + +// If SLASH_SLASH occurs at the beginning of path, it is not replaced +// because "//StoragePC/DrivePool/Movies" is a valid network path +const toUnix = (string) => { + let str = string.replace(BACK_SLASH_RE, SLASH); + let prepend = false; + if (str.startsWith(SLASH_SLASH)) { + prepend = true; + } + while (str.match(DOUBLE_SLASH_RE)) { + str = str.replace(DOUBLE_SLASH_RE, SLASH); + } + if (prepend) { + str = SLASH + str; + } + return str; +}; + +// Our version of upath.normalize +// TODO: this is not equal to path-normalize module - investigate why +const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path))); + +const normalizeIgnored = (cwd = EMPTY_STR) => (path) => { + if (typeof path !== STRING_TYPE) return path; + return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path)); +}; + +const getAbsolutePath = (path, cwd) => { + if (sysPath.isAbsolute(path)) { + return path; + } + if (path.startsWith(BANG)) { + return BANG + sysPath.join(cwd, path.slice(1)); + } + return sysPath.join(cwd, path); +}; + +const undef = (opts, key) => opts[key] === undefined; + +/** + * Directory entry. + * @property {Path} path + * @property {Set} items + */ +class DirEntry { + /** + * @param {Path} dir + * @param {Function} removeWatcher + */ + constructor(dir, removeWatcher) { + this.path = dir; + this._removeWatcher = removeWatcher; + /** @type {Set} */ + this.items = new Set(); + } + + add(item) { + const {items} = this; + if (!items) return; + if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item); + } + + async remove(item) { + const {items} = this; + if (!items) return; + items.delete(item); + if (items.size > 0) return; + + const dir = this.path; + try { + await readdir(dir); + } catch (err) { + if (this._removeWatcher) { + this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); + } + } + } + + has(item) { + const {items} = this; + if (!items) return; + return items.has(item); + } + + /** + * @returns {Array} + */ + getChildren() { + const {items} = this; + if (!items) return; + return [...items.values()]; + } + + dispose() { + this.items.clear(); + delete this.path; + delete this._removeWatcher; + delete this.items; + Object.freeze(this); + } +} + +const STAT_METHOD_F = 'stat'; +const STAT_METHOD_L = 'lstat'; +class WatchHelper { + constructor(path, watchPath, follow, fsw) { + this.fsw = fsw; + this.path = path = path.replace(REPLACER_RE, EMPTY_STR); + this.watchPath = watchPath; + this.fullWatchPath = sysPath.resolve(watchPath); + this.hasGlob = watchPath !== path; + /** @type {object|boolean} */ + if (path === EMPTY_STR) this.hasGlob = false; + this.globSymlink = this.hasGlob && follow ? undefined : false; + this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false; + this.dirParts = this.getDirParts(path); + this.dirParts.forEach((parts) => { + if (parts.length > 1) parts.pop(); + }); + this.followSymlinks = follow; + this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; + } + + checkGlobSymlink(entry) { + // only need to resolve once + // first entry should always have entry.parentDir === EMPTY_STR + if (this.globSymlink === undefined) { + this.globSymlink = entry.fullParentDir === this.fullWatchPath ? + false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath}; + } + + if (this.globSymlink) { + return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); + } + + return entry.fullPath; + } + + entryPath(entry) { + return sysPath.join(this.watchPath, + sysPath.relative(this.watchPath, this.checkGlobSymlink(entry)) + ); + } + + filterPath(entry) { + const {stats} = entry; + if (stats && stats.isSymbolicLink()) return this.filterDir(entry); + const resolvedPath = this.entryPath(entry); + const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? + this.globFilter(resolvedPath) : true; + return matchesGlob && + this.fsw._isntIgnored(resolvedPath, stats) && + this.fsw._hasReadPermissions(stats); + } + + getDirParts(path) { + if (!this.hasGlob) return []; + const parts = []; + const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path]; + expandedPath.forEach((path) => { + parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE)); + }); + return parts; + } + + filterDir(entry) { + if (this.hasGlob) { + const entryParts = this.getDirParts(this.checkGlobSymlink(entry)); + let globstar = false; + this.unmatchedGlob = !this.dirParts.some((parts) => { + return parts.every((part, i) => { + if (part === GLOBSTAR) globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); + }); + }); + } + return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats); + } +} + +/** + * Watches files & directories for changes. Emitted events: + * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` + * + * new FSWatcher() + * .add(directories) + * .on('add', path => log('File', path, 'was added')) + */ +class FSWatcher extends EventEmitter { +// Not indenting methods for history sake; for now. +constructor(_opts) { + super(); + + const opts = {}; + if (_opts) Object.assign(opts, _opts); // for frozen objects + + /** @type {Map} */ + this._watched = new Map(); + /** @type {Map} */ + this._closers = new Map(); + /** @type {Set} */ + this._ignoredPaths = new Set(); + + /** @type {Map} */ + this._throttled = new Map(); + + /** @type {Map} */ + this._symlinkPaths = new Map(); + + this._streams = new Set(); + this.closed = false; + + // Set up default options. + if (undef(opts, 'persistent')) opts.persistent = true; + if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false; + if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false; + if (undef(opts, 'interval')) opts.interval = 100; + if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300; + if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false; + opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; + + // Enable fsevents on OS X when polling isn't explicitly enabled. + if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling; + + // If we can't use fsevents, ensure the options reflect it's disabled. + const canUseFsEvents = FsEventsHandler.canUse(); + if (!canUseFsEvents) opts.useFsEvents = false; + + // Use polling on Mac if not using fsevents. + // Other platforms use non-polling fs_watch. + if (undef(opts, 'usePolling') && !opts.useFsEvents) { + opts.usePolling = isMacos; + } + + // Always default to polling on IBM i because fs.watch() is not available on IBM i. + if(isIBMi) { + opts.usePolling = true; + } + + // Global override (useful for end-developers that need to force polling for all + // instances of chokidar, regardless of usage/dependency depth) + const envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== undefined) { + const envLower = envPoll.toLowerCase(); + + if (envLower === 'false' || envLower === '0') { + opts.usePolling = false; + } else if (envLower === 'true' || envLower === '1') { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower; + } + } + const envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = Number.parseInt(envInterval, 10); + } + + // Editor atomic write normalization enabled by default with fs.watch + if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) this._pendingUnlinks = new Map(); + + if (undef(opts, 'followSymlinks')) opts.followSymlinks = true; + + if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; + const awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; + if (!awf.pollInterval) awf.pollInterval = 100; + this._pendingWrites = new Map(); + } + if (opts.ignored) opts.ignored = arrify(opts.ignored); + + let readyCalls = 0; + this._emitReady = () => { + readyCalls++; + if (readyCalls >= this._readyCount) { + this._emitReady = EMPTY_FN; + this._readyEmitted = true; + // use process.nextTick to allow time for listener to be bound + process.nextTick(() => this.emit(EV_READY)); + } + }; + this._emitRaw = (...args) => this.emit(EV_RAW, ...args); + this._readyEmitted = false; + this.options = opts; + + // Initialize with proper watcher. + if (opts.useFsEvents) { + this._fsEventsHandler = new FsEventsHandler(this); + } else { + this._nodeFsHandler = new NodeFsHandler(this); + } + + // You’re frozen when your heart’s not open. + Object.freeze(opts); +} + +// Public methods + +/** + * Adds paths to be watched on an existing FSWatcher instance + * @param {Path|Array} paths_ + * @param {String=} _origAdd private; for handling non-existent paths to be watched + * @param {Boolean=} _internal private; indicates a non-user add + * @returns {FSWatcher} for chaining + */ +add(paths_, _origAdd, _internal) { + const {cwd, disableGlobbing} = this.options; + this.closed = false; + let paths = unifyPaths(paths_); + if (cwd) { + paths = paths.map((path) => { + const absPath = getAbsolutePath(path, cwd); + + // Check `path` instead of `absPath` because the cwd portion can't be a glob + if (disableGlobbing || !isGlob(path)) { + return absPath; + } + return normalizePath(absPath); + }); + } + + // set aside negated glob strings + paths = paths.filter((path) => { + if (path.startsWith(BANG)) { + this._ignoredPaths.add(path.slice(1)); + return false; + } + + // if a path is being added that was previously ignored, stop ignoring it + this._ignoredPaths.delete(path); + this._ignoredPaths.delete(path + SLASH_GLOBSTAR); + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + + return true; + }); + + if (this.options.useFsEvents && this._fsEventsHandler) { + if (!this._readyCount) this._readyCount = paths.length; + if (this.options.persistent) this._readyCount += paths.length; + paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path)); + } else { + if (!this._readyCount) this._readyCount = 0; + this._readyCount += paths.length; + Promise.all( + paths.map(async path => { + const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd); + if (res) this._emitReady(); + return res; + }) + ).then(results => { + if (this.closed) return; + results.filter(item => item).forEach(item => { + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }); + }); + } + + return this; +} + +/** + * Close watchers or start ignoring events from specified paths. + * @param {Path|Array} paths_ - string or array of strings, file/directory paths and/or globs + * @returns {FSWatcher} for chaining +*/ +unwatch(paths_) { + if (this.closed) return this; + const paths = unifyPaths(paths_); + const {cwd} = this.options; + + paths.forEach((path) => { + // convert to absolute path unless relative path already matches + if (!sysPath.isAbsolute(path) && !this._closers.has(path)) { + if (cwd) path = sysPath.join(cwd, path); + path = sysPath.resolve(path); + } + + this._closePath(path); + + this._ignoredPaths.add(path); + if (this._watched.has(path)) { + this._ignoredPaths.add(path + SLASH_GLOBSTAR); + } + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + }); + + return this; +} + +/** + * Close watchers and remove all listeners from watched paths. + * @returns {Promise}. +*/ +close() { + if (this.closed) return this._closePromise; + this.closed = true; + + // Memory management. + this.removeAllListeners(); + const closers = []; + this._closers.forEach(closerList => closerList.forEach(closer => { + const promise = closer(); + if (promise instanceof Promise) closers.push(promise); + })); + this._streams.forEach(stream => stream.destroy()); + this._userIgnored = undefined; + this._readyCount = 0; + this._readyEmitted = false; + this._watched.forEach(dirent => dirent.dispose()); + ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => { + this[`_${key}`].clear(); + }); + + this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve(); + return this._closePromise; +} + +/** + * Expose list of watched paths + * @returns {Object} for chaining +*/ +getWatched() { + const watchList = {}; + this._watched.forEach((entry, dir) => { + const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || ONE_DOT] = entry.getChildren().sort(); + }); + return watchList; +} + +emitWithAll(event, args) { + this.emit(...args); + if (event !== EV_ERROR) this.emit(EV_ALL, ...args); +} + +// Common helpers +// -------------- + +/** + * Normalize and emit events. + * Calling _emit DOES NOT MEAN emit() would be called! + * @param {EventName} event Type of event + * @param {Path} path File or directory path + * @param {*=} val1 arguments to be passed with event + * @param {*=} val2 + * @param {*=} val3 + * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +async _emit(event, path, val1, val2, val3) { + if (this.closed) return; + + const opts = this.options; + if (isWindows) path = sysPath.normalize(path); + if (opts.cwd) path = sysPath.relative(opts.cwd, path); + /** @type Array */ + const args = [event, path]; + if (val3 !== undefined) args.push(val1, val2, val3); + else if (val2 !== undefined) args.push(val1, val2); + else if (val1 !== undefined) args.push(val1); + + const awf = opts.awaitWriteFinish; + let pw; + if (awf && (pw = this._pendingWrites.get(path))) { + pw.lastChange = new Date(); + return this; + } + + if (opts.atomic) { + if (event === EV_UNLINK) { + this._pendingUnlinks.set(path, args); + setTimeout(() => { + this._pendingUnlinks.forEach((entry, path) => { + this.emit(...entry); + this.emit(EV_ALL, ...entry); + this._pendingUnlinks.delete(path); + }); + }, typeof opts.atomic === 'number' ? opts.atomic : 100); + return this; + } + if (event === EV_ADD && this._pendingUnlinks.has(path)) { + event = args[0] = EV_CHANGE; + this._pendingUnlinks.delete(path); + } + } + + if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { + const awfEmit = (err, stats) => { + if (err) { + event = args[0] = EV_ERROR; + args[1] = err; + this.emitWithAll(event, args); + } else if (stats) { + // if stats doesn't exist the file must have been deleted + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + this.emitWithAll(event, args); + } + }; + + this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); + return this; + } + + if (event === EV_CHANGE) { + const isThrottled = !this._throttle(EV_CHANGE, path, 50); + if (isThrottled) return this; + } + + if (opts.alwaysStat && val1 === undefined && + (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE) + ) { + const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path; + let stats; + try { + stats = await stat(fullPath); + } catch (err) {} + // Suppress event when fs_stat fails, to avoid sending undefined 'stat' + if (!stats || this.closed) return; + args.push(stats); + } + this.emitWithAll(event, args); + + return this; +} + +/** + * Common handler for errors + * @param {Error} error + * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +_handleError(error) { + const code = error && error.code; + if (error && code !== 'ENOENT' && code !== 'ENOTDIR' && + (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES')) + ) { + this.emit(EV_ERROR, error); + } + return error || this.closed; +} + +/** + * Helper utility for throttling + * @param {ThrottleType} actionType type being throttled + * @param {Path} path being acted upon + * @param {Number} timeout duration of time to suppress duplicate actions + * @returns {Object|false} tracking object or false if action should be suppressed + */ +_throttle(actionType, path, timeout) { + if (!this._throttled.has(actionType)) { + this._throttled.set(actionType, new Map()); + } + + /** @type {Map} */ + const action = this._throttled.get(actionType); + /** @type {Object} */ + const actionPath = action.get(path); + + if (actionPath) { + actionPath.count++; + return false; + } + + let timeoutObject; + const clear = () => { + const item = action.get(path); + const count = item ? item.count : 0; + action.delete(path); + clearTimeout(timeoutObject); + if (item) clearTimeout(item.timeoutObject); + return count; + }; + timeoutObject = setTimeout(clear, timeout); + const thr = {timeoutObject, clear, count: 0}; + action.set(path, thr); + return thr; +} + +_incrReadyCount() { + return this._readyCount++; +} + +/** + * Awaits write operation to finish. + * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback. + * @param {Path} path being acted upon + * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished + * @param {EventName} event + * @param {Function} awfEmit Callback to be called when ready for event to be emitted. + */ +_awaitWriteFinish(path, threshold, event, awfEmit) { + let timeoutHandler; + + let fullPath = path; + if (this.options.cwd && !sysPath.isAbsolute(path)) { + fullPath = sysPath.join(this.options.cwd, path); + } + + const now = new Date(); + + const awaitWriteFinish = (prevStat) => { + fs.stat(fullPath, (err, curStat) => { + if (err || !this._pendingWrites.has(path)) { + if (err && err.code !== 'ENOENT') awfEmit(err); + return; + } + + const now = Number(new Date()); + + if (prevStat && curStat.size !== prevStat.size) { + this._pendingWrites.get(path).lastChange = now; + } + const pw = this._pendingWrites.get(path); + const df = now - pw.lastChange; + + if (df >= threshold) { + this._pendingWrites.delete(path); + awfEmit(undefined, curStat); + } else { + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval, + curStat + ); + } + }); + }; + + if (!this._pendingWrites.has(path)) { + this._pendingWrites.set(path, { + lastChange: now, + cancelWait: () => { + this._pendingWrites.delete(path); + clearTimeout(timeoutHandler); + return event; + } + }); + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval + ); + } +} + +_getGlobIgnored() { + return [...this._ignoredPaths.values()]; +} + +/** + * Determines whether user has asked to ignore this path. + * @param {Path} path filepath or dir + * @param {fs.Stats=} stats result of fs.stat + * @returns {Boolean} + */ +_isIgnored(path, stats) { + if (this.options.atomic && DOT_RE.test(path)) return true; + if (!this._userIgnored) { + const {cwd} = this.options; + const ign = this.options.ignored; + + const ignored = ign && ign.map(normalizeIgnored(cwd)); + const paths = arrify(ignored) + .filter((path) => typeof path === STRING_TYPE && !isGlob(path)) + .map((path) => path + SLASH_GLOBSTAR); + const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); + this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS); + } + + return this._userIgnored([path, stats]); +} + +_isntIgnored(path, stat) { + return !this._isIgnored(path, stat); +} + +/** + * Provides a set of common helpers and properties relating to symlink and glob handling. + * @param {Path} path file, directory, or glob pattern being watched + * @param {Number=} depth at any depth > 0, this isn't a glob + * @returns {WatchHelper} object containing helpers for this path + */ +_getWatchHelpers(path, depth) { + const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); + const follow = this.options.followSymlinks; + + return new WatchHelper(path, watchPath, follow, this); +} + +// Directory helpers +// ----------------- + +/** + * Provides directory tracking objects + * @param {String} directory path of the directory + * @returns {DirEntry} the directory's tracking object + */ +_getWatchedDir(directory) { + if (!this._boundRemove) this._boundRemove = this._remove.bind(this); + const dir = sysPath.resolve(directory); + if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove)); + return this._watched.get(dir); +} + +// File helpers +// ------------ + +/** + * Check for read permissions. + * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405 + * @param {fs.Stats} stats - object, result of fs_stat + * @returns {Boolean} indicates whether the file can be read +*/ +_hasReadPermissions(stats) { + if (this.options.ignorePermissionErrors) return true; + + // stats.mode may be bigint + const md = stats && Number.parseInt(stats.mode, 10); + const st = md & 0o777; + const it = Number.parseInt(st.toString(8)[0], 10); + return Boolean(4 & it); +} + +/** + * Handles emitting unlink events for + * files and directories, and via recursion, for + * files and directories within directories that are unlinked + * @param {String} directory within which the following item is located + * @param {String} item base path of item/directory + * @returns {void} +*/ +_remove(directory, item, isDirectory) { + // if what is being deleted is a directory, get that directory's paths + // for recursive deleting and cleaning of watched object + // if it is not a directory, nestedDirectoryChildren will be empty array + const path = sysPath.join(directory, item); + const fullPath = sysPath.resolve(path); + isDirectory = isDirectory != null + ? isDirectory + : this._watched.has(path) || this._watched.has(fullPath); + + // prevent duplicate handling in case of arriving here nearly simultaneously + // via multiple paths (such as _handleFile and _handleDir) + if (!this._throttle('remove', path, 100)) return; + + // if the only watched file is removed, watch for its return + if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { + this.add(directory, item, true); + } + + // This will create a new entry in the watched object in either case + // so we got to do the directory check beforehand + const wp = this._getWatchedDir(path); + const nestedDirectoryChildren = wp.getChildren(); + + // Recursively remove children directories / files. + nestedDirectoryChildren.forEach(nested => this._remove(path, nested)); + + // Check if item was on the watched list and remove it + const parent = this._getWatchedDir(directory); + const wasTracked = parent.has(item); + parent.remove(item); + + // Fixes issue #1042 -> Relative paths were detected and added as symlinks + // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612), + // but never removed from the map in case the path was deleted. + // This leads to an incorrect state if the path was recreated: + // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553 + if (this._symlinkPaths.has(fullPath)) { + this._symlinkPaths.delete(fullPath); + } + + // If we wait for this file to be fully written, cancel the wait. + let relPath = path; + if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); + if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { + const event = this._pendingWrites.get(relPath).cancelWait(); + if (event === EV_ADD) return; + } + + // The Entry will either be a directory that just got removed + // or a bogus entry to a file, in either case we have to remove it + this._watched.delete(path); + this._watched.delete(fullPath); + const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; + if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); + + // Avoid conflicts if we later create another file with the same name + if (!this.options.useFsEvents) { + this._closePath(path); + } +} + +/** + * Closes all watchers for a path + * @param {Path} path + */ +_closePath(path) { + this._closeFile(path) + const dir = sysPath.dirname(path); + this._getWatchedDir(dir).remove(sysPath.basename(path)); +} + +/** + * Closes only file-specific watchers + * @param {Path} path + */ +_closeFile(path) { + const closers = this._closers.get(path); + if (!closers) return; + closers.forEach(closer => closer()); + this._closers.delete(path); +} + +/** + * + * @param {Path} path + * @param {Function} closer + */ +_addPathCloser(path, closer) { + if (!closer) return; + let list = this._closers.get(path); + if (!list) { + list = []; + this._closers.set(path, list); + } + list.push(closer); +} + +_readdirp(root, opts) { + if (this.closed) return; + const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts}; + let stream = readdirp(root, options); + this._streams.add(stream); + stream.once(STR_CLOSE, () => { + stream = undefined; + }); + stream.once(STR_END, () => { + if (stream) { + this._streams.delete(stream); + stream = undefined; + } + }); + return stream; +} + +} + +// Export FSWatcher class +exports.FSWatcher = FSWatcher; + +/** + * Instantiates watcher with paths to be tracked. + * @param {String|Array} paths file/directory paths and/or globs + * @param {Object=} options chokidar opts + * @returns an instance of FSWatcher for chaining. + */ +const watch = (paths, options) => { + const watcher = new FSWatcher(options); + watcher.add(paths); + return watcher; +}; + +exports.watch = watch; diff --git a/user-service/node_modules/chokidar/lib/constants.js b/user-service/node_modules/chokidar/lib/constants.js new file mode 100644 index 0000000000..4743865d6b --- /dev/null +++ b/user-service/node_modules/chokidar/lib/constants.js @@ -0,0 +1,66 @@ +'use strict'; + +const {sep} = require('path'); +const {platform} = process; +const os = require('os'); + +exports.EV_ALL = 'all'; +exports.EV_READY = 'ready'; +exports.EV_ADD = 'add'; +exports.EV_CHANGE = 'change'; +exports.EV_ADD_DIR = 'addDir'; +exports.EV_UNLINK = 'unlink'; +exports.EV_UNLINK_DIR = 'unlinkDir'; +exports.EV_RAW = 'raw'; +exports.EV_ERROR = 'error'; + +exports.STR_DATA = 'data'; +exports.STR_END = 'end'; +exports.STR_CLOSE = 'close'; + +exports.FSEVENT_CREATED = 'created'; +exports.FSEVENT_MODIFIED = 'modified'; +exports.FSEVENT_DELETED = 'deleted'; +exports.FSEVENT_MOVED = 'moved'; +exports.FSEVENT_CLONED = 'cloned'; +exports.FSEVENT_UNKNOWN = 'unknown'; +exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1; +exports.FSEVENT_TYPE_FILE = 'file'; +exports.FSEVENT_TYPE_DIRECTORY = 'directory'; +exports.FSEVENT_TYPE_SYMLINK = 'symlink'; + +exports.KEY_LISTENERS = 'listeners'; +exports.KEY_ERR = 'errHandlers'; +exports.KEY_RAW = 'rawEmitters'; +exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW]; + +exports.DOT_SLASH = `.${sep}`; + +exports.BACK_SLASH_RE = /\\/g; +exports.DOUBLE_SLASH_RE = /\/\//; +exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/; +exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; +exports.REPLACER_RE = /^\.[/\\]/; + +exports.SLASH = '/'; +exports.SLASH_SLASH = '//'; +exports.BRACE_START = '{'; +exports.BANG = '!'; +exports.ONE_DOT = '.'; +exports.TWO_DOTS = '..'; +exports.STAR = '*'; +exports.GLOBSTAR = '**'; +exports.ROOT_GLOBSTAR = '/**/*'; +exports.SLASH_GLOBSTAR = '/**'; +exports.DIR_SUFFIX = 'Dir'; +exports.ANYMATCH_OPTS = {dot: true}; +exports.STRING_TYPE = 'string'; +exports.FUNCTION_TYPE = 'function'; +exports.EMPTY_STR = ''; +exports.EMPTY_FN = () => {}; +exports.IDENTITY_FN = val => val; + +exports.isWindows = platform === 'win32'; +exports.isMacos = platform === 'darwin'; +exports.isLinux = platform === 'linux'; +exports.isIBMi = os.type() === 'OS400'; diff --git a/user-service/node_modules/chokidar/lib/fsevents-handler.js b/user-service/node_modules/chokidar/lib/fsevents-handler.js new file mode 100644 index 0000000000..fe29393c17 --- /dev/null +++ b/user-service/node_modules/chokidar/lib/fsevents-handler.js @@ -0,0 +1,526 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); + +let fsevents; +try { + fsevents = require('fsevents'); +} catch (error) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error); +} + +if (fsevents) { + // TODO: real check + const mtch = process.version.match(/v(\d+)\.(\d+)/); + if (mtch && mtch[1] && mtch[2]) { + const maj = Number.parseInt(mtch[1], 10); + const min = Number.parseInt(mtch[2], 10); + if (maj === 8 && min < 16) { + fsevents = undefined; + } + } +} + +const { + EV_ADD, + EV_CHANGE, + EV_ADD_DIR, + EV_UNLINK, + EV_ERROR, + STR_DATA, + STR_END, + FSEVENT_CREATED, + FSEVENT_MODIFIED, + FSEVENT_DELETED, + FSEVENT_MOVED, + // FSEVENT_CLONED, + FSEVENT_UNKNOWN, + FSEVENT_FLAG_MUST_SCAN_SUBDIRS, + FSEVENT_TYPE_FILE, + FSEVENT_TYPE_DIRECTORY, + FSEVENT_TYPE_SYMLINK, + + ROOT_GLOBSTAR, + DIR_SUFFIX, + DOT_SLASH, + FUNCTION_TYPE, + EMPTY_FN, + IDENTITY_FN +} = require('./constants'); + +const Depth = (value) => isNaN(value) ? {} : {depth: value}; + +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const realpath = promisify(fs.realpath); + +const statMethods = { stat, lstat }; + +/** + * @typedef {String} Path + */ + +/** + * @typedef {Object} FsEventsWatchContainer + * @property {Set} listeners + * @property {Function} rawEmitter + * @property {{stop: Function}} watcher + */ + +// fsevents instance helper functions +/** + * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances) + * @type {Map} + */ +const FSEventsWatchers = new Map(); + +// Threshold of duplicate path prefixes at which to start +// consolidating going forward +const consolidateThreshhold = 10; + +const wrongEventFlags = new Set([ + 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 +]); + +/** + * Instantiates the fsevents interface + * @param {Path} path path to be watched + * @param {Function} callback called when fsevents is bound and ready + * @returns {{stop: Function}} new fsevents instance + */ +const createFSEventsInstance = (path, callback) => { + const stop = fsevents.watch(path, callback); + return {stop}; +}; + +/** + * Instantiates the fsevents interface or binds listeners to an existing one covering + * the same file tree. + * @param {Path} path - to be watched + * @param {Path} realPath - real path for symlinks + * @param {Function} listener - called when fsevents emits events + * @param {Function} rawEmitter - passes data to listeners of the 'raw' event + * @returns {Function} closer + */ +function setFSEventsListener(path, realPath, listener, rawEmitter) { + let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath; + + const parentPath = sysPath.dirname(watchPath); + let cont = FSEventsWatchers.get(watchPath); + + // If we've accumulated a substantial number of paths that + // could have been consolidated by watching one directory + // above the current one, create a watcher on the parent + // path instead, so that we do consolidate going forward. + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + + const resolvedPath = sysPath.resolve(path); + const hasSymlink = resolvedPath !== realPath; + + const filteredListener = (fullPath, flags, info) => { + if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); + if ( + fullPath === resolvedPath || + !fullPath.indexOf(resolvedPath + sysPath.sep) + ) listener(fullPath, flags, info); + }; + + // check if there is already a watcher on a parent path + // modifies `watchPath` to the parent path when it finds a match + let watchedParent = false; + for (const watchedPath of FSEventsWatchers.keys()) { + if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) { + watchPath = watchedPath; + cont = FSEventsWatchers.get(watchPath); + watchedParent = true; + break; + } + } + + if (cont || watchedParent) { + cont.listeners.add(filteredListener); + } else { + cont = { + listeners: new Set([filteredListener]), + rawEmitter, + watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { + if (!cont.listeners.size) return; + if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return; + const info = fsevents.getInfo(fullPath, flags); + cont.listeners.forEach(list => { + list(fullPath, flags, info); + }); + + cont.rawEmitter(info.event, fullPath, info); + }) + }; + FSEventsWatchers.set(watchPath, cont); + } + + // removes this instance's listeners and closes the underlying fsevents + // instance if there are no more listeners left + return () => { + const lst = cont.listeners; + + lst.delete(filteredListener); + if (!lst.size) { + FSEventsWatchers.delete(watchPath); + if (cont.watcher) return cont.watcher.stop().then(() => { + cont.rawEmitter = cont.watcher = undefined; + Object.freeze(cont); + }); + } + }; +} + +// Decide whether or not we should start a new higher-level +// parent watcher +const couldConsolidate = (path) => { + let count = 0; + for (const watchPath of FSEventsWatchers.keys()) { + if (watchPath.indexOf(path) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + + return false; +}; + +// returns boolean indicating whether fsevents can be used +const canUse = () => fsevents && FSEventsWatchers.size < 128; + +// determines subdirectory traversal levels from root to path +const calcDepth = (path, root) => { + let i = 0; + while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; + return i; +}; + +// returns boolean indicating whether the fsevents' event info has the same type +// as the one returned by fs.stat +const sameTypes = (info, stats) => ( + info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || + info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || + info.type === FSEVENT_TYPE_FILE && stats.isFile() +) + +/** + * @mixin + */ +class FsEventsHandler { + +/** + * @param {import('../index').FSWatcher} fsw + */ +constructor(fsw) { + this.fsw = fsw; +} +checkIgnored(path, stats) { + const ipaths = this.fsw._ignoredPaths; + if (this.fsw._isIgnored(path, stats)) { + ipaths.add(path); + if (stats && stats.isDirectory()) { + ipaths.add(path + ROOT_GLOBSTAR); + } + return true; + } + + ipaths.delete(path); + ipaths.delete(path + ROOT_GLOBSTAR); +} + +addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD; + this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts); +} + +async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + try { + const stats = await stat(path) + if (this.fsw.closed) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } catch (error) { + if (error.code === 'EACCES') { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } +} + +handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) { + if (this.fsw.closed || this.checkIgnored(path)) return; + + if (event === EV_UNLINK) { + const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY + // suppress unlink events on never before seen files + if (isDirectory || watchedDir.has(item)) { + this.fsw._remove(parent, item, isDirectory); + } + } else { + if (event === EV_ADD) { + // track new directories + if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path); + + if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { + // push symlinks back to the top of the stack to get handled + const curDepth = opts.depth === undefined ? + undefined : calcDepth(fullPath, realPath) + 1; + return this._addToFsEvents(path, false, true, curDepth); + } + + // track new paths + // (other than symlinks being followed, which will be tracked soon) + this.fsw._getWatchedDir(parent).add(item); + } + /** + * @type {'add'|'addDir'|'unlink'|'unlinkDir'} + */ + const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; + this.fsw._emit(eventName, path); + if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true); + } +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} watchPath - file/dir path to be watched with fsevents + * @param {String} realPath - real path (in case of symlinks) + * @param {Function} transform - path transformer + * @param {Function} globFilter - path filter in case a glob pattern was provided + * @returns {Function} closer for the watcher instance +*/ +_watchWithFsEvents(watchPath, realPath, transform, globFilter) { + if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return; + const opts = this.fsw.options; + const watchCallback = async (fullPath, flags, info) => { + if (this.fsw.closed) return; + if ( + opts.depth !== undefined && + calcDepth(fullPath, realPath) > opts.depth + ) return; + const path = transform(sysPath.join( + watchPath, sysPath.relative(watchPath, fullPath) + )); + if (globFilter && !globFilter(path)) return; + // ensure directories are tracked + const parent = sysPath.dirname(path); + const item = sysPath.basename(path); + const watchedDir = this.fsw._getWatchedDir( + info.type === FSEVENT_TYPE_DIRECTORY ? path : parent + ); + + // correct for wrong events emitted + if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { + if (typeof opts.ignored === FUNCTION_TYPE) { + let stats; + try { + stats = await stat(path); + } catch (error) {} + if (this.fsw.closed) return; + if (this.checkIgnored(path, stats)) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + switch (info.event) { + case FSEVENT_CREATED: + case FSEVENT_MODIFIED: + return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + case FSEVENT_DELETED: + case FSEVENT_MOVED: + return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + }; + + const closer = setFSEventsListener( + watchPath, + realPath, + watchCallback, + this.fsw._emitRaw + ); + + this.fsw._emitReady(); + return closer; +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} linkPath path to symlink + * @param {String} fullPath absolute path to the symlink + * @param {Function} transform pre-existing path transformer + * @param {Number} curDepth level of subdirectories traversed to where symlink is + * @returns {Promise} + */ +async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) { + // don't follow the same symlink more than once + if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return; + + this.fsw._symlinkPaths.set(fullPath, true); + this.fsw._incrReadyCount(); + + try { + const linkTarget = await realpath(linkPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(linkTarget)) { + return this.fsw._emitReady(); + } + + this.fsw._incrReadyCount(); + + // add the linkTarget for watching with a wrapper for transform + // that causes emitted paths to incorporate the link's path + this._addToFsEvents(linkTarget || linkPath, (path) => { + let aliasedPath = linkPath; + if (linkTarget && linkTarget !== DOT_SLASH) { + aliasedPath = path.replace(linkTarget, linkPath); + } else if (path !== DOT_SLASH) { + aliasedPath = sysPath.join(linkPath, path); + } + return transform(aliasedPath); + }, false, curDepth); + } catch(error) { + if (this.fsw._handleError(error)) { + return this.fsw._emitReady(); + } + } +} + +/** + * + * @param {Path} newPath + * @param {fs.Stats} stats + */ +emitAdd(newPath, stats, processPath, opts, forceAdd) { + const pp = processPath(newPath); + const isDir = stats.isDirectory(); + const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp)); + const base = sysPath.basename(pp); + + // ensure empty dirs get tracked + if (isDir) this.fsw._getWatchedDir(pp); + if (dirObj.has(base)) return; + dirObj.add(base); + + if (!opts.ignoreInitial || forceAdd === true) { + this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats); + } +} + +initWatch(realPath, path, wh, processPath) { + if (this.fsw.closed) return; + const closer = this._watchWithFsEvents( + wh.watchPath, + sysPath.resolve(realPath || wh.watchPath), + processPath, + wh.globFilter + ); + this.fsw._addPathCloser(path, closer); +} + +/** + * Handle added path with fsevents + * @param {String} path file/dir path or glob pattern + * @param {Function|Boolean=} transform converts working path to what the user expects + * @param {Boolean=} forceAdd ensure add is emitted + * @param {Number=} priorDepth Level of subdirectories already traversed. + * @returns {Promise} + */ +async _addToFsEvents(path, transform, forceAdd, priorDepth) { + if (this.fsw.closed) { + return; + } + const opts = this.fsw.options; + const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN; + + const wh = this.fsw._getWatchHelpers(path); + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + throw null; + } + if (stats.isDirectory()) { + // emit addDir unless this is a glob parent + if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd); + + // don't recurse further if it would exceed depth setting + if (priorDepth && priorDepth > opts.depth) return; + + // scan the contents of the dir + this.fsw._readdirp(wh.watchPath, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + ...Depth(opts.depth - (priorDepth || 0)) + }).on(STR_DATA, (entry) => { + // need to check filterPath on dirs b/c filterDir is less restrictive + if (this.fsw.closed) { + return; + } + if (entry.stats.isDirectory() && !wh.filterPath(entry)) return; + + const joinedPath = sysPath.join(wh.watchPath, entry.path); + const {fullPath} = entry; + + if (wh.followSymlinks && entry.stats.isSymbolicLink()) { + // preserve the current depth here since it can't be derived from + // real paths past the symlink + const curDepth = opts.depth === undefined ? + undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; + + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd); + } + }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => { + this.fsw._emitReady(); + }); + } else { + this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); + this.fsw._emitReady(); + } + } catch (error) { + if (!error || this.fsw._handleError(error)) { + // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__- + this.fsw._emitReady(); + this.fsw._emitReady(); + } + } + + if (opts.persistent && forceAdd !== true) { + if (typeof transform === FUNCTION_TYPE) { + // realpath has already been resolved + this.initWatch(undefined, path, wh, processPath); + } else { + let realPath; + try { + realPath = await realpath(wh.watchPath); + } catch (e) {} + this.initWatch(realPath, path, wh, processPath); + } + } +} + +} + +module.exports = FsEventsHandler; +module.exports.canUse = canUse; diff --git a/user-service/node_modules/chokidar/lib/nodefs-handler.js b/user-service/node_modules/chokidar/lib/nodefs-handler.js new file mode 100644 index 0000000000..199cfe9f9f --- /dev/null +++ b/user-service/node_modules/chokidar/lib/nodefs-handler.js @@ -0,0 +1,654 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const isBinaryPath = require('is-binary-path'); +const { + isWindows, + isLinux, + EMPTY_FN, + EMPTY_STR, + KEY_LISTENERS, + KEY_ERR, + KEY_RAW, + HANDLER_KEYS, + EV_CHANGE, + EV_ADD, + EV_ADD_DIR, + EV_ERROR, + STR_DATA, + STR_END, + BRACE_START, + STAR +} = require('./constants'); + +const THROTTLE_MODE_WATCH = 'watch'; + +const open = promisify(fs.open); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const close = promisify(fs.close); +const fsrealpath = promisify(fs.realpath); + +const statMethods = { lstat, stat }; + +// TODO: emit errors properly. Example: EMFILE on Macos. +const foreach = (val, fn) => { + if (val instanceof Set) { + val.forEach(fn); + } else { + fn(val); + } +}; + +const addAndConvert = (main, prop, item) => { + let container = main[prop]; + if (!(container instanceof Set)) { + main[prop] = container = new Set([container]); + } + container.add(item); +}; + +const clearItem = cont => key => { + const set = cont[key]; + if (set instanceof Set) { + set.clear(); + } else { + delete cont[key]; + } +}; + +const delFromSet = (main, prop, item) => { + const container = main[prop]; + if (container instanceof Set) { + container.delete(item); + } else if (container === item) { + delete main[prop]; + } +}; + +const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; + +/** + * @typedef {String} Path + */ + +// fs_watch helpers + +// object to hold per-process fs_watch instances +// (may be shared across chokidar FSWatcher instances) + +/** + * @typedef {Object} FsWatchContainer + * @property {Set} listeners + * @property {Set} errHandlers + * @property {Set} rawEmitters + * @property {fs.FSWatcher=} watcher + * @property {Boolean=} watcherUnusable + */ + +/** + * @type {Map} + */ +const FsWatchInstances = new Map(); + +/** + * Instantiates the fs_watch interface + * @param {String} path to be watched + * @param {Object} options to be passed to fs_watch + * @param {Function} listener main event handler + * @param {Function} errHandler emits info about errors + * @param {Function} emitRaw emits raw event data + * @returns {fs.FSWatcher} new fsevents instance + */ +function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { + const handleEvent = (rawEvent, evPath) => { + listener(path); + emitRaw(rawEvent, evPath, {watchedPath: path}); + + // emit based on events occurring for files from a directory's watcher in + // case the file's watcher misses it (and rely on throttling to de-dupe) + if (evPath && path !== evPath) { + fsWatchBroadcast( + sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath) + ); + } + }; + try { + return fs.watch(path, options, handleEvent); + } catch (error) { + errHandler(error); + } +} + +/** + * Helper for passing fs_watch event data to a collection of listeners + * @param {Path} fullPath absolute path bound to fs_watch instance + * @param {String} type listener type + * @param {*=} val1 arguments to be passed to listeners + * @param {*=} val2 + * @param {*=} val3 + */ +const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { + const cont = FsWatchInstances.get(fullPath); + if (!cont) return; + foreach(cont[type], (listener) => { + listener(val1, val2, val3); + }); +}; + +/** + * Instantiates the fs_watch interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path + * @param {String} fullPath absolute path + * @param {Object} options to be passed to fs_watch + * @param {Object} handlers container for event listener functions + */ +const setFsWatchListener = (path, fullPath, options, handlers) => { + const {listener, errHandler, rawEmitter} = handlers; + let cont = FsWatchInstances.get(fullPath); + + /** @type {fs.FSWatcher=} */ + let watcher; + if (!options.persistent) { + watcher = createFsWatchInstance( + path, options, listener, errHandler, rawEmitter + ); + return watcher.close.bind(watcher); + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_ERR, errHandler); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + watcher = createFsWatchInstance( + path, + options, + fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), + errHandler, // no need to use broadcast here + fsWatchBroadcast.bind(null, fullPath, KEY_RAW) + ); + if (!watcher) return; + watcher.on(EV_ERROR, async (error) => { + const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); + cont.watcherUnusable = true; // documented since Node 10.4.1 + // Workaround for https://github.com/joyent/node/issues/4337 + if (isWindows && error.code === 'EPERM') { + try { + const fd = await open(path, 'r'); + await close(fd); + broadcastErr(error); + } catch (err) {} + } else { + broadcastErr(error); + } + }); + cont = { + listeners: listener, + errHandlers: errHandler, + rawEmitters: rawEmitter, + watcher + }; + FsWatchInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // removes this instance's listeners and closes the underlying fs_watch + // instance if there are no more listeners left + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_ERR, errHandler); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + // Check to protect against issue gh-730. + // if (cont.watcherUnusable) { + cont.watcher.close(); + // } + FsWatchInstances.delete(fullPath); + HANDLER_KEYS.forEach(clearItem(cont)); + cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +// fs_watchFile helpers + +// object to hold per-process fs_watchFile instances +// (may be shared across chokidar FSWatcher instances) +const FsWatchFileInstances = new Map(); + +/** + * Instantiates the fs_watchFile interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path to be watched + * @param {String} fullPath absolute path + * @param {Object} options options to be passed to fs_watchFile + * @param {Object} handlers container for event listener functions + * @returns {Function} closer + */ +const setFsWatchFileListener = (path, fullPath, options, handlers) => { + const {listener, rawEmitter} = handlers; + let cont = FsWatchFileInstances.get(fullPath); + + /* eslint-disable no-unused-vars, prefer-destructuring */ + let listeners = new Set(); + let rawEmitters = new Set(); + + const copts = cont && cont.options; + if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) { + // "Upgrade" the watcher to persistence or a quicker interval. + // This creates some unlikely edge case issues if the user mixes + // settings in a very weird way, but solving for those cases + // doesn't seem worthwhile for the added complexity. + listeners = cont.listeners; + rawEmitters = cont.rawEmitters; + fs.unwatchFile(fullPath); + cont = undefined; + } + + /* eslint-enable no-unused-vars, prefer-destructuring */ + + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + // TODO + // listeners.add(listener); + // rawEmitters.add(rawEmitter); + cont = { + listeners: listener, + rawEmitters: rawEmitter, + options, + watcher: fs.watchFile(fullPath, options, (curr, prev) => { + foreach(cont.rawEmitters, (rawEmitter) => { + rawEmitter(EV_CHANGE, fullPath, {curr, prev}); + }); + const currmtime = curr.mtimeMs; + if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { + foreach(cont.listeners, (listener) => listener(path, curr)); + } + }) + }; + FsWatchFileInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // Removes this instance's listeners and closes the underlying fs_watchFile + // instance if there are no more listeners left. + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + FsWatchFileInstances.delete(fullPath); + fs.unwatchFile(fullPath); + cont.options = cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +/** + * @mixin + */ +class NodeFsHandler { + +/** + * @param {import("../index").FSWatcher} fsW + */ +constructor(fsW) { + this.fsw = fsW; + this._boundHandleError = (error) => fsW._handleError(error); +} + +/** + * Watch file for changes with fs_watchFile or fs_watch. + * @param {String} path to file or dir + * @param {Function} listener on fs change + * @returns {Function} closer for the watcher instance + */ +_watchWithNodeFs(path, listener) { + const opts = this.fsw.options; + const directory = sysPath.dirname(path); + const basename = sysPath.basename(path); + const parent = this.fsw._getWatchedDir(directory); + parent.add(basename); + const absolutePath = sysPath.resolve(path); + const options = {persistent: opts.persistent}; + if (!listener) listener = EMPTY_FN; + + let closer; + if (opts.usePolling) { + options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ? + opts.binaryInterval : opts.interval; + closer = setFsWatchFileListener(path, absolutePath, options, { + listener, + rawEmitter: this.fsw._emitRaw + }); + } else { + closer = setFsWatchListener(path, absolutePath, options, { + listener, + errHandler: this._boundHandleError, + rawEmitter: this.fsw._emitRaw + }); + } + return closer; +} + +/** + * Watch a file and emit add event if warranted. + * @param {Path} file Path + * @param {fs.Stats} stats result of fs_stat + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @returns {Function} closer for the watcher instance + */ +_handleFile(file, stats, initialAdd) { + if (this.fsw.closed) { + return; + } + const dirname = sysPath.dirname(file); + const basename = sysPath.basename(file); + const parent = this.fsw._getWatchedDir(dirname); + // stats is always present + let prevStats = stats; + + // if the file is already being watched, do nothing + if (parent.has(basename)) return; + + const listener = async (path, newStats) => { + if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return; + if (!newStats || newStats.mtimeMs === 0) { + try { + const newStats = await stat(file); + if (this.fsw.closed) return; + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + if (isLinux && prevStats.ino !== newStats.ino) { + this.fsw._closeFile(path) + prevStats = newStats; + this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener)); + } else { + prevStats = newStats; + } + } catch (error) { + // Fix issues where mtime is null but file is still present + this.fsw._remove(dirname, basename); + } + // add is about to be emitted if file not already tracked in parent + } else if (parent.has(basename)) { + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + prevStats = newStats; + } + } + // kick off the watcher + const closer = this._watchWithNodeFs(file, listener); + + // emit an add event if we're supposed to + if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { + if (!this.fsw._throttle(EV_ADD, file, 0)) return; + this.fsw._emit(EV_ADD, file, stats); + } + + return closer; +} + +/** + * Handle symlinks encountered while reading a dir. + * @param {Object} entry returned by readdirp + * @param {String} directory path of dir being read + * @param {String} path of this item + * @param {String} item basename of this item + * @returns {Promise} true if no more processing is needed for this entry. + */ +async _handleSymlink(entry, directory, path, item) { + if (this.fsw.closed) { + return; + } + const full = entry.fullPath; + const dir = this.fsw._getWatchedDir(directory); + + if (!this.fsw.options.followSymlinks) { + // watch symlink directly (don't follow) and detect changes + this.fsw._incrReadyCount(); + + let linkPath; + try { + linkPath = await fsrealpath(path); + } catch (e) { + this.fsw._emitReady(); + return true; + } + + if (this.fsw.closed) return; + if (dir.has(item)) { + if (this.fsw._symlinkPaths.get(full) !== linkPath) { + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_CHANGE, path, entry.stats); + } + } else { + dir.add(item); + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_ADD, path, entry.stats); + } + this.fsw._emitReady(); + return true; + } + + // don't follow the same symlink more than once + if (this.fsw._symlinkPaths.has(full)) { + return true; + } + + this.fsw._symlinkPaths.set(full, true); +} + +_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) { + // Normalize the directory name on Windows + directory = sysPath.join(directory, EMPTY_STR); + + if (!wh.hasGlob) { + throttler = this.fsw._throttle('readdir', directory, 1000); + if (!throttler) return; + } + + const previous = this.fsw._getWatchedDir(wh.path); + const current = new Set(); + + let stream = this.fsw._readdirp(directory, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + depth: 0 + }).on(STR_DATA, async (entry) => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const item = entry.path; + let path = sysPath.join(directory, item); + current.add(item); + + if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) { + return; + } + + if (this.fsw.closed) { + stream = undefined; + return; + } + // Files that present in current directory snapshot + // but absent in previous are added to watch list and + // emit `add` event. + if (item === target || !target && !previous.has(item)) { + this.fsw._incrReadyCount(); + + // ensure relativeness of path is preserved in case of watcher reuse + path = sysPath.join(dir, sysPath.relative(dir, path)); + + this._addToNodeFs(path, initialAdd, wh, depth + 1); + } + }).on(EV_ERROR, this._boundHandleError); + + return new Promise(resolve => + stream.once(STR_END, () => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const wasThrottled = throttler ? throttler.clear() : false; + + resolve(); + + // Files that absent in current directory snapshot + // but present in previous emit `remove` event + // and are removed from @watched[directory]. + previous.getChildren().filter((item) => { + return item !== directory && + !current.has(item) && + // in case of intersecting globs; + // a path may have been filtered out of this readdir, but + // shouldn't be removed because it matches a different glob + (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath.resolve(directory, item) + })); + }).forEach((item) => { + this.fsw._remove(directory, item); + }); + + stream = undefined; + + // one more time for any missed in case changes came in extremely quickly + if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler); + }) + ); +} + +/** + * Read directory to add / remove files from `@watched` list and re-read it on change. + * @param {String} dir fs path + * @param {fs.Stats} stats + * @param {Boolean} initialAdd + * @param {Number} depth relative to user-supplied path + * @param {String} target child path targeted for watch + * @param {Object} wh Common watch helpers for this path + * @param {String} realpath + * @returns {Promise} closer for the watcher instance. + */ +async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) { + const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir)); + const tracked = parentDir.has(sysPath.basename(dir)); + if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats); + } + + // ensure dir is tracked (harmless if redundant) + parentDir.add(sysPath.basename(dir)); + this.fsw._getWatchedDir(dir); + let throttler; + let closer; + + const oDepth = this.fsw.options.depth; + if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) { + if (!target) { + await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler); + if (this.fsw.closed) return; + } + + closer = this._watchWithNodeFs(dir, (dirPath, stats) => { + // if current directory is removed, do nothing + if (stats && stats.mtimeMs === 0) return; + + this._handleRead(dirPath, false, wh, target, dir, depth, throttler); + }); + } + return closer; +} + +/** + * Handle added file, directory, or glob pattern. + * Delegates call to _handleFile / _handleDir after checks. + * @param {String} path to file or ir + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @param {Object} priorWh depth relative to user-supplied path + * @param {Number} depth Child path actually targeted for watch + * @param {String=} target Child path actually targeted for watch + * @returns {Promise} + */ +async _addToNodeFs(path, initialAdd, priorWh, depth, target) { + const ready = this.fsw._emitReady; + if (this.fsw._isIgnored(path) || this.fsw.closed) { + ready(); + return false; + } + + const wh = this.fsw._getWatchHelpers(path, depth); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = entry => priorWh.filterPath(entry); + wh.filterDir = entry => priorWh.filterDir(entry); + } + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + ready(); + return false; + } + + const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START); + let closer; + if (stats.isDirectory()) { + const absPath = sysPath.resolve(path); + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath); + if (this.fsw.closed) return; + // preserve this symlink's target path + if (absPath !== targetPath && targetPath !== undefined) { + this.fsw._symlinkPaths.set(absPath, targetPath); + } + } else if (stats.isSymbolicLink()) { + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + const parent = sysPath.dirname(wh.watchPath); + this.fsw._getWatchedDir(parent).add(wh.watchPath); + this.fsw._emit(EV_ADD, wh.watchPath, stats); + closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath); + if (this.fsw.closed) return; + + // preserve this symlink's target path + if (targetPath !== undefined) { + this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath); + } + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd); + } + ready(); + + this.fsw._addPathCloser(path, closer); + return false; + + } catch (error) { + if (this.fsw._handleError(error)) { + ready(); + return path; + } + } +} + +} + +module.exports = NodeFsHandler; diff --git a/user-service/node_modules/chokidar/package.json b/user-service/node_modules/chokidar/package.json new file mode 100644 index 0000000000..e8f8b3d995 --- /dev/null +++ b/user-service/node_modules/chokidar/package.json @@ -0,0 +1,70 @@ +{ + "name": "chokidar", + "description": "Minimal and efficient cross-platform file watching library", + "version": "3.6.0", + "homepage": "https://github.com/paulmillr/chokidar", + "author": "Paul Miller (https://paulmillr.com)", + "contributors": [ + "Paul Miller (https://paulmillr.com)", + "Elan Shanker" + ], + "engines": { + "node": ">= 8.10.0" + }, + "main": "index.js", + "types": "./types/index.d.ts", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "devDependencies": { + "@types/node": "^14", + "chai": "^4.3", + "dtslint": "^3.3.0", + "eslint": "^7.0.0", + "mocha": "^7.0.0", + "rimraf": "^3.0.0", + "sinon": "^9.0.1", + "sinon-chai": "^3.3.0", + "typescript": "^4.4.3", + "upath": "^1.2.0" + }, + "files": [ + "index.js", + "lib/*.js", + "types/index.d.ts" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/paulmillr/chokidar.git" + }, + "bugs": { + "url": "https://github.com/paulmillr/chokidar/issues" + }, + "license": "MIT", + "scripts": { + "dtslint": "dtslint types", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "build": "npm ls", + "mocha": "mocha --exit --timeout 90000", + "test": "npm run lint && npm run mocha" + }, + "keywords": [ + "fs", + "watch", + "watchFile", + "watcher", + "watching", + "file", + "fsevents" + ], + "funding": "https://paulmillr.com/funding/" +} diff --git a/user-service/node_modules/chokidar/types/index.d.ts b/user-service/node_modules/chokidar/types/index.d.ts new file mode 100644 index 0000000000..455806638f --- /dev/null +++ b/user-service/node_modules/chokidar/types/index.d.ts @@ -0,0 +1,192 @@ +// TypeScript Version: 3.0 + +/// + +import * as fs from "fs"; +import { EventEmitter } from "events"; +import { Matcher } from 'anymatch'; + +export class FSWatcher extends EventEmitter implements fs.FSWatcher { + options: WatchOptions; + + /** + * Constructs a new FSWatcher instance with optional WatchOptions parameter. + */ + constructor(options?: WatchOptions); + + /** + * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one + * string. + */ + add(paths: string | ReadonlyArray): this; + + /** + * Stop watching files, directories, or glob patterns. Takes an array of strings or just one + * string. + */ + unwatch(paths: string | ReadonlyArray): this; + + /** + * Returns an object representing all the paths on the file system being watched by this + * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless + * the `cwd` option was used), and the values are arrays of the names of the items contained in + * each directory. + */ + getWatched(): { + [directory: string]: string[]; + }; + + /** + * Removes all listeners from watched files. + */ + close(): Promise; + + on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this; + + on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this; + + /** + * Error occurred + */ + on(event: 'error', listener: (error: Error) => void): this; + + /** + * Exposes the native Node `fs.FSWatcher events` + */ + on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this; + + /** + * Fires when the initial scan is complete + */ + on(event: 'ready', listener: () => void): this; + + on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this; + + on(event: string, listener: (...args: any[]) => void): this; + + ref(): this; + + unref(): this; +} + +export interface WatchOptions { + /** + * Indicates whether the process should continue to run as long as files are being watched. If + * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, + * even if the process continues to run. + */ + persistent?: boolean; + + /** + * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to + * be ignored. The whole relative or absolute path is tested, not just filename. If a function + * with two arguments is provided, it gets called twice per path - once with a single argument + * (the path), second time with two arguments (the path and the + * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). + */ + ignored?: Matcher; + + /** + * If set to `false` then `add`/`addDir` events are also emitted for matching paths while + * instantiating the watching as chokidar discovers these file paths (before the `ready` event). + */ + ignoreInitial?: boolean; + + /** + * When `false`, only the symlinks themselves will be watched for changes instead of following + * the link references and bubbling events through the link's path. + */ + followSymlinks?: boolean; + + /** + * The base directory from which watch `paths` are to be derived. Paths emitted with events will + * be relative to this. + */ + cwd?: string; + + /** + * If set to true then the strings passed to .watch() and .add() are treated as literal path + * names, even if they look like globs. Default: false. + */ + disableGlobbing?: boolean; + + /** + * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU + * utilization, consider setting this to `false`. It is typically necessary to **set this to + * `true` to successfully watch files over a network**, and it may be necessary to successfully + * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides + * the `useFsEvents` default. + */ + usePolling?: boolean; + + /** + * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly + * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on + * OS X, `usePolling: true` becomes the default. + */ + useFsEvents?: boolean; + + /** + * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that + * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is + * provided even in cases where it wasn't already available from the underlying watch events. + */ + alwaysStat?: boolean; + + /** + * If set, limits how many levels of subdirectories will be traversed. + */ + depth?: number; + + /** + * Interval of file system polling. + */ + interval?: number; + + /** + * Interval of file system polling for binary files. ([see list of binary extensions](https://gi + * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) + */ + binaryInterval?: number; + + /** + * Indicates whether to watch files that don't have read permissions if possible. If watching + * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed + * silently. + */ + ignorePermissionErrors?: boolean; + + /** + * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts + * that occur when using editors that use "atomic writes" instead of writing directly to the + * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` + * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, + * you can override it by setting `atomic` to a custom value, in milliseconds. + */ + atomic?: boolean | number; + + /** + * can be set to an object in order to adjust timing params: + */ + awaitWriteFinish?: AwaitWriteFinishOptions | boolean; +} + +export interface AwaitWriteFinishOptions { + /** + * Amount of time in milliseconds for a file size to remain constant before emitting its event. + */ + stabilityThreshold?: number; + + /** + * File size polling interval. + */ + pollInterval?: number; +} + +/** + * produces an instance of `FSWatcher`. + */ +export function watch( + paths: string | ReadonlyArray, + options?: WatchOptions +): FSWatcher; diff --git a/user-service/node_modules/chownr/LICENSE b/user-service/node_modules/chownr/LICENSE new file mode 100644 index 0000000000..19129e315f --- /dev/null +++ b/user-service/node_modules/chownr/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/user-service/node_modules/chownr/README.md b/user-service/node_modules/chownr/README.md new file mode 100644 index 0000000000..70e9a54a32 --- /dev/null +++ b/user-service/node_modules/chownr/README.md @@ -0,0 +1,3 @@ +Like `chown -R`. + +Takes the same arguments as `fs.chown()` diff --git a/user-service/node_modules/chownr/chownr.js b/user-service/node_modules/chownr/chownr.js new file mode 100644 index 0000000000..0d40932169 --- /dev/null +++ b/user-service/node_modules/chownr/chownr.js @@ -0,0 +1,167 @@ +'use strict' +const fs = require('fs') +const path = require('path') + +/* istanbul ignore next */ +const LCHOWN = fs.lchown ? 'lchown' : 'chown' +/* istanbul ignore next */ +const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' + +/* istanbul ignore next */ +const needEISDIRHandled = fs.lchown && + !process.version.match(/v1[1-9]+\./) && + !process.version.match(/v10\.[6-9]/) + +const lchownSync = (path, uid, gid) => { + try { + return fs[LCHOWNSYNC](path, uid, gid) + } catch (er) { + if (er.code !== 'ENOENT') + throw er + } +} + +/* istanbul ignore next */ +const chownSync = (path, uid, gid) => { + try { + return fs.chownSync(path, uid, gid) + } catch (er) { + if (er.code !== 'ENOENT') + throw er + } +} + +/* istanbul ignore next */ +const handleEISDIR = + needEISDIRHandled ? (path, uid, gid, cb) => er => { + // Node prior to v10 had a very questionable implementation of + // fs.lchown, which would always try to call fs.open on a directory + // Fall back to fs.chown in those cases. + if (!er || er.code !== 'EISDIR') + cb(er) + else + fs.chown(path, uid, gid, cb) + } + : (_, __, ___, cb) => cb + +/* istanbul ignore next */ +const handleEISDirSync = + needEISDIRHandled ? (path, uid, gid) => { + try { + return lchownSync(path, uid, gid) + } catch (er) { + if (er.code !== 'EISDIR') + throw er + chownSync(path, uid, gid) + } + } + : (path, uid, gid) => lchownSync(path, uid, gid) + +// fs.readdir could only accept an options object as of node v6 +const nodeVersion = process.version +let readdir = (path, options, cb) => fs.readdir(path, options, cb) +let readdirSync = (path, options) => fs.readdirSync(path, options) +/* istanbul ignore next */ +if (/^v4\./.test(nodeVersion)) + readdir = (path, options, cb) => fs.readdir(path, cb) + +const chown = (cpath, uid, gid, cb) => { + fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er.code !== 'ENOENT' ? er : null) + })) +} + +const chownrKid = (p, child, uid, gid, cb) => { + if (typeof child === 'string') + return fs.lstat(path.resolve(p, child), (er, stats) => { + // Skip ENOENT error + if (er) + return cb(er.code !== 'ENOENT' ? er : null) + stats.name = child + chownrKid(p, stats, uid, gid, cb) + }) + + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, er => { + if (er) + return cb(er) + const cpath = path.resolve(p, child.name) + chown(cpath, uid, gid, cb) + }) + } else { + const cpath = path.resolve(p, child.name) + chown(cpath, uid, gid, cb) + } +} + + +const chownr = (p, uid, gid, cb) => { + readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb() + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er) + } + if (er || !children.length) + return chown(p, uid, gid, cb) + + let len = children.length + let errState = null + const then = er => { + if (errState) + return + if (er) + return cb(errState = er) + if (-- len === 0) + return chown(p, uid, gid, cb) + } + + children.forEach(child => chownrKid(p, child, uid, gid, then)) + }) +} + +const chownrKidSync = (p, child, uid, gid) => { + if (typeof child === 'string') { + try { + const stats = fs.lstatSync(path.resolve(p, child)) + stats.name = child + child = stats + } catch (er) { + if (er.code === 'ENOENT') + return + else + throw er + } + } + + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid) + + handleEISDirSync(path.resolve(p, child.name), uid, gid) +} + +const chownrSync = (p, uid, gid) => { + let children + try { + children = readdirSync(p, { withFileTypes: true }) + } catch (er) { + if (er.code === 'ENOENT') + return + else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP') + return handleEISDirSync(p, uid, gid) + else + throw er + } + + if (children && children.length) + children.forEach(child => chownrKidSync(p, child, uid, gid)) + + return handleEISDirSync(p, uid, gid) +} + +module.exports = chownr +chownr.sync = chownrSync diff --git a/user-service/node_modules/chownr/package.json b/user-service/node_modules/chownr/package.json new file mode 100644 index 0000000000..5b0214ca12 --- /dev/null +++ b/user-service/node_modules/chownr/package.json @@ -0,0 +1,32 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "chownr", + "description": "like `chown -R`", + "version": "2.0.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/chownr.git" + }, + "main": "chownr.js", + "files": [ + "chownr.js" + ], + "devDependencies": { + "mkdirp": "0.3", + "rimraf": "^2.7.1", + "tap": "^14.10.6" + }, + "tap": { + "check-coverage": true + }, + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags" + }, + "license": "ISC", + "engines": { + "node": ">=10" + } +} diff --git a/user-service/node_modules/color-support/LICENSE b/user-service/node_modules/color-support/LICENSE new file mode 100644 index 0000000000..19129e315f --- /dev/null +++ b/user-service/node_modules/color-support/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/user-service/node_modules/color-support/README.md b/user-service/node_modules/color-support/README.md new file mode 100644 index 0000000000..f89aa17d35 --- /dev/null +++ b/user-service/node_modules/color-support/README.md @@ -0,0 +1,129 @@ +# color-support + +A module which will endeavor to guess your terminal's level of color +support. + +[![Build Status](https://travis-ci.org/isaacs/color-support.svg?branch=master)](https://travis-ci.org/isaacs/color-support) [![Coverage Status](https://coveralls.io/repos/github/isaacs/color-support/badge.svg?branch=master)](https://coveralls.io/github/isaacs/color-support?branch=master) + +This is similar to `supports-color`, but it does not read +`process.argv`. + +1. If not in a node environment, not supported. + +2. If stdout is not a TTY, not supported, unless the `ignoreTTY` + option is set. + +3. If the `TERM` environ is `dumb`, not supported, unless the + `ignoreDumb` option is set. + +4. If on Windows, then support 16 colors. + +5. If using Tmux, then support 256 colors. + +7. Handle continuous-integration servers. If `CI` or + `TEAMCITY_VERSION` are set in the environment, and `TRAVIS` is not + set, then color is not supported, unless `ignoreCI` option is set. + +6. Guess based on the `TERM_PROGRAM` environ. These terminals support + 16m colors: + + - `iTerm.app` version 3.x supports 16m colors, below support 256 + - `MacTerm` supports 16m colors + - `Apple_Terminal` supports 256 colors + - Have more things that belong on this list? Send a PR! + +8. Make a guess based on the `TERM` environment variable. Any + `xterm-256color` will get 256 colors. Any screen, xterm, vt100, + color, ansi, cygwin, or linux `TERM` will get 16 colors. + +9. If `COLORTERM` environment variable is set, then support 16 colors. + +10. At this point, we assume that color is not supported. + +## USAGE + +```javascript +var testColorSupport = require('color-support') +var colorSupport = testColorSupport(/* options object */) + +if (!colorSupport) { + console.log('color is not supported') +} else if (colorSupport.has16m) { + console.log('\x1b[38;2;102;194;255m16m colors\x1b[0m') +} else if (colorSupport.has256) { + console.log('\x1b[38;5;119m256 colors\x1b[0m') +} else if (colorSupport.hasBasic) { + console.log('\x1b[31mbasic colors\x1b[0m') +} else { + console.log('this is impossible, but colors are not supported') +} +``` + +If you don't have any options to set, you can also just look at the +flags which will all be set on the test function itself. (Of course, +this doesn't return a falsey value when colors aren't supported, and +doesn't allow you to set options.) + +```javascript +var colorSupport = require('color-support') + +if (colorSupport.has16m) { + console.log('\x1b[38;2;102;194;255m16m colors\x1b[0m') +} else if (colorSupport.has256) { + console.log('\x1b[38;5;119m256 colors\x1b[0m') +} else if (colorSupport.hasBasic) { + console.log('\x1b[31mbasic colors\x1b[0m') +} else { + console.log('colors are not supported') +} +``` + +## Options + +You can pass in the following options. + +* ignoreTTY - default false. Ignore the `isTTY` check. +* ignoreDumb - default false. Ignore `TERM=dumb` environ check. +* ignoreCI - default false. Ignore `CI` environ check. +* env - Object for environment vars. Defaults to `process.env`. +* stream - Stream for `isTTY` check. Defaults to `process.stdout`. +* term - String for `TERM` checking. Defaults to `env.TERM`. +* alwaysReturn - default false. Return an object when colors aren't + supported (instead of returning `false`). +* level - A number from 0 to 3. This will return a result for the + specified level. This is useful if you want to be able to set the + color support level explicitly as a number in an environment + variable or config, but then use the object flags in your program. + Except for `alwaysReturn` to return an object for level 0, all other + options are ignored, since no checking is done if a level is + explicitly set. + +## Return Value + +If no color support is available, then `false` is returned by default, +unless the `alwaysReturn` flag is set to `true`. This is so that the +simple question of "can I use colors or not" can treat any truthy +return as "yes". + +Otherwise, the return object has the following fields: + +* `level` - A number from 0 to 3 + * `0` - No color support + * `1` - Basic (16) color support + * `2` - 256 color support + * `3` - 16 million (true) color support +* `hasBasic` - Boolean +* `has256` - Boolean +* `has16m` - Boolean + +## CLI + +You can run the `color-support` bin from the command line which will +just dump the values as this module calculates them in whatever env +it's run. It takes no command line arguments. + +## Credits + +This is a spiritual, if not actual, fork of +[supports-color](http://npm.im/supports-color) by the ever prolific +[Sindre Sorhus](http://npm.im/~sindresorhus). diff --git a/user-service/node_modules/color-support/bin.js b/user-service/node_modules/color-support/bin.js new file mode 100755 index 0000000000..3c0a967218 --- /dev/null +++ b/user-service/node_modules/color-support/bin.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +var colorSupport = require('./')({alwaysReturn: true }) +console.log(JSON.stringify(colorSupport, null, 2)) diff --git a/user-service/node_modules/color-support/browser.js b/user-service/node_modules/color-support/browser.js new file mode 100644 index 0000000000..ab5c6631a3 --- /dev/null +++ b/user-service/node_modules/color-support/browser.js @@ -0,0 +1,14 @@ +module.exports = colorSupport({ alwaysReturn: true }, colorSupport) + +function colorSupport(options, obj) { + obj = obj || {} + options = options || {} + obj.level = 0 + obj.hasBasic = false + obj.has256 = false + obj.has16m = false + if (!options.alwaysReturn) { + return false + } + return obj +} diff --git a/user-service/node_modules/color-support/index.js b/user-service/node_modules/color-support/index.js new file mode 100644 index 0000000000..6b6f3b2819 --- /dev/null +++ b/user-service/node_modules/color-support/index.js @@ -0,0 +1,134 @@ +// call it on itself so we can test the export val for basic stuff +module.exports = colorSupport({ alwaysReturn: true }, colorSupport) + +function hasNone (obj, options) { + obj.level = 0 + obj.hasBasic = false + obj.has256 = false + obj.has16m = false + if (!options.alwaysReturn) { + return false + } + return obj +} + +function hasBasic (obj) { + obj.hasBasic = true + obj.has256 = false + obj.has16m = false + obj.level = 1 + return obj +} + +function has256 (obj) { + obj.hasBasic = true + obj.has256 = true + obj.has16m = false + obj.level = 2 + return obj +} + +function has16m (obj) { + obj.hasBasic = true + obj.has256 = true + obj.has16m = true + obj.level = 3 + return obj +} + +function colorSupport (options, obj) { + options = options || {} + + obj = obj || {} + + // if just requesting a specific level, then return that. + if (typeof options.level === 'number') { + switch (options.level) { + case 0: + return hasNone(obj, options) + case 1: + return hasBasic(obj) + case 2: + return has256(obj) + case 3: + return has16m(obj) + } + } + + obj.level = 0 + obj.hasBasic = false + obj.has256 = false + obj.has16m = false + + if (typeof process === 'undefined' || + !process || + !process.stdout || + !process.env || + !process.platform) { + return hasNone(obj, options) + } + + var env = options.env || process.env + var stream = options.stream || process.stdout + var term = options.term || env.TERM || '' + var platform = options.platform || process.platform + + if (!options.ignoreTTY && !stream.isTTY) { + return hasNone(obj, options) + } + + if (!options.ignoreDumb && term === 'dumb' && !env.COLORTERM) { + return hasNone(obj, options) + } + + if (platform === 'win32') { + return hasBasic(obj) + } + + if (env.TMUX) { + return has256(obj) + } + + if (!options.ignoreCI && (env.CI || env.TEAMCITY_VERSION)) { + if (env.TRAVIS) { + return has256(obj) + } else { + return hasNone(obj, options) + } + } + + // TODO: add more term programs + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + var ver = env.TERM_PROGRAM_VERSION || '0.' + if (/^[0-2]\./.test(ver)) { + return has256(obj) + } else { + return has16m(obj) + } + + case 'HyperTerm': + case 'Hyper': + return has16m(obj) + + case 'MacTerm': + return has16m(obj) + + case 'Apple_Terminal': + return has256(obj) + } + + if (/^xterm-256/.test(term)) { + return has256(obj) + } + + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(term)) { + return hasBasic(obj) + } + + if (env.COLORTERM) { + return hasBasic(obj) + } + + return hasNone(obj, options) +} diff --git a/user-service/node_modules/color-support/package.json b/user-service/node_modules/color-support/package.json new file mode 100644 index 0000000000..f3e3b77145 --- /dev/null +++ b/user-service/node_modules/color-support/package.json @@ -0,0 +1,36 @@ +{ + "name": "color-support", + "version": "1.1.3", + "description": "A module which will endeavor to guess your terminal's level of color support.", + "main": "index.js", + "browser": "browser.js", + "bin": "bin.js", + "devDependencies": { + "tap": "^10.3.3" + }, + "scripts": { + "test": "tap test/*.js --100 -J", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/color-support.git" + }, + "keywords": [ + "terminal", + "color", + "support", + "xterm", + "truecolor", + "256" + ], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "files": [ + "browser.js", + "index.js", + "bin.js" + ] +} diff --git a/user-service/node_modules/concat-map/.travis.yml b/user-service/node_modules/concat-map/.travis.yml new file mode 100644 index 0000000000..f1d0f13c8a --- /dev/null +++ b/user-service/node_modules/concat-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/user-service/node_modules/concat-map/LICENSE b/user-service/node_modules/concat-map/LICENSE new file mode 100644 index 0000000000..ee27ba4b44 --- /dev/null +++ b/user-service/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/concat-map/README.markdown b/user-service/node_modules/concat-map/README.markdown new file mode 100644 index 0000000000..408f70a1be --- /dev/null +++ b/user-service/node_modules/concat-map/README.markdown @@ -0,0 +1,62 @@ +concat-map +========== + +Concatenative mapdashery. + +[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) + +[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) + +example +======= + +``` js +var concatMap = require('concat-map'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); +``` + +*** + +``` +[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] +``` + +methods +======= + +``` js +var concatMap = require('concat-map') +``` + +concatMap(xs, fn) +----------------- + +Return an array of concatenated elements by calling `fn(x, i)` for each element +`x` and each index `i` in the array `xs`. + +When `fn(x, i)` returns an array, its result will be concatenated with the +result array. If `fn(x, i)` returns anything else, that value will be pushed +onto the end of the result array. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install concat-map +``` + +license +======= + +MIT + +notes +===== + +This module was written while sitting high above the ground in a tree. diff --git a/user-service/node_modules/concat-map/example/map.js b/user-service/node_modules/concat-map/example/map.js new file mode 100644 index 0000000000..33656217b6 --- /dev/null +++ b/user-service/node_modules/concat-map/example/map.js @@ -0,0 +1,6 @@ +var concatMap = require('../'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); diff --git a/user-service/node_modules/concat-map/index.js b/user-service/node_modules/concat-map/index.js new file mode 100644 index 0000000000..b29a7812e5 --- /dev/null +++ b/user-service/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/user-service/node_modules/concat-map/package.json b/user-service/node_modules/concat-map/package.json new file mode 100644 index 0000000000..d3640e6b02 --- /dev/null +++ b/user-service/node_modules/concat-map/package.json @@ -0,0 +1,43 @@ +{ + "name" : "concat-map", + "description" : "concatenative mapdashery", + "version" : "0.0.1", + "repository" : { + "type" : "git", + "url" : "git://github.com/substack/node-concat-map.git" + }, + "main" : "index.js", + "keywords" : [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "directories" : { + "example" : "example", + "test" : "test" + }, + "scripts" : { + "test" : "tape test/*.js" + }, + "devDependencies" : { + "tape" : "~2.4.0" + }, + "license" : "MIT", + "author" : { + "name" : "James Halliday", + "email" : "mail@substack.net", + "url" : "http://substack.net" + }, + "testling" : { + "files" : "test/*.js", + "browsers" : { + "ie" : [ 6, 7, 8, 9 ], + "ff" : [ 3.5, 10, 15.0 ], + "chrome" : [ 10, 22 ], + "safari" : [ 5.1 ], + "opera" : [ 12 ] + } + } +} diff --git a/user-service/node_modules/concat-map/test/map.js b/user-service/node_modules/concat-map/test/map.js new file mode 100644 index 0000000000..fdbd7022f6 --- /dev/null +++ b/user-service/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/user-service/node_modules/console-control-strings/LICENSE b/user-service/node_modules/console-control-strings/LICENSE new file mode 100644 index 0000000000..e756052969 --- /dev/null +++ b/user-service/node_modules/console-control-strings/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2014, Rebecca Turner + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/user-service/node_modules/console-control-strings/README.md b/user-service/node_modules/console-control-strings/README.md new file mode 100644 index 0000000000..f58cc8d892 --- /dev/null +++ b/user-service/node_modules/console-control-strings/README.md @@ -0,0 +1,145 @@ +# Console Control Strings + +A library of cross-platform tested terminal/console command strings for +doing things like color and cursor positioning. This is a subset of both +ansi and vt100. All control codes included work on both Windows & Unix-like +OSes, except where noted. + +## Usage + +```js +var consoleControl = require('console-control-strings') + +console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset')) +process.stdout.write(consoleControl.goto(75, 10)) +``` + +## Why Another? + +There are tons of libraries similar to this one. I wanted one that was: + +1. Very clear about compatibility goals. +2. Could emit, for instance, a start color code without an end one. +3. Returned strings w/o writing to streams. +4. Was not weighed down with other unrelated baggage. + +## Functions + +### var code = consoleControl.up(_num = 1_) + +Returns the escape sequence to move _num_ lines up. + +### var code = consoleControl.down(_num = 1_) + +Returns the escape sequence to move _num_ lines down. + +### var code = consoleControl.forward(_num = 1_) + +Returns the escape sequence to move _num_ lines righ. + +### var code = consoleControl.back(_num = 1_) + +Returns the escape sequence to move _num_ lines left. + +### var code = consoleControl.nextLine(_num = 1_) + +Returns the escape sequence to move _num_ lines down and to the beginning of +the line. + +### var code = consoleControl.previousLine(_num = 1_) + +Returns the escape sequence to move _num_ lines up and to the beginning of +the line. + +### var code = consoleControl.eraseData() + +Returns the escape sequence to erase everything from the current cursor +position to the bottom right of the screen. This is line based, so it +erases the remainder of the current line and all following lines. + +### var code = consoleControl.eraseLine() + +Returns the escape sequence to erase to the end of the current line. + +### var code = consoleControl.goto(_x_, _y_) + +Returns the escape sequence to move the cursor to the designated position. +Note that the origin is _1, 1_ not _0, 0_. + +### var code = consoleControl.gotoSOL() + +Returns the escape sequence to move the cursor to the beginning of the +current line. (That is, it returns a carriage return, `\r`.) + +### var code = consoleControl.beep() + +Returns the escape sequence to cause the termianl to beep. (That is, it +returns unicode character `\x0007`, a Control-G.) + +### var code = consoleControl.hideCursor() + +Returns the escape sequence to hide the cursor. + +### var code = consoleControl.showCursor() + +Returns the escape sequence to show the cursor. + +### var code = consoleControl.color(_colors = []_) + +### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_) + +Returns the escape sequence to set the current terminal display attributes +(mostly colors). Arguments can either be a list of attributes or an array +of attributes. The difference between passing in an array or list of colors +and calling `.color` separately for each one, is that in the former case a +single escape sequence will be produced where as in the latter each change +will have its own distinct escape sequence. Each attribute can be one of: + +* Reset: + * **reset** – Reset all attributes to the terminal default. +* Styles: + * **bold** – Display text as bold. In some terminals this means using a + bold font, in others this means changing the color. In some it means + both. + * **italic** – Display text as italic. This is not available in most Windows terminals. + * **underline** – Underline text. This is not available in most Windows Terminals. + * **inverse** – Invert the foreground and background colors. + * **stopBold** – Do not display text as bold. + * **stopItalic** – Do not display text as italic. + * **stopUnderline** – Do not underline text. + * **stopInverse** – Do not invert foreground and background. +* Colors: + * **white** + * **black** + * **blue** + * **cyan** + * **green** + * **magenta** + * **red** + * **yellow** + * **grey** / **brightBlack** + * **brightRed** + * **brightGreen** + * **brightYellow** + * **brightBlue** + * **brightMagenta** + * **brightCyan** + * **brightWhite** +* Background Colors: + * **bgWhite** + * **bgBlack** + * **bgBlue** + * **bgCyan** + * **bgGreen** + * **bgMagenta** + * **bgRed** + * **bgYellow** + * **bgGrey** / **bgBrightBlack** + * **bgBrightRed** + * **bgBrightGreen** + * **bgBrightYellow** + * **bgBrightBlue** + * **bgBrightMagenta** + * **bgBrightCyan** + * **bgBrightWhite** + diff --git a/user-service/node_modules/console-control-strings/index.js b/user-service/node_modules/console-control-strings/index.js new file mode 100644 index 0000000000..bf890348ec --- /dev/null +++ b/user-service/node_modules/console-control-strings/index.js @@ -0,0 +1,125 @@ +'use strict' + +// These tables borrowed from `ansi` + +var prefix = '\x1b[' + +exports.up = function up (num) { + return prefix + (num || '') + 'A' +} + +exports.down = function down (num) { + return prefix + (num || '') + 'B' +} + +exports.forward = function forward (num) { + return prefix + (num || '') + 'C' +} + +exports.back = function back (num) { + return prefix + (num || '') + 'D' +} + +exports.nextLine = function nextLine (num) { + return prefix + (num || '') + 'E' +} + +exports.previousLine = function previousLine (num) { + return prefix + (num || '') + 'F' +} + +exports.horizontalAbsolute = function horizontalAbsolute (num) { + if (num == null) throw new Error('horizontalAboslute requires a column to position to') + return prefix + num + 'G' +} + +exports.eraseData = function eraseData () { + return prefix + 'J' +} + +exports.eraseLine = function eraseLine () { + return prefix + 'K' +} + +exports.goto = function (x, y) { + return prefix + y + ';' + x + 'H' +} + +exports.gotoSOL = function () { + return '\r' +} + +exports.beep = function () { + return '\x07' +} + +exports.hideCursor = function hideCursor () { + return prefix + '?25l' +} + +exports.showCursor = function showCursor () { + return prefix + '?25h' +} + +var colors = { + reset: 0, +// styles + bold: 1, + italic: 3, + underline: 4, + inverse: 7, +// resets + stopBold: 22, + stopItalic: 23, + stopUnderline: 24, + stopInverse: 27, +// colors + white: 37, + black: 30, + blue: 34, + cyan: 36, + green: 32, + magenta: 35, + red: 31, + yellow: 33, + bgWhite: 47, + bgBlack: 40, + bgBlue: 44, + bgCyan: 46, + bgGreen: 42, + bgMagenta: 45, + bgRed: 41, + bgYellow: 43, + + grey: 90, + brightBlack: 90, + brightRed: 91, + brightGreen: 92, + brightYellow: 93, + brightBlue: 94, + brightMagenta: 95, + brightCyan: 96, + brightWhite: 97, + + bgGrey: 100, + bgBrightBlack: 100, + bgBrightRed: 101, + bgBrightGreen: 102, + bgBrightYellow: 103, + bgBrightBlue: 104, + bgBrightMagenta: 105, + bgBrightCyan: 106, + bgBrightWhite: 107 +} + +exports.color = function color (colorWith) { + if (arguments.length !== 1 || !Array.isArray(colorWith)) { + colorWith = Array.prototype.slice.call(arguments) + } + return prefix + colorWith.map(colorNameToCode).join(';') + 'm' +} + +function colorNameToCode (color) { + if (colors[color] != null) return colors[color] + throw new Error('Unknown color or style name: ' + color) +} diff --git a/user-service/node_modules/console-control-strings/package.json b/user-service/node_modules/console-control-strings/package.json new file mode 100644 index 0000000000..eb6c62ae2d --- /dev/null +++ b/user-service/node_modules/console-control-strings/package.json @@ -0,0 +1,27 @@ +{ + "name": "console-control-strings", + "version": "1.1.0", + "description": "A library of cross-platform tested terminal/console command strings for doing things like color and cursor positioning. This is a subset of both ansi and vt100. All control codes included work on both Windows & Unix-like OSes, except where noted.", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "standard && tap test/*.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/iarna/console-control-strings" + }, + "keywords": [], + "author": "Rebecca Turner (http://re-becca.org/)", + "license": "ISC", + "files": [ + "LICENSE", + "index.js" + ], + "devDependencies": { + "standard": "^7.1.2", + "tap": "^5.7.2" + } +} diff --git a/user-service/node_modules/content-disposition/HISTORY.md b/user-service/node_modules/content-disposition/HISTORY.md new file mode 100644 index 0000000000..488effa0c9 --- /dev/null +++ b/user-service/node_modules/content-disposition/HISTORY.md @@ -0,0 +1,60 @@ +0.5.4 / 2021-12-10 +================== + + * deps: safe-buffer@5.2.1 + +0.5.3 / 2018-12-17 +================== + + * Use `safe-buffer` for improved Buffer API + +0.5.2 / 2016-12-08 +================== + + * Fix `parse` to accept any linear whitespace character + +0.5.1 / 2016-01-17 +================== + + * perf: enable strict mode + +0.5.0 / 2014-10-11 +================== + + * Add `parse` function + +0.4.0 / 2014-09-21 +================== + + * Expand non-Unicode `filename` to the full ISO-8859-1 charset + +0.3.0 / 2014-09-20 +================== + + * Add `fallback` option + * Add `type` option + +0.2.0 / 2014-09-19 +================== + + * Reduce ambiguity of file names with hex escape in buggy browsers + +0.1.2 / 2014-09-19 +================== + + * Fix periodic invalid Unicode filename header + +0.1.1 / 2014-09-19 +================== + + * Fix invalid characters appearing in `filename*` parameter + +0.1.0 / 2014-09-18 +================== + + * Make the `filename` argument optional + +0.0.0 / 2014-09-18 +================== + + * Initial release diff --git a/user-service/node_modules/content-disposition/LICENSE b/user-service/node_modules/content-disposition/LICENSE new file mode 100644 index 0000000000..84441fbb57 --- /dev/null +++ b/user-service/node_modules/content-disposition/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/content-disposition/README.md b/user-service/node_modules/content-disposition/README.md new file mode 100644 index 0000000000..3a0bb05594 --- /dev/null +++ b/user-service/node_modules/content-disposition/README.md @@ -0,0 +1,142 @@ +# content-disposition + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Create and parse HTTP `Content-Disposition` header + +## Installation + +```sh +$ npm install content-disposition +``` + +## API + +```js +var contentDisposition = require('content-disposition') +``` + +### contentDisposition(filename, options) + +Create an attachment `Content-Disposition` header value using the given file name, +if supplied. The `filename` is optional and if no file name is desired, but you +want to specify `options`, set `filename` to `undefined`. + +```js +res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf')) +``` + +**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this +header through a means different from `setHeader` in Node.js, you'll want to specify +the `'binary'` encoding in Node.js. + +#### Options + +`contentDisposition` accepts these properties in the options object. + +##### fallback + +If the `filename` option is outside ISO-8859-1, then the file name is actually +stored in a supplemental field for clients that support Unicode file names and +a ISO-8859-1 version of the file name is automatically generated. + +This specifies the ISO-8859-1 file name to override the automatic generation or +disables the generation all together, defaults to `true`. + + - A string will specify the ISO-8859-1 file name to use in place of automatic + generation. + - `false` will disable including a ISO-8859-1 file name and only include the + Unicode version (unless the file name is already ISO-8859-1). + - `true` will enable automatic generation if the file name is outside ISO-8859-1. + +If the `filename` option is ISO-8859-1 and this option is specified and has a +different value, then the `filename` option is encoded in the extended field +and this set as the fallback field, even though they are both ISO-8859-1. + +##### type + +Specifies the disposition type, defaults to `"attachment"`. This can also be +`"inline"`, or any other value (all values except inline are treated like +`attachment`, but can convey additional information if both parties agree to +it). The type is normalized to lower-case. + +### contentDisposition.parse(string) + +```js +var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt') +``` + +Parse a `Content-Disposition` header string. This automatically handles extended +("Unicode") parameters by decoding them and providing them under the standard +parameter name. This will return an object with the following properties (examples +are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`): + + - `type`: The disposition type (always lower case). Example: `'attachment'` + + - `parameters`: An object of the parameters in the disposition (name of parameter + always lower case and extended versions replace non-extended versions). Example: + `{filename: "€ rates.txt"}` + +## Examples + +### Send a file for download + +```js +var contentDisposition = require('content-disposition') +var destroy = require('destroy') +var fs = require('fs') +var http = require('http') +var onFinished = require('on-finished') + +var filePath = '/path/to/public/plans.pdf' + +http.createServer(function onRequest (req, res) { + // set headers + res.setHeader('Content-Type', 'application/pdf') + res.setHeader('Content-Disposition', contentDisposition(filePath)) + + // send file + var stream = fs.createReadStream(filePath) + stream.pipe(res) + onFinished(res, function () { + destroy(stream) + }) +}) +``` + +## Testing + +```sh +$ npm test +``` + +## References + +- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616] +- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987] +- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266] +- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231] + +[rfc-2616]: https://tools.ietf.org/html/rfc2616 +[rfc-5987]: https://tools.ietf.org/html/rfc5987 +[rfc-6266]: https://tools.ietf.org/html/rfc6266 +[tc-2231]: http://greenbytes.de/tech/tc2231/ + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/content-disposition.svg +[npm-url]: https://npmjs.org/package/content-disposition +[node-version-image]: https://img.shields.io/node/v/content-disposition.svg +[node-version-url]: https://nodejs.org/en/download +[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg +[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master +[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg +[downloads-url]: https://npmjs.org/package/content-disposition +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/content-disposition/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/content-disposition?query=workflow%3Aci diff --git a/user-service/node_modules/content-disposition/index.js b/user-service/node_modules/content-disposition/index.js new file mode 100644 index 0000000000..ecec899a99 --- /dev/null +++ b/user-service/node_modules/content-disposition/index.js @@ -0,0 +1,458 @@ +/*! + * content-disposition + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = contentDisposition +module.exports.parse = parse + +/** + * Module dependencies. + * @private + */ + +var basename = require('path').basename +var Buffer = require('safe-buffer').Buffer + +/** + * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") + * @private + */ + +var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex + +/** + * RegExp to match percent encoding escape. + * @private + */ + +var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/ +var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g + +/** + * RegExp to match non-latin1 characters. + * @private + */ + +var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g + +/** + * RegExp to match quoted-pair in RFC 2616 + * + * quoted-pair = "\" CHAR + * CHAR = + * @private + */ + +var QESC_REGEXP = /\\([\u0000-\u007f])/g // eslint-disable-line no-control-regex + +/** + * RegExp to match chars that must be quoted-pair in RFC 2616 + * @private + */ + +var QUOTE_REGEXP = /([\\"])/g + +/** + * RegExp for various RFC 2616 grammar + * + * parameter = token "=" ( token | quoted-string ) + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) + * qdtext = > + * quoted-pair = "\" CHAR + * CHAR = + * TEXT = + * LWS = [CRLF] 1*( SP | HT ) + * CRLF = CR LF + * CR = + * LF = + * SP = + * HT = + * CTL = + * OCTET = + * @private + */ + +var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex +var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/ +var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/ + +/** + * RegExp for various RFC 5987 grammar + * + * ext-value = charset "'" [ language ] "'" value-chars + * charset = "UTF-8" / "ISO-8859-1" / mime-charset + * mime-charset = 1*mime-charsetc + * mime-charsetc = ALPHA / DIGIT + * / "!" / "#" / "$" / "%" / "&" + * / "+" / "-" / "^" / "_" / "`" + * / "{" / "}" / "~" + * language = ( 2*3ALPHA [ extlang ] ) + * / 4ALPHA + * / 5*8ALPHA + * extlang = *3( "-" 3ALPHA ) + * value-chars = *( pct-encoded / attr-char ) + * pct-encoded = "%" HEXDIG HEXDIG + * attr-char = ALPHA / DIGIT + * / "!" / "#" / "$" / "&" / "+" / "-" / "." + * / "^" / "_" / "`" / "|" / "~" + * @private + */ + +var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/ + +/** + * RegExp for various RFC 6266 grammar + * + * disposition-type = "inline" | "attachment" | disp-ext-type + * disp-ext-type = token + * disposition-parm = filename-parm | disp-ext-parm + * filename-parm = "filename" "=" value + * | "filename*" "=" ext-value + * disp-ext-parm = token "=" value + * | ext-token "=" ext-value + * ext-token = + * @private + */ + +var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex + +/** + * Create an attachment Content-Disposition header. + * + * @param {string} [filename] + * @param {object} [options] + * @param {string} [options.type=attachment] + * @param {string|boolean} [options.fallback=true] + * @return {string} + * @public + */ + +function contentDisposition (filename, options) { + var opts = options || {} + + // get type + var type = opts.type || 'attachment' + + // get parameters + var params = createparams(filename, opts.fallback) + + // format into string + return format(new ContentDisposition(type, params)) +} + +/** + * Create parameters object from filename and fallback. + * + * @param {string} [filename] + * @param {string|boolean} [fallback=true] + * @return {object} + * @private + */ + +function createparams (filename, fallback) { + if (filename === undefined) { + return + } + + var params = {} + + if (typeof filename !== 'string') { + throw new TypeError('filename must be a string') + } + + // fallback defaults to true + if (fallback === undefined) { + fallback = true + } + + if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { + throw new TypeError('fallback must be a string or boolean') + } + + if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) { + throw new TypeError('fallback must be ISO-8859-1 string') + } + + // restrict to file base name + var name = basename(filename) + + // determine if name is suitable for quoted string + var isQuotedString = TEXT_REGEXP.test(name) + + // generate fallback name + var fallbackName = typeof fallback !== 'string' + ? fallback && getlatin1(name) + : basename(fallback) + var hasFallback = typeof fallbackName === 'string' && fallbackName !== name + + // set extended filename parameter + if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) { + params['filename*'] = name + } + + // set filename parameter + if (isQuotedString || hasFallback) { + params.filename = hasFallback + ? fallbackName + : name + } + + return params +} + +/** + * Format object to Content-Disposition header. + * + * @param {object} obj + * @param {string} obj.type + * @param {object} [obj.parameters] + * @return {string} + * @private + */ + +function format (obj) { + var parameters = obj.parameters + var type = obj.type + + if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) { + throw new TypeError('invalid type') + } + + // start with normalized type + var string = String(type).toLowerCase() + + // append parameters + if (parameters && typeof parameters === 'object') { + var param + var params = Object.keys(parameters).sort() + + for (var i = 0; i < params.length; i++) { + param = params[i] + + var val = param.substr(-1) === '*' + ? ustring(parameters[param]) + : qstring(parameters[param]) + + string += '; ' + param + '=' + val + } + } + + return string +} + +/** + * Decode a RFC 5987 field value (gracefully). + * + * @param {string} str + * @return {string} + * @private + */ + +function decodefield (str) { + var match = EXT_VALUE_REGEXP.exec(str) + + if (!match) { + throw new TypeError('invalid extended field value') + } + + var charset = match[1].toLowerCase() + var encoded = match[2] + var value + + // to binary string + var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode) + + switch (charset) { + case 'iso-8859-1': + value = getlatin1(binary) + break + case 'utf-8': + value = Buffer.from(binary, 'binary').toString('utf8') + break + default: + throw new TypeError('unsupported charset in extended field') + } + + return value +} + +/** + * Get ISO-8859-1 version of string. + * + * @param {string} val + * @return {string} + * @private + */ + +function getlatin1 (val) { + // simple Unicode -> ISO-8859-1 transformation + return String(val).replace(NON_LATIN1_REGEXP, '?') +} + +/** + * Parse Content-Disposition header string. + * + * @param {string} string + * @return {object} + * @public + */ + +function parse (string) { + if (!string || typeof string !== 'string') { + throw new TypeError('argument string is required') + } + + var match = DISPOSITION_TYPE_REGEXP.exec(string) + + if (!match) { + throw new TypeError('invalid type format') + } + + // normalize type + var index = match[0].length + var type = match[1].toLowerCase() + + var key + var names = [] + var params = {} + var value + + // calculate index to start at + index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';' + ? index - 1 + : index + + // match parameters + while ((match = PARAM_REGEXP.exec(string))) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') + } + + index += match[0].length + key = match[1].toLowerCase() + value = match[2] + + if (names.indexOf(key) !== -1) { + throw new TypeError('invalid duplicate parameter') + } + + names.push(key) + + if (key.indexOf('*') + 1 === key.length) { + // decode extended value + key = key.slice(0, -1) + value = decodefield(value) + + // overwrite existing value + params[key] = value + continue + } + + if (typeof params[key] === 'string') { + continue + } + + if (value[0] === '"') { + // remove quotes and escapes + value = value + .substr(1, value.length - 2) + .replace(QESC_REGEXP, '$1') + } + + params[key] = value + } + + if (index !== -1 && index !== string.length) { + throw new TypeError('invalid parameter format') + } + + return new ContentDisposition(type, params) +} + +/** + * Percent decode a single character. + * + * @param {string} str + * @param {string} hex + * @return {string} + * @private + */ + +function pdecode (str, hex) { + return String.fromCharCode(parseInt(hex, 16)) +} + +/** + * Percent encode a single character. + * + * @param {string} char + * @return {string} + * @private + */ + +function pencode (char) { + return '%' + String(char) + .charCodeAt(0) + .toString(16) + .toUpperCase() +} + +/** + * Quote a string for HTTP. + * + * @param {string} val + * @return {string} + * @private + */ + +function qstring (val) { + var str = String(val) + + return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' +} + +/** + * Encode a Unicode string for HTTP (RFC 5987). + * + * @param {string} val + * @return {string} + * @private + */ + +function ustring (val) { + var str = String(val) + + // percent encode as UTF-8 + var encoded = encodeURIComponent(str) + .replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode) + + return 'UTF-8\'\'' + encoded +} + +/** + * Class for parsed Content-Disposition header for v8 optimization + * + * @public + * @param {string} type + * @param {object} parameters + * @constructor + */ + +function ContentDisposition (type, parameters) { + this.type = type + this.parameters = parameters +} diff --git a/user-service/node_modules/content-disposition/package.json b/user-service/node_modules/content-disposition/package.json new file mode 100644 index 0000000000..43c70ce24a --- /dev/null +++ b/user-service/node_modules/content-disposition/package.json @@ -0,0 +1,44 @@ +{ + "name": "content-disposition", + "description": "Create and parse Content-Disposition header", + "version": "0.5.4", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "content-disposition", + "http", + "rfc6266", + "res" + ], + "repository": "jshttp/content-disposition", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "7.32.0", + "eslint-config-standard": "13.0.1", + "eslint-plugin-import": "2.25.3", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "istanbul": "0.4.5", + "mocha": "9.1.3" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" + } +} diff --git a/user-service/node_modules/content-type/HISTORY.md b/user-service/node_modules/content-type/HISTORY.md new file mode 100644 index 0000000000..458367139e --- /dev/null +++ b/user-service/node_modules/content-type/HISTORY.md @@ -0,0 +1,29 @@ +1.0.5 / 2023-01-29 +================== + + * perf: skip value escaping when unnecessary + +1.0.4 / 2017-09-11 +================== + + * perf: skip parameter parsing when no parameters + +1.0.3 / 2017-09-10 +================== + + * perf: remove argument reassignment + +1.0.2 / 2016-05-09 +================== + + * perf: enable strict mode + +1.0.1 / 2015-02-13 +================== + + * Improve missing `Content-Type` header error message + +1.0.0 / 2015-02-01 +================== + + * Initial implementation, derived from `media-typer@0.3.0` diff --git a/user-service/node_modules/content-type/LICENSE b/user-service/node_modules/content-type/LICENSE new file mode 100644 index 0000000000..34b1a2de37 --- /dev/null +++ b/user-service/node_modules/content-type/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/content-type/README.md b/user-service/node_modules/content-type/README.md new file mode 100644 index 0000000000..c1a922a9af --- /dev/null +++ b/user-service/node_modules/content-type/README.md @@ -0,0 +1,94 @@ +# content-type + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Create and parse HTTP Content-Type header according to RFC 7231 + +## Installation + +```sh +$ npm install content-type +``` + +## API + +```js +var contentType = require('content-type') +``` + +### contentType.parse(string) + +```js +var obj = contentType.parse('image/svg+xml; charset=utf-8') +``` + +Parse a `Content-Type` header. This will return an object with the following +properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): + + - `type`: The media type (the type and subtype, always lower case). + Example: `'image/svg+xml'` + + - `parameters`: An object of the parameters in the media type (name of parameter + always lower case). Example: `{charset: 'utf-8'}` + +Throws a `TypeError` if the string is missing or invalid. + +### contentType.parse(req) + +```js +var obj = contentType.parse(req) +``` + +Parse the `Content-Type` header from the given `req`. Short-cut for +`contentType.parse(req.headers['content-type'])`. + +Throws a `TypeError` if the `Content-Type` header is missing or invalid. + +### contentType.parse(res) + +```js +var obj = contentType.parse(res) +``` + +Parse the `Content-Type` header set on the given `res`. Short-cut for +`contentType.parse(res.getHeader('content-type'))`. + +Throws a `TypeError` if the `Content-Type` header is missing or invalid. + +### contentType.format(obj) + +```js +var str = contentType.format({ + type: 'image/svg+xml', + parameters: { charset: 'utf-8' } +}) +``` + +Format an object into a `Content-Type` header. This will return a string of the +content type for the given object with the following properties (examples are +shown that produce the string `'image/svg+xml; charset=utf-8'`): + + - `type`: The media type (will be lower-cased). Example: `'image/svg+xml'` + + - `parameters`: An object of the parameters in the media type (name of the + parameter will be lower-cased). Example: `{charset: 'utf-8'}` + +Throws a `TypeError` if the object contains an invalid type or parameter names. + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/content-type/master?label=ci +[ci-url]: https://github.com/jshttp/content-type/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/content-type/master +[coveralls-url]: https://coveralls.io/r/jshttp/content-type?branch=master +[node-image]: https://badgen.net/npm/node/content-type +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/content-type +[npm-url]: https://npmjs.org/package/content-type +[npm-version-image]: https://badgen.net/npm/v/content-type diff --git a/user-service/node_modules/content-type/index.js b/user-service/node_modules/content-type/index.js new file mode 100644 index 0000000000..41840e7bc3 --- /dev/null +++ b/user-service/node_modules/content-type/index.js @@ -0,0 +1,225 @@ +/*! + * content-type + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 + * + * parameter = token "=" ( token / quoted-string ) + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE + * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text + * obs-text = %x80-FF + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + */ +var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex +var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex +var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ + +/** + * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 + * + * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + * obs-text = %x80-FF + */ +var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g // eslint-disable-line no-control-regex + +/** + * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 + */ +var QUOTE_REGEXP = /([\\"])/g + +/** + * RegExp to match type in RFC 7231 sec 3.1.1.1 + * + * media-type = type "/" subtype + * type = token + * subtype = token + */ +var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ + +/** + * Module exports. + * @public + */ + +exports.format = format +exports.parse = parse + +/** + * Format object to media type. + * + * @param {object} obj + * @return {string} + * @public + */ + +function format (obj) { + if (!obj || typeof obj !== 'object') { + throw new TypeError('argument obj is required') + } + + var parameters = obj.parameters + var type = obj.type + + if (!type || !TYPE_REGEXP.test(type)) { + throw new TypeError('invalid type') + } + + var string = type + + // append parameters + if (parameters && typeof parameters === 'object') { + var param + var params = Object.keys(parameters).sort() + + for (var i = 0; i < params.length; i++) { + param = params[i] + + if (!TOKEN_REGEXP.test(param)) { + throw new TypeError('invalid parameter name') + } + + string += '; ' + param + '=' + qstring(parameters[param]) + } + } + + return string +} + +/** + * Parse media type to object. + * + * @param {string|object} string + * @return {Object} + * @public + */ + +function parse (string) { + if (!string) { + throw new TypeError('argument string is required') + } + + // support req/res-like objects as argument + var header = typeof string === 'object' + ? getcontenttype(string) + : string + + if (typeof header !== 'string') { + throw new TypeError('argument string is required to be a string') + } + + var index = header.indexOf(';') + var type = index !== -1 + ? header.slice(0, index).trim() + : header.trim() + + if (!TYPE_REGEXP.test(type)) { + throw new TypeError('invalid media type') + } + + var obj = new ContentType(type.toLowerCase()) + + // parse parameters + if (index !== -1) { + var key + var match + var value + + PARAM_REGEXP.lastIndex = index + + while ((match = PARAM_REGEXP.exec(header))) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') + } + + index += match[0].length + key = match[1].toLowerCase() + value = match[2] + + if (value.charCodeAt(0) === 0x22 /* " */) { + // remove quotes + value = value.slice(1, -1) + + // remove escapes + if (value.indexOf('\\') !== -1) { + value = value.replace(QESC_REGEXP, '$1') + } + } + + obj.parameters[key] = value + } + + if (index !== header.length) { + throw new TypeError('invalid parameter format') + } + } + + return obj +} + +/** + * Get content-type from req/res objects. + * + * @param {object} + * @return {Object} + * @private + */ + +function getcontenttype (obj) { + var header + + if (typeof obj.getHeader === 'function') { + // res-like + header = obj.getHeader('content-type') + } else if (typeof obj.headers === 'object') { + // req-like + header = obj.headers && obj.headers['content-type'] + } + + if (typeof header !== 'string') { + throw new TypeError('content-type header is missing from object') + } + + return header +} + +/** + * Quote a string if necessary. + * + * @param {string} val + * @return {string} + * @private + */ + +function qstring (val) { + var str = String(val) + + // no need to quote tokens + if (TOKEN_REGEXP.test(str)) { + return str + } + + if (str.length > 0 && !TEXT_REGEXP.test(str)) { + throw new TypeError('invalid parameter value') + } + + return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' +} + +/** + * Class to represent a content type. + * @private + */ +function ContentType (type) { + this.parameters = Object.create(null) + this.type = type +} diff --git a/user-service/node_modules/content-type/package.json b/user-service/node_modules/content-type/package.json new file mode 100644 index 0000000000..9db19f63fb --- /dev/null +++ b/user-service/node_modules/content-type/package.json @@ -0,0 +1,42 @@ +{ + "name": "content-type", + "description": "Create and parse HTTP Content-Type header", + "version": "1.0.5", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "content-type", + "http", + "req", + "res", + "rfc7231" + ], + "repository": "jshttp/content-type", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "8.32.0", + "eslint-config-standard": "15.0.1", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "10.2.0", + "nyc": "15.1.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/user-service/node_modules/cookie-signature/.npmignore b/user-service/node_modules/cookie-signature/.npmignore new file mode 100644 index 0000000000..f1250e584c --- /dev/null +++ b/user-service/node_modules/cookie-signature/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/user-service/node_modules/cookie-signature/History.md b/user-service/node_modules/cookie-signature/History.md new file mode 100644 index 0000000000..78513cc3d2 --- /dev/null +++ b/user-service/node_modules/cookie-signature/History.md @@ -0,0 +1,38 @@ +1.0.6 / 2015-02-03 +================== + +* use `npm test` instead of `make test` to run tests +* clearer assertion messages when checking input + + +1.0.5 / 2014-09-05 +================== + +* add license to package.json + +1.0.4 / 2014-06-25 +================== + + * corrected avoidance of timing attacks (thanks @tenbits!) + +1.0.3 / 2014-01-28 +================== + + * [incorrect] fix for timing attacks + +1.0.2 / 2014-01-28 +================== + + * fix missing repository warning + * fix typo in test + +1.0.1 / 2013-04-15 +================== + + * Revert "Changed underlying HMAC algo. to sha512." + * Revert "Fix for timing attacks on MAC verification." + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/user-service/node_modules/cookie-signature/Readme.md b/user-service/node_modules/cookie-signature/Readme.md new file mode 100644 index 0000000000..2559e841b0 --- /dev/null +++ b/user-service/node_modules/cookie-signature/Readme.md @@ -0,0 +1,42 @@ + +# cookie-signature + + Sign and unsign cookies. + +## Example + +```js +var cookie = require('cookie-signature'); + +var val = cookie.sign('hello', 'tobiiscool'); +val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); + +var val = cookie.sign('hello', 'tobiiscool'); +cookie.unsign(val, 'tobiiscool').should.equal('hello'); +cookie.unsign(val, 'luna').should.be.false; +``` + +## License + +(The MIT License) + +Copyright (c) 2012 LearnBoost <tj@learnboost.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/user-service/node_modules/cookie-signature/index.js b/user-service/node_modules/cookie-signature/index.js new file mode 100644 index 0000000000..b8c9463a23 --- /dev/null +++ b/user-service/node_modules/cookie-signature/index.js @@ -0,0 +1,51 @@ +/** + * Module dependencies. + */ + +var crypto = require('crypto'); + +/** + * Sign the given `val` with `secret`. + * + * @param {String} val + * @param {String} secret + * @return {String} + * @api private + */ + +exports.sign = function(val, secret){ + if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); + if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); + return val + '.' + crypto + .createHmac('sha256', secret) + .update(val) + .digest('base64') + .replace(/\=+$/, ''); +}; + +/** + * Unsign and decode the given `val` with `secret`, + * returning `false` if the signature is invalid. + * + * @param {String} val + * @param {String} secret + * @return {String|Boolean} + * @api private + */ + +exports.unsign = function(val, secret){ + if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); + if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); + var str = val.slice(0, val.lastIndexOf('.')) + , mac = exports.sign(str, secret); + + return sha1(mac) == sha1(val) ? str : false; +}; + +/** + * Private + */ + +function sha1(str){ + return crypto.createHash('sha1').update(str).digest('hex'); +} diff --git a/user-service/node_modules/cookie-signature/package.json b/user-service/node_modules/cookie-signature/package.json new file mode 100644 index 0000000000..29c4498e07 --- /dev/null +++ b/user-service/node_modules/cookie-signature/package.json @@ -0,0 +1,18 @@ +{ + "name": "cookie-signature", + "version": "1.0.6", + "description": "Sign and unsign cookies", + "keywords": ["cookie", "sign", "unsign"], + "author": "TJ Holowaychuk ", + "license": "MIT", + "repository": { "type": "git", "url": "https://github.com/visionmedia/node-cookie-signature.git"}, + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "scripts": { + "test": "mocha --require should --reporter spec" + }, + "main": "index" +} diff --git a/user-service/node_modules/cookie/HISTORY.md b/user-service/node_modules/cookie/HISTORY.md new file mode 100644 index 0000000000..41ae4b013c --- /dev/null +++ b/user-service/node_modules/cookie/HISTORY.md @@ -0,0 +1,147 @@ +0.6.0 / 2023-11-06 +================== + + * Add `partitioned` option + +0.5.0 / 2022-04-11 +================== + + * Add `priority` option + * Fix `expires` option to reject invalid dates + * perf: improve default decode speed + * perf: remove slow string split in parse + +0.4.2 / 2022-02-02 +================== + + * perf: read value only when assigning in parse + * perf: remove unnecessary regexp in parse + +0.4.1 / 2020-04-21 +================== + + * Fix `maxAge` option to reject invalid values + +0.4.0 / 2019-05-15 +================== + + * Add `SameSite=None` support + +0.3.1 / 2016-05-26 +================== + + * Fix `sameSite: true` to work with draft-7 clients + - `true` now sends `SameSite=Strict` instead of `SameSite` + +0.3.0 / 2016-05-26 +================== + + * Add `sameSite` option + - Replaces `firstPartyOnly` option, never implemented by browsers + * Improve error message when `encode` is not a function + * Improve error message when `expires` is not a `Date` + +0.2.4 / 2016-05-20 +================== + + * perf: enable strict mode + * perf: use for loop in parse + * perf: use string concatenation for serialization + +0.2.3 / 2015-10-25 +================== + + * Fix cookie `Max-Age` to never be a floating point number + +0.2.2 / 2015-09-17 +================== + + * Fix regression when setting empty cookie value + - Ease the new restriction, which is just basic header-level validation + * Fix typo in invalid value errors + +0.2.1 / 2015-09-17 +================== + + * Throw on invalid values provided to `serialize` + - Ensures the resulting string is a valid HTTP header value + +0.2.0 / 2015-08-13 +================== + + * Add `firstPartyOnly` option + * Throw better error for invalid argument to parse + * perf: hoist regular expression + +0.1.5 / 2015-09-17 +================== + + * Fix regression when setting empty cookie value + - Ease the new restriction, which is just basic header-level validation + * Fix typo in invalid value errors + +0.1.4 / 2015-09-17 +================== + + * Throw better error for invalid argument to parse + * Throw on invalid values provided to `serialize` + - Ensures the resulting string is a valid HTTP header value + +0.1.3 / 2015-05-19 +================== + + * Reduce the scope of try-catch deopt + * Remove argument reassignments + +0.1.2 / 2014-04-16 +================== + + * Remove unnecessary files from npm package + +0.1.1 / 2014-02-23 +================== + + * Fix bad parse when cookie value contained a comma + * Fix support for `maxAge` of `0` + +0.1.0 / 2013-05-01 +================== + + * Add `decode` option + * Add `encode` option + +0.0.6 / 2013-04-08 +================== + + * Ignore cookie parts missing `=` + +0.0.5 / 2012-10-29 +================== + + * Return raw cookie value if value unescape errors + +0.0.4 / 2012-06-21 +================== + + * Use encode/decodeURIComponent for cookie encoding/decoding + - Improve server/client interoperability + +0.0.3 / 2012-06-06 +================== + + * Only escape special characters per the cookie RFC + +0.0.2 / 2012-06-01 +================== + + * Fix `maxAge` option to not throw error + +0.0.1 / 2012-05-28 +================== + + * Add more tests + +0.0.0 / 2012-05-28 +================== + + * Initial release diff --git a/user-service/node_modules/cookie/LICENSE b/user-service/node_modules/cookie/LICENSE new file mode 100644 index 0000000000..058b6b4efa --- /dev/null +++ b/user-service/node_modules/cookie/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/user-service/node_modules/cookie/README.md b/user-service/node_modules/cookie/README.md new file mode 100644 index 0000000000..71fdac1110 --- /dev/null +++ b/user-service/node_modules/cookie/README.md @@ -0,0 +1,317 @@ +# cookie + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Basic HTTP cookie parser and serializer for HTTP servers. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install cookie +``` + +## API + +```js +var cookie = require('cookie'); +``` + +### cookie.parse(str, options) + +Parse an HTTP `Cookie` header string and returning an object of all cookie name-value pairs. +The `str` argument is the string representing a `Cookie` header value and `options` is an +optional object containing additional parsing options. + +```js +var cookies = cookie.parse('foo=bar; equation=E%3Dmc%5E2'); +// { foo: 'bar', equation: 'E=mc^2' } +``` + +#### Options + +`cookie.parse` accepts these properties in the options object. + +##### decode + +Specifies a function that will be used to decode a cookie's value. Since the value of a cookie +has a limited character set (and must be a simple string), this function can be used to decode +a previously-encoded cookie value into a JavaScript string or other object. + +The default function is the global `decodeURIComponent`, which will decode any URL-encoded +sequences into their byte representations. + +**note** if an error is thrown from this function, the original, non-decoded cookie value will +be returned as the cookie's value. + +### cookie.serialize(name, value, options) + +Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the +name for the cookie, the `value` argument is the value to set the cookie to, and the `options` +argument is an optional object containing additional serialization options. + +```js +var setCookie = cookie.serialize('foo', 'bar'); +// foo=bar +``` + +#### Options + +`cookie.serialize` accepts these properties in the options object. + +##### domain + +Specifies the value for the [`Domain` `Set-Cookie` attribute][rfc-6265-5.2.3]. By default, no +domain is set, and most clients will consider the cookie to apply to only the current domain. + +##### encode + +Specifies a function that will be used to encode a cookie's value. Since value of a cookie +has a limited character set (and must be a simple string), this function can be used to encode +a value into a string suited for a cookie's value. + +The default function is the global `encodeURIComponent`, which will encode a JavaScript string +into UTF-8 byte sequences and then URL-encode any that fall outside of the cookie range. + +##### expires + +Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute][rfc-6265-5.2.1]. +By default, no expiration is set, and most clients will consider this a "non-persistent cookie" and +will delete it on a condition like exiting a web browser application. + +**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and +`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this, +so if both are set, they should point to the same date and time. + +##### httpOnly + +Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute][rfc-6265-5.2.6]. When truthy, +the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` attribute is not set. + +**note** be careful when setting this to `true`, as compliant clients will not allow client-side +JavaScript to see the cookie in `document.cookie`. + +##### maxAge + +Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute][rfc-6265-5.2.2]. +The given number will be converted to an integer by rounding down. By default, no maximum age is set. + +**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and +`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this, +so if both are set, they should point to the same date and time. + +##### partitioned + +Specifies the `boolean` value for the [`Partitioned` `Set-Cookie`](rfc-cutler-httpbis-partitioned-cookies) +attribute. When truthy, the `Partitioned` attribute is set, otherwise it is not. By default, the +`Partitioned` attribute is not set. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +More information about can be found in [the proposal](https://github.com/privacycg/CHIPS). + +##### path + +Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6265-5.2.4]. By default, the path +is considered the ["default path"][rfc-6265-5.1.4]. + +##### priority + +Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1]. + + - `'low'` will set the `Priority` attribute to `Low`. + - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set. + - `'high'` will set the `Priority` attribute to `High`. + +More information about the different priority levels can be found in +[the specification][rfc-west-cookie-priority-00-4.1]. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +##### sameSite + +Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-09-5.4.7]. + + - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement. + - `false` will not set the `SameSite` attribute. + - `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement. + - `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie. + - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement. + +More information about the different enforcement levels can be found in +[the specification][rfc-6265bis-09-5.4.7]. + +**note** This is an attribute that has not yet been fully standardized, and may change in the future. +This also means many clients may ignore this attribute until they understand it. + +##### secure + +Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute][rfc-6265-5.2.5]. When truthy, +the `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set. + +**note** be careful when setting this to `true`, as compliant clients will not send the cookie back to +the server in the future if the browser does not have an HTTPS connection. + +## Example + +The following example uses this module in conjunction with the Node.js core HTTP server +to prompt a user for their name and display it back on future visits. + +```js +var cookie = require('cookie'); +var escapeHtml = require('escape-html'); +var http = require('http'); +var url = require('url'); + +function onRequest(req, res) { + // Parse the query string + var query = url.parse(req.url, true, true).query; + + if (query && query.name) { + // Set a new cookie with the name + res.setHeader('Set-Cookie', cookie.serialize('name', String(query.name), { + httpOnly: true, + maxAge: 60 * 60 * 24 * 7 // 1 week + })); + + // Redirect back after setting cookie + res.statusCode = 302; + res.setHeader('Location', req.headers.referer || '/'); + res.end(); + return; + } + + // Parse the cookies on the request + var cookies = cookie.parse(req.headers.cookie || ''); + + // Get the visitor name set in the cookie + var name = cookies.name; + + res.setHeader('Content-Type', 'text/html; charset=UTF-8'); + + if (name) { + res.write('

    Welcome back, ' + escapeHtml(name) + '!

    '); + } else { + res.write('

    Hello, new visitor!

    '); + } + + res.write('
    '); + res.write(' '); + res.end('
    '); +} + +http.createServer(onRequest).listen(3000); +``` + +## Testing + +```sh +$ npm test +``` + +## Benchmark + +``` +$ npm run bench + +> cookie@0.5.0 bench +> node benchmark/index.js + + node@18.18.2 + acorn@8.10.0 + ada@2.6.0 + ares@1.19.1 + brotli@1.0.9 + cldr@43.1 + icu@73.2 + llhttp@6.0.11 + modules@108 + napi@9 + nghttp2@1.57.0 + nghttp3@0.7.0 + ngtcp2@0.8.1 + openssl@3.0.10+quic + simdutf@3.2.14 + tz@2023c + undici@5.26.3 + unicode@15.0 + uv@1.44.2 + uvwasi@0.0.18 + v8@10.2.154.26-node.26 + zlib@1.2.13.1-motley + +> node benchmark/parse-top.js + + cookie.parse - top sites + + 14 tests completed. + + parse accounts.google.com x 2,588,913 ops/sec ±0.74% (186 runs sampled) + parse apple.com x 2,370,002 ops/sec ±0.69% (186 runs sampled) + parse cloudflare.com x 2,213,102 ops/sec ±0.88% (188 runs sampled) + parse docs.google.com x 2,194,157 ops/sec ±1.03% (184 runs sampled) + parse drive.google.com x 2,265,084 ops/sec ±0.79% (187 runs sampled) + parse en.wikipedia.org x 457,099 ops/sec ±0.81% (186 runs sampled) + parse linkedin.com x 504,407 ops/sec ±0.89% (186 runs sampled) + parse maps.google.com x 1,230,959 ops/sec ±0.98% (186 runs sampled) + parse microsoft.com x 926,294 ops/sec ±0.88% (184 runs sampled) + parse play.google.com x 2,311,338 ops/sec ±0.83% (185 runs sampled) + parse support.google.com x 1,508,850 ops/sec ±0.86% (186 runs sampled) + parse www.google.com x 1,022,582 ops/sec ±1.32% (182 runs sampled) + parse youtu.be x 332,136 ops/sec ±1.02% (185 runs sampled) + parse youtube.com x 323,833 ops/sec ±0.77% (183 runs sampled) + +> node benchmark/parse.js + + cookie.parse - generic + + 6 tests completed. + + simple x 3,214,032 ops/sec ±1.61% (183 runs sampled) + decode x 587,237 ops/sec ±1.16% (187 runs sampled) + unquote x 2,954,618 ops/sec ±1.35% (183 runs sampled) + duplicates x 857,008 ops/sec ±0.89% (187 runs sampled) + 10 cookies x 292,133 ops/sec ±0.89% (187 runs sampled) + 100 cookies x 22,610 ops/sec ±0.68% (187 runs sampled) +``` + +## References + +- [RFC 6265: HTTP State Management Mechanism][rfc-6265] +- [Same-site Cookies][rfc-6265bis-09-5.4.7] + +[rfc-cutler-httpbis-partitioned-cookies]: https://tools.ietf.org/html/draft-cutler-httpbis-partitioned-cookies/ +[rfc-west-cookie-priority-00-4.1]: https://tools.ietf.org/html/draft-west-cookie-priority-00#section-4.1 +[rfc-6265bis-09-5.4.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-09#section-5.4.7 +[rfc-6265]: https://tools.ietf.org/html/rfc6265 +[rfc-6265-5.1.4]: https://tools.ietf.org/html/rfc6265#section-5.1.4 +[rfc-6265-5.2.1]: https://tools.ietf.org/html/rfc6265#section-5.2.1 +[rfc-6265-5.2.2]: https://tools.ietf.org/html/rfc6265#section-5.2.2 +[rfc-6265-5.2.3]: https://tools.ietf.org/html/rfc6265#section-5.2.3 +[rfc-6265-5.2.4]: https://tools.ietf.org/html/rfc6265#section-5.2.4 +[rfc-6265-5.2.5]: https://tools.ietf.org/html/rfc6265#section-5.2.5 +[rfc-6265-5.2.6]: https://tools.ietf.org/html/rfc6265#section-5.2.6 +[rfc-6265-5.3]: https://tools.ietf.org/html/rfc6265#section-5.3 + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/cookie/master?label=ci +[ci-url]: https://github.com/jshttp/cookie/actions/workflows/ci.yml +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/cookie/master +[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master +[node-image]: https://badgen.net/npm/node/cookie +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/cookie +[npm-url]: https://npmjs.org/package/cookie +[npm-version-image]: https://badgen.net/npm/v/cookie diff --git a/user-service/node_modules/cookie/SECURITY.md b/user-service/node_modules/cookie/SECURITY.md new file mode 100644 index 0000000000..fd4a6c53a9 --- /dev/null +++ b/user-service/node_modules/cookie/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The `cookie` team and community take all security bugs seriously. Thank +you for improving the security of the project. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `cookie`. This +information can be found in the npm registry using the command +`npm owner ls cookie`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/jshttp/cookie/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/user-service/node_modules/cookie/index.js b/user-service/node_modules/cookie/index.js new file mode 100644 index 0000000000..03d4c386b0 --- /dev/null +++ b/user-service/node_modules/cookie/index.js @@ -0,0 +1,274 @@ +/*! + * cookie + * Copyright(c) 2012-2014 Roman Shtylman + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +exports.parse = parse; +exports.serialize = serialize; + +/** + * Module variables. + * @private + */ + +var __toString = Object.prototype.toString + +/** + * RegExp to match field-content in RFC 7230 sec 3.2 + * + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + * obs-text = %x80-FF + */ + +var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; + +/** + * Parse a cookie header. + * + * Parse the given cookie header string into an object + * The object has the various cookies as keys(names) => values + * + * @param {string} str + * @param {object} [options] + * @return {object} + * @public + */ + +function parse(str, options) { + if (typeof str !== 'string') { + throw new TypeError('argument str must be a string'); + } + + var obj = {} + var opt = options || {}; + var dec = opt.decode || decode; + + var index = 0 + while (index < str.length) { + var eqIdx = str.indexOf('=', index) + + // no more cookie pairs + if (eqIdx === -1) { + break + } + + var endIdx = str.indexOf(';', index) + + if (endIdx === -1) { + endIdx = str.length + } else if (endIdx < eqIdx) { + // backtrack on prior semicolon + index = str.lastIndexOf(';', eqIdx - 1) + 1 + continue + } + + var key = str.slice(index, eqIdx).trim() + + // only assign once + if (undefined === obj[key]) { + var val = str.slice(eqIdx + 1, endIdx).trim() + + // quoted values + if (val.charCodeAt(0) === 0x22) { + val = val.slice(1, -1) + } + + obj[key] = tryDecode(val, dec); + } + + index = endIdx + 1 + } + + return obj; +} + +/** + * Serialize data into a cookie header. + * + * Serialize the a name value pair into a cookie string suitable for + * http headers. An optional options object specified cookie parameters. + * + * serialize('foo', 'bar', { httpOnly: true }) + * => "foo=bar; httpOnly" + * + * @param {string} name + * @param {string} val + * @param {object} [options] + * @return {string} + * @public + */ + +function serialize(name, val, options) { + var opt = options || {}; + var enc = opt.encode || encode; + + if (typeof enc !== 'function') { + throw new TypeError('option encode is invalid'); + } + + if (!fieldContentRegExp.test(name)) { + throw new TypeError('argument name is invalid'); + } + + var value = enc(val); + + if (value && !fieldContentRegExp.test(value)) { + throw new TypeError('argument val is invalid'); + } + + var str = name + '=' + value; + + if (null != opt.maxAge) { + var maxAge = opt.maxAge - 0; + + if (isNaN(maxAge) || !isFinite(maxAge)) { + throw new TypeError('option maxAge is invalid') + } + + str += '; Max-Age=' + Math.floor(maxAge); + } + + if (opt.domain) { + if (!fieldContentRegExp.test(opt.domain)) { + throw new TypeError('option domain is invalid'); + } + + str += '; Domain=' + opt.domain; + } + + if (opt.path) { + if (!fieldContentRegExp.test(opt.path)) { + throw new TypeError('option path is invalid'); + } + + str += '; Path=' + opt.path; + } + + if (opt.expires) { + var expires = opt.expires + + if (!isDate(expires) || isNaN(expires.valueOf())) { + throw new TypeError('option expires is invalid'); + } + + str += '; Expires=' + expires.toUTCString() + } + + if (opt.httpOnly) { + str += '; HttpOnly'; + } + + if (opt.secure) { + str += '; Secure'; + } + + if (opt.partitioned) { + str += '; Partitioned' + } + + if (opt.priority) { + var priority = typeof opt.priority === 'string' + ? opt.priority.toLowerCase() + : opt.priority + + switch (priority) { + case 'low': + str += '; Priority=Low' + break + case 'medium': + str += '; Priority=Medium' + break + case 'high': + str += '; Priority=High' + break + default: + throw new TypeError('option priority is invalid') + } + } + + if (opt.sameSite) { + var sameSite = typeof opt.sameSite === 'string' + ? opt.sameSite.toLowerCase() : opt.sameSite; + + switch (sameSite) { + case true: + str += '; SameSite=Strict'; + break; + case 'lax': + str += '; SameSite=Lax'; + break; + case 'strict': + str += '; SameSite=Strict'; + break; + case 'none': + str += '; SameSite=None'; + break; + default: + throw new TypeError('option sameSite is invalid'); + } + } + + return str; +} + +/** + * URL-decode string value. Optimized to skip native call when no %. + * + * @param {string} str + * @returns {string} + */ + +function decode (str) { + return str.indexOf('%') !== -1 + ? decodeURIComponent(str) + : str +} + +/** + * URL-encode value. + * + * @param {string} val + * @returns {string} + */ + +function encode (val) { + return encodeURIComponent(val) +} + +/** + * Determine if value is a Date. + * + * @param {*} val + * @private + */ + +function isDate (val) { + return __toString.call(val) === '[object Date]' || + val instanceof Date +} + +/** + * Try decoding a string using a decoding function. + * + * @param {string} str + * @param {function} decode + * @private + */ + +function tryDecode(str, decode) { + try { + return decode(str); + } catch (e) { + return str; + } +} diff --git a/user-service/node_modules/cookie/package.json b/user-service/node_modules/cookie/package.json new file mode 100644 index 0000000000..0c3f0063de --- /dev/null +++ b/user-service/node_modules/cookie/package.json @@ -0,0 +1,44 @@ +{ + "name": "cookie", + "description": "HTTP server cookie parsing and serialization", + "version": "0.6.0", + "author": "Roman Shtylman ", + "contributors": [ + "Douglas Christopher Wilson " + ], + "license": "MIT", + "keywords": [ + "cookie", + "cookies" + ], + "repository": "jshttp/cookie", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "8.53.0", + "eslint-plugin-markdown": "3.0.1", + "mocha": "10.2.0", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "top-sites": "1.1.194" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "update-bench": "node scripts/update-benchmark.js", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/user-service/node_modules/cors/CONTRIBUTING.md b/user-service/node_modules/cors/CONTRIBUTING.md new file mode 100644 index 0000000000..591b09a130 --- /dev/null +++ b/user-service/node_modules/cors/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# contributing to `cors` + +CORS is a node.js package for providing a [connect](http://www.senchalabs.org/connect/)/[express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. Learn more about the project in [the README](README.md). + +## The CORS Spec + +[http://www.w3.org/TR/cors/](http://www.w3.org/TR/cors/) + +## Pull Requests Welcome + +* Include `'use strict';` in every javascript file. +* 2 space indentation. +* Please run the testing steps below before submitting. + +## Testing + +```bash +$ npm install +$ npm test +``` + +## Interactive Testing Harness + +[http://node-cors-client.herokuapp.com](http://node-cors-client.herokuapp.com) + +Related git repositories: + +* [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) +* [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) + +## License + +[MIT License](http://www.opensource.org/licenses/mit-license.php) diff --git a/user-service/node_modules/cors/HISTORY.md b/user-service/node_modules/cors/HISTORY.md new file mode 100644 index 0000000000..5762bce922 --- /dev/null +++ b/user-service/node_modules/cors/HISTORY.md @@ -0,0 +1,58 @@ +2.8.5 / 2018-11-04 +================== + + * Fix setting `maxAge` option to `0` + +2.8.4 / 2017-07-12 +================== + + * Work-around Safari bug in default pre-flight response + +2.8.3 / 2017-03-29 +================== + + * Fix error when options delegate missing `methods` option + +2.8.2 / 2017-03-28 +================== + + * Fix error when frozen options are passed + * Send "Vary: Origin" when using regular expressions + * Send "Vary: Access-Control-Request-Headers" when dynamic `allowedHeaders` + +2.8.1 / 2016-09-08 +================== + +This release only changed documentation. + +2.8.0 / 2016-08-23 +================== + + * Add `optionsSuccessStatus` option + +2.7.2 / 2016-08-23 +================== + + * Fix error when Node.js running in strict mode + +2.7.1 / 2015-05-28 +================== + + * Move module into expressjs organization + +2.7.0 / 2015-05-28 +================== + + * Allow array of matching condition as `origin` option + * Allow regular expression as `origin` option + +2.6.1 / 2015-05-28 +================== + + * Update `license` in package.json + +2.6.0 / 2015-04-27 +================== + + * Add `preflightContinue` option + * Fix "Vary: Origin" header added for "*" diff --git a/user-service/node_modules/cors/LICENSE b/user-service/node_modules/cors/LICENSE new file mode 100644 index 0000000000..fd10c843f2 --- /dev/null +++ b/user-service/node_modules/cors/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2013 Troy Goode + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/cors/README.md b/user-service/node_modules/cors/README.md new file mode 100644 index 0000000000..732b847ed9 --- /dev/null +++ b/user-service/node_modules/cors/README.md @@ -0,0 +1,243 @@ +# cors + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +CORS is a node.js package for providing a [Connect](http://www.senchalabs.org/connect/)/[Express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. + +**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)** + +* [Installation](#installation) +* [Usage](#usage) + * [Simple Usage](#simple-usage-enable-all-cors-requests) + * [Enable CORS for a Single Route](#enable-cors-for-a-single-route) + * [Configuring CORS](#configuring-cors) + * [Configuring CORS Asynchronously](#configuring-cors-asynchronously) + * [Enabling CORS Pre-Flight](#enabling-cors-pre-flight) +* [Configuration Options](#configuration-options) +* [Demo](#demo) +* [License](#license) +* [Author](#author) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install cors +``` + +## Usage + +### Simple Usage (Enable *All* CORS Requests) + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.use(cors()) + +app.get('/products/:id', function (req, res, next) { + res.json({msg: 'This is CORS-enabled for all origins!'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Enable CORS for a Single Route + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.get('/products/:id', cors(), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a Single Route'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Configuring CORS + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var corsOptions = { + origin: 'http://example.com', + optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 +} + +app.get('/products/:id', cors(corsOptions), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for only example.com.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +### Configuring CORS w/ Dynamic Origin + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var whitelist = ['http://example1.com', 'http://example2.com'] +var corsOptions = { + origin: function (origin, callback) { + if (whitelist.indexOf(origin) !== -1) { + callback(null, true) + } else { + callback(new Error('Not allowed by CORS')) + } + } +} + +app.get('/products/:id', cors(corsOptions), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +If you do not want to block REST tools or server-to-server requests, +add a `!origin` check in the origin function like so: + +```javascript +var corsOptions = { + origin: function (origin, callback) { + if (whitelist.indexOf(origin) !== -1 || !origin) { + callback(null, true) + } else { + callback(new Error('Not allowed by CORS')) + } + } +} +``` + +### Enabling CORS Pre-Flight + +Certain CORS requests are considered 'complex' and require an initial +`OPTIONS` request (called the "pre-flight request"). An example of a +'complex' CORS request is one that uses an HTTP verb other than +GET/HEAD/POST (such as DELETE) or that uses custom headers. To enable +pre-flighting, you must add a new OPTIONS handler for the route you want +to support: + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +app.options('/products/:id', cors()) // enable pre-flight request for DELETE request +app.del('/products/:id', cors(), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for all origins!'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +You can also enable pre-flight across-the-board like so: + +```javascript +app.options('*', cors()) // include before other routes +``` + +### Configuring CORS Asynchronously + +```javascript +var express = require('express') +var cors = require('cors') +var app = express() + +var whitelist = ['http://example1.com', 'http://example2.com'] +var corsOptionsDelegate = function (req, callback) { + var corsOptions; + if (whitelist.indexOf(req.header('Origin')) !== -1) { + corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response + } else { + corsOptions = { origin: false } // disable CORS for this request + } + callback(null, corsOptions) // callback expects two parameters: error and options +} + +app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) { + res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) +}) + +app.listen(80, function () { + console.log('CORS-enabled web server listening on port 80') +}) +``` + +## Configuration Options + +* `origin`: Configures the **Access-Control-Allow-Origin** CORS header. Possible values: + - `Boolean` - set `origin` to `true` to reflect the [request origin](http://tools.ietf.org/html/draft-abarth-origin-09), as defined by `req.header('Origin')`, or set it to `false` to disable CORS. + - `String` - set `origin` to a specific origin. For example if you set it to `"http://example.com"` only requests from "http://example.com" will be allowed. + - `RegExp` - set `origin` to a regular expression pattern which will be used to test the request origin. If it's a match, the request origin will be reflected. For example the pattern `/example\.com$/` will reflect any request that is coming from an origin ending with "example.com". + - `Array` - set `origin` to an array of valid origins. Each origin can be a `String` or a `RegExp`. For example `["http://example1.com", /\.example2\.com$/]` will accept any request from "http://example1.com" or from a subdomain of "example2.com". + - `Function` - set `origin` to a function implementing some custom logic. The function takes the request origin as the first parameter and a callback (which expects the signature `err [object], allow [bool]`) as the second. +* `methods`: Configures the **Access-Control-Allow-Methods** CORS header. Expects a comma-delimited string (ex: 'GET,PUT,POST') or an array (ex: `['GET', 'PUT', 'POST']`). +* `allowedHeaders`: Configures the **Access-Control-Allow-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Type,Authorization') or an array (ex: `['Content-Type', 'Authorization']`). If not specified, defaults to reflecting the headers specified in the request's **Access-Control-Request-Headers** header. +* `exposedHeaders`: Configures the **Access-Control-Expose-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Range,X-Content-Range') or an array (ex: `['Content-Range', 'X-Content-Range']`). If not specified, no custom headers are exposed. +* `credentials`: Configures the **Access-Control-Allow-Credentials** CORS header. Set to `true` to pass the header, otherwise it is omitted. +* `maxAge`: Configures the **Access-Control-Max-Age** CORS header. Set to an integer to pass the header, otherwise it is omitted. +* `preflightContinue`: Pass the CORS preflight response to the next handler. +* `optionsSuccessStatus`: Provides a status code to use for successful `OPTIONS` requests, since some legacy browsers (IE11, various SmartTVs) choke on `204`. + +The default configuration is the equivalent of: + +```json +{ + "origin": "*", + "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", + "preflightContinue": false, + "optionsSuccessStatus": 204 +} +``` + +For details on the effect of each CORS header, read [this](http://www.html5rocks.com/en/tutorials/cors/) article on HTML5 Rocks. + +## Demo + +A demo that illustrates CORS working (and not working) using jQuery is available here: [http://node-cors-client.herokuapp.com/](http://node-cors-client.herokuapp.com/) + +Code for that demo can be found here: + +* Client: [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) +* Server: [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) + +## License + +[MIT License](http://www.opensource.org/licenses/mit-license.php) + +## Author + +[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com)) + +[coveralls-image]: https://img.shields.io/coveralls/expressjs/cors/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/cors?branch=master +[downloads-image]: https://img.shields.io/npm/dm/cors.svg +[downloads-url]: https://npmjs.org/package/cors +[npm-image]: https://img.shields.io/npm/v/cors.svg +[npm-url]: https://npmjs.org/package/cors +[travis-image]: https://img.shields.io/travis/expressjs/cors/master.svg +[travis-url]: https://travis-ci.org/expressjs/cors diff --git a/user-service/node_modules/cors/lib/index.js b/user-service/node_modules/cors/lib/index.js new file mode 100644 index 0000000000..5475aecd6d --- /dev/null +++ b/user-service/node_modules/cors/lib/index.js @@ -0,0 +1,238 @@ +(function () { + + 'use strict'; + + var assign = require('object-assign'); + var vary = require('vary'); + + var defaults = { + origin: '*', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', + preflightContinue: false, + optionsSuccessStatus: 204 + }; + + function isString(s) { + return typeof s === 'string' || s instanceof String; + } + + function isOriginAllowed(origin, allowedOrigin) { + if (Array.isArray(allowedOrigin)) { + for (var i = 0; i < allowedOrigin.length; ++i) { + if (isOriginAllowed(origin, allowedOrigin[i])) { + return true; + } + } + return false; + } else if (isString(allowedOrigin)) { + return origin === allowedOrigin; + } else if (allowedOrigin instanceof RegExp) { + return allowedOrigin.test(origin); + } else { + return !!allowedOrigin; + } + } + + function configureOrigin(options, req) { + var requestOrigin = req.headers.origin, + headers = [], + isAllowed; + + if (!options.origin || options.origin === '*') { + // allow any origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: '*' + }]); + } else if (isString(options.origin)) { + // fixed origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: options.origin + }]); + headers.push([{ + key: 'Vary', + value: 'Origin' + }]); + } else { + isAllowed = isOriginAllowed(requestOrigin, options.origin); + // reflect origin + headers.push([{ + key: 'Access-Control-Allow-Origin', + value: isAllowed ? requestOrigin : false + }]); + headers.push([{ + key: 'Vary', + value: 'Origin' + }]); + } + + return headers; + } + + function configureMethods(options) { + var methods = options.methods; + if (methods.join) { + methods = options.methods.join(','); // .methods is an array, so turn it into a string + } + return { + key: 'Access-Control-Allow-Methods', + value: methods + }; + } + + function configureCredentials(options) { + if (options.credentials === true) { + return { + key: 'Access-Control-Allow-Credentials', + value: 'true' + }; + } + return null; + } + + function configureAllowedHeaders(options, req) { + var allowedHeaders = options.allowedHeaders || options.headers; + var headers = []; + + if (!allowedHeaders) { + allowedHeaders = req.headers['access-control-request-headers']; // .headers wasn't specified, so reflect the request headers + headers.push([{ + key: 'Vary', + value: 'Access-Control-Request-Headers' + }]); + } else if (allowedHeaders.join) { + allowedHeaders = allowedHeaders.join(','); // .headers is an array, so turn it into a string + } + if (allowedHeaders && allowedHeaders.length) { + headers.push([{ + key: 'Access-Control-Allow-Headers', + value: allowedHeaders + }]); + } + + return headers; + } + + function configureExposedHeaders(options) { + var headers = options.exposedHeaders; + if (!headers) { + return null; + } else if (headers.join) { + headers = headers.join(','); // .headers is an array, so turn it into a string + } + if (headers && headers.length) { + return { + key: 'Access-Control-Expose-Headers', + value: headers + }; + } + return null; + } + + function configureMaxAge(options) { + var maxAge = (typeof options.maxAge === 'number' || options.maxAge) && options.maxAge.toString() + if (maxAge && maxAge.length) { + return { + key: 'Access-Control-Max-Age', + value: maxAge + }; + } + return null; + } + + function applyHeaders(headers, res) { + for (var i = 0, n = headers.length; i < n; i++) { + var header = headers[i]; + if (header) { + if (Array.isArray(header)) { + applyHeaders(header, res); + } else if (header.key === 'Vary' && header.value) { + vary(res, header.value); + } else if (header.value) { + res.setHeader(header.key, header.value); + } + } + } + } + + function cors(options, req, res, next) { + var headers = [], + method = req.method && req.method.toUpperCase && req.method.toUpperCase(); + + if (method === 'OPTIONS') { + // preflight + headers.push(configureOrigin(options, req)); + headers.push(configureCredentials(options, req)); + headers.push(configureMethods(options, req)); + headers.push(configureAllowedHeaders(options, req)); + headers.push(configureMaxAge(options, req)); + headers.push(configureExposedHeaders(options, req)); + applyHeaders(headers, res); + + if (options.preflightContinue) { + next(); + } else { + // Safari (and potentially other browsers) need content-length 0, + // for 204 or they just hang waiting for a body + res.statusCode = options.optionsSuccessStatus; + res.setHeader('Content-Length', '0'); + res.end(); + } + } else { + // actual response + headers.push(configureOrigin(options, req)); + headers.push(configureCredentials(options, req)); + headers.push(configureExposedHeaders(options, req)); + applyHeaders(headers, res); + next(); + } + } + + function middlewareWrapper(o) { + // if options are static (either via defaults or custom options passed in), wrap in a function + var optionsCallback = null; + if (typeof o === 'function') { + optionsCallback = o; + } else { + optionsCallback = function (req, cb) { + cb(null, o); + }; + } + + return function corsMiddleware(req, res, next) { + optionsCallback(req, function (err, options) { + if (err) { + next(err); + } else { + var corsOptions = assign({}, defaults, options); + var originCallback = null; + if (corsOptions.origin && typeof corsOptions.origin === 'function') { + originCallback = corsOptions.origin; + } else if (corsOptions.origin) { + originCallback = function (origin, cb) { + cb(null, corsOptions.origin); + }; + } + + if (originCallback) { + originCallback(req.headers.origin, function (err2, origin) { + if (err2 || !origin) { + next(err2); + } else { + corsOptions.origin = origin; + cors(corsOptions, req, res, next); + } + }); + } else { + next(); + } + } + }); + }; + } + + // can pass either an options hash, an options delegate, or nothing + module.exports = middlewareWrapper; + +}()); diff --git a/user-service/node_modules/cors/package.json b/user-service/node_modules/cors/package.json new file mode 100644 index 0000000000..ff37d9843e --- /dev/null +++ b/user-service/node_modules/cors/package.json @@ -0,0 +1,41 @@ +{ + "name": "cors", + "description": "Node.js CORS middleware", + "version": "2.8.5", + "author": "Troy Goode (https://github.com/troygoode/)", + "license": "MIT", + "keywords": [ + "cors", + "express", + "connect", + "middleware" + ], + "repository": "expressjs/cors", + "main": "./lib/index.js", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "devDependencies": { + "after": "0.8.2", + "eslint": "2.13.1", + "express": "4.16.3", + "mocha": "5.2.0", + "nyc": "13.1.0", + "supertest": "3.3.0" + }, + "files": [ + "lib/index.js", + "CONTRIBUTING.md", + "HISTORY.md", + "LICENSE", + "README.md" + ], + "engines": { + "node": ">= 0.10" + }, + "scripts": { + "test": "npm run lint && nyc --reporter=html --reporter=text mocha --require test/support/env", + "lint": "eslint lib test" + } +} diff --git a/user-service/node_modules/debug/.coveralls.yml b/user-service/node_modules/debug/.coveralls.yml new file mode 100644 index 0000000000..20a7068581 --- /dev/null +++ b/user-service/node_modules/debug/.coveralls.yml @@ -0,0 +1 @@ +repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/user-service/node_modules/debug/.eslintrc b/user-service/node_modules/debug/.eslintrc new file mode 100644 index 0000000000..8a37ae2c2e --- /dev/null +++ b/user-service/node_modules/debug/.eslintrc @@ -0,0 +1,11 @@ +{ + "env": { + "browser": true, + "node": true + }, + "rules": { + "no-console": 0, + "no-empty": [1, { "allowEmptyCatch": true }] + }, + "extends": "eslint:recommended" +} diff --git a/user-service/node_modules/debug/.npmignore b/user-service/node_modules/debug/.npmignore new file mode 100644 index 0000000000..5f60eecc84 --- /dev/null +++ b/user-service/node_modules/debug/.npmignore @@ -0,0 +1,9 @@ +support +test +examples +example +*.sock +dist +yarn.lock +coverage +bower.json diff --git a/user-service/node_modules/debug/.travis.yml b/user-service/node_modules/debug/.travis.yml new file mode 100644 index 0000000000..6c6090c3b0 --- /dev/null +++ b/user-service/node_modules/debug/.travis.yml @@ -0,0 +1,14 @@ + +language: node_js +node_js: + - "6" + - "5" + - "4" + +install: + - make node_modules + +script: + - make lint + - make test + - make coveralls diff --git a/user-service/node_modules/debug/CHANGELOG.md b/user-service/node_modules/debug/CHANGELOG.md new file mode 100644 index 0000000000..eadaa18951 --- /dev/null +++ b/user-service/node_modules/debug/CHANGELOG.md @@ -0,0 +1,362 @@ + +2.6.9 / 2017-09-22 +================== + + * remove ReDoS regexp in %o formatter (#504) + +2.6.8 / 2017-05-18 +================== + + * Fix: Check for undefined on browser globals (#462, @marbemac) + +2.6.7 / 2017-05-16 +================== + + * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) + * Fix: Inline extend function in node implementation (#452, @dougwilson) + * Docs: Fix typo (#455, @msasad) + +2.6.5 / 2017-04-27 +================== + + * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) + * Misc: clean up browser reference checks (#447, @thebigredgeek) + * Misc: add npm-debug.log to .gitignore (@thebigredgeek) + + +2.6.4 / 2017-04-20 +================== + + * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) + * Chore: ignore bower.json in npm installations. (#437, @joaovieira) + * Misc: update "ms" to v0.7.3 (@tootallnate) + +2.6.3 / 2017-03-13 +================== + + * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) + * Docs: Changelog fix (@thebigredgeek) + +2.6.2 / 2017-03-10 +================== + + * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) + * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) + * Docs: Add Slackin invite badge (@tootallnate) + +2.6.1 / 2017-02-10 +================== + + * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error + * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) + * Fix: IE8 "Expected identifier" error (#414, @vgoma) + * Fix: Namespaces would not disable once enabled (#409, @musikov) + +2.6.0 / 2016-12-28 +================== + + * Fix: added better null pointer checks for browser useColors (@thebigredgeek) + * Improvement: removed explicit `window.debug` export (#404, @tootallnate) + * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) + +2.5.2 / 2016-12-25 +================== + + * Fix: reference error on window within webworkers (#393, @KlausTrainer) + * Docs: fixed README typo (#391, @lurch) + * Docs: added notice about v3 api discussion (@thebigredgeek) + +2.5.1 / 2016-12-20 +================== + + * Fix: babel-core compatibility + +2.5.0 / 2016-12-20 +================== + + * Fix: wrong reference in bower file (@thebigredgeek) + * Fix: webworker compatibility (@thebigredgeek) + * Fix: output formatting issue (#388, @kribblo) + * Fix: babel-loader compatibility (#383, @escwald) + * Misc: removed built asset from repo and publications (@thebigredgeek) + * Misc: moved source files to /src (#378, @yamikuronue) + * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) + * Test: coveralls integration (#378, @yamikuronue) + * Docs: simplified language in the opening paragraph (#373, @yamikuronue) + +2.4.5 / 2016-12-17 +================== + + * Fix: `navigator` undefined in Rhino (#376, @jochenberger) + * Fix: custom log function (#379, @hsiliev) + * Improvement: bit of cleanup + linting fixes (@thebigredgeek) + * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) + * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) + +2.4.4 / 2016-12-14 +================== + + * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) + +2.4.3 / 2016-12-14 +================== + + * Fix: navigation.userAgent error for react native (#364, @escwald) + +2.4.2 / 2016-12-14 +================== + + * Fix: browser colors (#367, @tootallnate) + * Misc: travis ci integration (@thebigredgeek) + * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) + +2.4.1 / 2016-12-13 +================== + + * Fix: typo that broke the package (#356) + +2.4.0 / 2016-12-13 +================== + + * Fix: bower.json references unbuilt src entry point (#342, @justmatt) + * Fix: revert "handle regex special characters" (@tootallnate) + * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) + * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) + * Improvement: allow colors in workers (#335, @botverse) + * Improvement: use same color for same namespace. (#338, @lchenay) + +2.3.3 / 2016-11-09 +================== + + * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) + * Fix: Returning `localStorage` saved values (#331, Levi Thomason) + * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) + +2.3.2 / 2016-11-09 +================== + + * Fix: be super-safe in index.js as well (@TooTallNate) + * Fix: should check whether process exists (Tom Newby) + +2.3.1 / 2016-11-09 +================== + + * Fix: Added electron compatibility (#324, @paulcbetts) + * Improvement: Added performance optimizations (@tootallnate) + * Readme: Corrected PowerShell environment variable example (#252, @gimre) + * Misc: Removed yarn lock file from source control (#321, @fengmk2) + +2.3.0 / 2016-11-07 +================== + + * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) + * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) + * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) + * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) + * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) + * Package: Update "ms" to 0.7.2 (#315, @DevSide) + * Package: removed superfluous version property from bower.json (#207 @kkirsche) + * Readme: fix USE_COLORS to DEBUG_COLORS + * Readme: Doc fixes for format string sugar (#269, @mlucool) + * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) + * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) + * Readme: better docs for browser support (#224, @matthewmueller) + * Tooling: Added yarn integration for development (#317, @thebigredgeek) + * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) + * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) + * Misc: Updated contributors (@thebigredgeek) + +2.2.0 / 2015-05-09 +================== + + * package: update "ms" to v0.7.1 (#202, @dougwilson) + * README: add logging to file example (#193, @DanielOchoa) + * README: fixed a typo (#191, @amir-s) + * browser: expose `storage` (#190, @stephenmathieson) + * Makefile: add a `distclean` target (#189, @stephenmathieson) + +2.1.3 / 2015-03-13 +================== + + * Updated stdout/stderr example (#186) + * Updated example/stdout.js to match debug current behaviour + * Renamed example/stderr.js to stdout.js + * Update Readme.md (#184) + * replace high intensity foreground color for bold (#182, #183) + +2.1.2 / 2015-03-01 +================== + + * dist: recompile + * update "ms" to v0.7.0 + * package: update "browserify" to v9.0.3 + * component: fix "ms.js" repo location + * changed bower package name + * updated documentation about using debug in a browser + * fix: security error on safari (#167, #168, @yields) + +2.1.1 / 2014-12-29 +================== + + * browser: use `typeof` to check for `console` existence + * browser: check for `console.log` truthiness (fix IE 8/9) + * browser: add support for Chrome apps + * Readme: added Windows usage remarks + * Add `bower.json` to properly support bower install + +2.1.0 / 2014-10-15 +================== + + * node: implement `DEBUG_FD` env variable support + * package: update "browserify" to v6.1.0 + * package: add "license" field to package.json (#135, @panuhorsmalahti) + +2.0.0 / 2014-09-01 +================== + + * package: update "browserify" to v5.11.0 + * node: use stderr rather than stdout for logging (#29, @stephenmathieson) + +1.0.4 / 2014-07-15 +================== + + * dist: recompile + * example: remove `console.info()` log usage + * example: add "Content-Type" UTF-8 header to browser example + * browser: place %c marker after the space character + * browser: reset the "content" color via `color: inherit` + * browser: add colors support for Firefox >= v31 + * debug: prefer an instance `log()` function over the global one (#119) + * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) + +1.0.3 / 2014-07-09 +================== + + * Add support for multiple wildcards in namespaces (#122, @seegno) + * browser: fix lint + +1.0.2 / 2014-06-10 +================== + + * browser: update color palette (#113, @gscottolson) + * common: make console logging function configurable (#108, @timoxley) + * node: fix %o colors on old node <= 0.8.x + * Makefile: find node path using shell/which (#109, @timoxley) + +1.0.1 / 2014-06-06 +================== + + * browser: use `removeItem()` to clear localStorage + * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) + * package: add "contributors" section + * node: fix comment typo + * README: list authors + +1.0.0 / 2014-06-04 +================== + + * make ms diff be global, not be scope + * debug: ignore empty strings in enable() + * node: make DEBUG_COLORS able to disable coloring + * *: export the `colors` array + * npmignore: don't publish the `dist` dir + * Makefile: refactor to use browserify + * package: add "browserify" as a dev dependency + * Readme: add Web Inspector Colors section + * node: reset terminal color for the debug content + * node: map "%o" to `util.inspect()` + * browser: map "%j" to `JSON.stringify()` + * debug: add custom "formatters" + * debug: use "ms" module for humanizing the diff + * Readme: add "bash" syntax highlighting + * browser: add Firebug color support + * browser: add colors for WebKit browsers + * node: apply log to `console` + * rewrite: abstract common logic for Node & browsers + * add .jshintrc file + +0.8.1 / 2014-04-14 +================== + + * package: re-add the "component" section + +0.8.0 / 2014-03-30 +================== + + * add `enable()` method for nodejs. Closes #27 + * change from stderr to stdout + * remove unnecessary index.js file + +0.7.4 / 2013-11-13 +================== + + * remove "browserify" key from package.json (fixes something in browserify) + +0.7.3 / 2013-10-30 +================== + + * fix: catch localStorage security error when cookies are blocked (Chrome) + * add debug(err) support. Closes #46 + * add .browser prop to package.json. Closes #42 + +0.7.2 / 2013-02-06 +================== + + * fix package.json + * fix: Mobile Safari (private mode) is broken with debug + * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript + +0.7.1 / 2013-02-05 +================== + + * add repository URL to package.json + * add DEBUG_COLORED to force colored output + * add browserify support + * fix component. Closes #24 + +0.7.0 / 2012-05-04 +================== + + * Added .component to package.json + * Added debug.component.js build + +0.6.0 / 2012-03-16 +================== + + * Added support for "-" prefix in DEBUG [Vinay Pulim] + * Added `.enabled` flag to the node version [TooTallNate] + +0.5.0 / 2012-02-02 +================== + + * Added: humanize diffs. Closes #8 + * Added `debug.disable()` to the CS variant + * Removed padding. Closes #10 + * Fixed: persist client-side variant again. Closes #9 + +0.4.0 / 2012-02-01 +================== + + * Added browser variant support for older browsers [TooTallNate] + * Added `debug.enable('project:*')` to browser variant [TooTallNate] + * Added padding to diff (moved it to the right) + +0.3.0 / 2012-01-26 +================== + + * Added millisecond diff when isatty, otherwise UTC string + +0.2.0 / 2012-01-22 +================== + + * Added wildcard support + +0.1.0 / 2011-12-02 +================== + + * Added: remove colors unless stderr isatty [TooTallNate] + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/user-service/node_modules/debug/LICENSE b/user-service/node_modules/debug/LICENSE new file mode 100644 index 0000000000..658c933d28 --- /dev/null +++ b/user-service/node_modules/debug/LICENSE @@ -0,0 +1,19 @@ +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/user-service/node_modules/debug/Makefile b/user-service/node_modules/debug/Makefile new file mode 100644 index 0000000000..584da8bf93 --- /dev/null +++ b/user-service/node_modules/debug/Makefile @@ -0,0 +1,50 @@ +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# Path +PATH := node_modules/.bin:$(PATH) +SHELL := /bin/bash + +# applications +NODE ?= $(shell which node) +YARN ?= $(shell which yarn) +PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) +BROWSERIFY ?= $(NODE) $(BIN)/browserify + +.FORCE: + +install: node_modules + +node_modules: package.json + @NODE_ENV= $(PKG) install + @touch node_modules + +lint: .FORCE + eslint browser.js debug.js index.js node.js + +test-node: .FORCE + istanbul cover node_modules/mocha/bin/_mocha -- test/**.js + +test-browser: .FORCE + mkdir -p dist + + @$(BROWSERIFY) \ + --standalone debug \ + . > dist/debug.js + + karma start --single-run + rimraf dist + +test: .FORCE + concurrently \ + "make test-node" \ + "make test-browser" + +coveralls: + cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + +.PHONY: all install clean distclean diff --git a/user-service/node_modules/debug/README.md b/user-service/node_modules/debug/README.md new file mode 100644 index 0000000000..f67be6b317 --- /dev/null +++ b/user-service/node_modules/debug/README.md @@ -0,0 +1,312 @@ +# debug +[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny node.js debugging utility modelled after node core's debugging technique. + +**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example _worker.js_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) + +#### Windows note + + On Windows the environment variable is set using the `set` command. + + ```cmd + set DEBUG=*,-not_this + ``` + + Note that PowerShell uses different syntax to set environment variables. + + ```cmd + $env:DEBUG = "*,-not_this" + ``` + +Then, run the program to be debugged as usual. + +## Millisecond diff + + When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) + +## Conventions + + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". + +## Wildcards + + The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + + You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". + +## Environment Variables + + When running through Node.js, you can set a few environment variables that will + change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + + __Note:__ The environment variables beginning with `DEBUG_` end up being + converted into an Options object that gets used with `%o`/`%O` formatters. + See the Node.js documentation for + [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) + for the complete list. + +## Formatters + + + Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + +### Custom formatters + + You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + +## Browser support + You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), + or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), + if you don't want to build it yourself. + + Debug's enable state is currently persisted by `localStorage`. + Consider the situation shown below where you have `worker:a` and `worker:b`, + and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +#### Web Inspector Colors + + Colors are also enabled on "Web Inspectors" that understand the `%c` formatting + option. These are WebKit web inspectors, Firefox ([since version + 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) + and the Firebug plugin for Firefox (any version). + + Colored output looks something like: + + ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example _stdout.js_: + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/debug/component.json b/user-service/node_modules/debug/component.json new file mode 100644 index 0000000000..9de26410f0 --- /dev/null +++ b/user-service/node_modules/debug/component.json @@ -0,0 +1,19 @@ +{ + "name": "debug", + "repo": "visionmedia/debug", + "description": "small debugging utility", + "version": "2.6.9", + "keywords": [ + "debug", + "log", + "debugger" + ], + "main": "src/browser.js", + "scripts": [ + "src/browser.js", + "src/debug.js" + ], + "dependencies": { + "rauchg/ms.js": "0.7.1" + } +} diff --git a/user-service/node_modules/debug/karma.conf.js b/user-service/node_modules/debug/karma.conf.js new file mode 100644 index 0000000000..103a82d15b --- /dev/null +++ b/user-service/node_modules/debug/karma.conf.js @@ -0,0 +1,70 @@ +// Karma configuration +// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha', 'chai', 'sinon'], + + + // list of files / patterns to load in the browser + files: [ + 'dist/debug.js', + 'test/*spec.js' + ], + + + // list of files to exclude + exclude: [ + 'src/node.js' + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/user-service/node_modules/debug/node.js b/user-service/node_modules/debug/node.js new file mode 100644 index 0000000000..7fc36fe6db --- /dev/null +++ b/user-service/node_modules/debug/node.js @@ -0,0 +1 @@ +module.exports = require('./src/node'); diff --git a/user-service/node_modules/debug/package.json b/user-service/node_modules/debug/package.json new file mode 100644 index 0000000000..dc787ba767 --- /dev/null +++ b/user-service/node_modules/debug/package.json @@ -0,0 +1,49 @@ +{ + "name": "debug", + "version": "2.6.9", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": "TJ Holowaychuk ", + "contributors": [ + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + }, + "devDependencies": { + "browserify": "9.0.3", + "chai": "^3.5.0", + "concurrently": "^3.1.0", + "coveralls": "^2.11.15", + "eslint": "^3.12.1", + "istanbul": "^0.4.5", + "karma": "^1.3.0", + "karma-chai": "^0.1.0", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sinon": "^1.0.5", + "mocha": "^3.2.0", + "mocha-lcov-reporter": "^1.2.0", + "rimraf": "^2.5.4", + "sinon": "^1.17.6", + "sinon-chai": "^2.8.0" + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "component": { + "scripts": { + "debug/index.js": "browser.js", + "debug/debug.js": "debug.js" + } + } +} diff --git a/user-service/node_modules/debug/src/browser.js b/user-service/node_modules/debug/src/browser.js new file mode 100644 index 0000000000..7106924934 --- /dev/null +++ b/user-service/node_modules/debug/src/browser.js @@ -0,0 +1,185 @@ +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} diff --git a/user-service/node_modules/debug/src/debug.js b/user-service/node_modules/debug/src/debug.js new file mode 100644 index 0000000000..6a5e3fc94c --- /dev/null +++ b/user-service/node_modules/debug/src/debug.js @@ -0,0 +1,202 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/user-service/node_modules/debug/src/index.js b/user-service/node_modules/debug/src/index.js new file mode 100644 index 0000000000..e12cf4d58c --- /dev/null +++ b/user-service/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/user-service/node_modules/debug/src/inspector-log.js b/user-service/node_modules/debug/src/inspector-log.js new file mode 100644 index 0000000000..60ea6c04aa --- /dev/null +++ b/user-service/node_modules/debug/src/inspector-log.js @@ -0,0 +1,15 @@ +module.exports = inspectorLog; + +// black hole +const nullStream = new (require('stream').Writable)(); +nullStream._write = () => {}; + +/** + * Outputs a `console.log()` to the Node.js Inspector console *only*. + */ +function inspectorLog() { + const stdout = console._stdout; + console._stdout = nullStream; + console.log.apply(console, arguments); + console._stdout = stdout; +} diff --git a/user-service/node_modules/debug/src/node.js b/user-service/node_modules/debug/src/node.js new file mode 100644 index 0000000000..b15109c905 --- /dev/null +++ b/user-service/node_modules/debug/src/node.js @@ -0,0 +1,248 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); +var util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = require('fs'); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = require('net'); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); diff --git a/user-service/node_modules/define-data-property/.eslintrc b/user-service/node_modules/define-data-property/.eslintrc new file mode 100644 index 0000000000..75443e81ee --- /dev/null +++ b/user-service/node_modules/define-data-property/.eslintrc @@ -0,0 +1,24 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "id-length": 0, + "new-cap": ["error", { + "capIsNewExceptions": [ + "GetIntrinsic", + ], + }], + }, + + "overrides": [ + { + "files": "test/**", + "rules": { + "max-lines-per-function": "off", + }, + }, + ], +} diff --git a/user-service/node_modules/define-data-property/.github/FUNDING.yml b/user-service/node_modules/define-data-property/.github/FUNDING.yml new file mode 100644 index 0000000000..3e17725ddf --- /dev/null +++ b/user-service/node_modules/define-data-property/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/define-data-property +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/user-service/node_modules/define-data-property/.nycrc b/user-service/node_modules/define-data-property/.nycrc new file mode 100644 index 0000000000..1826526e09 --- /dev/null +++ b/user-service/node_modules/define-data-property/.nycrc @@ -0,0 +1,13 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "lines": 86, + "statements": 85.93, + "functions": 82.43, + "branches": 76.06, + "exclude": [ + "coverage", + "test" + ] +} diff --git a/user-service/node_modules/define-data-property/CHANGELOG.md b/user-service/node_modules/define-data-property/CHANGELOG.md new file mode 100644 index 0000000000..4eed75ea90 --- /dev/null +++ b/user-service/node_modules/define-data-property/CHANGELOG.md @@ -0,0 +1,70 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [v1.1.4](https://github.com/ljharb/define-data-property/compare/v1.1.3...v1.1.4) - 2024-02-13 + +### Commits + +- [Refactor] use `es-define-property` [`90f2f4c`](https://github.com/ljharb/define-data-property/commit/90f2f4cc20298401e71c28e1e08888db12021453) +- [Dev Deps] update `@types/object.getownpropertydescriptors` [`cd929d9`](https://github.com/ljharb/define-data-property/commit/cd929d9a04f5f2fdcfa9d5be140940b91a083153) + +## [v1.1.3](https://github.com/ljharb/define-data-property/compare/v1.1.2...v1.1.3) - 2024-02-12 + +### Commits + +- [types] hand-write d.ts instead of emitting it [`0cbc988`](https://github.com/ljharb/define-data-property/commit/0cbc988203c105f2d97948327c7167ebd33bd318) +- [meta] simplify `exports` [`690781e`](https://github.com/ljharb/define-data-property/commit/690781eed28bbf2d6766237efda0ba6dd591609e) +- [Dev Deps] update `hasown`; clean up DT packages [`6cdfd1c`](https://github.com/ljharb/define-data-property/commit/6cdfd1cb2d91d791bfd18cda5d5cab232fd5d8fc) +- [actions] cleanup [`3142bc6`](https://github.com/ljharb/define-data-property/commit/3142bc6a4bc406a51f5b04f31e98562a27f35ffd) +- [meta] add `funding` [`8474423`](https://github.com/ljharb/define-data-property/commit/847442391a79779af3e0f1bf0b5bb923552b7804) +- [Deps] update `get-intrinsic` [`3e9be00`](https://github.com/ljharb/define-data-property/commit/3e9be00e07784ba34e7c77d8bc0fdbc832ad61de) + +## [v1.1.2](https://github.com/ljharb/define-data-property/compare/v1.1.1...v1.1.2) - 2024-02-05 + +### Commits + +- [Dev Deps] update @types packages, `object-inspect`, `tape`, `typescript` [`df41bf8`](https://github.com/ljharb/define-data-property/commit/df41bf84ca3456be6226055caab44e38e3a7fd2f) +- [Dev Deps] update DT packages, `aud`, `npmignore`, `tape`, typescript` [`fab0e4e`](https://github.com/ljharb/define-data-property/commit/fab0e4ec709ee02b79f42d6db3ee5f26e0a34b8a) +- [Dev Deps] use `hasown` instead of `has` [`aa51ef9`](https://github.com/ljharb/define-data-property/commit/aa51ef93f6403d49d9bb72a807bcdb6e418978c0) +- [Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic` [`d89be50`](https://github.com/ljharb/define-data-property/commit/d89be50571175888d391238605122679f7e65ffc) +- [Deps] update `has-property-descriptors` [`7af887c`](https://github.com/ljharb/define-data-property/commit/7af887c9083b59b195b0079e04815cfed9fcee2b) +- [Deps] update `get-intrinsic` [`bb8728e`](https://github.com/ljharb/define-data-property/commit/bb8728ec42cd998505a7157ae24853a560c20646) + +## [v1.1.1](https://github.com/ljharb/define-data-property/compare/v1.1.0...v1.1.1) - 2023-10-12 + +### Commits + +- [Tests] fix tests in ES3 engines [`5c6920e`](https://github.com/ljharb/define-data-property/commit/5c6920edd1f52f675b02f417e539c28135b43f94) +- [Dev Deps] update `@types/es-value-fixtures`, `@types/for-each`, `@types/gopd`, `@types/has-property-descriptors`, `tape`, `typescript` [`7d82dfc`](https://github.com/ljharb/define-data-property/commit/7d82dfc20f778b4465bba06335dd53f6f431aea3) +- [Fix] IE 8 has a broken `Object.defineProperty` [`0672e1a`](https://github.com/ljharb/define-data-property/commit/0672e1af2a9fcc787e7c23b96dea60d290df5548) +- [meta] emit types on prepack [`73acb1f`](https://github.com/ljharb/define-data-property/commit/73acb1f903c21b314ec7156bf10f73c7910530c0) +- [Dev Deps] update `tape`, `typescript` [`9489a77`](https://github.com/ljharb/define-data-property/commit/9489a7738bf2ecf0ac71d5b78ec4ca6ad7ba0142) + +## [v1.1.0](https://github.com/ljharb/define-data-property/compare/v1.0.1...v1.1.0) - 2023-09-13 + +### Commits + +- [New] add `loose` arg [`155235a`](https://github.com/ljharb/define-data-property/commit/155235a4c4d7741f6de01cd87c99599a56654b72) +- [New] allow `null` to be passed for the non* args [`7d2fa5f`](https://github.com/ljharb/define-data-property/commit/7d2fa5f06be0392736c13b126f7cd38979f34792) + +## [v1.0.1](https://github.com/ljharb/define-data-property/compare/v1.0.0...v1.0.1) - 2023-09-12 + +### Commits + +- [meta] add TS types [`43d763c`](https://github.com/ljharb/define-data-property/commit/43d763c6c883f652de1c9c02ef6216ee507ffa69) +- [Dev Deps] update `@types/tape`, `typescript` [`f444985`](https://github.com/ljharb/define-data-property/commit/f444985811c36f3e6448a03ad2f9b7898917f4c7) +- [meta] add `safe-publish-latest`, [`172bb10`](https://github.com/ljharb/define-data-property/commit/172bb10890896ebb160e64398f6ee55760107bee) + +## v1.0.0 - 2023-09-12 + +### Commits + +- Initial implementation, tests, readme [`5b43d6b`](https://github.com/ljharb/define-data-property/commit/5b43d6b44e675a904810467a7d4e0adb7efc3196) +- Initial commit [`35e577a`](https://github.com/ljharb/define-data-property/commit/35e577a6ba59a98befa97776d70d90f3bea9009d) +- npm init [`82a0a04`](https://github.com/ljharb/define-data-property/commit/82a0a04a321ca7de220af02d41e2745e8a9962ed) +- Only apps should have lockfiles [`96df244`](https://github.com/ljharb/define-data-property/commit/96df244a3c6f426f9a2437be825d1c6f5dd7158e) +- [meta] use `npmignore` to autogenerate an npmignore file [`a87ff18`](https://github.com/ljharb/define-data-property/commit/a87ff18cb79e14c2eb5720486c4759fd9a189375) diff --git a/user-service/node_modules/define-data-property/LICENSE b/user-service/node_modules/define-data-property/LICENSE new file mode 100644 index 0000000000..b4213ac640 --- /dev/null +++ b/user-service/node_modules/define-data-property/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/user-service/node_modules/define-data-property/README.md b/user-service/node_modules/define-data-property/README.md new file mode 100644 index 0000000000..f2304daef9 --- /dev/null +++ b/user-service/node_modules/define-data-property/README.md @@ -0,0 +1,67 @@ +# define-data-property [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +Define a data property on an object. Will fall back to assignment in an engine without descriptors. + +The three `non*` argument can also be passed `null`, which will use the existing state if available. + +The `loose` argument will mean that if you attempt to set a non-normal data property, in an environment without descriptor support, it will fall back to normal assignment. + +## Usage + +```javascript +var defineDataProperty = require('define-data-property'); +var assert = require('assert'); + +var obj = {}; +defineDataProperty(obj, 'key', 'value'); +defineDataProperty( + obj, + 'key2', + 'value', + true, // nonEnumerable, optional + false, // nonWritable, optional + true, // nonConfigurable, optional + false // loose, optional +); + +assert.deepEqual( + Object.getOwnPropertyDescriptors(obj), + { + key: { + configurable: true, + enumerable: true, + value: 'value', + writable: true, + }, + key2: { + configurable: false, + enumerable: false, + value: 'value', + writable: true, + }, + } +); +``` + +[package-url]: https://npmjs.org/package/define-data-property +[npm-version-svg]: https://versionbadg.es/ljharb/define-data-property.svg +[deps-svg]: https://david-dm.org/ljharb/define-data-property.svg +[deps-url]: https://david-dm.org/ljharb/define-data-property +[dev-deps-svg]: https://david-dm.org/ljharb/define-data-property/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/define-data-property#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/define-data-property.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/define-data-property.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/define-data-property.svg +[downloads-url]: https://npm-stat.com/charts.html?package=define-data-property +[codecov-image]: https://codecov.io/gh/ljharb/define-data-property/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/define-data-property/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/define-data-property +[actions-url]: https://github.com/ljharb/define-data-property/actions diff --git a/user-service/node_modules/define-data-property/index.d.ts b/user-service/node_modules/define-data-property/index.d.ts new file mode 100644 index 0000000000..b56a77da82 --- /dev/null +++ b/user-service/node_modules/define-data-property/index.d.ts @@ -0,0 +1,12 @@ + +declare function defineDataProperty( + obj: Record, + property: keyof typeof obj, + value: typeof obj[typeof property], + nonEnumerable?: boolean | null, + nonWritable?: boolean | null, + nonConfigurable?: boolean | null, + loose?: boolean +): void; + +export = defineDataProperty; \ No newline at end of file diff --git a/user-service/node_modules/define-data-property/index.js b/user-service/node_modules/define-data-property/index.js new file mode 100644 index 0000000000..e1a38c07bb --- /dev/null +++ b/user-service/node_modules/define-data-property/index.js @@ -0,0 +1,56 @@ +'use strict'; + +var $defineProperty = require('es-define-property'); + +var $SyntaxError = require('es-errors/syntax'); +var $TypeError = require('es-errors/type'); + +var gopd = require('gopd'); + +/** @type {import('.')} */ +module.exports = function defineDataProperty( + obj, + property, + value +) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new $TypeError('`obj` must be an object or a function`'); + } + if (typeof property !== 'string' && typeof property !== 'symbol') { + throw new $TypeError('`property` must be a string or a symbol`'); + } + if (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) { + throw new $TypeError('`nonEnumerable`, if provided, must be a boolean or null'); + } + if (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) { + throw new $TypeError('`nonWritable`, if provided, must be a boolean or null'); + } + if (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) { + throw new $TypeError('`nonConfigurable`, if provided, must be a boolean or null'); + } + if (arguments.length > 6 && typeof arguments[6] !== 'boolean') { + throw new $TypeError('`loose`, if provided, must be a boolean'); + } + + var nonEnumerable = arguments.length > 3 ? arguments[3] : null; + var nonWritable = arguments.length > 4 ? arguments[4] : null; + var nonConfigurable = arguments.length > 5 ? arguments[5] : null; + var loose = arguments.length > 6 ? arguments[6] : false; + + /* @type {false | TypedPropertyDescriptor} */ + var desc = !!gopd && gopd(obj, property); + + if ($defineProperty) { + $defineProperty(obj, property, { + configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, + enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, + value: value, + writable: nonWritable === null && desc ? desc.writable : !nonWritable + }); + } else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) { + // must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable + obj[property] = value; // eslint-disable-line no-param-reassign + } else { + throw new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.'); + } +}; diff --git a/user-service/node_modules/define-data-property/package.json b/user-service/node_modules/define-data-property/package.json new file mode 100644 index 0000000000..eec40971eb --- /dev/null +++ b/user-service/node_modules/define-data-property/package.json @@ -0,0 +1,106 @@ +{ + "name": "define-data-property", + "version": "1.1.4", + "description": "Define a data property on an object. Will fall back to assignment in an engine without descriptors.", + "main": "index.js", + "types": "./index.d.ts", + "exports": { + ".": "./index.js", + "./package.json": "./package.json" + }, + "sideEffects": false, + "scripts": { + "prepack": "npmignore --auto --commentLines=autogenerated", + "prepublish": "not-in-publish || npm run prepublishOnly", + "prepublishOnly": "safe-publish-latest", + "tsc": "tsc -p .", + "prelint": "evalmd README.md", + "lint": "eslint --ext=js,mjs .", + "postlint": "npm run tsc", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "aud --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/define-data-property.git" + }, + "keywords": [ + "define", + "data", + "property", + "object", + "accessor", + "javascript", + "ecmascript", + "enumerable", + "configurable", + "writable" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/define-data-property/issues" + }, + "homepage": "https://github.com/ljharb/define-data-property#readme", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "devDependencies": { + "@ljharb/eslint-config": "^21.1.0", + "@types/call-bind": "^1.0.5", + "@types/define-properties": "^1.1.5", + "@types/es-value-fixtures": "^1.4.4", + "@types/for-each": "^0.3.3", + "@types/get-intrinsic": "^1.2.2", + "@types/gopd": "^1.0.3", + "@types/has-property-descriptors": "^1.0.3", + "@types/object-inspect": "^1.8.4", + "@types/object.getownpropertydescriptors": "^2.1.4", + "@types/tape": "^5.6.4", + "aud": "^2.0.4", + "auto-changelog": "^2.4.0", + "es-value-fixtures": "^1.4.2", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.3", + "hasown": "^2.0.1", + "in-publish": "^2.0.1", + "npmignore": "^0.3.1", + "nyc": "^10.3.2", + "object-inspect": "^1.13.1", + "object.getownpropertydescriptors": "^2.1.7", + "reflect.ownkeys": "^1.1.4", + "safe-publish-latest": "^2.0.0", + "tape": "^5.7.4", + "typescript": "next" + }, + "engines": { + "node": ">= 0.4" + }, + "testling": { + "files": "test/index.js" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows", + "types/reflect.ownkeys" + ] + } +} diff --git a/user-service/node_modules/define-data-property/test/index.js b/user-service/node_modules/define-data-property/test/index.js new file mode 100644 index 0000000000..68204c66b2 --- /dev/null +++ b/user-service/node_modules/define-data-property/test/index.js @@ -0,0 +1,392 @@ +'use strict'; + +var test = require('tape'); +var v = require('es-value-fixtures'); +var forEach = require('for-each'); +var inspect = require('object-inspect'); +var hasOwn = require('hasown'); +var hasPropertyDescriptors = require('has-property-descriptors')(); +var getOwnPropertyDescriptors = require('object.getownpropertydescriptors'); +var ownKeys = require('reflect.ownkeys'); + +var defineDataProperty = require('../'); + +test('defineDataProperty', function (t) { + t.test('argument validation', function (st) { + forEach(v.primitives, function (nonObject) { + st['throws']( + // @ts-expect-error + function () { defineDataProperty(nonObject, 'key', 'value'); }, + TypeError, + 'throws on non-object input: ' + inspect(nonObject) + ); + }); + + forEach(v.nonPropertyKeys, function (nonPropertyKey) { + st['throws']( + // @ts-expect-error + function () { defineDataProperty({}, nonPropertyKey, 'value'); }, + TypeError, + 'throws on non-PropertyKey input: ' + inspect(nonPropertyKey) + ); + }); + + forEach(v.nonBooleans, function (nonBoolean) { + if (nonBoolean !== null) { + st['throws']( + // @ts-expect-error + function () { defineDataProperty({}, 'key', 'value', nonBoolean); }, + TypeError, + 'throws on non-boolean nonEnumerable: ' + inspect(nonBoolean) + ); + + st['throws']( + // @ts-expect-error + function () { defineDataProperty({}, 'key', 'value', false, nonBoolean); }, + TypeError, + 'throws on non-boolean nonWritable: ' + inspect(nonBoolean) + ); + + st['throws']( + // @ts-expect-error + function () { defineDataProperty({}, 'key', 'value', false, false, nonBoolean); }, + TypeError, + 'throws on non-boolean nonConfigurable: ' + inspect(nonBoolean) + ); + } + }); + + st.end(); + }); + + t.test('normal data property', function (st) { + /** @type {Record} */ + var obj = { existing: 'existing property' }; + st.ok(hasOwn(obj, 'existing'), 'has initial own property'); + st.equal(obj.existing, 'existing property', 'has expected initial value'); + + var res = defineDataProperty(obj, 'added', 'added property'); + st.equal(res, void undefined, 'returns `undefined`'); + st.ok(hasOwn(obj, 'added'), 'has expected own property'); + st.equal(obj.added, 'added property', 'has expected value'); + + defineDataProperty(obj, 'existing', 'new value'); + st.ok(hasOwn(obj, 'existing'), 'still has expected own property'); + st.equal(obj.existing, 'new value', 'has new expected value'); + + defineDataProperty(obj, 'explicit1', 'new value', false); + st.ok(hasOwn(obj, 'explicit1'), 'has expected own property (explicit enumerable)'); + st.equal(obj.explicit1, 'new value', 'has new expected value (explicit enumerable)'); + + defineDataProperty(obj, 'explicit2', 'new value', false, false); + st.ok(hasOwn(obj, 'explicit2'), 'has expected own property (explicit writable)'); + st.equal(obj.explicit2, 'new value', 'has new expected value (explicit writable)'); + + defineDataProperty(obj, 'explicit3', 'new value', false, false, false); + st.ok(hasOwn(obj, 'explicit3'), 'has expected own property (explicit configurable)'); + st.equal(obj.explicit3, 'new value', 'has new expected value (explicit configurable)'); + + st.end(); + }); + + t.test('loose mode', { skip: !hasPropertyDescriptors }, function (st) { + var obj = { existing: 'existing property' }; + + defineDataProperty(obj, 'added', 'added value 1', true, null, null, true); + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + existing: { + configurable: true, + enumerable: true, + value: 'existing property', + writable: true + }, + added: { + configurable: true, + enumerable: !hasPropertyDescriptors, + value: 'added value 1', + writable: true + } + }, + 'in loose mode, obj still adds property 1' + ); + + defineDataProperty(obj, 'added', 'added value 2', false, true, null, true); + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + existing: { + configurable: true, + enumerable: true, + value: 'existing property', + writable: true + }, + added: { + configurable: true, + enumerable: true, + value: 'added value 2', + writable: !hasPropertyDescriptors + } + }, + 'in loose mode, obj still adds property 2' + ); + + defineDataProperty(obj, 'added', 'added value 3', false, false, true, true); + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + existing: { + configurable: true, + enumerable: true, + value: 'existing property', + writable: true + }, + added: { + configurable: !hasPropertyDescriptors, + enumerable: true, + value: 'added value 3', + writable: true + } + }, + 'in loose mode, obj still adds property 3' + ); + + st.end(); + }); + + t.test('non-normal data property, ES3', { skip: hasPropertyDescriptors }, function (st) { + /** @type {Record} */ + var obj = { existing: 'existing property' }; + + st['throws']( + function () { defineDataProperty(obj, 'added', 'added value', true); }, + SyntaxError, + 'nonEnumerable throws a Syntax Error' + ); + + st['throws']( + function () { defineDataProperty(obj, 'added', 'added value', false, true); }, + SyntaxError, + 'nonWritable throws a Syntax Error' + ); + + st['throws']( + function () { defineDataProperty(obj, 'added', 'added value', false, false, true); }, + SyntaxError, + 'nonWritable throws a Syntax Error' + ); + + st.deepEqual( + ownKeys(obj), + ['existing'], + 'obj still has expected keys' + ); + st.equal(obj.existing, 'existing property', 'obj still has expected values'); + + st.end(); + }); + + t.test('new non-normal data property, ES5+', { skip: !hasPropertyDescriptors }, function (st) { + /** @type {Record} */ + var obj = { existing: 'existing property' }; + + defineDataProperty(obj, 'nonEnum', null, true); + defineDataProperty(obj, 'nonWrit', null, false, true); + defineDataProperty(obj, 'nonConf', null, false, false, true); + + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + existing: { + configurable: true, + enumerable: true, + value: 'existing property', + writable: true + }, + nonEnum: { + configurable: true, + enumerable: false, + value: null, + writable: true + }, + nonWrit: { + configurable: true, + enumerable: true, + value: null, + writable: false + }, + nonConf: { + configurable: false, + enumerable: true, + value: null, + writable: true + } + }, + 'obj has expected property descriptors' + ); + + st.end(); + }); + + t.test('existing non-normal data property, ES5+', { skip: !hasPropertyDescriptors }, function (st) { + // test case changing an existing non-normal property + + /** @type {Record} */ + var obj = {}; + Object.defineProperty(obj, 'nonEnum', { configurable: true, enumerable: false, value: null, writable: true }); + Object.defineProperty(obj, 'nonWrit', { configurable: true, enumerable: true, value: null, writable: false }); + Object.defineProperty(obj, 'nonConf', { configurable: false, enumerable: true, value: null, writable: true }); + + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + nonEnum: { + configurable: true, + enumerable: false, + value: null, + writable: true + }, + nonWrit: { + configurable: true, + enumerable: true, + value: null, + writable: false + }, + nonConf: { + configurable: false, + enumerable: true, + value: null, + writable: true + } + }, + 'obj initially has expected property descriptors' + ); + + defineDataProperty(obj, 'nonEnum', 'new value', false); + defineDataProperty(obj, 'nonWrit', 'new value', false, false); + st['throws']( + function () { defineDataProperty(obj, 'nonConf', 'new value', false, false, false); }, + TypeError, + 'can not alter a nonconfigurable property' + ); + + st.deepEqual( + getOwnPropertyDescriptors(obj), + { + nonEnum: { + configurable: true, + enumerable: true, + value: 'new value', + writable: true + }, + nonWrit: { + configurable: true, + enumerable: true, + value: 'new value', + writable: true + }, + nonConf: { + configurable: false, + enumerable: true, + value: null, + writable: true + } + }, + 'obj ends up with expected property descriptors' + ); + + st.end(); + }); + + t.test('frozen object, ES5+', { skip: !hasPropertyDescriptors }, function (st) { + var frozen = Object.freeze({ existing: true }); + + st['throws']( + function () { defineDataProperty(frozen, 'existing', 'new value'); }, + TypeError, + 'frozen object can not modify an existing property' + ); + + st['throws']( + function () { defineDataProperty(frozen, 'new', 'new property'); }, + TypeError, + 'frozen object can not add a new property' + ); + + st.end(); + }); + + t.test('sealed object, ES5+', { skip: !hasPropertyDescriptors }, function (st) { + var sealed = Object.seal({ existing: true }); + st.deepEqual( + Object.getOwnPropertyDescriptor(sealed, 'existing'), + { + configurable: false, + enumerable: true, + value: true, + writable: true + }, + 'existing value on sealed object has expected descriptor' + ); + + defineDataProperty(sealed, 'existing', 'new value'); + + st.deepEqual( + Object.getOwnPropertyDescriptor(sealed, 'existing'), + { + configurable: false, + enumerable: true, + value: 'new value', + writable: true + }, + 'existing value on sealed object has changed descriptor' + ); + + st['throws']( + function () { defineDataProperty(sealed, 'new', 'new property'); }, + TypeError, + 'sealed object can not add a new property' + ); + + st.end(); + }); + + t.test('nonextensible object, ES5+', { skip: !hasPropertyDescriptors }, function (st) { + var nonExt = Object.preventExtensions({ existing: true }); + + st.deepEqual( + Object.getOwnPropertyDescriptor(nonExt, 'existing'), + { + configurable: true, + enumerable: true, + value: true, + writable: true + }, + 'existing value on non-extensible object has expected descriptor' + ); + + defineDataProperty(nonExt, 'existing', 'new value', true); + + st.deepEqual( + Object.getOwnPropertyDescriptor(nonExt, 'existing'), + { + configurable: true, + enumerable: false, + value: 'new value', + writable: true + }, + 'existing value on non-extensible object has changed descriptor' + ); + + st['throws']( + function () { defineDataProperty(nonExt, 'new', 'new property'); }, + TypeError, + 'non-extensible object can not add a new property' + ); + + st.end(); + }); + + t.end(); +}); diff --git a/user-service/node_modules/define-data-property/tsconfig.json b/user-service/node_modules/define-data-property/tsconfig.json new file mode 100644 index 0000000000..69f060dccd --- /dev/null +++ b/user-service/node_modules/define-data-property/tsconfig.json @@ -0,0 +1,59 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + + /* Language and Environment */ + "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "typeRoots": ["types"], /* Specify multiple folders that act like './node_modules/@types'. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "noEmit": true, /* Disable emitting files from a compilation. */ + + /* Interop Constraints */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + + /* Completeness */ + // "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": [ + "coverage" + ] +} diff --git a/user-service/node_modules/delegates/.npmignore b/user-service/node_modules/delegates/.npmignore new file mode 100644 index 0000000000..c2658d7d1b --- /dev/null +++ b/user-service/node_modules/delegates/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/user-service/node_modules/delegates/History.md b/user-service/node_modules/delegates/History.md new file mode 100644 index 0000000000..25959eab67 --- /dev/null +++ b/user-service/node_modules/delegates/History.md @@ -0,0 +1,22 @@ + +1.0.0 / 2015-12-14 +================== + + * Merge pull request #12 from kasicka/master + * Add license text + +0.1.0 / 2014-10-17 +================== + + * adds `.fluent()` to api + +0.0.3 / 2014-01-13 +================== + + * fix receiver for .method() + +0.0.2 / 2014-01-13 +================== + + * Object.defineProperty() sucks + * Initial commit diff --git a/user-service/node_modules/delegates/License b/user-service/node_modules/delegates/License new file mode 100644 index 0000000000..60de60addb --- /dev/null +++ b/user-service/node_modules/delegates/License @@ -0,0 +1,20 @@ +Copyright (c) 2015 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/delegates/Makefile b/user-service/node_modules/delegates/Makefile new file mode 100644 index 0000000000..a9dcfd50db --- /dev/null +++ b/user-service/node_modules/delegates/Makefile @@ -0,0 +1,8 @@ + +test: + @./node_modules/.bin/mocha \ + --require should \ + --reporter spec \ + --bail + +.PHONY: test \ No newline at end of file diff --git a/user-service/node_modules/delegates/Readme.md b/user-service/node_modules/delegates/Readme.md new file mode 100644 index 0000000000..ab8cf4ace1 --- /dev/null +++ b/user-service/node_modules/delegates/Readme.md @@ -0,0 +1,94 @@ + +# delegates + + Node method and accessor delegation utilty. + +## Installation + +``` +$ npm install delegates +``` + +## Example + +```js +var delegate = require('delegates'); + +... + +delegate(proto, 'request') + .method('acceptsLanguages') + .method('acceptsEncodings') + .method('acceptsCharsets') + .method('accepts') + .method('is') + .access('querystring') + .access('idempotent') + .access('socket') + .access('length') + .access('query') + .access('search') + .access('status') + .access('method') + .access('path') + .access('body') + .access('host') + .access('url') + .getter('subdomains') + .getter('protocol') + .getter('header') + .getter('stale') + .getter('fresh') + .getter('secure') + .getter('ips') + .getter('ip') +``` + +# API + +## Delegate(proto, prop) + +Creates a delegator instance used to configure using the `prop` on the given +`proto` object. (which is usually a prototype) + +## Delegate#method(name) + +Allows the given method `name` to be accessed on the host. + +## Delegate#getter(name) + +Creates a "getter" for the property with the given `name` on the delegated +object. + +## Delegate#setter(name) + +Creates a "setter" for the property with the given `name` on the delegated +object. + +## Delegate#access(name) + +Creates an "accessor" (ie: both getter *and* setter) for the property with the +given `name` on the delegated object. + +## Delegate#fluent(name) + +A unique type of "accessor" that works for a "fluent" API. When called as a +getter, the method returns the expected value. However, if the method is called +with a value, it will return itself so it can be chained. For example: + +```js +delegate(proto, 'request') + .fluent('query') + +// getter +var q = request.query(); + +// setter (chainable) +request + .query({ a: 1 }) + .query({ b: 2 }); +``` + +# License + + MIT diff --git a/user-service/node_modules/delegates/index.js b/user-service/node_modules/delegates/index.js new file mode 100644 index 0000000000..17c222d529 --- /dev/null +++ b/user-service/node_modules/delegates/index.js @@ -0,0 +1,121 @@ + +/** + * Expose `Delegator`. + */ + +module.exports = Delegator; + +/** + * Initialize a delegator. + * + * @param {Object} proto + * @param {String} target + * @api public + */ + +function Delegator(proto, target) { + if (!(this instanceof Delegator)) return new Delegator(proto, target); + this.proto = proto; + this.target = target; + this.methods = []; + this.getters = []; + this.setters = []; + this.fluents = []; +} + +/** + * Delegate method `name`. + * + * @param {String} name + * @return {Delegator} self + * @api public + */ + +Delegator.prototype.method = function(name){ + var proto = this.proto; + var target = this.target; + this.methods.push(name); + + proto[name] = function(){ + return this[target][name].apply(this[target], arguments); + }; + + return this; +}; + +/** + * Delegator accessor `name`. + * + * @param {String} name + * @return {Delegator} self + * @api public + */ + +Delegator.prototype.access = function(name){ + return this.getter(name).setter(name); +}; + +/** + * Delegator getter `name`. + * + * @param {String} name + * @return {Delegator} self + * @api public + */ + +Delegator.prototype.getter = function(name){ + var proto = this.proto; + var target = this.target; + this.getters.push(name); + + proto.__defineGetter__(name, function(){ + return this[target][name]; + }); + + return this; +}; + +/** + * Delegator setter `name`. + * + * @param {String} name + * @return {Delegator} self + * @api public + */ + +Delegator.prototype.setter = function(name){ + var proto = this.proto; + var target = this.target; + this.setters.push(name); + + proto.__defineSetter__(name, function(val){ + return this[target][name] = val; + }); + + return this; +}; + +/** + * Delegator fluent accessor + * + * @param {String} name + * @return {Delegator} self + * @api public + */ + +Delegator.prototype.fluent = function (name) { + var proto = this.proto; + var target = this.target; + this.fluents.push(name); + + proto[name] = function(val){ + if ('undefined' != typeof val) { + this[target][name] = val; + return this; + } else { + return this[target][name]; + } + }; + + return this; +}; diff --git a/user-service/node_modules/delegates/package.json b/user-service/node_modules/delegates/package.json new file mode 100644 index 0000000000..17240384fd --- /dev/null +++ b/user-service/node_modules/delegates/package.json @@ -0,0 +1,13 @@ +{ + "name": "delegates", + "version": "1.0.0", + "repository": "visionmedia/node-delegates", + "description": "delegate methods and accessors to another property", + "keywords": ["delegate", "delegation"], + "dependencies": {}, + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "license": "MIT" +} diff --git a/user-service/node_modules/delegates/test/index.js b/user-service/node_modules/delegates/test/index.js new file mode 100644 index 0000000000..7b6e3d4df1 --- /dev/null +++ b/user-service/node_modules/delegates/test/index.js @@ -0,0 +1,94 @@ + +var assert = require('assert'); +var delegate = require('..'); + +describe('.method(name)', function(){ + it('should delegate methods', function(){ + var obj = {}; + + obj.request = { + foo: function(bar){ + assert(this == obj.request); + return bar; + } + }; + + delegate(obj, 'request').method('foo'); + + obj.foo('something').should.equal('something'); + }) +}) + +describe('.getter(name)', function(){ + it('should delegate getters', function(){ + var obj = {}; + + obj.request = { + get type() { + return 'text/html'; + } + } + + delegate(obj, 'request').getter('type'); + + obj.type.should.equal('text/html'); + }) +}) + +describe('.setter(name)', function(){ + it('should delegate setters', function(){ + var obj = {}; + + obj.request = { + get type() { + return this._type.toUpperCase(); + }, + + set type(val) { + this._type = val; + } + } + + delegate(obj, 'request').setter('type'); + + obj.type = 'hey'; + obj.request.type.should.equal('HEY'); + }) +}) + +describe('.access(name)', function(){ + it('should delegate getters and setters', function(){ + var obj = {}; + + obj.request = { + get type() { + return this._type.toUpperCase(); + }, + + set type(val) { + this._type = val; + } + } + + delegate(obj, 'request').access('type'); + + obj.type = 'hey'; + obj.type.should.equal('HEY'); + }) +}) + +describe('.fluent(name)', function () { + it('should delegate in a fluent fashion', function () { + var obj = { + settings: { + env: 'development' + } + }; + + delegate(obj, 'settings').fluent('env'); + + obj.env().should.equal('development'); + obj.env('production').should.equal(obj); + obj.settings.env.should.equal('production'); + }) +}) diff --git a/user-service/node_modules/depd/History.md b/user-service/node_modules/depd/History.md new file mode 100644 index 0000000000..cd9ebaaa99 --- /dev/null +++ b/user-service/node_modules/depd/History.md @@ -0,0 +1,103 @@ +2.0.0 / 2018-10-26 +================== + + * Drop support for Node.js 0.6 + * Replace internal `eval` usage with `Function` constructor + * Use instance methods on `process` to check for listeners + +1.1.2 / 2018-01-11 +================== + + * perf: remove argument reassignment + * Support Node.js 0.6 to 9.x + +1.1.1 / 2017-07-27 +================== + + * Remove unnecessary `Buffer` loading + * Support Node.js 0.6 to 8.x + +1.1.0 / 2015-09-14 +================== + + * Enable strict mode in more places + * Support io.js 3.x + * Support io.js 2.x + * Support web browser loading + - Requires bundler like Browserify or webpack + +1.0.1 / 2015-04-07 +================== + + * Fix `TypeError`s when under `'use strict'` code + * Fix useless type name on auto-generated messages + * Support io.js 1.x + * Support Node.js 0.12 + +1.0.0 / 2014-09-17 +================== + + * No changes + +0.4.5 / 2014-09-09 +================== + + * Improve call speed to functions using the function wrapper + * Support Node.js 0.6 + +0.4.4 / 2014-07-27 +================== + + * Work-around v8 generating empty stack traces + +0.4.3 / 2014-07-26 +================== + + * Fix exception when global `Error.stackTraceLimit` is too low + +0.4.2 / 2014-07-19 +================== + + * Correct call site for wrapped functions and properties + +0.4.1 / 2014-07-19 +================== + + * Improve automatic message generation for function properties + +0.4.0 / 2014-07-19 +================== + + * Add `TRACE_DEPRECATION` environment variable + * Remove non-standard grey color from color output + * Support `--no-deprecation` argument + * Support `--trace-deprecation` argument + * Support `deprecate.property(fn, prop, message)` + +0.3.0 / 2014-06-16 +================== + + * Add `NO_DEPRECATION` environment variable + +0.2.0 / 2014-06-15 +================== + + * Add `deprecate.property(obj, prop, message)` + * Remove `supports-color` dependency for node.js 0.8 + +0.1.0 / 2014-06-15 +================== + + * Add `deprecate.function(fn, message)` + * Add `process.on('deprecation', fn)` emitter + * Automatically generate message when omitted from `deprecate()` + +0.0.1 / 2014-06-15 +================== + + * Fix warning for dynamic calls at singe call site + +0.0.0 / 2014-06-15 +================== + + * Initial implementation diff --git a/user-service/node_modules/depd/LICENSE b/user-service/node_modules/depd/LICENSE new file mode 100644 index 0000000000..248de7af2b --- /dev/null +++ b/user-service/node_modules/depd/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2018 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/user-service/node_modules/depd/Readme.md b/user-service/node_modules/depd/Readme.md new file mode 100644 index 0000000000..043d1ca284 --- /dev/null +++ b/user-service/node_modules/depd/Readme.md @@ -0,0 +1,280 @@ +# depd + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Linux Build][travis-image]][travis-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Deprecate all the things + +> With great modules comes great responsibility; mark things deprecated! + +## Install + +This module is installed directly using `npm`: + +```sh +$ npm install depd +``` + +This module can also be bundled with systems like +[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/), +though by default this module will alter it's API to no longer display or +track deprecations. + +## API + + + +```js +var deprecate = require('depd')('my-module') +``` + +This library allows you to display deprecation messages to your users. +This library goes above and beyond with deprecation warnings by +introspection of the call stack (but only the bits that it is interested +in). + +Instead of just warning on the first invocation of a deprecated +function and never again, this module will warn on the first invocation +of a deprecated function per unique call site, making it ideal to alert +users of all deprecated uses across the code base, rather than just +whatever happens to execute first. + +The deprecation warnings from this module also include the file and line +information for the call into the module that the deprecated function was +in. + +**NOTE** this library has a similar interface to the `debug` module, and +this module uses the calling file to get the boundary for the call stacks, +so you should always create a new `deprecate` object in each file and not +within some central file. + +### depd(namespace) + +Create a new deprecate function that uses the given namespace name in the +messages and will display the call site prior to the stack entering the +file this function was called from. It is highly suggested you use the +name of your module as the namespace. + +### deprecate(message) + +Call this function from deprecated code to display a deprecation message. +This message will appear once per unique caller site. Caller site is the +first call site in the stack in a different file from the caller of this +function. + +If the message is omitted, a message is generated for you based on the site +of the `deprecate()` call and will display the name of the function called, +similar to the name displayed in a stack trace. + +### deprecate.function(fn, message) + +Call this function to wrap a given function in a deprecation message on any +call to the function. An optional message can be supplied to provide a custom +message. + +### deprecate.property(obj, prop, message) + +Call this function to wrap a given property on object in a deprecation message +on any accessing or setting of the property. An optional message can be supplied +to provide a custom message. + +The method must be called on the object where the property belongs (not +inherited from the prototype). + +If the property is a data descriptor, it will be converted to an accessor +descriptor in order to display the deprecation message. + +### process.on('deprecation', fn) + +This module will allow easy capturing of deprecation errors by emitting the +errors as the type "deprecation" on the global `process`. If there are no +listeners for this type, the errors are written to STDERR as normal, but if +there are any listeners, nothing will be written to STDERR and instead only +emitted. From there, you can write the errors in a different format or to a +logging source. + +The error represents the deprecation and is emitted only once with the same +rules as writing to STDERR. The error has the following properties: + + - `message` - This is the message given by the library + - `name` - This is always `'DeprecationError'` + - `namespace` - This is the namespace the deprecation came from + - `stack` - This is the stack of the call to the deprecated thing + +Example `error.stack` output: + +``` +DeprecationError: my-cool-module deprecated oldfunction + at Object. ([eval]-wrapper:6:22) + at Module._compile (module.js:456:26) + at evalScript (node.js:532:25) + at startup (node.js:80:7) + at node.js:902:3 +``` + +### process.env.NO_DEPRECATION + +As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` +is provided as a quick solution to silencing deprecation warnings from being +output. The format of this is similar to that of `DEBUG`: + +```sh +$ NO_DEPRECATION=my-module,othermod node app.js +``` + +This will suppress deprecations from being output for "my-module" and "othermod". +The value is a list of comma-separated namespaces. To suppress every warning +across all namespaces, use the value `*` for a namespace. + +Providing the argument `--no-deprecation` to the `node` executable will suppress +all deprecations (only available in Node.js 0.8 or higher). + +**NOTE** This will not suppress the deperecations given to any "deprecation" +event listeners, just the output to STDERR. + +### process.env.TRACE_DEPRECATION + +As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` +is provided as a solution to getting more detailed location information in deprecation +warnings by including the entire stack trace. The format of this is the same as +`NO_DEPRECATION`: + +```sh +$ TRACE_DEPRECATION=my-module,othermod node app.js +``` + +This will include stack traces for deprecations being output for "my-module" and +"othermod". The value is a list of comma-separated namespaces. To trace every +warning across all namespaces, use the value `*` for a namespace. + +Providing the argument `--trace-deprecation` to the `node` executable will trace +all deprecations (only available in Node.js 0.8 or higher). + +**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. + +## Display + +![message](files/message.png) + +When a user calls a function in your library that you mark deprecated, they +will see the following written to STDERR (in the given colors, similar colors +and layout to the `debug` module): + +``` +bright cyan bright yellow +| | reset cyan +| | | | +▼ ▼ ▼ ▼ +my-cool-module deprecated oldfunction [eval]-wrapper:6:22 +▲ ▲ ▲ ▲ +| | | | +namespace | | location of mycoolmod.oldfunction() call + | deprecation message + the word "deprecated" +``` + +If the user redirects their STDERR to a file or somewhere that does not support +colors, they see (similar layout to the `debug` module): + +``` +Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 +▲ ▲ ▲ ▲ ▲ +| | | | | +timestamp of message namespace | | location of mycoolmod.oldfunction() call + | deprecation message + the word "deprecated" +``` + +## Examples + +### Deprecating all calls to a function + +This will display a deprecated message about "oldfunction" being deprecated +from "my-module" on STDERR. + +```js +var deprecate = require('depd')('my-cool-module') + +// message automatically derived from function name +// Object.oldfunction +exports.oldfunction = deprecate.function(function oldfunction () { + // all calls to function are deprecated +}) + +// specific message +exports.oldfunction = deprecate.function(function () { + // all calls to function are deprecated +}, 'oldfunction') +``` + +### Conditionally deprecating a function call + +This will display a deprecated message about "weirdfunction" being deprecated +from "my-module" on STDERR when called with less than 2 arguments. + +```js +var deprecate = require('depd')('my-cool-module') + +exports.weirdfunction = function () { + if (arguments.length < 2) { + // calls with 0 or 1 args are deprecated + deprecate('weirdfunction args < 2') + } +} +``` + +When calling `deprecate` as a function, the warning is counted per call site +within your own module, so you can display different deprecations depending +on different situations and the users will still get all the warnings: + +```js +var deprecate = require('depd')('my-cool-module') + +exports.weirdfunction = function () { + if (arguments.length < 2) { + // calls with 0 or 1 args are deprecated + deprecate('weirdfunction args < 2') + } else if (typeof arguments[0] !== 'string') { + // calls with non-string first argument are deprecated + deprecate('weirdfunction non-string first arg') + } +} +``` + +### Deprecating property access + +This will display a deprecated message about "oldprop" being deprecated +from "my-module" on STDERR when accessed. A deprecation will be displayed +when setting the value and when getting the value. + +```js +var deprecate = require('depd')('my-cool-module') + +exports.oldprop = 'something' + +// message automatically derives from property name +deprecate.property(exports, 'oldprop') + +// explicit message +deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') +``` + +## License + +[MIT](LICENSE) + +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/nodejs-depd/master?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd +[coveralls-image]: https://badgen.net/coveralls/c/github/dougwilson/nodejs-depd/master +[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master +[node-image]: https://badgen.net/npm/node/depd +[node-url]: https://nodejs.org/en/download/ +[npm-downloads-image]: https://badgen.net/npm/dm/depd +[npm-url]: https://npmjs.org/package/depd +[npm-version-image]: https://badgen.net/npm/v/depd +[travis-image]: https://badgen.net/travis/dougwilson/nodejs-depd/master?label=linux +[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd diff --git a/user-service/node_modules/depd/index.js b/user-service/node_modules/depd/index.js new file mode 100644 index 0000000000..1bf2fcfdef --- /dev/null +++ b/user-service/node_modules/depd/index.js @@ -0,0 +1,538 @@ +/*! + * depd + * Copyright(c) 2014-2018 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var relative = require('path').relative + +/** + * Module exports. + */ + +module.exports = depd + +/** + * Get the path to base files on. + */ + +var basePath = process.cwd() + +/** + * Determine if namespace is contained in the string. + */ + +function containsNamespace (str, namespace) { + var vals = str.split(/[ ,]+/) + var ns = String(namespace).toLowerCase() + + for (var i = 0; i < vals.length; i++) { + var val = vals[i] + + // namespace contained + if (val && (val === '*' || val.toLowerCase() === ns)) { + return true + } + } + + return false +} + +/** + * Convert a data descriptor to accessor descriptor. + */ + +function convertDataDescriptorToAccessor (obj, prop, message) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + var value = descriptor.value + + descriptor.get = function getter () { return value } + + if (descriptor.writable) { + descriptor.set = function setter (val) { return (value = val) } + } + + delete descriptor.value + delete descriptor.writable + + Object.defineProperty(obj, prop, descriptor) + + return descriptor +} + +/** + * Create arguments string to keep arity. + */ + +function createArgumentsString (arity) { + var str = '' + + for (var i = 0; i < arity; i++) { + str += ', arg' + i + } + + return str.substr(2) +} + +/** + * Create stack string from stack. + */ + +function createStackString (stack) { + var str = this.name + ': ' + this.namespace + + if (this.message) { + str += ' deprecated ' + this.message + } + + for (var i = 0; i < stack.length; i++) { + str += '\n at ' + stack[i].toString() + } + + return str +} + +/** + * Create deprecate for namespace in caller. + */ + +function depd (namespace) { + if (!namespace) { + throw new TypeError('argument namespace is required') + } + + var stack = getStack() + var site = callSiteLocation(stack[1]) + var file = site[0] + + function deprecate (message) { + // call to self as log + log.call(deprecate, message) + } + + deprecate._file = file + deprecate._ignored = isignored(namespace) + deprecate._namespace = namespace + deprecate._traced = istraced(namespace) + deprecate._warned = Object.create(null) + + deprecate.function = wrapfunction + deprecate.property = wrapproperty + + return deprecate +} + +/** + * Determine if event emitter has listeners of a given type. + * + * The way to do this check is done three different ways in Node.js >= 0.8 + * so this consolidates them into a minimal set using instance methods. + * + * @param {EventEmitter} emitter + * @param {string} type + * @returns {boolean} + * @private + */ + +function eehaslisteners (emitter, type) { + var count = typeof emitter.listenerCount !== 'function' + ? emitter.listeners(type).length + : emitter.listenerCount(type) + + return count > 0 +} + +/** + * Determine if namespace is ignored. + */ + +function isignored (namespace) { + if (process.noDeprecation) { + // --no-deprecation support + return true + } + + var str = process.env.NO_DEPRECATION || '' + + // namespace ignored + return containsNamespace(str, namespace) +} + +/** + * Determine if namespace is traced. + */ + +function istraced (namespace) { + if (process.traceDeprecation) { + // --trace-deprecation support + return true + } + + var str = process.env.TRACE_DEPRECATION || '' + + // namespace traced + return containsNamespace(str, namespace) +} + +/** + * Display deprecation message. + */ + +function log (message, site) { + var haslisteners = eehaslisteners(process, 'deprecation') + + // abort early if no destination + if (!haslisteners && this._ignored) { + return + } + + var caller + var callFile + var callSite + var depSite + var i = 0 + var seen = false + var stack = getStack() + var file = this._file + + if (site) { + // provided site + depSite = site + callSite = callSiteLocation(stack[1]) + callSite.name = depSite.name + file = callSite[0] + } else { + // get call site + i = 2 + depSite = callSiteLocation(stack[i]) + callSite = depSite + } + + // get caller of deprecated thing in relation to file + for (; i < stack.length; i++) { + caller = callSiteLocation(stack[i]) + callFile = caller[0] + + if (callFile === file) { + seen = true + } else if (callFile === this._file) { + file = this._file + } else if (seen) { + break + } + } + + var key = caller + ? depSite.join(':') + '__' + caller.join(':') + : undefined + + if (key !== undefined && key in this._warned) { + // already warned + return + } + + this._warned[key] = true + + // generate automatic message from call site + var msg = message + if (!msg) { + msg = callSite === depSite || !callSite.name + ? defaultMessage(depSite) + : defaultMessage(callSite) + } + + // emit deprecation if listeners exist + if (haslisteners) { + var err = DeprecationError(this._namespace, msg, stack.slice(i)) + process.emit('deprecation', err) + return + } + + // format and write message + var format = process.stderr.isTTY + ? formatColor + : formatPlain + var output = format.call(this, msg, caller, stack.slice(i)) + process.stderr.write(output + '\n', 'utf8') +} + +/** + * Get call site location as array. + */ + +function callSiteLocation (callSite) { + var file = callSite.getFileName() || '' + var line = callSite.getLineNumber() + var colm = callSite.getColumnNumber() + + if (callSite.isEval()) { + file = callSite.getEvalOrigin() + ', ' + file + } + + var site = [file, line, colm] + + site.callSite = callSite + site.name = callSite.getFunctionName() + + return site +} + +/** + * Generate a default message from the site. + */ + +function defaultMessage (site) { + var callSite = site.callSite + var funcName = site.name + + // make useful anonymous name + if (!funcName) { + funcName = '' + } + + var context = callSite.getThis() + var typeName = context && callSite.getTypeName() + + // ignore useless type name + if (typeName === 'Object') { + typeName = undefined + } + + // make useful type name + if (typeName === 'Function') { + typeName = context.name || typeName + } + + return typeName && callSite.getMethodName() + ? typeName + '.' + funcName + : funcName +} + +/** + * Format deprecation message without color. + */ + +function formatPlain (msg, caller, stack) { + var timestamp = new Date().toUTCString() + + var formatted = timestamp + + ' ' + this._namespace + + ' deprecated ' + msg + + // add stack trace + if (this._traced) { + for (var i = 0; i < stack.length; i++) { + formatted += '\n at ' + stack[i].toString() + } + + return formatted + } + + if (caller) { + formatted += ' at ' + formatLocation(caller) + } + + return formatted +} + +/** + * Format deprecation message with color. + */ + +function formatColor (msg, caller, stack) { + var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan + ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow + ' \x1b[0m' + msg + '\x1b[39m' // reset + + // add stack trace + if (this._traced) { + for (var i = 0; i < stack.length; i++) { + formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan + } + + return formatted + } + + if (caller) { + formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan + } + + return formatted +} + +/** + * Format call site location. + */ + +function formatLocation (callSite) { + return relative(basePath, callSite[0]) + + ':' + callSite[1] + + ':' + callSite[2] +} + +/** + * Get the stack as array of call sites. + */ + +function getStack () { + var limit = Error.stackTraceLimit + var obj = {} + var prep = Error.prepareStackTrace + + Error.prepareStackTrace = prepareObjectStackTrace + Error.stackTraceLimit = Math.max(10, limit) + + // capture the stack + Error.captureStackTrace(obj) + + // slice this function off the top + var stack = obj.stack.slice(1) + + Error.prepareStackTrace = prep + Error.stackTraceLimit = limit + + return stack +} + +/** + * Capture call site stack from v8. + */ + +function prepareObjectStackTrace (obj, stack) { + return stack +} + +/** + * Return a wrapped function in a deprecation message. + */ + +function wrapfunction (fn, message) { + if (typeof fn !== 'function') { + throw new TypeError('argument fn must be a function') + } + + var args = createArgumentsString(fn.length) + var stack = getStack() + var site = callSiteLocation(stack[1]) + + site.name = fn.name + + // eslint-disable-next-line no-new-func + var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site', + '"use strict"\n' + + 'return function (' + args + ') {' + + 'log.call(deprecate, message, site)\n' + + 'return fn.apply(this, arguments)\n' + + '}')(fn, log, this, message, site) + + return deprecatedfn +} + +/** + * Wrap property in a deprecation message. + */ + +function wrapproperty (obj, prop, message) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new TypeError('argument obj must be object') + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + + if (!descriptor) { + throw new TypeError('must call property on owner object') + } + + if (!descriptor.configurable) { + throw new TypeError('property must be configurable') + } + + var deprecate = this + var stack = getStack() + var site = callSiteLocation(stack[1]) + + // set site name + site.name = prop + + // convert data descriptor + if ('value' in descriptor) { + descriptor = convertDataDescriptorToAccessor(obj, prop, message) + } + + var get = descriptor.get + var set = descriptor.set + + // wrap getter + if (typeof get === 'function') { + descriptor.get = function getter () { + log.call(deprecate, message, site) + return get.apply(this, arguments) + } + } + + // wrap setter + if (typeof set === 'function') { + descriptor.set = function setter () { + log.call(deprecate, message, site) + return set.apply(this, arguments) + } + } + + Object.defineProperty(obj, prop, descriptor) +} + +/** + * Create DeprecationError for deprecation + */ + +function DeprecationError (namespace, message, stack) { + var error = new Error() + var stackString + + Object.defineProperty(error, 'constructor', { + value: DeprecationError + }) + + Object.defineProperty(error, 'message', { + configurable: true, + enumerable: false, + value: message, + writable: true + }) + + Object.defineProperty(error, 'name', { + enumerable: false, + configurable: true, + value: 'DeprecationError', + writable: true + }) + + Object.defineProperty(error, 'namespace', { + configurable: true, + enumerable: false, + value: namespace, + writable: true + }) + + Object.defineProperty(error, 'stack', { + configurable: true, + enumerable: false, + get: function () { + if (stackString !== undefined) { + return stackString + } + + // prepare stack trace + return (stackString = createStackString.call(this, stack)) + }, + set: function setter (val) { + stackString = val + } + }) + + return error +} diff --git a/user-service/node_modules/depd/lib/browser/index.js b/user-service/node_modules/depd/lib/browser/index.js new file mode 100644 index 0000000000..6be45cc20b --- /dev/null +++ b/user-service/node_modules/depd/lib/browser/index.js @@ -0,0 +1,77 @@ +/*! + * depd + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = depd + +/** + * Create deprecate for namespace in caller. + */ + +function depd (namespace) { + if (!namespace) { + throw new TypeError('argument namespace is required') + } + + function deprecate (message) { + // no-op in browser + } + + deprecate._file = undefined + deprecate._ignored = true + deprecate._namespace = namespace + deprecate._traced = false + deprecate._warned = Object.create(null) + + deprecate.function = wrapfunction + deprecate.property = wrapproperty + + return deprecate +} + +/** + * Return a wrapped function in a deprecation message. + * + * This is a no-op version of the wrapper, which does nothing but call + * validation. + */ + +function wrapfunction (fn, message) { + if (typeof fn !== 'function') { + throw new TypeError('argument fn must be a function') + } + + return fn +} + +/** + * Wrap property in a deprecation message. + * + * This is a no-op version of the wrapper, which does nothing but call + * validation. + */ + +function wrapproperty (obj, prop, message) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new TypeError('argument obj must be object') + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + + if (!descriptor) { + throw new TypeError('must call property on owner object') + } + + if (!descriptor.configurable) { + throw new TypeError('property must be configurable') + } +} diff --git a/user-service/node_modules/depd/package.json b/user-service/node_modules/depd/package.json new file mode 100644 index 0000000000..3857e19918 --- /dev/null +++ b/user-service/node_modules/depd/package.json @@ -0,0 +1,45 @@ +{ + "name": "depd", + "description": "Deprecate all the things", + "version": "2.0.0", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "deprecate", + "deprecated" + ], + "repository": "dougwilson/nodejs-depd", + "browser": "lib/browser/index.js", + "devDependencies": { + "benchmark": "2.1.4", + "beautify-benchmark": "0.2.4", + "eslint": "5.7.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.14.0", + "eslint-plugin-markdown": "1.0.0-beta.7", + "eslint-plugin-node": "7.0.1", + "eslint-plugin-promise": "4.0.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "5.2.0", + "safe-buffer": "5.1.2", + "uid-safe": "2.1.5" + }, + "files": [ + "lib/", + "History.md", + "LICENSE", + "index.js", + "Readme.md" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail test/", + "test-ci": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter spec test/ && istanbul report lcovonly text-summary", + "test-cov": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter dot test/ && istanbul report lcov text-summary" + } +} diff --git a/user-service/node_modules/destroy/LICENSE b/user-service/node_modules/destroy/LICENSE new file mode 100644 index 0000000000..0e2c35f0ea --- /dev/null +++ b/user-service/node_modules/destroy/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/user-service/node_modules/destroy/README.md b/user-service/node_modules/destroy/README.md new file mode 100644 index 0000000000..e7701aee74 --- /dev/null +++ b/user-service/node_modules/destroy/README.md @@ -0,0 +1,63 @@ +# destroy + +[![NPM version][npm-image]][npm-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +Destroy a stream. + +This module is meant to ensure a stream gets destroyed, handling different APIs +and Node.js bugs. + +## API + +```js +var destroy = require('destroy') +``` + +### destroy(stream [, suppress]) + +Destroy the given stream, and optionally suppress any future `error` events. + +In most cases, this is identical to a simple `stream.destroy()` call. The rules +are as follows for a given stream: + + 1. If the `stream` is an instance of `ReadStream`, then call `stream.destroy()` + and add a listener to the `open` event to call `stream.close()` if it is + fired. This is for a Node.js bug that will leak a file descriptor if + `.destroy()` is called before `open`. + 2. If the `stream` is an instance of a zlib stream, then call `stream.destroy()` + and close the underlying zlib handle if open, otherwise call `stream.close()`. + This is for consistency across Node.js versions and a Node.js bug that will + leak a native zlib handle. + 3. If the `stream` is not an instance of `Stream`, then nothing happens. + 4. If the `stream` has a `.destroy()` method, then call it. + +The function returns the `stream` passed in as the argument. + +## Example + +```js +var destroy = require('destroy') + +var fs = require('fs') +var stream = fs.createReadStream('package.json') + +// ... and later +destroy(stream) +``` + +[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square +[npm-url]: https://npmjs.org/package/destroy +[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square +[github-url]: https://github.com/stream-utils/destroy/tags +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master +[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square +[license-url]: LICENSE.md +[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/destroy +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/destroy/ci/master?label=ci&style=flat-square +[github-actions-ci-url]: https://github.com/stream-utils/destroy/actions/workflows/ci.yml diff --git a/user-service/node_modules/destroy/index.js b/user-service/node_modules/destroy/index.js new file mode 100644 index 0000000000..7fd5c09363 --- /dev/null +++ b/user-service/node_modules/destroy/index.js @@ -0,0 +1,209 @@ +/*! + * destroy + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var EventEmitter = require('events').EventEmitter +var ReadStream = require('fs').ReadStream +var Stream = require('stream') +var Zlib = require('zlib') + +/** + * Module exports. + * @public + */ + +module.exports = destroy + +/** + * Destroy the given stream, and optionally suppress any future `error` events. + * + * @param {object} stream + * @param {boolean} suppress + * @public + */ + +function destroy (stream, suppress) { + if (isFsReadStream(stream)) { + destroyReadStream(stream) + } else if (isZlibStream(stream)) { + destroyZlibStream(stream) + } else if (hasDestroy(stream)) { + stream.destroy() + } + + if (isEventEmitter(stream) && suppress) { + stream.removeAllListeners('error') + stream.addListener('error', noop) + } + + return stream +} + +/** + * Destroy a ReadStream. + * + * @param {object} stream + * @private + */ + +function destroyReadStream (stream) { + stream.destroy() + + if (typeof stream.close === 'function') { + // node.js core bug work-around + stream.on('open', onOpenClose) + } +} + +/** + * Close a Zlib stream. + * + * Zlib streams below Node.js 4.5.5 have a buggy implementation + * of .close() when zlib encountered an error. + * + * @param {object} stream + * @private + */ + +function closeZlibStream (stream) { + if (stream._hadError === true) { + var prop = stream._binding === null + ? '_binding' + : '_handle' + + stream[prop] = { + close: function () { this[prop] = null } + } + } + + stream.close() +} + +/** + * Destroy a Zlib stream. + * + * Zlib streams don't have a destroy function in Node.js 6. On top of that + * simply calling destroy on a zlib stream in Node.js 8+ will result in a + * memory leak. So until that is fixed, we need to call both close AND destroy. + * + * PR to fix memory leak: https://github.com/nodejs/node/pull/23734 + * + * In Node.js 6+8, it's important that destroy is called before close as the + * stream would otherwise emit the error 'zlib binding closed'. + * + * @param {object} stream + * @private + */ + +function destroyZlibStream (stream) { + if (typeof stream.destroy === 'function') { + // node.js core bug work-around + // istanbul ignore if: node.js 0.8 + if (stream._binding) { + // node.js < 0.10.0 + stream.destroy() + if (stream._processing) { + stream._needDrain = true + stream.once('drain', onDrainClearBinding) + } else { + stream._binding.clear() + } + } else if (stream._destroy && stream._destroy !== Stream.Transform.prototype._destroy) { + // node.js >= 12, ^11.1.0, ^10.15.1 + stream.destroy() + } else if (stream._destroy && typeof stream.close === 'function') { + // node.js 7, 8 + stream.destroyed = true + stream.close() + } else { + // fallback + // istanbul ignore next + stream.destroy() + } + } else if (typeof stream.close === 'function') { + // node.js < 8 fallback + closeZlibStream(stream) + } +} + +/** + * Determine if stream has destroy. + * @private + */ + +function hasDestroy (stream) { + return stream instanceof Stream && + typeof stream.destroy === 'function' +} + +/** + * Determine if val is EventEmitter. + * @private + */ + +function isEventEmitter (val) { + return val instanceof EventEmitter +} + +/** + * Determine if stream is fs.ReadStream stream. + * @private + */ + +function isFsReadStream (stream) { + return stream instanceof ReadStream +} + +/** + * Determine if stream is Zlib stream. + * @private + */ + +function isZlibStream (stream) { + return stream instanceof Zlib.Gzip || + stream instanceof Zlib.Gunzip || + stream instanceof Zlib.Deflate || + stream instanceof Zlib.DeflateRaw || + stream instanceof Zlib.Inflate || + stream instanceof Zlib.InflateRaw || + stream instanceof Zlib.Unzip +} + +/** + * No-op function. + * @private + */ + +function noop () {} + +/** + * On drain handler to clear binding. + * @private + */ + +// istanbul ignore next: node.js 0.8 +function onDrainClearBinding () { + this._binding.clear() +} + +/** + * On open handler to close stream. + * @private + */ + +function onOpenClose () { + if (typeof this.fd === 'number') { + // actually close down the fd + this.close() + } +} diff --git a/user-service/node_modules/destroy/package.json b/user-service/node_modules/destroy/package.json new file mode 100644 index 0000000000..c85e438378 --- /dev/null +++ b/user-service/node_modules/destroy/package.json @@ -0,0 +1,48 @@ +{ + "name": "destroy", + "description": "destroy a stream if possible", + "version": "1.2.0", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com", + "twitter": "https://twitter.com/jongleberry" + }, + "contributors": [ + "Douglas Christopher Wilson " + ], + "license": "MIT", + "repository": "stream-utils/destroy", + "devDependencies": { + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.2", + "nyc": "15.1.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "files": [ + "index.js", + "LICENSE" + ], + "keywords": [ + "stream", + "streams", + "destroy", + "cleanup", + "leak", + "fd" + ] +} diff --git a/user-service/node_modules/detect-libc/LICENSE b/user-service/node_modules/detect-libc/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/user-service/node_modules/detect-libc/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/user-service/node_modules/detect-libc/README.md b/user-service/node_modules/detect-libc/README.md new file mode 100644 index 0000000000..23212fdd79 --- /dev/null +++ b/user-service/node_modules/detect-libc/README.md @@ -0,0 +1,163 @@ +# detect-libc + +Node.js module to detect details of the C standard library (libc) +implementation provided by a given Linux system. + +Currently supports detection of GNU glibc and MUSL libc. + +Provides asychronous and synchronous functions for the +family (e.g. `glibc`, `musl`) and version (e.g. `1.23`, `1.2.3`). + +The version numbers of libc implementations +are not guaranteed to be semver-compliant. + +For previous v1.x releases, please see the +[v1](https://github.com/lovell/detect-libc/tree/v1) branch. + +## Install + +```sh +npm install detect-libc +``` + +## API + +### GLIBC + +```ts +const GLIBC: string = 'glibc'; +``` + +A String constant containing the value `glibc`. + +### MUSL + +```ts +const MUSL: string = 'musl'; +``` + +A String constant containing the value `musl`. + +### family + +```ts +function family(): Promise; +``` + +Resolves asychronously with: + +* `glibc` or `musl` when the libc family can be determined +* `null` when the libc family cannot be determined +* `null` when run on a non-Linux platform + +```js +const { family, GLIBC, MUSL } = require('detect-libc'); + +switch (await family()) { + case GLIBC: ... + case MUSL: ... + case null: ... +} +``` + +### familySync + +```ts +function familySync(): string | null; +``` + +Synchronous version of `family()`. + +```js +const { familySync, GLIBC, MUSL } = require('detect-libc'); + +switch (familySync()) { + case GLIBC: ... + case MUSL: ... + case null: ... +} +``` + +### version + +```ts +function version(): Promise; +``` + +Resolves asychronously with: + +* The version when it can be determined +* `null` when the libc family cannot be determined +* `null` when run on a non-Linux platform + +```js +const { version } = require('detect-libc'); + +const v = await version(); +if (v) { + const [major, minor, patch] = v.split('.'); +} +``` + +### versionSync + +```ts +function versionSync(): string | null; +``` + +Synchronous version of `version()`. + +```js +const { versionSync } = require('detect-libc'); + +const v = versionSync(); +if (v) { + const [major, minor, patch] = v.split('.'); +} +``` + +### isNonGlibcLinux + +```ts +function isNonGlibcLinux(): Promise; +``` + +Resolves asychronously with: + +* `false` when the libc family is `glibc` +* `true` when the libc family is not `glibc` +* `false` when run on a non-Linux platform + +```js +const { isNonGlibcLinux } = require('detect-libc'); + +if (await isNonGlibcLinux()) { ... } +``` + +### isNonGlibcLinuxSync + +```ts +function isNonGlibcLinuxSync(): boolean; +``` + +Synchronous version of `isNonGlibcLinux()`. + +```js +const { isNonGlibcLinuxSync } = require('detect-libc'); + +if (isNonGlibcLinuxSync()) { ... } +``` + +## Licensing + +Copyright 2017 Lovell Fuller and others. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0.html) + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/user-service/node_modules/detect-libc/index.d.ts b/user-service/node_modules/detect-libc/index.d.ts new file mode 100644 index 0000000000..4c0fb2b0ab --- /dev/null +++ b/user-service/node_modules/detect-libc/index.d.ts @@ -0,0 +1,14 @@ +// Copyright 2017 Lovell Fuller and others. +// SPDX-License-Identifier: Apache-2.0 + +export const GLIBC: 'glibc'; +export const MUSL: 'musl'; + +export function family(): Promise; +export function familySync(): string | null; + +export function isNonGlibcLinux(): Promise; +export function isNonGlibcLinuxSync(): boolean; + +export function version(): Promise; +export function versionSync(): string | null; diff --git a/user-service/node_modules/detect-libc/lib/detect-libc.js b/user-service/node_modules/detect-libc/lib/detect-libc.js new file mode 100644 index 0000000000..fe49987047 --- /dev/null +++ b/user-service/node_modules/detect-libc/lib/detect-libc.js @@ -0,0 +1,267 @@ +// Copyright 2017 Lovell Fuller and others. +// SPDX-License-Identifier: Apache-2.0 + +'use strict'; + +const childProcess = require('child_process'); +const { isLinux, getReport } = require('./process'); +const { LDD_PATH, readFile, readFileSync } = require('./filesystem'); + +let cachedFamilyFilesystem; +let cachedVersionFilesystem; + +const command = 'getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true'; +let commandOut = ''; + +const safeCommand = () => { + if (!commandOut) { + return new Promise((resolve) => { + childProcess.exec(command, (err, out) => { + commandOut = err ? ' ' : out; + resolve(commandOut); + }); + }); + } + return commandOut; +}; + +const safeCommandSync = () => { + if (!commandOut) { + try { + commandOut = childProcess.execSync(command, { encoding: 'utf8' }); + } catch (_err) { + commandOut = ' '; + } + } + return commandOut; +}; + +/** + * A String constant containing the value `glibc`. + * @type {string} + * @public + */ +const GLIBC = 'glibc'; + +/** + * A Regexp constant to get the GLIBC Version. + * @type {string} + */ +const RE_GLIBC_VERSION = /LIBC[a-z0-9 \-).]*?(\d+\.\d+)/i; + +/** + * A String constant containing the value `musl`. + * @type {string} + * @public + */ +const MUSL = 'musl'; + +const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-'); + +const familyFromReport = () => { + const report = getReport(); + if (report.header && report.header.glibcVersionRuntime) { + return GLIBC; + } + if (Array.isArray(report.sharedObjects)) { + if (report.sharedObjects.some(isFileMusl)) { + return MUSL; + } + } + return null; +}; + +const familyFromCommand = (out) => { + const [getconf, ldd1] = out.split(/[\r\n]+/); + if (getconf && getconf.includes(GLIBC)) { + return GLIBC; + } + if (ldd1 && ldd1.includes(MUSL)) { + return MUSL; + } + return null; +}; + +const getFamilyFromLddContent = (content) => { + if (content.includes('musl')) { + return MUSL; + } + if (content.includes('GNU C Library')) { + return GLIBC; + } + return null; +}; + +const familyFromFilesystem = async () => { + if (cachedFamilyFilesystem !== undefined) { + return cachedFamilyFilesystem; + } + cachedFamilyFilesystem = null; + try { + const lddContent = await readFile(LDD_PATH); + cachedFamilyFilesystem = getFamilyFromLddContent(lddContent); + } catch (e) {} + return cachedFamilyFilesystem; +}; + +const familyFromFilesystemSync = () => { + if (cachedFamilyFilesystem !== undefined) { + return cachedFamilyFilesystem; + } + cachedFamilyFilesystem = null; + try { + const lddContent = readFileSync(LDD_PATH); + cachedFamilyFilesystem = getFamilyFromLddContent(lddContent); + } catch (e) {} + return cachedFamilyFilesystem; +}; + +/** + * Resolves with the libc family when it can be determined, `null` otherwise. + * @returns {Promise} + */ +const family = async () => { + let family = null; + if (isLinux()) { + family = await familyFromFilesystem(); + if (!family) { + family = familyFromReport(); + } + if (!family) { + const out = await safeCommand(); + family = familyFromCommand(out); + } + } + return family; +}; + +/** + * Returns the libc family when it can be determined, `null` otherwise. + * @returns {?string} + */ +const familySync = () => { + let family = null; + if (isLinux()) { + family = familyFromFilesystemSync(); + if (!family) { + family = familyFromReport(); + } + if (!family) { + const out = safeCommandSync(); + family = familyFromCommand(out); + } + } + return family; +}; + +/** + * Resolves `true` only when the platform is Linux and the libc family is not `glibc`. + * @returns {Promise} + */ +const isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC; + +/** + * Returns `true` only when the platform is Linux and the libc family is not `glibc`. + * @returns {boolean} + */ +const isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC; + +const versionFromFilesystem = async () => { + if (cachedVersionFilesystem !== undefined) { + return cachedVersionFilesystem; + } + cachedVersionFilesystem = null; + try { + const lddContent = await readFile(LDD_PATH); + const versionMatch = lddContent.match(RE_GLIBC_VERSION); + if (versionMatch) { + cachedVersionFilesystem = versionMatch[1]; + } + } catch (e) {} + return cachedVersionFilesystem; +}; + +const versionFromFilesystemSync = () => { + if (cachedVersionFilesystem !== undefined) { + return cachedVersionFilesystem; + } + cachedVersionFilesystem = null; + try { + const lddContent = readFileSync(LDD_PATH); + const versionMatch = lddContent.match(RE_GLIBC_VERSION); + if (versionMatch) { + cachedVersionFilesystem = versionMatch[1]; + } + } catch (e) {} + return cachedVersionFilesystem; +}; + +const versionFromReport = () => { + const report = getReport(); + if (report.header && report.header.glibcVersionRuntime) { + return report.header.glibcVersionRuntime; + } + return null; +}; + +const versionSuffix = (s) => s.trim().split(/\s+/)[1]; + +const versionFromCommand = (out) => { + const [getconf, ldd1, ldd2] = out.split(/[\r\n]+/); + if (getconf && getconf.includes(GLIBC)) { + return versionSuffix(getconf); + } + if (ldd1 && ldd2 && ldd1.includes(MUSL)) { + return versionSuffix(ldd2); + } + return null; +}; + +/** + * Resolves with the libc version when it can be determined, `null` otherwise. + * @returns {Promise} + */ +const version = async () => { + let version = null; + if (isLinux()) { + version = await versionFromFilesystem(); + if (!version) { + version = versionFromReport(); + } + if (!version) { + const out = await safeCommand(); + version = versionFromCommand(out); + } + } + return version; +}; + +/** + * Returns the libc version when it can be determined, `null` otherwise. + * @returns {?string} + */ +const versionSync = () => { + let version = null; + if (isLinux()) { + version = versionFromFilesystemSync(); + if (!version) { + version = versionFromReport(); + } + if (!version) { + const out = safeCommandSync(); + version = versionFromCommand(out); + } + } + return version; +}; + +module.exports = { + GLIBC, + MUSL, + family, + familySync, + isNonGlibcLinux, + isNonGlibcLinuxSync, + version, + versionSync +}; diff --git a/user-service/node_modules/detect-libc/lib/filesystem.js b/user-service/node_modules/detect-libc/lib/filesystem.js new file mode 100644 index 0000000000..de7e007e32 --- /dev/null +++ b/user-service/node_modules/detect-libc/lib/filesystem.js @@ -0,0 +1,41 @@ +// Copyright 2017 Lovell Fuller and others. +// SPDX-License-Identifier: Apache-2.0 + +'use strict'; + +const fs = require('fs'); + +/** + * The path where we can find the ldd + */ +const LDD_PATH = '/usr/bin/ldd'; + +/** + * Read the content of a file synchronous + * + * @param {string} path + * @returns {string} + */ +const readFileSync = (path) => fs.readFileSync(path, 'utf-8'); + +/** + * Read the content of a file + * + * @param {string} path + * @returns {Promise} + */ +const readFile = (path) => new Promise((resolve, reject) => { + fs.readFile(path, 'utf-8', (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); +}); + +module.exports = { + LDD_PATH, + readFileSync, + readFile +}; diff --git a/user-service/node_modules/detect-libc/lib/process.js b/user-service/node_modules/detect-libc/lib/process.js new file mode 100644 index 0000000000..ee78ad261b --- /dev/null +++ b/user-service/node_modules/detect-libc/lib/process.js @@ -0,0 +1,24 @@ +// Copyright 2017 Lovell Fuller and others. +// SPDX-License-Identifier: Apache-2.0 + +'use strict'; + +const isLinux = () => process.platform === 'linux'; + +let report = null; +const getReport = () => { + if (!report) { + /* istanbul ignore next */ + if (isLinux() && process.report) { + const orig = process.report.excludeNetwork; + process.report.excludeNetwork = true; + report = process.report.getReport(); + process.report.excludeNetwork = orig; + } else { + report = {}; + } + } + return report; +}; + +module.exports = { isLinux, getReport }; diff --git a/user-service/node_modules/detect-libc/package.json b/user-service/node_modules/detect-libc/package.json new file mode 100644 index 0000000000..d5adec3100 --- /dev/null +++ b/user-service/node_modules/detect-libc/package.json @@ -0,0 +1,40 @@ +{ + "name": "detect-libc", + "version": "2.0.3", + "description": "Node.js module to detect the C standard library (libc) implementation family and version", + "main": "lib/detect-libc.js", + "files": [ + "lib/", + "index.d.ts" + ], + "scripts": { + "test": "semistandard && nyc --reporter=text --check-coverage --branches=100 ava test/unit.js", + "bench": "node benchmark/detect-libc", + "bench:calls": "node benchmark/call-familySync.js && sleep 1 && node benchmark/call-isNonGlibcLinuxSync.js && sleep 1 && node benchmark/call-versionSync.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/lovell/detect-libc" + }, + "keywords": [ + "libc", + "glibc", + "musl" + ], + "author": "Lovell Fuller ", + "contributors": [ + "Niklas Salmoukas ", + "Vinícius Lourenço " + ], + "license": "Apache-2.0", + "devDependencies": { + "ava": "^2.4.0", + "benchmark": "^2.1.4", + "nyc": "^15.1.0", + "proxyquire": "^2.1.3", + "semistandard": "^14.2.3" + }, + "engines": { + "node": ">=8" + } +} diff --git a/user-service/node_modules/dotenv/CHANGELOG.md b/user-service/node_modules/dotenv/CHANGELOG.md new file mode 100644 index 0000000000..e35152ae27 --- /dev/null +++ b/user-service/node_modules/dotenv/CHANGELOG.md @@ -0,0 +1,475 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [Unreleased](https://github.com/motdotla/dotenv/compare/v16.4.5...master) + +## [16.4.5](https://github.com/motdotla/dotenv/compare/v16.4.4...v16.4.5) (2024-02-19) + +### Changed + +- 🐞 fix recent regression when using `path` option. return to historical behavior: do not attempt to auto find `.env` if `path` set. (regression was introduced in `16.4.3`) [#814](https://github.com/motdotla/dotenv/pull/814) + +## [16.4.4](https://github.com/motdotla/dotenv/compare/v16.4.3...v16.4.4) (2024-02-13) + +### Changed + +- 🐞 Replaced chaining operator `?.` with old school `&&` (fixing node 12 failures) [#812](https://github.com/motdotla/dotenv/pull/812) + +## [16.4.3](https://github.com/motdotla/dotenv/compare/v16.4.2...v16.4.3) (2024-02-12) + +### Changed + +- Fixed processing of multiple files in `options.path` [#805](https://github.com/motdotla/dotenv/pull/805) + +## [16.4.2](https://github.com/motdotla/dotenv/compare/v16.4.1...v16.4.2) (2024-02-10) + +### Changed + +- Changed funding link in package.json to [`dotenvx.com`](https://dotenvx.com) + +## [16.4.1](https://github.com/motdotla/dotenv/compare/v16.4.0...v16.4.1) (2024-01-24) + +- Patch support for array as `path` option [#797](https://github.com/motdotla/dotenv/pull/797) + +## [16.4.0](https://github.com/motdotla/dotenv/compare/v16.3.2...v16.4.0) (2024-01-23) + +- Add `error.code` to error messages around `.env.vault` decryption handling [#795](https://github.com/motdotla/dotenv/pull/795) +- Add ability to find `.env.vault` file when filename(s) passed as an array [#784](https://github.com/motdotla/dotenv/pull/784) + +## [16.3.2](https://github.com/motdotla/dotenv/compare/v16.3.1...v16.3.2) (2024-01-18) + +### Added + +- Add debug message when no encoding set [#735](https://github.com/motdotla/dotenv/pull/735) + +### Changed + +- Fix output typing for `populate` [#792](https://github.com/motdotla/dotenv/pull/792) +- Use subarray instead of slice [#793](https://github.com/motdotla/dotenv/pull/793) + +## [16.3.1](https://github.com/motdotla/dotenv/compare/v16.3.0...v16.3.1) (2023-06-17) + +### Added + +- Add missing type definitions for `processEnv` and `DOTENV_KEY` options. [#756](https://github.com/motdotla/dotenv/pull/756) + +## [16.3.0](https://github.com/motdotla/dotenv/compare/v16.2.0...v16.3.0) (2023-06-16) + +### Added + +- Optionally pass `DOTENV_KEY` to options rather than relying on `process.env.DOTENV_KEY`. Defaults to `process.env.DOTENV_KEY` [#754](https://github.com/motdotla/dotenv/pull/754) + +## [16.2.0](https://github.com/motdotla/dotenv/compare/v16.1.4...v16.2.0) (2023-06-15) + +### Added + +- Optionally write to your own target object rather than `process.env`. Defaults to `process.env`. [#753](https://github.com/motdotla/dotenv/pull/753) +- Add import type URL to types file [#751](https://github.com/motdotla/dotenv/pull/751) + +## [16.1.4](https://github.com/motdotla/dotenv/compare/v16.1.3...v16.1.4) (2023-06-04) + +### Added + +- Added `.github/` to `.npmignore` [#747](https://github.com/motdotla/dotenv/pull/747) + +## [16.1.3](https://github.com/motdotla/dotenv/compare/v16.1.2...v16.1.3) (2023-05-31) + +### Removed + +- Removed `browser` keys for `path`, `os`, and `crypto` in package.json. These were set to false incorrectly as of 16.1. Instead, if using dotenv on the front-end make sure to include polyfills for `path`, `os`, and `crypto`. [node-polyfill-webpack-plugin](https://github.com/Richienb/node-polyfill-webpack-plugin) provides these. + +## [16.1.2](https://github.com/motdotla/dotenv/compare/v16.1.1...v16.1.2) (2023-05-31) + +### Changed + +- Exposed private function `_configDotenv` as `configDotenv`. [#744](https://github.com/motdotla/dotenv/pull/744) + +## [16.1.1](https://github.com/motdotla/dotenv/compare/v16.1.0...v16.1.1) (2023-05-30) + +### Added + +- Added type definition for `decrypt` function + +### Changed + +- Fixed `{crypto: false}` in `packageJson.browser` + +## [16.1.0](https://github.com/motdotla/dotenv/compare/v16.0.3...v16.1.0) (2023-05-30) + +### Added + +- Add `populate` convenience method [#733](https://github.com/motdotla/dotenv/pull/733) +- Accept URL as path option [#720](https://github.com/motdotla/dotenv/pull/720) +- Add dotenv to `npm fund` command +- Spanish language README [#698](https://github.com/motdotla/dotenv/pull/698) +- Add `.env.vault` support. 🎉 ([#730](https://github.com/motdotla/dotenv/pull/730)) + +ℹ️ `.env.vault` extends the `.env` file format standard with a localized encrypted vault file. Package it securely with your production code deploys. It's cloud agnostic so that you can deploy your secrets anywhere – without [risky third-party integrations](https://techcrunch.com/2023/01/05/circleci-breach/). [read more](https://github.com/motdotla/dotenv#-deploying) + +### Changed + +- Fixed "cannot resolve 'fs'" error on tools like Replit [#693](https://github.com/motdotla/dotenv/pull/693) + +## [16.0.3](https://github.com/motdotla/dotenv/compare/v16.0.2...v16.0.3) (2022-09-29) + +### Changed + +- Added library version to debug logs ([#682](https://github.com/motdotla/dotenv/pull/682)) + +## [16.0.2](https://github.com/motdotla/dotenv/compare/v16.0.1...v16.0.2) (2022-08-30) + +### Added + +- Export `env-options.js` and `cli-options.js` in package.json for use with downstream [dotenv-expand](https://github.com/motdotla/dotenv-expand) module + +## [16.0.1](https://github.com/motdotla/dotenv/compare/v16.0.0...v16.0.1) (2022-05-10) + +### Changed + +- Minor README clarifications +- Development ONLY: updated devDependencies as recommended for development only security risks ([#658](https://github.com/motdotla/dotenv/pull/658)) + +## [16.0.0](https://github.com/motdotla/dotenv/compare/v15.0.1...v16.0.0) (2022-02-02) + +### Added + +- _Breaking:_ Backtick support 🎉 ([#615](https://github.com/motdotla/dotenv/pull/615)) + +If you had values containing the backtick character, please quote those values with either single or double quotes. + +## [15.0.1](https://github.com/motdotla/dotenv/compare/v15.0.0...v15.0.1) (2022-02-02) + +### Changed + +- Properly parse empty single or double quoted values 🐞 ([#614](https://github.com/motdotla/dotenv/pull/614)) + +## [15.0.0](https://github.com/motdotla/dotenv/compare/v14.3.2...v15.0.0) (2022-01-31) + +`v15.0.0` is a major new release with some important breaking changes. + +### Added + +- _Breaking:_ Multiline parsing support (just works. no need for the flag.) + +### Changed + +- _Breaking:_ `#` marks the beginning of a comment (UNLESS the value is wrapped in quotes. Please update your `.env` files to wrap in quotes any values containing `#`. For example: `SECRET_HASH="something-with-a-#-hash"`). + +..Understandably, (as some teams have noted) this is tedious to do across the entire team. To make it less tedious, we recommend using [dotenv cli](https://github.com/dotenv-org/cli) going forward. It's an optional plugin that will keep your `.env` files in sync between machines, environments, or team members. + +### Removed + +- _Breaking:_ Remove multiline option (just works out of the box now. no need for the flag.) + +## [14.3.2](https://github.com/motdotla/dotenv/compare/v14.3.1...v14.3.2) (2022-01-25) + +### Changed + +- Preserve backwards compatibility on values containing `#` 🐞 ([#603](https://github.com/motdotla/dotenv/pull/603)) + +## [14.3.1](https://github.com/motdotla/dotenv/compare/v14.3.0...v14.3.1) (2022-01-25) + +### Changed + +- Preserve backwards compatibility on exports by re-introducing the prior in-place exports 🐞 ([#606](https://github.com/motdotla/dotenv/pull/606)) + +## [14.3.0](https://github.com/motdotla/dotenv/compare/v14.2.0...v14.3.0) (2022-01-24) + +### Added + +- Add `multiline` option 🎉 ([#486](https://github.com/motdotla/dotenv/pull/486)) + +## [14.2.0](https://github.com/motdotla/dotenv/compare/v14.1.1...v14.2.0) (2022-01-17) + +### Added + +- Add `dotenv_config_override` cli option +- Add `DOTENV_CONFIG_OVERRIDE` command line env option + +## [14.1.1](https://github.com/motdotla/dotenv/compare/v14.1.0...v14.1.1) (2022-01-17) + +### Added + +- Add React gotcha to FAQ on README + +## [14.1.0](https://github.com/motdotla/dotenv/compare/v14.0.1...v14.1.0) (2022-01-17) + +### Added + +- Add `override` option 🎉 ([#595](https://github.com/motdotla/dotenv/pull/595)) + +## [14.0.1](https://github.com/motdotla/dotenv/compare/v14.0.0...v14.0.1) (2022-01-16) + +### Added + +- Log error on failure to load `.env` file ([#594](https://github.com/motdotla/dotenv/pull/594)) + +## [14.0.0](https://github.com/motdotla/dotenv/compare/v13.0.1...v14.0.0) (2022-01-16) + +### Added + +- _Breaking:_ Support inline comments for the parser 🎉 ([#568](https://github.com/motdotla/dotenv/pull/568)) + +## [13.0.1](https://github.com/motdotla/dotenv/compare/v13.0.0...v13.0.1) (2022-01-16) + +### Changed + +* Hide comments and newlines from debug output ([#404](https://github.com/motdotla/dotenv/pull/404)) + +## [13.0.0](https://github.com/motdotla/dotenv/compare/v12.0.4...v13.0.0) (2022-01-16) + +### Added + +* _Breaking:_ Add type file for `config.js` ([#539](https://github.com/motdotla/dotenv/pull/539)) + +## [12.0.4](https://github.com/motdotla/dotenv/compare/v12.0.3...v12.0.4) (2022-01-16) + +### Changed + +* README updates +* Minor order adjustment to package json format + +## [12.0.3](https://github.com/motdotla/dotenv/compare/v12.0.2...v12.0.3) (2022-01-15) + +### Changed + +* Simplified jsdoc for consistency across editors + +## [12.0.2](https://github.com/motdotla/dotenv/compare/v12.0.1...v12.0.2) (2022-01-15) + +### Changed + +* Improve embedded jsdoc type documentation + +## [12.0.1](https://github.com/motdotla/dotenv/compare/v12.0.0...v12.0.1) (2022-01-15) + +### Changed + +* README updates and clarifications + +## [12.0.0](https://github.com/motdotla/dotenv/compare/v11.0.0...v12.0.0) (2022-01-15) + +### Removed + +- _Breaking:_ drop support for Flow static type checker ([#584](https://github.com/motdotla/dotenv/pull/584)) + +### Changed + +- Move types/index.d.ts to lib/main.d.ts ([#585](https://github.com/motdotla/dotenv/pull/585)) +- Typescript cleanup ([#587](https://github.com/motdotla/dotenv/pull/587)) +- Explicit typescript inclusion in package.json ([#566](https://github.com/motdotla/dotenv/pull/566)) + +## [11.0.0](https://github.com/motdotla/dotenv/compare/v10.0.0...v11.0.0) (2022-01-11) + +### Changed + +- _Breaking:_ drop support for Node v10 ([#558](https://github.com/motdotla/dotenv/pull/558)) +- Patch debug option ([#550](https://github.com/motdotla/dotenv/pull/550)) + +## [10.0.0](https://github.com/motdotla/dotenv/compare/v9.0.2...v10.0.0) (2021-05-20) + +### Added + +- Add generic support to parse function +- Allow for import "dotenv/config.js" +- Add support to resolve home directory in path via ~ + +## [9.0.2](https://github.com/motdotla/dotenv/compare/v9.0.1...v9.0.2) (2021-05-10) + +### Changed + +- Support windows newlines with debug mode + +## [9.0.1](https://github.com/motdotla/dotenv/compare/v9.0.0...v9.0.1) (2021-05-08) + +### Changed + +- Updates to README + +## [9.0.0](https://github.com/motdotla/dotenv/compare/v8.6.0...v9.0.0) (2021-05-05) + +### Changed + +- _Breaking:_ drop support for Node v8 + +## [8.6.0](https://github.com/motdotla/dotenv/compare/v8.5.1...v8.6.0) (2021-05-05) + +### Added + +- define package.json in exports + +## [8.5.1](https://github.com/motdotla/dotenv/compare/v8.5.0...v8.5.1) (2021-05-05) + +### Changed + +- updated dev dependencies via npm audit + +## [8.5.0](https://github.com/motdotla/dotenv/compare/v8.4.0...v8.5.0) (2021-05-05) + +### Added + +- allow for `import "dotenv/config"` + +## [8.4.0](https://github.com/motdotla/dotenv/compare/v8.3.0...v8.4.0) (2021-05-05) + +### Changed + +- point to exact types file to work with VS Code + +## [8.3.0](https://github.com/motdotla/dotenv/compare/v8.2.0...v8.3.0) (2021-05-05) + +### Changed + +- _Breaking:_ drop support for Node v8 (mistake to be released as minor bump. later bumped to 9.0.0. see above.) + +## [8.2.0](https://github.com/motdotla/dotenv/compare/v8.1.0...v8.2.0) (2019-10-16) + +### Added + +- TypeScript types + +## [8.1.0](https://github.com/motdotla/dotenv/compare/v8.0.0...v8.1.0) (2019-08-18) + +### Changed + +- _Breaking:_ drop support for Node v6 ([#392](https://github.com/motdotla/dotenv/issues/392)) + +# [8.0.0](https://github.com/motdotla/dotenv/compare/v7.0.0...v8.0.0) (2019-05-02) + +### Changed + +- _Breaking:_ drop support for Node v6 ([#302](https://github.com/motdotla/dotenv/issues/392)) + +## [7.0.0] - 2019-03-12 + +### Fixed + +- Fix removing unbalanced quotes ([#376](https://github.com/motdotla/dotenv/pull/376)) + +### Removed + +- Removed `load` alias for `config` for consistency throughout code and documentation. + +## [6.2.0] - 2018-12-03 + +### Added + +- Support preload configuration via environment variables ([#351](https://github.com/motdotla/dotenv/issues/351)) + +## [6.1.0] - 2018-10-08 + +### Added + +- `debug` option for `config` and `parse` methods will turn on logging + +## [6.0.0] - 2018-06-02 + +### Changed + +- _Breaking:_ drop support for Node v4 ([#304](https://github.com/motdotla/dotenv/pull/304)) + +## [5.0.0] - 2018-01-29 + +### Added + +- Testing against Node v8 and v9 +- Documentation on trim behavior of values +- Documentation on how to use with `import` + +### Changed + +- _Breaking_: default `path` is now `path.resolve(process.cwd(), '.env')` +- _Breaking_: does not write over keys already in `process.env` if the key has a falsy value +- using `const` and `let` instead of `var` + +### Removed + +- Testing against Node v7 + +## [4.0.0] - 2016-12-23 + +### Changed + +- Return Object with parsed content or error instead of false ([#165](https://github.com/motdotla/dotenv/pull/165)). + +### Removed + +- `verbose` option removed in favor of returning result. + +## [3.0.0] - 2016-12-20 + +### Added + +- `verbose` option will log any error messages. Off by default. +- parses email addresses correctly +- allow importing config method directly in ES6 + +### Changed + +- Suppress error messages by default ([#154](https://github.com/motdotla/dotenv/pull/154)) +- Ignoring more files for NPM to make package download smaller + +### Fixed + +- False positive test due to case-sensitive variable ([#124](https://github.com/motdotla/dotenv/pull/124)) + +### Removed + +- `silent` option removed in favor of `verbose` + +## [2.0.0] - 2016-01-20 + +### Added + +- CHANGELOG to ["make it easier for users and contributors to see precisely what notable changes have been made between each release"](http://keepachangelog.com/). Linked to from README +- LICENSE to be more explicit about what was defined in `package.json`. Linked to from README +- Testing nodejs v4 on travis-ci +- added examples of how to use dotenv in different ways +- return parsed object on success rather than boolean true + +### Changed + +- README has shorter description not referencing ruby gem since we don't have or want feature parity + +### Removed + +- Variable expansion and escaping so environment variables are encouraged to be fully orthogonal + +## [1.2.0] - 2015-06-20 + +### Added + +- Preload hook to require dotenv without including it in your code + +### Changed + +- clarified license to be "BSD-2-Clause" in `package.json` + +### Fixed + +- retain spaces in string vars + +## [1.1.0] - 2015-03-31 + +### Added + +- Silent option to silence `console.log` when `.env` missing + +## [1.0.0] - 2015-03-13 + +### Removed + +- support for multiple `.env` files. should always use one `.env` file for the current environment + +[7.0.0]: https://github.com/motdotla/dotenv/compare/v6.2.0...v7.0.0 +[6.2.0]: https://github.com/motdotla/dotenv/compare/v6.1.0...v6.2.0 +[6.1.0]: https://github.com/motdotla/dotenv/compare/v6.0.0...v6.1.0 +[6.0.0]: https://github.com/motdotla/dotenv/compare/v5.0.0...v6.0.0 +[5.0.0]: https://github.com/motdotla/dotenv/compare/v4.0.0...v5.0.0 +[4.0.0]: https://github.com/motdotla/dotenv/compare/v3.0.0...v4.0.0 +[3.0.0]: https://github.com/motdotla/dotenv/compare/v2.0.0...v3.0.0 +[2.0.0]: https://github.com/motdotla/dotenv/compare/v1.2.0...v2.0.0 +[1.2.0]: https://github.com/motdotla/dotenv/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/motdotla/dotenv/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/motdotla/dotenv/compare/v0.4.0...v1.0.0 diff --git a/user-service/node_modules/dotenv/LICENSE b/user-service/node_modules/dotenv/LICENSE new file mode 100644 index 0000000000..c430ad8bd0 --- /dev/null +++ b/user-service/node_modules/dotenv/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2015, Scott Motte +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/user-service/node_modules/dotenv/README-es.md b/user-service/node_modules/dotenv/README-es.md new file mode 100644 index 0000000000..154c139094 --- /dev/null +++ b/user-service/node_modules/dotenv/README-es.md @@ -0,0 +1,448 @@ +
    +🎉 announcing dotenvx. run anywhere, multi-environment, encrypted envs. +
    + +  + +
    + +

    + + Dotenv es apoyado por la comunidad. + +

    +Gracias espaciales a: +
    +
    + +
    + Warp +
    + Warp es una rápida e impresionante terminal basada en Rust, reinventado para funcionar como una aplicación moderna. +
    + Haga más en la CLI con edición de texto real, resultado básado en bloques, y busqueda de comandos de IA. +
    +
    +
    + +
    + Retool +
    + Retool ayuda a los desarrolladores a crear software interno personalizado, como aplicaciones CRUD y paneles de administración, realmente rápido. +
    + Construya Interfaces de Usuario de forma visual con componentes flexibles, conéctese a cualquier fuente de datos, y escriba lógica de negocio en JavaScript. +
    +
    +
    + +
    + WorkOS +
    + Su Apliación, Lista para la Empresa. +
    + Agrega Inicio de Sesión Único, Autenticación Multi-Factor, y mucho más, en minutos en lugar de meses. +
    +
    +
    +
    +
    +
    +
    + +
    + +# dotenv [![NPM version](https://img.shields.io/npm/v/dotenv.svg?style=flat-square)](https://www.npmjs.com/package/dotenv) + +dotenv + +Dotenv es un módulo de dependencia cero que carga las variables de entorno desde un archivo `.env` en [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env). El almacenamiento de la configuración del entorno separado del código está basado en la metodología [The Twelve-Factor App](http://12factor.net/config). + +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) +[![LICENSE](https://img.shields.io/github/license/motdotla/dotenv.svg)](LICENSE) + +## Instalación + +```bash +# instalación local (recomendado) +npm install dotenv --save +``` + +O installación con yarn? `yarn add dotenv` + +## Uso + +Cree un archivo `.env` en la raíz de su proyecto: + +```dosini +S3_BUCKET="YOURS3BUCKET" +SECRET_KEY="YOURSECRETKEYGOESHERE" +``` + +Tan prónto como sea posible en su aplicación, importe y configure dotenv: + +```javascript +require('dotenv').config() +console.log(process.env) // elimine esto después que haya confirmado que esta funcionando +``` + +.. o usa ES6? + +```javascript +import * as dotenv from 'dotenv' // vea en https://github.com/motdotla/dotenv#como-uso-dotenv-con-import +// REVISAR LINK DE REFERENCIA DE IMPORTACIÓN +dotenv.config() +import express from 'express' +``` + +Eso es todo. `process.env` ahora tiene las claves y los valores que definiste en tu archivo `.env`: + +```javascript +require('dotenv').config() + +... + +s3.getBucketCors({Bucket: process.env.S3_BUCKET}, function(err, data) {}) +``` + +### Valores multilínea + +Si necesita variables de varias líneas, por ejemplo, claves privadas, ahora se admiten en la versión (`>= v15.0.0`) con saltos de línea: + +```dosini +PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- +... +Kh9NV... +... +-----END RSA PRIVATE KEY-----" +``` + +Alternativamente, puede usar comillas dobles y usar el carácter `\n`: + +```dosini +PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n" +``` + +### Comentarios + +Los comentarios pueden ser agregados en tu archivo o en la misma línea: + +```dosini +# This is a comment +SECRET_KEY=YOURSECRETKEYGOESHERE # comment +SECRET_HASH="something-with-a-#-hash" +``` + +Los comentarios comienzan donde existe un `#`, entonces, si su valor contiene un `#`, enciérrelo entre comillas. Este es un cambio importante desde la versión `>= v15.0.0` en adelante. + +### Análisis + +El motor que analiza el contenido de su archivo que contiene variables de entorno está disponible para su uso. Este Acepta una Cadena o un Búfer y devolverá un Objeto con las claves y los valores analizados. + +```javascript +const dotenv = require('dotenv') +const buf = Buffer.from('BASICO=basico') +const config = dotenv.parse(buf) // devolverá un objeto +console.log(typeof config, config) // objeto { BASICO : 'basico' } +``` + +### Precarga + +Puede usar el `--require` (`-r`) [opción de línea de comando](https://nodejs.org/api/cli.html#-r---require-module) para precargar dotenv. Al hacer esto, no necesita requerir ni cargar dotnev en el código de su aplicación. + +```bash +$ node -r dotenv/config tu_script.js +``` + +Las opciones de configuración a continuación se admiten como argumentos de línea de comandos en el formato `dotenv_config_

UgTnZfKU*>z6sjo6F_Bm6FVN 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