From 9a0fff5385b3667366696d195c2c347266a9ed0d Mon Sep 17 00:00:00 2001 From: Linrador <68631622+Linrador@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:11:41 +0200 Subject: [PATCH] updated --- backend/.env | 9 + backend/certs/myRoot.crt | 23 + backend/certs/myRoot.key | 27 + backend/package-lock.json | 1767 ++ backend/package.json | 20 + backend/prisma/dev.db | Bin 0 -> 90112 bytes .../migrations/20250807104541_/migration.sql | 84 + .../migration.sql | 3 + .../migration.sql | 2 + backend/prisma/migrations/migration_lock.toml | 3 + backend/prisma/schema.prisma | 109 + backend/prisma/seed.js | 35 + backend/prisma/update-direction.js | 180 + backend/server.js | 1609 ++ frontend/.gitignore | 41 + frontend/README.md | 36 + frontend/eslint.config.mjs | 16 + frontend/global.d.ts | 21 + frontend/next.config.ts | 46 + frontend/package-lock.json | 6915 +++++++ frontend/package.json | 61 + frontend/postcss.config.mjs | 5 + frontend/public/assets/img/logo.png | Bin 0 -> 538861 bytes .../public/assets/vendor/lodash/lodash.js | 17209 ++++++++++++++++ .../vendor/vanilla-calendar-pro/index.css | 1 + .../vendor/vanilla-calendar-pro/index.js | 2 + frontend/src/app/(auth)/login/layout.tsx | 20 + frontend/src/app/(auth)/login/page.tsx | 146 + frontend/src/app/(protected)/admin/page.tsx | 13 + frontend/src/app/(protected)/layout.tsx | 36 + .../app/(protected)/notifications/page.tsx | 604 + frontend/src/app/(protected)/page.tsx | 236 + frontend/src/app/(protected)/results/page.tsx | 46 + frontend/src/app/components/Alert.tsx | 62 + frontend/src/app/components/AuthContext.tsx | 144 + frontend/src/app/components/Badge.tsx | 15 + frontend/src/app/components/Button.tsx | 97 + frontend/src/app/components/CameraList.tsx | 169 + frontend/src/app/components/Card.tsx | 43 + frontend/src/app/components/Changelog.tsx | 88 + frontend/src/app/components/Clipboard.tsx | 66 + frontend/src/app/components/ComboBox.tsx | 278 + .../app/components/ConnectionIndicator.tsx | 27 + .../src/app/components/DarkModeToggle.tsx | 54 + frontend/src/app/components/DatePicker.tsx | 320 + frontend/src/app/components/Footer.tsx | 38 + frontend/src/app/components/Header.tsx | 26 + frontend/src/app/components/HomeClient.tsx | 46 + .../src/app/components/ImageZoomModal.tsx | 116 + .../src/app/components/LoadingSpinner.tsx | 34 + frontend/src/app/components/LoginForm.tsx | 84 + frontend/src/app/components/Modal.tsx | 94 + frontend/src/app/components/Pagination.tsx | 141 + frontend/src/app/components/PrelineScript.tsx | 45 + .../app/components/PrelineScriptWrapper.tsx | 12 + frontend/src/app/components/Progress.tsx | 38 + .../src/app/components/RecognitionDetails.tsx | 131 + .../src/app/components/RecognitionRow.tsx | 76 + .../src/app/components/RecognitionsTable.tsx | 201 + .../components/RecognitionsTableFilters.tsx | 147 + frontend/src/app/components/SSEContext.tsx | 82 + frontend/src/app/components/Select.tsx | 72 + frontend/src/app/components/Table.tsx | 79 + frontend/src/app/components/Tabs.tsx | 101 + frontend/src/app/components/ThemeProvider.tsx | 69 + frontend/src/app/components/TimeLine.tsx | 6 + frontend/src/app/components/TimeLineItem.tsx | 69 + frontend/src/app/components/TimePicker.tsx | 187 + frontend/src/app/components/Toast.tsx | 50 + frontend/src/app/components/Tooltip.tsx | 45 + frontend/src/app/components/UserForm.tsx | 222 + frontend/src/app/components/UserGreeting.tsx | 177 + frontend/src/app/components/UserTable.tsx | 354 + .../src/app/components/VanillaCalendar.tsx | 29 + frontend/src/app/components/charts/Chart | 0 .../src/app/components/charts/ChartBar.tsx | 119 + .../app/components/charts/ChartContainer.tsx | 27 + .../src/app/components/charts/ChartPie.tsx | 103 + frontend/src/app/favicon.ico | Bin 0 -> 25931 bytes frontend/src/app/globals.css | 130 + frontend/src/app/layout.tsx | 47 + frontend/src/app/providers/FadeContext.tsx | 26 + frontend/src/app/providers/PageTransition.tsx | 83 + frontend/src/app/unsubscribe/page.tsx | 109 + frontend/src/lib/auth.ts | 35 + frontend/src/lib/logoutNotice.ts | 126 + frontend/src/lib/useSessionRefresher.ts | 27 + frontend/src/middleware.ts | 66 + frontend/src/types/plates.ts | 19 + frontend/src/types/user.ts | 15 + frontend/tailwind.config.js | 16 + frontend/tsconfig.json | 41 + 92 files changed, 34448 insertions(+) create mode 100644 backend/.env create mode 100644 backend/certs/myRoot.crt create mode 100644 backend/certs/myRoot.key create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/prisma/dev.db create mode 100644 backend/prisma/migrations/20250807104541_/migration.sql create mode 100644 backend/prisma/migrations/20250808065658_added_brandmodelconfidence/migration.sql create mode 100644 backend/prisma/migrations/20250808081217_added_direction_degrees/migration.sql create mode 100644 backend/prisma/migrations/migration_lock.toml create mode 100644 backend/prisma/schema.prisma create mode 100644 backend/prisma/seed.js create mode 100644 backend/prisma/update-direction.js create mode 100644 backend/server.js create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.mjs create mode 100644 frontend/global.d.ts create mode 100644 frontend/next.config.ts create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.mjs create mode 100644 frontend/public/assets/img/logo.png create mode 100644 frontend/public/assets/vendor/lodash/lodash.js create mode 100644 frontend/public/assets/vendor/vanilla-calendar-pro/index.css create mode 100644 frontend/public/assets/vendor/vanilla-calendar-pro/index.js create mode 100644 frontend/src/app/(auth)/login/layout.tsx create mode 100644 frontend/src/app/(auth)/login/page.tsx create mode 100644 frontend/src/app/(protected)/admin/page.tsx create mode 100644 frontend/src/app/(protected)/layout.tsx create mode 100644 frontend/src/app/(protected)/notifications/page.tsx create mode 100644 frontend/src/app/(protected)/page.tsx create mode 100644 frontend/src/app/(protected)/results/page.tsx create mode 100644 frontend/src/app/components/Alert.tsx create mode 100644 frontend/src/app/components/AuthContext.tsx create mode 100644 frontend/src/app/components/Badge.tsx create mode 100644 frontend/src/app/components/Button.tsx create mode 100644 frontend/src/app/components/CameraList.tsx create mode 100644 frontend/src/app/components/Card.tsx create mode 100644 frontend/src/app/components/Changelog.tsx create mode 100644 frontend/src/app/components/Clipboard.tsx create mode 100644 frontend/src/app/components/ComboBox.tsx create mode 100644 frontend/src/app/components/ConnectionIndicator.tsx create mode 100644 frontend/src/app/components/DarkModeToggle.tsx create mode 100644 frontend/src/app/components/DatePicker.tsx create mode 100644 frontend/src/app/components/Footer.tsx create mode 100644 frontend/src/app/components/Header.tsx create mode 100644 frontend/src/app/components/HomeClient.tsx create mode 100644 frontend/src/app/components/ImageZoomModal.tsx create mode 100644 frontend/src/app/components/LoadingSpinner.tsx create mode 100644 frontend/src/app/components/LoginForm.tsx create mode 100644 frontend/src/app/components/Modal.tsx create mode 100644 frontend/src/app/components/Pagination.tsx create mode 100644 frontend/src/app/components/PrelineScript.tsx create mode 100644 frontend/src/app/components/PrelineScriptWrapper.tsx create mode 100644 frontend/src/app/components/Progress.tsx create mode 100644 frontend/src/app/components/RecognitionDetails.tsx create mode 100644 frontend/src/app/components/RecognitionRow.tsx create mode 100644 frontend/src/app/components/RecognitionsTable.tsx create mode 100644 frontend/src/app/components/RecognitionsTableFilters.tsx create mode 100644 frontend/src/app/components/SSEContext.tsx create mode 100644 frontend/src/app/components/Select.tsx create mode 100644 frontend/src/app/components/Table.tsx create mode 100644 frontend/src/app/components/Tabs.tsx create mode 100644 frontend/src/app/components/ThemeProvider.tsx create mode 100644 frontend/src/app/components/TimeLine.tsx create mode 100644 frontend/src/app/components/TimeLineItem.tsx create mode 100644 frontend/src/app/components/TimePicker.tsx create mode 100644 frontend/src/app/components/Toast.tsx create mode 100644 frontend/src/app/components/Tooltip.tsx create mode 100644 frontend/src/app/components/UserForm.tsx create mode 100644 frontend/src/app/components/UserGreeting.tsx create mode 100644 frontend/src/app/components/UserTable.tsx create mode 100644 frontend/src/app/components/VanillaCalendar.tsx create mode 100644 frontend/src/app/components/charts/Chart create mode 100644 frontend/src/app/components/charts/ChartBar.tsx create mode 100644 frontend/src/app/components/charts/ChartContainer.tsx create mode 100644 frontend/src/app/components/charts/ChartPie.tsx create mode 100644 frontend/src/app/favicon.ico create mode 100644 frontend/src/app/globals.css create mode 100644 frontend/src/app/layout.tsx create mode 100644 frontend/src/app/providers/FadeContext.tsx create mode 100644 frontend/src/app/providers/PageTransition.tsx create mode 100644 frontend/src/app/unsubscribe/page.tsx create mode 100644 frontend/src/lib/auth.ts create mode 100644 frontend/src/lib/logoutNotice.ts create mode 100644 frontend/src/lib/useSessionRefresher.ts create mode 100644 frontend/src/middleware.ts create mode 100644 frontend/src/types/plates.ts create mode 100644 frontend/src/types/user.ts create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tsconfig.json diff --git a/backend/.env b/backend/.env new file mode 100644 index 0000000..95187d0 --- /dev/null +++ b/backend/.env @@ -0,0 +1,9 @@ +DATABASE_URL="file:./dev.db" +JWT_SECRET=tegvideo7010! +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=seduesseldorf@gmail.com +SMTP_PASS=odkxssbmfvewpitv +MAIL_FROM="'SE Düsseldorf' " +UNSUBSCRIBE_SECRET=tegvideo7010! +FRONTEND_ORIGIN=https://sekt.tegdssd.de \ No newline at end of file diff --git a/backend/certs/myRoot.crt b/backend/certs/myRoot.crt new file mode 100644 index 0000000..761d11b --- /dev/null +++ b/backend/certs/myRoot.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID0TCCArmgAwIBAgIUXtS3/4RCGrDOM9uBOowzcH6ObTEwDQYJKoZIhvcNAQEL +BQAweDELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05SVzEKMAgGA1UEBwwBRDENMAsG +A1UECgwEU0UtRDEMMAoGA1UECwwDVEVHMRMwEQYDVQQDDAp0ZWdkc3NkLmRlMR0w +GwYJKoZIhvcNAQkBFg50ZWdAdGVnZHNzZC5kZTAeFw0yNTAxMTYwODUxMjhaFw0z +NTAxMTQwODUxMjhaMHgxCzAJBgNVBAYTAkRFMQwwCgYDVQQIDANOUlcxCjAIBgNV +BAcMAUQxDTALBgNVBAoMBFNFLUQxDDAKBgNVBAsMA1RFRzETMBEGA1UEAwwKdGVn +ZHNzZC5kZTEdMBsGCSqGSIb3DQEJARYOdGVnQHRlZ2Rzc2QuZGUwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCf2ReWVqa9RD9xASRO1g7TL3nKlrwVG8Cl +POI2KyZfi+YnSYnGK4jtmVLVIgRalPDc9hL1KknieTuvn972eXTKM9mkF0fI5iEg +fuopPvlZeW01zIIMQr5IK3RLtw4kQ28nRLux5qXJGpxTLd0jQSz1AQ2o9EHkxXT3 +4OBIbhHsi697ykIiNGqCjrzVKTEKVHsMQBiCtC4C30hSKuRGvNFOt0PVhw/qs9WL +CmHKJiGffZmtCcvYSHBmYl4dNV0RkkIeZWDDXIiZj9qlcRKUJEtfKuuThu3z8qYC +Q+CQ6qf9SaPWGBUA5GsVty7ipVBgrkLjDKOqEsOhfXfRBUpFMGeVAgMBAAGjUzBR +MB0GA1UdDgQWBBTStDq2DsHZkyAxQgMTaiB18Rmn4DAfBgNVHSMEGDAWgBTStDq2 +DsHZkyAxQgMTaiB18Rmn4DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA +A4IBAQCGMzirjIP+evX2Zvl20yrcCqqmXFAWKoS2iPxBlxAQS6NpqaGoZJ/4F3cZ +GZOlPNn24K4T4zY/DgEeHfW0CiSlhs1KJumo51xd/gC9+GGmZVuSrwizmQV6pnjF +G3Py5s0w6aF66na++HZ0KtCtL71PQhZretZh8s9km5bQyJEctfmNoCUFkuMSmh3y +/x5Y0pZLC2Y1Aha0Qsk1XDlYFbxP0/422DH2NAA6vqkLR/FJ/mcXWL9BIHYqeyKN +WqU2H7kKkRJcS2IznZlX21AM4UirrFJArtultBsZww0SKZVYTYlPiHyMfeDappjh +CMi0uNfy5n+2HyLXNtDZcnMyNTGh +-----END CERTIFICATE----- diff --git a/backend/certs/myRoot.key b/backend/certs/myRoot.key new file mode 100644 index 0000000..13940e0 --- /dev/null +++ b/backend/certs/myRoot.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAn9kXllamvUQ/cQEkTtYO0y95ypa8FRvApTziNismX4vmJ0mJ +xiuI7ZlS1SIEWpTw3PYS9SpJ4nk7r5/e9nl0yjPZpBdHyOYhIH7qKT75WXltNcyC +DEK+SCt0S7cOJENvJ0S7sealyRqcUy3dI0Es9QENqPRB5MV09+DgSG4R7Iuve8pC +IjRqgo681SkxClR7DEAYgrQuAt9IUirkRrzRTrdD1YcP6rPViwphyiYhn32ZrQnL +2EhwZmJeHTVdEZJCHmVgw1yImY/apXESlCRLXyrrk4bt8/KmAkPgkOqn/Umj1hgV +AORrFbcu4qVQYK5C4wyjqhLDoX130QVKRTBnlQIDAQABAoIBABB7rGj+Sndd4ETg +30OZ4zF3xdFUNdTfZcAkRRdc37oejP8kICblOlt14grEVTqZ/TRr04ygbboC0lrL +24wC/j4Tlq/LDsXypRvaun7CVagaU16m1go5n7GFeZqNJ9Ipef7MoaY4qIPSUKhr +JFCMWfxxvVzcwya6DdO5xqbxYrvHifUVqJnjLrYNQUMmWJodjTZIWg9dbDYkWKIk +eoK2cnz7NlEujpCxgsMlibDbzIkd8G4rFXEcCZw4Hz1fLXEQvCv8orxiAjt3AkeQ +JIf79LaJNE2JdxInnTR/7Gaewk7+b6E75O6r0bPO4nGN7/pqlvaui85GJb5LBWGI +XbQ7SMECgYEA0PPFQmbdm4pbwdJ4+1hDE4oDNA4YvlR/1LbtY1r8nAShzaR0DBMr +GmLG6gS6xC/7BV2JEShSAAGsHyV/QVqBBhpfeP77DltxcHXXEzRf0DsrBdm3KsD/ +o7Q4R8Fro/08t0olS9iAwUXu05zC8XyFRyRXoRDvVTyNttmDXvO3HXkCgYEAw9bn +AlMsqX8OkKAPmoR0Em8pj2Kr0SCtOteUmvAb1bMGkCnEnGEdeP36GTSBgq0CyTA7 +RSxO03r+/3+JdB7HZTPzKiv+vHqHqHDRErBIvDOcFkLfuarayhXJf4+pGqmT6Is1 +czjggUsGeM22EUwo7lzXT9gsmQgZXAfhthxTv/0CgYEAxteT2jLFpKSv2OyP0LAX +dNqbXcgkZ8tFsok5spj9VwNZbraW8H61P/DL1hsWGGiIenyeWUODdRoiT6mBRhH4 +QnSKcjxDcVA3zYt2VoI6w4/qyzB6DCeJnqF8BVzdMDtmsg3PHDQ1orcIJTxCj0eu +FRtSgKX6+6QaP+0SBSPsGBECgYAi9la/f4HVsK00/J5Mg6EFOXs98euipibG/n21 +O3B8sj1Vt182W9AbLZxcq5cDcUeyCz5JlyNrdeXYTziG1ofadW/P85LCq01UsO9i +Wr5hewU+pCm0x9/PfBxA/bC+5c9WEKQ2Mc1Cx9Yb8v2yENqt0z1NL9ama1+7olyV +WnFJMQKBgQDGHRjD9Lfd1jx2ct2CYNlsx6ioYzfACZGaD0gMEMoOkV0NzDHtQbjp +nkJHOVMGxbPxG+TlCmCEbunScgpZ95rUsVEiREHrqFmuBRiEqmXqPqvw2iMd9yMb +CEVCUyOB+FcUKb/kw8fcoK/3maY5wx+2fP6Iu9AFPVz2p7WXNOSTpA== +-----END RSA PRIVATE KEY----- diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..d7c9c5d --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1767 @@ +{ + "name": "backend", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@prisma/client": "^6.11.0", + "bcrypt": "^6.0.0", + "chokidar": "^4.0.3", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "crypto": "^1.0.1", + "dotenv": "^16.5.0", + "express": "^5.1.0", + "fast-xml-parser": "^5.2.3", + "jsonwebtoken": "^9.0.2", + "nodemailer": "^7.0.3", + "sharp": "^0.34.2", + "ws": "^8.18.2" + }, + "devDependencies": { + "prisma": "^6.11.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@prisma/client": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.11.0.tgz", + "integrity": "sha512-K9TkKepOYvCOg3qCuKz7ZHf6rf58BFKi08plKjU4qVv9y7/UxO6tLz7PlWcgODUZKURLPmRHjHERffIx/8az4w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.11.0.tgz", + "integrity": "sha512-icBfutMpdrwSf2ggo012zhQ4oianijXL/UPbv4PNVK3WUWbB3/F5Ltq8ZfElGrtwKC6XuFFPxU5qDC9x7vh8zQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "jiti": "2.4.2" + } + }, + "node_modules/@prisma/debug": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.11.0.tgz", + "integrity": "sha512-zo4oEZMWMt0BFWl+4NK9FUpaEOmjGR3y2/r0lkW/DK4BUBRgMj90s8QqK2K+vXG3xn0nAGg2kOSu+Swn60CFLg==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.11.0.tgz", + "integrity": "sha512-uqnYxvPKZPvYZA7F0q4gTR+fVWUJSY5bif7JAKBIOD5SoRRy0qEIaPy4Nna5WDLQaFGshaY/Bh8dLOQMfxhJJw==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.11.0", + "@prisma/engines-version": "6.11.0-18.9c30299f5a0ea26a96790e13f796dc6094db3173", + "@prisma/fetch-engine": "6.11.0", + "@prisma/get-platform": "6.11.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.11.0-18.9c30299f5a0ea26a96790e13f796dc6094db3173", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.11.0-18.9c30299f5a0ea26a96790e13f796dc6094db3173.tgz", + "integrity": "sha512-M3vbyDICFIA1oJl0cFkM0omD4HsJZjFi0hu0f0UxyPABH8KEcZyUd5BToCrNl4B8lUeQn+L5+gfaQleOKp6Lrg==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.11.0.tgz", + "integrity": "sha512-ZHHSP7vJFo5hePH+MNovxhqXabIg38ZpCwQfUBON29kwPX3f1pjYnzGpgJLCJy4k7mKGOzTgrXPqH8+nJvq2fw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.11.0", + "@prisma/engines-version": "6.11.0-18.9c30299f5a0ea26a96790e13f796dc6094db3173", + "@prisma/get-platform": "6.11.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.11.0.tgz", + "integrity": "sha512-yspBGvOfJQwuoApk5B4aBlHDy6YDXAOe4Ml8U2eZ+M2b7fDd10YDomS3Q4qrYHUUVYF3TJyN86NcnRMOvCMUrA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.11.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", + "license": "ISC" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "Apache-2.0", + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "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==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.3.tgz", + "integrity": "sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "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/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==", + "license": "MIT", + "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/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "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/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.4.0.tgz", + "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nodemailer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.3.tgz", + "integrity": "sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==", + "license": "MIT-0", + "engines": { + "node": ">=6.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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "ISC", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/prisma": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.11.0.tgz", + "integrity": "sha512-gI69E7fusgk32XALpXzdgR10xUx2aFnHiu/JaUo4O07G4JvFT0xNtD0Iy81p37iBLTYFEhWa9VrHKXaiyZ5fLQ==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "6.11.0", + "@prisma/engines": "6.11.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..12f9b51 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "@prisma/client": "^6.11.0", + "bcrypt": "^6.0.0", + "chokidar": "^4.0.3", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "crypto": "^1.0.1", + "dotenv": "^16.5.0", + "express": "^5.1.0", + "fast-xml-parser": "^5.2.3", + "jsonwebtoken": "^9.0.2", + "nodemailer": "^7.0.3", + "sharp": "^0.34.2", + "ws": "^8.18.2" + }, + "devDependencies": { + "prisma": "^6.11.0" + } +} diff --git a/backend/prisma/dev.db b/backend/prisma/dev.db new file mode 100644 index 0000000000000000000000000000000000000000..a66e9f314f153732276329a2ee5b7d99b1558203 GIT binary patch literal 90112 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 literal 0 HcmV?d00001 diff --git a/backend/prisma/migrations/20250807104541_/migration.sql b/backend/prisma/migrations/20250807104541_/migration.sql new file mode 100644 index 0000000..724bf9d --- /dev/null +++ b/backend/prisma/migrations/20250807104541_/migration.sql @@ -0,0 +1,84 @@ +-- CreateTable +CREATE TABLE "Recognition" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "license" TEXT NOT NULL, + "licenseFormatted" TEXT, + "country" TEXT, + "confidence" INTEGER, + "timestampUTC" DATETIME NOT NULL, + "timestampLocal" DATETIME NOT NULL, + "cameraName" TEXT, + "classification" TEXT, + "imageFile" TEXT, + "plateFile" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "brand" TEXT, + "model" TEXT +); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL PRIMARY KEY, + "username" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "isAdmin" BOOLEAN NOT NULL DEFAULT false, + "expiresAt" DATETIME, + "lastLogin" DATETIME +); + +-- CreateTable +CREATE TABLE "CameraAccess" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "userId" TEXT NOT NULL, + "camera" TEXT NOT NULL, + "from" DATETIME, + "to" DATETIME, + CONSTRAINT "CameraAccess_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "NotificationRule" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "userId" TEXT NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "plates" TEXT, + "brand" TEXT, + "model" TEXT, + "camera" TEXT, + "timeFrom" TEXT, + "timeTo" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "NotificationRule_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "NotificationRecipient" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "ruleId" INTEGER NOT NULL, + "email" TEXT NOT NULL, + CONSTRAINT "NotificationRecipient_ruleId_fkey" FOREIGN KEY ("ruleId") REFERENCES "NotificationRule" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "UnsubscribeToken" ( + "id" TEXT NOT NULL PRIMARY KEY, + "ruleId" INTEGER, + "email" TEXT NOT NULL, + "token" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "expiresAt" DATETIME NOT NULL, + CONSTRAINT "UnsubscribeToken_ruleId_fkey" FOREIGN KEY ("ruleId") REFERENCES "NotificationRule" ("id") ON DELETE CASCADE ON UPDATE CASCADE +); + +-- CreateIndex +CREATE UNIQUE INDEX "Recognition_license_timestampUTC_key" ON "Recognition"("license", "timestampUTC"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "UnsubscribeToken_token_key" ON "UnsubscribeToken"("token"); + +-- CreateIndex +CREATE INDEX "UnsubscribeToken_ruleId_email_idx" ON "UnsubscribeToken"("ruleId", "email"); diff --git a/backend/prisma/migrations/20250808065658_added_brandmodelconfidence/migration.sql b/backend/prisma/migrations/20250808065658_added_brandmodelconfidence/migration.sql new file mode 100644 index 0000000..ec743e0 --- /dev/null +++ b/backend/prisma/migrations/20250808065658_added_brandmodelconfidence/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Recognition" ADD COLUMN "brandmodelconfidence" INTEGER; +ALTER TABLE "Recognition" ADD COLUMN "direction" TEXT; diff --git a/backend/prisma/migrations/20250808081217_added_direction_degrees/migration.sql b/backend/prisma/migrations/20250808081217_added_direction_degrees/migration.sql new file mode 100644 index 0000000..ad8b1d4 --- /dev/null +++ b/backend/prisma/migrations/20250808081217_added_direction_degrees/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Recognition" ADD COLUMN "directionDegrees" INTEGER; diff --git a/backend/prisma/migrations/migration_lock.toml b/backend/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..2a5a444 --- /dev/null +++ b/backend/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "sqlite" diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma new file mode 100644 index 0000000..58e6a79 --- /dev/null +++ b/backend/prisma/schema.prisma @@ -0,0 +1,109 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" // oder postgres / mysql … + url = env("DATABASE_URL") +} + +/** + * ───────────── Bestehende Tabellen ───────────── + */ + +model Recognition { + id Int @id @default(autoincrement()) + license String + licenseFormatted String? + country String? + confidence Int? + timestampUTC DateTime + timestampLocal DateTime + cameraName String? + classification String? + direction String? + directionDegrees Int? + imageFile String? + plateFile String? + createdAt DateTime @default(now()) + brand String? + model String? + brandmodelconfidence Int? + + @@unique([license, timestampUTC]) +} + +model User { + id String @id @default(cuid()) + username String @unique + passwordHash String + isAdmin Boolean @default(false) + expiresAt DateTime? + lastLogin DateTime? + cameraAccess CameraAccess[] + notificationRules NotificationRule[] @relation("UserRules") +} + +model CameraAccess { + id Int @id @default(autoincrement()) + user User @relation(fields: [userId], references: [id]) + userId String + camera String + from DateTime? + to DateTime? +} + +/** + * ───────────── Neue Tabellen für Benachrichtigungen ───────────── + */ + +model NotificationRule { + id Int @id @default(autoincrement()) + user User @relation("UserRules", fields: [userId], references: [id]) + userId String + enabled Boolean @default(true) + + /** + * optionale Filter -------------- + */ + plates String? + brand String? + model String? + camera String? + timeFrom String? + timeTo String? + + /** + * Empfänger --------------------- + */ + recipients NotificationRecipient[] @relation("RuleRecipients") + + /** + * Unsubscribe Tokens ------- + */ + unsubscribeTokens UnsubscribeToken[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model NotificationRecipient { + id Int @id @default(autoincrement()) + ruleId Int + email String + + rule NotificationRule @relation("RuleRecipients", fields: [ruleId], references: [id], onDelete: Cascade) +} + +model UnsubscribeToken { + id String @id @default(uuid()) + ruleId Int? + email String + token String @unique + createdAt DateTime @default(now()) + expiresAt DateTime + + rule NotificationRule? @relation(fields: [ruleId], references: [id], onDelete: Cascade) + + @@index([ruleId, email]) +} diff --git a/backend/prisma/seed.js b/backend/prisma/seed.js new file mode 100644 index 0000000..230b235 --- /dev/null +++ b/backend/prisma/seed.js @@ -0,0 +1,35 @@ +const { PrismaClient } = require('@prisma/client'); +const bcrypt = require('bcrypt'); + +const prisma = new PrismaClient(); + +async function main() { + const username = 'admin'; + const password = 'tegvideo7010!'; // Wähle ein sicheres Passwort + const hashed = await bcrypt.hash(password, 10); + + const existing = await prisma.user.findUnique({ where: { username } }); + + if (!existing) { + const user = await prisma.user.create({ + data: { + username, + passwordHash: hashed, + isAdmin: true, + expiresAt: null, + }, + }); + + console.log('✅ Admin-User erstellt:', user.username); + } else { + console.log('⚠️ Benutzer existiert bereits.'); + } +} + +main() + .catch((e) => { + console.error('❌ Fehler beim Seed:', e); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/prisma/update-direction.js b/backend/prisma/update-direction.js new file mode 100644 index 0000000..06e1402 --- /dev/null +++ b/backend/prisma/update-direction.js @@ -0,0 +1,180 @@ +#!/usr/bin/env node +/* + Backfill direction & directionDegrees from *_Info.xml files into Recognition rows. + + Usage: + node scripts/backfill-direction.js [PATH_TO_ROOT] +*/ + +const fs = require('fs'); +const path = require('path'); +const { PrismaClient } = require('@prisma/client'); +const { XMLParser } = require('fast-xml-parser'); + +const prisma = new PrismaClient(); +const parser = new XMLParser({ ignoreAttributes: false }); + +const ROOT = process.argv[2] || './data'; +const CONCURRENCY = 8; // parallel verarbeitete Dateien + +// Hilfsfunktion: alle Dateien rekursiv einsammeln +function walkFiles(dir, list = []) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const e of entries) { + const full = path.join(dir, e.name); + if (e.isDirectory()) { + walkFiles(full, list); + } else if (e.isFile() && e.name.endsWith('_Info.xml')) { + list.push(full); + } + } + return list; +} + +// XML -> Date aus {DateUTC, TimeUTC} / {DateLocal, TimeLocal} +function toDate(dateObj, timeObj) { + if (!dateObj || !timeObj) return null; + const y = Number(dateObj.Year); + const m = Number(dateObj.Month) - 1; // 0-based + const d = Number(dateObj.Day); + const hh = Number(timeObj.Hour); + const mm = Number(timeObj.Min); + const ss = Number(timeObj.Sec); + const ms = Number(timeObj.Msec || 0); + if ([y,m,d,hh,mm,ss].some(n => Number.isNaN(n))) return null; + return new Date(y, m, d, hh, mm, ss, ms); +} + +async function processXmlFile(file) { + try { + const xml = fs.readFileSync(file, 'utf8'); + const json = parser.parse(xml); + const data = json?.ReturnRecognitionData?.StandardMessage?.RecognitionData; + if (!data) return { skipped: true, reason: 'no RecognitionData' }; + + const license = String(data.License || '').trim(); + if (!license) return { skipped: true, reason: 'no license' }; + + const dirStr = data.Direction != null ? String(data.Direction).trim() : null; + const degInt = data.DirectionDegrees != null ? parseInt(data.DirectionDegrees, 10) : null; + + // nichts zu backfillen? + if ((!dirStr || dirStr.length === 0) && (!degInt || Number.isNaN(degInt))) { + return { skipped: true, reason: 'no direction fields in XML' }; + } + + // Zeiten + const tsUTC = toDate(data.DateUTC, data.TimeUTC); + const tsLocal = toDate(data.DateLocal, data.TimeLocal); + + if (!tsUTC && !tsLocal) { + return { skipped: true, reason: 'no timestamps' }; + } + + // Update-Bedingungen: + // - entweder (license, timestampUTC) matcht + // - oder (license, timestampLocal) matcht + // - und direction/directionDegrees sind leer / null / 0 + const where = { + AND: [ + { + OR: [ + ...(tsUTC ? [{ license, timestampUTC: tsUTC }] : []), + ...(tsLocal ? [{ license, timestampLocal: tsLocal }] : []), + ] + }, + { + OR: [ + { direction: null }, + { direction: '' }, + { directionDegrees: null }, + { directionDegrees: 0 }, + ] + } + ] + }; + + // Nur setzen, wenn sie in XML sinnvolle Werte haben + const dataUpdate = {}; + if (dirStr && dirStr.length > 0) dataUpdate.direction = dirStr; + if (Number.isInteger(degInt) && degInt >= 0) dataUpdate.directionDegrees = degInt; + + if (Object.keys(dataUpdate).length === 0) { + return { skipped: true, reason: 'nothing to update' }; + } + + const result = await prisma.recognition.updateMany({ + where, + data: dataUpdate, + }); + + return { updated: result.count }; + } catch (err) { + return { error: err.message || String(err) }; + } +} + +// Einfache Parallelitätssteuerung +async function run() { + console.log(`🔎 Suche XMLs unter: ${path.resolve(ROOT)}`); + const files = walkFiles(ROOT); + console.log(`Gefundene *_Info.xml: ${files.length}`); + + let idx = 0; + let active = 0; + let done = 0; + let updated = 0; + let skipped = 0; + let errors = 0; + + await new Promise((resolve) => { + const pump = () => { + while (active < CONCURRENCY && idx < files.length) { + const file = files[idx++]; + active++; + + processXmlFile(file) + .then((res) => { + done++; + if (res?.updated) { + updated += res.updated; + console.log(`✅ ${file} → updated ${res.updated}`); + } else if (res?.skipped) { + skipped++; + // optional leiser: + // console.log(`⏭️ ${file} → skipped: ${res.reason}`); + } else if (res?.error) { + errors++; + console.warn(`❌ ${file} → ${res.error}`); + } else { + // nichts + } + }) + .catch((e) => { + errors++; + console.warn(`❌ ${file} → ${e.message || e}`); + }) + .finally(() => { + active--; + if (done === files.length) resolve(); + else pump(); + }); + } + }; + pump(); + }); + + console.log('—'.repeat(50)); + console.log(`Fertig. Dateien: ${files.length}`); + console.log(`✅ Updates: ${updated}`); + console.log(`⏭️ Skipped: ${skipped}`); + console.log(`❌ Errors : ${errors}`); + + await prisma.$disconnect(); +} + +run().catch(async (e) => { + console.error('Fatal:', e); + await prisma.$disconnect(); + process.exit(1); +}); diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..6eba766 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,1609 @@ +// server.js +const fs = require('fs'); +const path = require('path'); +const express = require('express'); +const chokidar = require('chokidar'); +const { XMLParser } = require('fast-xml-parser'); +const { PrismaClient } = require('@prisma/client'); +const cors = require('cors'); +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const cookieParser = require('cookie-parser'); +const crypto = require('crypto'); +const https = require('https'); + +require('dotenv').config(); + +const WATCH_PATH = process.argv[2] || process.env.WATCH_PATH || './data'; +const API_PORT = process.env.API_PORT || 3001; +const frontendBase = process.env.FRONTEND_ORIGIN || 'https://localhost:3000'; + +const prisma = new PrismaClient(); +const app = express(); + +const nodemailer = require('nodemailer'); + +const mailer = nodemailer.createTransport({ + host : process.env.SMTP_HOST, + port : parseInt(process.env.SMTP_PORT || '587', 10), + secure: false, + auth : { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS, + }, +}); + +const allowedHosts = [process.env.FRONTEND_ORIGIN, 'localhost', '10.0.1.25', '10.0.3.6', 'kennzeichen.tegdssd.de', 'sekt.tegdssd.de', 'kennzeichen.local', 'sekt.local']; + +app.use( + cors({ + origin: (origin, cb) => { + if (!origin) return cb(null, true); + const { hostname } = new URL(origin); + if (allowedHosts.includes(hostname)) return cb(null, true); + cb(new Error('Nicht erlaubter Origin')); + }, + credentials: true, + }) +); + + + +app.use(cookieParser()); +app.use(express.json()); +app.set('trust proxy', 1); + +// === SSE-Clientverwaltung === +const sseClients = new Map(); +let lastResetTimestamp = new Date(); + +// === Funktionen === + +function pushLogout(userId, reason = 'expired') { + const set = sseClients.get(userId); + if (!set) return; + + const payload = `event: logout\ndata: ${JSON.stringify({ reason })}\n\n`; + for (const res of set) res.write(payload); +} + +async function lookupImage(filename) { + if (!filename) return null; + const full = await findImageFile(filename); + return full && fs.existsSync(full) ? full : null; +} + +function capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} + +function localDateKey(d) { + const y = d.getFullYear(); + const m = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + return `${y}-${m}-${day}`; // YYYY-MM-DD in lokaler Zeit +} + +function createUnsubscribeToken(ruleId, email) { + const secret = process.env.UNSUBSCRIBE_SECRET || 'fallback_secret'; + const base = ruleId != null ? `${ruleId}:${email}` : `all:${email}`; + return crypto.createHmac('sha256', secret).update(base).digest('hex'); +} + +async function sendNotificationMail(rule, rec) { + const toList = rule.recipients.map(r => r.email.trim()).filter(Boolean); + if (!toList.length) { + console.warn(`🔔 Regel ${rule.id}: keine Empfänger – Mail übersprungen.`); + return { sent: false, reason: 'noRecipients' }; + } + + const snapPath = await lookupImage(rec.imageFile); + const platePath = await lookupImage(rec.plateFile); + + const attachments = []; + if (snapPath) attachments.push({ filename: path.basename(snapPath), path: snapPath }); + if (platePath) attachments.push({ filename: path.basename(platePath), path: platePath }); + + let successes = [], failures = []; + + for (const email of toList) { + // Regel-Token: löschen + neu anlegen + await prisma.unsubscribeToken.deleteMany({ + where: { ruleId: rule.id, email } + }); + + const tokenRecord = await prisma.unsubscribeToken.create({ + data: { + ruleId: rule.id, + email, + token: '', // wird gleich gesetzt + expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), + } + }); + + const unsubscribeSig = createUnsubscribeToken(tokenRecord.ruleId, tokenRecord.email); + + await prisma.unsubscribeToken.update({ + where: { id: tokenRecord.id }, + data: { token: unsubscribeSig }, + }); + + // Globaler Token: löschen + neu anlegen + await prisma.unsubscribeToken.deleteMany({ + where: { ruleId: null, email } + }); + + const globalTokenRecord = await prisma.unsubscribeToken.create({ + data: { + ruleId: null, + email, + token: '', // wird gleich gesetzt + expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), + } + }); + + const globalSig = createUnsubscribeToken(null, globalTokenRecord.email); + + await prisma.unsubscribeToken.update({ + where: { id: globalTokenRecord.id }, + data: { token: globalSig }, + }); + + const unsubscribeLink = `https://sekt.tegdssd.de/api/unsubscribe?id=${tokenRecord.id}&sig=${unsubscribeSig}`; + const globalUnsubscribeLink = `https://sekt.tegdssd.de/api/unsubscribe?id=${globalTokenRecord.id}&sig=${globalSig}`; + + const html = ` +

Hallo ${rule.user.username},

+

es gibt einen neuen Treffer für deine Regel #${rule.id}:

+
    +
  • Kennzeichen: ${rec.licenseFormatted ?? rec.license}
  • + ${rec.brand ? `
  • Marke: ${rec.brand}
  • ` : ''} + ${rec.model ? `
  • Modell: ${rec.model}
  • ` : ''} +
  • Kamera: ${rec.cameraName || '–'}
  • +
  • Zeit: ${new Date(rec.timestampLocal).toLocaleString('de-DE')}
  • +
+

+ Diese Mail wurde automatisch generiert. Bitte nicht antworten.
+ Du möchtest keine E-Mails mehr zu dieser Regel?
+ Hier austragen

+ Du möchtest dich von allen Benachrichtigungen abmelden?
+ Alle Regeln abbestellen

+ Die Links sind 30 Tage gültig. +

+ `; + + try { + const info = await mailer.sendMail({ + from: process.env.MAIL_FROM, + to: email, + subject: `Kennzeichentreffer: ${rec.licenseFormatted ?? rec.license}`, + html, + attachments + }); + + if (info.rejected.length === 0) { + successes.push(email); + console.log(`✅ Mail an ${email} versendet`); + } else { + failures.push(email); + console.warn(`⚠️ Mail an ${email} abgelehnt: ${info.response}`); + } + } catch (err) { + console.error(`❌ Fehler beim Mailversand an ${email}:`, err); + failures.push(email); + } + } + + return { sent: failures.length === 0, accepted: successes, rejected: failures }; +} + +function timeStringToMinutes(time) { + if (!time) return null; + const [h, m] = time.split(':').map(Number); + if (isNaN(h) || isNaN(m)) return null; + return h * 60 + m; +} + + +function matchesRule(rule, rec) { + if (!rule.enabled) return false; + + if (rule.plates) { + const re = new RegExp(rule.plates, 'i'); + if (!re.test(rec.license)) return false; + } + if (rule.brand && !(rec.brand || '').toLowerCase().includes(rule.brand.toLowerCase())) return false; + if (rule.model && !(rec.model || '').toLowerCase().includes(rule.model.toLowerCase())) return false; + if (rule.camera && (rec.cameraName !== rule.camera)) return false; + + if (rule.timeFrom && rule.timeTo) { + const nowMinutes = new Date(rec.timestampLocal).getHours() * 60 + new Date(rec.timestampLocal).getMinutes(); + const from = timeStringToMinutes(rule.timeFrom); + const to = timeStringToMinutes(rule.timeTo); + + if (from != null && to != null) { + if (from <= to) { + if (nowMinutes < from || nowMinutes > to) return false; // z. B. 08:00–17:00 + } else { + if (nowMinutes > to && nowMinutes < from) return false; // über Mitternacht, z. B. 22:00–06:00 + } + } + } + return true; +} + +async function verifyToken(req, res, next) { + let token; + + // 1. Erst in req.cookies schauen + if (req.cookies && req.cookies.token) { + token = req.cookies.token; + } + + // 2. Falls nicht gefunden, in Authorization Header schauen + if (!token && req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) { + token = req.headers.authorization.substring(7); + } + + // 3. Falls nicht gefunden, manuell aus Cookie-String extrahieren + if (!token && req.headers.cookie) { + const cookies = req.headers.cookie.split(';'); + for (let cookie of cookies) { + const [name, value] = cookie.trim().split('='); + if (name === 'token') { + token = value; + break; + } + } + } + + if (!token) { + return res.status(401).json({ error: 'Kein Token' }); + } + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + + const user = await prisma.user.findUnique({ + where: { id: decoded.id }, + include: { cameraAccess: true }, + }); + + if (!user) return res.status(401).json({ error: 'Benutzer nicht gefunden' }); + + // Ablaufprüfung für Nicht-Admins + if (!user.isAdmin && user.expiresAt && new Date(user.expiresAt) < new Date()) { + pushLogout(user.id, 'expired'); + return res + .clearCookie('token', { + httpOnly: true, + secure: true, + sameSite: 'none', + }) + .status(403).json({ error: 'Der Zugang ist abgelaufen.', logout: true }); + } + + req.user = { + id: user.id, + username: user.username, + isAdmin: user.isAdmin, + cameraAccess: user.cameraAccess ?? [] + }; + + // Token-Aktualisierung, falls < 2 Minuten verbleiben + const remainingMs = decoded.exp * 1000 - Date.now(); + if (remainingMs < 2 * 60 * 1000) { + + const maxAgeMs = 60 * 60 * 1000; // 1 Stunde in Millisekunden + + const newToken = jwt.sign( + { id: user.id, username: user.username, isAdmin: user.isAdmin }, + process.env.JWT_SECRET, + { expiresIn: maxAgeMs / 1000 } // 5 Minuten + ); + + res.cookie('token', newToken, { + httpOnly: true, + secure: true, + sameSite: 'none', + maxAge: maxAgeMs, + }); + } + + next(); + } catch (err) { + console.error('❌ Token-Fehler:', err); + return res.status(401).json({ error: 'Ungültiger Token' }); + } +} + +function buildCameraAccessFilter(cameraAccess, isAdmin = false) { + if (isAdmin) return {}; // 🔓 Admins dürfen alles sehen + + if (!cameraAccess || cameraAccess.length === 0) { + // Prisma WHERE-Filter, der garantiert keine Ergebnisse liefert + return { cameraName: '__NO_ACCESS__' }; + } + + return { + OR: cameraAccess.map(access => { + const cond = { cameraName: access.camera }; + if (access.from || access.to) { + cond.timestampLocal = {}; + if (access.from) cond.timestampLocal.gte = new Date(access.from); + if (access.to) cond.timestampLocal.lte = new Date(access.to); + } + return cond; + }), + }; +} + +async function findAllXmlFiles(dir) { + console.log('📄 Starte XML-Import...'); + + function walk(d) { + try { + const entries = fs.readdirSync(d, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(d, entry.name); + if (entry.isDirectory()) { + walk(fullPath); + } else if (entry.isFile() && entry.name.endsWith('_Info.xml')) { + enqueueFile(fullPath); + } + } + } catch (err) { + console.error(`❌ Fehler beim Lesen von ${d}:`, err.message); + } + } + + walk(dir); + console.log('✅ XML-Import gestartet.'); +} + +function enqueueFile(filePath) { + fileQueue.push(filePath); + if (!processing) processQueue(); +} + +async function processQueue() { + processing = true; + while (fileQueue.length > 0) { + await processFile(fileQueue.shift()); + } + processing = false; +} + +async function findImageFile(filename) { + const jpgFilename = filename.replace(/\.webp$/, '.jpg'); + + function searchInDir(dir) { + try { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + const found = searchInDir(fullPath); + if (found) return found; + } else if (entry.isFile() && entry.name === jpgFilename) { + return fullPath; + } + } + } catch (err) { + console.error('❌ Fehler beim Lesen des Verzeichnisses:', err); + } + return null; + } + + return searchInDir(WATCH_PATH); +} + +async function processFile(filePath) { + try { + const xml = fs.readFileSync(filePath, 'utf-8'); + const json = parser.parse(xml); + const data = json?.ReturnRecognitionData?.StandardMessage?.RecognitionData; + if (!data?.License) return; + + const baseName = path.basename(filePath).replace('_Info.xml', ''); + const dir = path.dirname(filePath); + const jpgPath = path.join(dir, `${baseName}.jpg`); + const platePath = path.join(dir, `${baseName}_plate.jpg`); + + const timestampUTC = new Date( + data.DateUTC.Year, data.DateUTC.Month - 1, data.DateUTC.Day, + data.TimeUTC.Hour, data.TimeUTC.Min, data.TimeUTC.Sec, data.TimeUTC.Msec + ); + + const timestampLocal = new Date( + data.DateLocal.Year, data.DateLocal.Month - 1, data.DateLocal.Day, + data.TimeLocal.Hour, data.TimeLocal.Min, data.TimeLocal.Sec, data.TimeLocal.Msec + ); + + const exists = await prisma.recognition.findFirst({ + where: { license: String(data.License), timestampUTC, timestampLocal } + }); + if (exists) return; + + const saved = await prisma.recognition.create({ + data: { + license: String(data.License) || null, + licenseFormatted: String(data.LicenseFormatted) || null, + country: data.Country || null, + confidence: parseInt(data.Confidence || '0', 10), + timestampUTC, + timestampLocal, + cameraName: String(data.CameraName) || null, + classification: String(data.MMR?.Classification) || null, + direction: String(data.Direction) || null, + directionDegrees: parseInt(data.DirectionDegrees || '0', 10), + imageFile: fs.existsSync(jpgPath) ? `${baseName}.jpg` : null, + plateFile: fs.existsSync(platePath) ? `${baseName}_plate.jpg` : null, + brand: data.MMR?.Make ? String(data.MMR.Make) : null || null, + model: data.MMR?.Model ? String(data.MMR.Model) : null || null, + brandmodelconfidence: parseInt(data.MMR?.MakeModelConfidence || '0', 10), + }, + }); + + + const rules = await prisma.notificationRule.findMany({ + where : { enabled: true }, + include: { + recipients: true, + user: { select: { username: true } } + }, + }); + + for (const rule of rules) { + if (matchesRule(rule, saved)) { + const url = saved.imageFile + ? `https://${frontendBase}/images/${saved.imageFile}` + : null; + sendNotificationMail(rule, saved, url).catch(console.error); + } + } + + broadcastSSE(saved); + console.log(`✅ Erfasst: ${saved.license}`); + } catch (err) { + console.error(`❌ Fehler bei ${filePath}:`, err.message); + } +} + +function generateSecurePassword(length = 12) { + const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%()*+,-./:;=?@[]_{|}~'; + const bytes = crypto.randomBytes(length); + const password = Array.from(bytes, (byte) => chars[byte % chars.length]).join(''); + return password; +} + +// Token-Cleanup (z. B. beim Start oder via Intervall) +async function cleanUpExpiredTokens() { + const result = await prisma.unsubscribeToken.deleteMany({ + where: { + expiresAt: { lt: new Date() } + } + }); + console.log(`🧹 ${result.count} abgelaufene Tokens entfernt`); +} + + + + +function isoDateLocal(date) { + // Offset in Millisekunden (negativ in CEST) + const offsetMs = date.getTimezoneOffset() * 60_000; + return new Date(date.getTime() - offsetMs).toISOString().slice(0, 10); +} + +function broadcastSSE(data) { + const payload = `event: new-recognition\ndata: ${JSON.stringify(data)}\n\n`; + + sseClients.forEach((resSet, userId) => { + prisma.user.findUnique({ + where: { id: userId }, + include: { cameraAccess: true }, + }).then(user => { + if (!user) return; + + const isAllowed = user.cameraAccess.some(access => { + if (access.camera !== data.cameraName) return false; + + const ts = new Date(data.timestampLocal).getTime(); + const from = access.from ? new Date(access.from).getTime() : -Infinity; + const to = access.to ? new Date(access.to).getTime() : Infinity; + + return ts >= from && ts <= to; + }); + + if (user.isAdmin || isAllowed) { + for (const res of resSet) res.write(payload); + } + }).catch(err => { + console.error(`❌ Fehler beim Laden von User ${userId}:`, err); + }); + }); +} + +// === REST-API-Endpunkte === + +// === POST === + +app.post('/api/login', express.json(), async (req, res) => { + const { username, password } = req.body; + + /* ── 1. User laden ───────────────────────────── */ + const user = await prisma.user.findUnique({ where: { username } }); + if (!user) { + return res.status(401).json({ error: 'Ungültiger Benutzername oder Passwort' }); + } + + /* ── 2. Passwort prüfen ───────────────────────── */ + const isValidPw = await bcrypt.compare(password, user.passwordHash); + if (!isValidPw) { + return res.status(401).json({ error: 'Ungültiger Benutzername oder Passwort' }); + } + + /* ── 3. Ablaufdatum prüfen (außer bei Admins) ─── */ + if ( + !user.isAdmin && + user.expiresAt && + new Date(user.expiresAt) <= new Date() // ≤ jetzt ⇒ abgelaufen + ) { + return res.status(403).json({ error: 'Der Zugang ist abgelaufen.' }); + } + + // === lastLogin aktualisieren =========================================== + const now = new Date(); + let updatedUserLastLogin = user.lastLogin; + try { + const updated = await prisma.user.update({ + where: { id: user.id }, + data: { lastLogin: now }, + select: { lastLogin: true }, // nur was wir brauchen + }); + updatedUserLastLogin = updated.lastLogin; + } catch (err) { + console.warn('⚠️ lastLogin konnte nicht aktualisiert werden:', err); + // updatedUserLastLogin bleibt auf altem Wert (oder undefined) + } + + /* ── 4. Token ausstellen ─────────────────────── */ + const maxAgeMs = 60 * 60 * 1000; // 1 Stunde in Millisekunden + const token = jwt.sign( + { id: user.id, username: user.username, isAdmin: user.isAdmin }, + process.env.JWT_SECRET, + { expiresIn: maxAgeMs / 1000 } + ); + + res.cookie('token', token, { + httpOnly : true, + secure: true, + sameSite: 'none', + maxAge : maxAgeMs, + }); + + res.json({ + success: true, + token, + user: { + id: user.id, + username: user.username, + isAdmin: user.isAdmin, + tokenExpiresAt: Date.now() + maxAgeMs, + expiresAt: user.expiresAt ? user.expiresAt.toISOString?.() ?? user.expiresAt : null, + lastLogin: updatedUserLastLogin + ? updatedUserLastLogin.toISOString?.() ?? updatedUserLastLogin + : now.toISOString(), + }, + }); +}); + +app.post('/api/refresh-token', verifyToken, (req, res) => { + const { id, username, isAdmin } = req.user; + + const maxAgeMs = 60 * 60 * 1000; // 1 Stunde + const maxAgeSec = maxAgeMs / 1000; + + const newToken = jwt.sign( + { id, username, isAdmin }, + process.env.JWT_SECRET, + { expiresIn: maxAgeSec } // 1 Stunde + ); + + res.cookie('token', newToken, { + httpOnly: true, + secure: true, + sameSite: 'none', + maxAge: maxAgeMs, + }); + + res.json({ + success: true, + tokenExpiresAt: Date.now() + maxAgeMs, + }); +}); + +app.post('/api/logout', (req, res) => { + res.clearCookie('token', { + httpOnly: true, + secure: true, + sameSite: 'none', + }); + res.json({ success: true }); +}); + +app.post('/api/notifications', verifyToken, async (req, res) => { + const { + plates, brand, model, camera, + timeFrom, timeTo, + emails // Array + } = req.body; + + if (!Array.isArray(emails) || emails.length === 0) { + return res.status(400).json({ error: 'Mindestens eine Empfänger-E-Mail angeben.' }); + } + + try { + const raw = await prisma.notificationRule.create({ + data: { + userId : req.user.id, + plates, + brand, + model, + camera, + timeFrom, + timeTo, + recipients: { create: emails.map(e => ({ email: e.trim() })) } + }, + include: { recipients: { select: { email: true } } } + }); + + const rule = { + id : raw.id, + licensePattern : raw.plates, + brand : raw.brand, + model : raw.model, + camera : raw.camera, + timeFrom : raw.timeFrom, + timeTo : raw.timeTo, + recipients : raw.recipients.map(r => r.email) + }; + + res.status(201).json(rule); + + } catch (err) { + console.error('❌ Fehler beim Anlegen der NotificationRule:', err); + res.status(500).json({ error: 'Konnte Regel nicht speichern.' }); + } +}); + +app.post('/api/admin/create-user', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + const { username, expiresAt, cameraAccess } = req.body; + + const newPassword = generateSecurePassword(12); + const passwordHash = await bcrypt.hash(newPassword, 10); + + try { + const user = await prisma.user.create({ + data: { + username, + passwordHash, + expiresAt: expiresAt ? new Date(expiresAt) : null, + cameraAccess: { + create: cameraAccess?.map(access => ({ + camera: access.camera, + from: access.from ? new Date(access.from) : null, + to: access.to ? new Date(access.to) : null, + })) || [], + }, + }, + include: { cameraAccess: true }, + }); + + res.json({ success: true, user, newPassword }); + } catch (err) { + console.error('Fehler beim Erstellen des Benutzers:', err); + res.status(500).json({ error: 'Fehler beim Erstellen des Benutzers' }); + } +}); + +app.post('/api/admin/reset-password/:id', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + const userId = req.params.id; + const newPassword = generateSecurePassword(12); + const passwordHash = await bcrypt.hash(newPassword, 10); + + try { + await prisma.user.update({ + where: { id: userId }, + data: { passwordHash }, + }); + + res.json({ success: true, newPassword }); + } catch (err) { + console.error('Fehler beim Zurücksetzen des Passworts:', err); + res.status(500).json({ error: 'Passwort konnte nicht zurückgesetzt werden' }); + } +}); + +app.post('/api/recognitions/reset-count', (req, res) => { + lastResetTimestamp = new Date(); + res.status(200).json({ success: true }); +}); + +app.post('/api/admin/block-user/:id', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + const userId = req.params.id; + + if (userId === String(req.user.id)) { + return res.status(400).json({ error: 'Du kannst dich nicht selbst sperren.' }); + } + + try { + await prisma.user.update({ + where: { id: userId }, + data: { expiresAt: new Date() }, + }); + + pushLogout(userId, 'blocked'); + + res.json({ success: true }); + } catch (err) { + console.error('❌ Fehler beim Sperren des Benutzers:', err); + res.status(500).json({ error: 'Zugang konnte nicht gesperrt werden' }); + } +}); + +// === PUT === + +app.put('/api/notifications/:id', verifyToken, async (req, res) => { + const id = parseInt(req.params.id, 10); + + /* ── gehört diese Regel dem anfragenden User? ───────────────────── */ + const exists = await prisma.notificationRule.findUnique({ + where : { id }, + select: { userId: true }, + }); + if (!exists || exists.userId !== req.user.id) { + return res.status(404).json({ error: 'Not found' }); + } + + /* ── Body zerlegen: „emails“ darf nicht direkt ins Update ───────── */ + const { + emails, // Array oder undefined + plates, + brand, + model, + camera, + timeFrom, + timeTo, + } = req.body; + + try { + /* 1. Hauptfelder updaten ---------------------------------------- */ + await prisma.notificationRule.update({ + where: { id }, + data : { + plates, + brand, + model, + camera, + timeFrom: timeFrom, + timeTo: timeTo, + }, + }); + + /* 2. Recipients komplett ersetzen ------------------------------- */ + if (Array.isArray(emails)) { + // (a) alte Empfänger entfernen + await prisma.notificationRecipient.deleteMany({ where: { ruleId: id } }); + + // (b) neue Empfänger anlegen + if (emails.length) { + await prisma.notificationRecipient.createMany({ + data: emails.map((e) => ({ ruleId: id, email: e.trim() })), + }); + } + } else { + // kein E-Mail-Array => aktuelle Regel direkt zurückgeben + const rule = await prisma.notificationRule.findUnique({ + where : { id }, + include: { recipients: { select: { email: true } } }, + }); + return res.json({ + id : rule.id, + licensePattern : rule.plates, + brand : rule.brand, + model : rule.model, + camera : rule.camera, + timeFrom : rule.timeFrom, + timeTo : rule.timeTo, + recipients : rule.recipients.map((r) => r.email), + }); + } + + /* 3. Aktuelle Regel zurückgeben --------------------------------- */ + const rule = await prisma.notificationRule.findUnique({ + where : { id }, + include: { recipients: { select: { email: true } } }, + }); + + res.json({ + id : rule.id, + licensePattern : rule.plates, + brand : rule.brand, + model : rule.model, + camera : rule.camera, + timeFrom : rule.timeFrom, + timeTo : rule.timeTo, + recipients : rule.recipients.map((r) => r.email), + }); + + } catch (err) { + console.error('❌ Fehler beim Aktualisieren der NotificationRule:', err); + res.status(500).json({ error: 'Update fehlgeschlagen' }); + } +}); + + +app.put('/api/admin/update-user/:id', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + const userId = req.params.id; // String-ID! + const { username, expiresAt, cameraAccess } = req.body; + + try { + /* 1. Benutzer aktualisieren ---------------------------------------- */ + await prisma.user.update({ + where: { id: userId }, + data : { + username, + expiresAt: expiresAt ? new Date(expiresAt) : null, + }, + }); + + /* 2. Kamera-Zugriffe neu setzen ------------------------------------ */ + await prisma.cameraAccess.deleteMany({ where: { userId } }); + + if (Array.isArray(cameraAccess) && cameraAccess.length) { + await prisma.cameraAccess.createMany({ + data: cameraAccess.map(a => ({ + camera: a.camera, + from : a.from ? new Date(a.from) : null, + to : a.to ? new Date(a.to) : null, + userId, + })) + }); + } + + /* 3. Sofortige Abmeldung, falls Zugang jetzt abgelaufen ----------- */ + if (expiresAt && new Date(expiresAt) <= new Date()) { + pushLogout(userId, 'expired'); // <<==== HIER + } + + res.json({ success: true }); + } catch (err) { + console.error('❌ Fehler beim Aktualisieren des Benutzers:', err); + res.status(500).json({ error: 'Aktualisierung fehlgeschlagen' }); + } +}); + +// === DELETE === + +app.delete('/api/notifications/:id', verifyToken, async (req, res) => { + await prisma.notificationRule.delete({ + where: { id: parseInt(req.params.id, 10), userId: req.user.id } + }); + res.status(204).end(); +}); + + +app.delete('/api/admin/delete-user/:id', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + const userId = req.params.id + + try { + // Zuerst Kamera-Zugriffe löschen (wegen Foreign Key Constraints) + await prisma.cameraAccess.deleteMany({ + where: { userId }, + }); + + // Danach Benutzer löschen + await prisma.user.delete({ + where: { id: userId }, + }); + + res.json({ success: true }); + } catch (err) { + console.error('❌ Fehler beim Löschen des Benutzers:', err); + res.status(500).json({ error: 'Benutzer konnte nicht gelöscht werden' }); + } +}); + + +// === GET === + +app.get('/api/protected', verifyToken, (req, res) => { + if (!req.user.isAdmin) return res.status(403).json({ error: 'Kein Zugriff' }); + res.json({ data: 'Admin-Daten' }); +}); + +app.get('/api/notifications', verifyToken, async (req, res) => { + const rows = await prisma.notificationRule.findMany({ + where : { userId: req.user.id }, + orderBy: { createdAt: 'desc' }, + include: { recipients: { select: { email: true } } } + }); + + const data = rows.map(r => ({ + id : r.id, + licensePattern : r.plates, + brand : r.brand, + model : r.model, + camera : r.camera, + timeFrom : r.timeFrom, + timeTo : r.timeTo, + recipients : r.recipients.map(x => x.email) + })); + + res.json(data); +}); + +app.get('/api/unsubscribe', async (req, res) => { + const id = req.query.id?.toString(); // UUID (Token-ID) + const sig = req.query.sig?.toString(); // HMAC-Signatur + + const setStatus = (status, ruleId = '') => { + res.cookie('unsubscribeStatus', status, { + maxAge: 5 * 1000, + path: '/', + secure: true, + sameSite: 'none', + }); + + res.cookie('unsubscribeRule', ruleId.toString(), { + maxAge: 5 * 1000, + path: '/', + secure: true, + sameSite: 'none', + }); + }; + + if (!id || !sig) { + setStatus('error'); + return res.redirect(`${frontendBase}/unsubscribe`); + } + + try { + const record = await prisma.unsubscribeToken.findUnique({ where: { id } }); + + if (!record) { + setStatus('invalid'); + return res.redirect(`${frontendBase}/unsubscribe`); + } + + const expectedSig = createUnsubscribeToken(record.ruleId, record.email); + const isValid = sig === expectedSig; + + if (!isValid) { + setStatus('invalid'); + return res.redirect(`${frontendBase}/unsubscribe`); + } + + const ruleId = record.ruleId; + + // Regel-spezifische Austragung + if (ruleId !== null) { + const deleted = await prisma.notificationRecipient.deleteMany({ + where: { ruleId, email: record.email }, + }); + + await prisma.unsubscribeToken.delete({ where: { id } }); + + setStatus(deleted.count > 0 ? 'success' : 'notfound', ruleId); + return res.redirect(`${frontendBase}/unsubscribe`); + } + + // Globale Austragung + const deleted = await prisma.notificationRecipient.deleteMany({ where: { email: record.email } }); + await prisma.unsubscribeToken.deleteMany({ where: { email: record.email } }); + + setStatus(deleted.count > 0 ? 'success' : 'notfound', 'all'); + return res.redirect(`${frontendBase}/unsubscribe`); + } catch (err) { + console.error('❌ Fehler bei /api/unsubscribe:', err); + setStatus('error'); + return res.redirect(`${frontendBase}/unsubscribe`); + } +}); + +app.get('/api/cameras', verifyToken, async (req, res) => { + try { + let cameraNames = []; + + if (req.user.isAdmin) { + const cameras = await prisma.recognition.findMany({ + where: { cameraName: { not: null } }, + distinct: ['cameraName'], + select: { cameraName: true }, + }); + + cameraNames = cameras + .map((entry) => entry.cameraName) + .filter(Boolean); + } else { + cameraNames = req.user.cameraAccess + .map((access) => access.camera) + .filter(Boolean); + } + + const uniqueSorted = [...new Set(cameraNames)].sort((a, b) => a.localeCompare(b)); + + res.json({ cameras: uniqueSorted }); + } catch (err) { + console.error('❌ Fehler bei /api/cameras:', err); + res.status(500).json({ error: 'Kameras konnten nicht geladen werden' }); + } +}); + +app.get('/api/me', async (req, res) => { + const token = req.cookies.token; + if (!token) return res.status(401).json({ error: 'Nicht eingeloggt' }); + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + + // User aus DB holen, um lastLogin (und ggf. expiresAt) zu liefern + const dbUser = await prisma.user.findUnique({ + where: { id: decoded.id }, + select: { + lastLogin: true, + expiresAt: true, + }, + }); + + res.json({ + id: decoded.id, + username: decoded.username, + isAdmin: decoded.isAdmin, + tokenExpiresAt: decoded.exp ? decoded.exp * 1000 : undefined, + lastLogin: dbUser?.lastLogin ? dbUser.lastLogin.toISOString() : null, + expiresAt: dbUser?.expiresAt ? dbUser.expiresAt.toISOString() : null, + }); + } catch (err) { + res.status(401).json({ error: 'Ungültiger Token' }); + } +}); + +app.get('/api/recognitions', verifyToken, async (req, res) => { + try { + const page = parseInt(req.query.page) || 1; + const limit = parseInt(req.query.limit) || 10; + const skip = (page - 1) * limit; + const search = req.query.search?.toString().trim().toLowerCase().replace(/\s+/g, ''); + const direction = req.query.direction?.toString(); + + let timestampFrom = req.query.timestampFrom ? new Date(req.query.timestampFrom) : null; + let timestampTo = req.query.timestampTo ? new Date(req.query.timestampTo) : null; + + if (timestampTo) { + timestampTo.setHours(23, 59, 59, 999); + } + + // Nutzer & Kamera-Zugriffsrechte laden + const user = req.user; + + if (!user || (!user.isAdmin && !user.cameraAccess.length)) { + return res.json({ data: [], page: 1, totalPages: 1, totalCount: 0 }); + } + + // Filter nach erlaubten Kameras + Zeiträumen + const accessFilters = user.cameraAccess.map(access => { + const timeFilter = {}; + if (access.from) timeFilter.gte = access.from; + if (access.to) timeFilter.lte = access.to; + + return { + cameraName: access.camera, + ...(Object.keys(timeFilter).length ? { timestampLocal: timeFilter } : {}), + }; + }); + + // Suchfilter + const searchFilters = []; + if (search) { + searchFilters.push( + { license: { contains: search } }, + { brand: { contains: search } }, + { model: { contains: search } }, + ); + } + + // Globaler Zeitfilter (aus Filterleiste) + const globalTimeFilter = {}; + if (timestampFrom) globalTimeFilter.gte = timestampFrom; + if (timestampTo) globalTimeFilter.lte = timestampTo; + + // Kombinierter Prisma-Filter + const where = { + AND: [ + ...(!user.isAdmin ? [{ OR: accessFilters }] : []), + ...(searchFilters.length ? [{ OR: searchFilters }] : []), + ...(Object.keys(globalTimeFilter).length ? [{ timestampLocal: globalTimeFilter }] : []), + ...(direction === 'towards' || direction === 'away' + ? [{ direction: { equals: capitalize(direction) } }] + : []), + ], + }; + + const [entries, totalCount] = await Promise.all([ + prisma.recognition.findMany({ + where, + orderBy: { timestampLocal: 'desc' }, + skip, + take: limit, + }), + prisma.recognition.count({ where }), + ]); + + res.json({ + data: entries, + page, + totalPages: Math.ceil(totalCount / limit), + totalCount, + }); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +app.get('/api/recognitions/stream', verifyToken, (req, res) => { + // 1) Verifizierter User steckt jetzt in req.user + const uid = String(req.user.id); + const username = String(req.user.username); + + res.status(200); + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Connection', 'keep-alive'); + res.setHeader('Access-Control-Allow-Origin', 'https://kennzeichen.local'); + res.setHeader('Access-Control-Allow-Credentials', 'true'); + res.flushHeaders(); + + /* --- Map pflegen ------------------------------------------------------ */ + if (!sseClients.has(uid)) sseClients.set(uid, new Set()); + sseClients.get(uid).add(res); + + console.log(`🟢 SSE-Client (${username}) verbunden`); + + res.write(': connected\n\n'); + + /* --- Ping — egal ob du ihn brauchst oder nicht ------------------------ */ + const ping = setInterval(() => { + res.write(`event: ping\ndata: ${Date.now()}\n\n`); + }, 30_000); + + /* --- Aufräumen -------------------------------------------------------- */ + req.on('close', () => { + clearInterval(ping); + sseClients.get(uid).delete(res); + if (sseClients.get(uid).size === 0) sseClients.delete(uid); + console.log(`🔴 SSE-Client (${username}) getrennt`); + }); +}); + +app.get('/api/recognitions/count', verifyToken, async (req, res) => { + const where = buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin); + const count = await prisma.recognition.count({ where }); + res.json({ count }); +}); + +app.get('/api/recognitions/new-count', verifyToken, async (req, res) => { + const count = await prisma.recognition.count({ + where: { + createdAt: { gt: lastResetTimestamp }, + ...buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin), + }, + }); + res.json({ count }); +}); + +app.get('/api/recognitions/by-camera', verifyToken, async (req, res) => { + try { + const isAdmin = req.user?.isAdmin; + const filter = isAdmin + ? {} + : buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin); + + const result = await prisma.recognition.findMany({ where: filter, select: { cameraName: true } }); + + const counts = result.reduce((acc, { cameraName }) => { + if (!cameraName) return acc; + acc[cameraName] = (acc[cameraName] || 0) + 1; + return acc; + }, {}); + + const labels = Object.keys(counts); + const series = Object.values(counts); + + res.json({ labels, series }); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/by-camera:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + + +app.get('/api/recognitions/dates', verifyToken, async (req, res) => { + try { + const cameraFilter = req.query.camera?.toString(); + + // Admins: kein Filter notwendig + const isAdmin = req.user?.isAdmin; + const filter = isAdmin + ? {} + : buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin); + + const recognitions = await prisma.recognition.findMany({ + where: cameraFilter + ? { cameraName: cameraFilter, ...filter } + : filter, + select: { + cameraName: true, + timestampLocal: true, + }, + }); + + if (cameraFilter) { + const timestamps = recognitions.map(r => r.timestampLocal); + if (timestamps.length === 0) { + return res.json([]); + } + + const startDate = isoDateLocal(new Date(Math.min(...timestamps.map(t => t.getTime())))); + const endDate = isoDateLocal(new Date(Math.max(...timestamps.map(t => t.getTime())))); + + return res.json([ + { + camera: cameraFilter, + startDate, + endDate, + } + ]); + } else { + const grouped = new Map(); + + for (const entry of recognitions) { + const camera = entry.cameraName || 'Unbekannt'; + if (!grouped.has(camera)) grouped.set(camera, []); + grouped.get(camera).push(entry.timestampLocal); + } + + const result = Array.from(grouped.entries()).map(([camera, timestamps]) => { + const startDate = isoDateLocal(new Date(Math.min(...timestamps.map(t => t.getTime())))); + const endDate = isoDateLocal(new Date(Math.max(...timestamps.map(t => t.getTime())))); + return { camera, startDate, endDate }; + }); + + res.json(result); + } + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/dates:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + + +app.get('/api/recognitions/counts', verifyToken, async (req, res) => { + try { + const days = parseInt(req.query.days) || 7; + + const today = new Date(); + today.setHours(0, 0, 0, 0); // lokales 00:00 + + const fromDate = new Date(today); + fromDate.setDate(fromDate.getDate() - (days - 1)); + + const entries = await prisma.recognition.findMany({ + where: { + timestampLocal: { + gte: fromDate, + lt: new Date(today.getTime() + 24 * 60 * 60 * 1000), // bis Ende heute + }, + ...buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin), + }, + select: { timestampLocal: true }, + }); + + const countsMap = new Map(); + for (const { timestampLocal } of entries) { + const key = localDateKey(timestampLocal); // ❗ lokal statt ISO/UTC + countsMap.set(key, (countsMap.get(key) || 0) + 1); + } + + const counts = []; + for (let i = 0; i < days; i++) { + const d = new Date(fromDate); + d.setDate(fromDate.getDate() + i); + const key = localDateKey(d); // ❗ gleiche Logik + counts.push({ date: key, count: countsMap.get(key) || 0 }); + } + + res.json(counts); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/counts:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +// /api/recognitions/top10plates +app.get('/api/recognitions/top10plates', verifyToken, async (req, res) => { + try { + // Admins sehen alles; sonst Kamera-/Zeitfenster einschränken + const accessFilter = buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin); + + // 1) In der DB zählen (Top 10) + const grouped = await prisma.recognition.groupBy({ + by: ['license'], + where: { + license: { not: '' }, + // optional: wenn NULL ausgeschlossen werden soll + // license: { notIn: ['', null] as any }, + ...(req.user.isAdmin ? {} : accessFilter), + }, + _count: { license: true }, + orderBy: { _count: { license: 'desc' } }, + take: 10, + }); + + // Falls keine Daten, direkt leere Antwort + if (!grouped.length) { + return res.json({ data: [] }); + } + + // 2) Für diese Top-Kennzeichen die *neueste* Marke/Modell holen + const topPlates = grouped.map(g => g.license); + + const latestMeta = await prisma.recognition.findMany({ + where: { + license: { in: topPlates }, + ...(req.user.isAdmin ? {} : accessFilter), + }, + select: { license: true, brand: true, model: true, timestampLocal: true }, + orderBy: { timestampLocal: 'desc' }, // neueste zuerst + }); + + // 3) Pro Kennzeichen die erste (neueste) Meta-Zeile nehmen + const metaByPlate = new Map(); + for (const r of latestMeta) { + if (!metaByPlate.has(r.license)) { + metaByPlate.set(r.license, { + brand: r.brand ?? null, + model: r.model ?? null, + }); + } + // danach ignorieren wir ältere Einträge für dasselbe Kennzeichen + } + + // 4) Antwort zusammenbauen (Reihenfolge bereits nach Count desc) + const data = grouped.map(g => ({ + plate: g.license, + count: g._count.license, + brand: metaByPlate.get(g.license)?.brand ?? null, + model: metaByPlate.get(g.license)?.model ?? null, + })); + + res.json({ data }); + } catch (error) { + console.error('❌ Fehler bei /api/recognitions/top10plates:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + + +app.get('/api/recognitions/top10brands', verifyToken, async (req, res) => { + try { + const result = await prisma.recognition.findMany({ + where: { + brand: { not: null }, + ...buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin) + }, + select: { brand: true }, + }); + + const brandCounts = {}; + + for (const { brand } of result) { + if (!brand) continue; + brandCounts[brand] = (brandCounts[brand] || 0) + 1; + } + + // Sortieren nach Häufigkeit (absteigend) + const sorted = Object.entries(brandCounts) + .sort((a, b) => b[1] - a[1]) + .slice(0, 10); // Nur Top 10 + + const labels = sorted.map(([brand]) => brand); + const series = sorted.map(([_, count]) => count); + + res.json({ labels, series }); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/top10brands:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +app.get('/api/recognitions/countries', verifyToken, async (req, res) => { + try { + const result = await prisma.recognition.findMany({ + where: { + country: { not: null }, + ...buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin) + }, + select: { country: true } + }); + + const counts = result.reduce((acc, { country }) => { + if (!country) return acc; + acc[country] = (acc[country] || 0) + 1; + return acc; + }, {}); + + const labels = Object.keys(counts); + const series = Object.values(counts); + + res.json({ labels, series }); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/countries:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +app.get('/api/recognitions/by-hour', verifyToken, async (req, res) => { + try { + const result = await prisma.recognition.findMany({ + where: buildCameraAccessFilter(req.user.cameraAccess, req.user.isAdmin), + select: { + timestampLocal: true, + }, + }); + + const hourCounts = Array(24).fill(0); + + for (const entry of result) { + const hour = entry.timestampLocal.getHours(); + hourCounts[hour]++; + } + + const labels = Array.from({ length: 24 }, (_, i) => { + const pad = (n) => n.toString().padStart(2, '0'); + return `${pad(i)}:00–${pad((i + 1) % 24)}:00`; + }); + + res.json({ labels, series: hourCounts }); + } catch (err) { + console.error('❌ Fehler bei /api/recognitions/by-hour:', err); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +app.get('/images/:filename', verifyToken, async (req, res) => { + const filename = req.params.filename; + const imagePath = await findImageFile(filename); + + if (!imagePath || !fs.existsSync(imagePath)) { + return res.status(404).send('Bild nicht gefunden.'); + } + + try { + const data = await fs.promises.readFile(imagePath); + res.setHeader('Content-Type', 'image/jpeg'); + res.setHeader('Cache-Control', 'public, max-age=31536000'); + res.send(data); + } catch (err) { + console.error('❌ Fehler beim Lesen der Datei:', err); + res.status(500).send('Fehler beim Laden des Bildes.'); + } +}); + +app.get('/api/admin/users', verifyToken, async (req, res) => { + if (!req.user?.isAdmin) { + return res.status(403).json({ error: 'Nicht autorisiert' }); + } + + try { + const rows = await prisma.user.findMany({ + orderBy: { username: 'asc' }, + select: { + id: true, + username: true, + isAdmin: true, + expiresAt: true, + lastLogin: true, + cameraAccess: { + select: { + id: true, + camera: true, + from: true, + to: true, + }, + }, + }, + }); + + // Normalisieren (ISO-Strings oder null) – passend zu deinem Frontend-Typ UserWithAccess + const users = rows.map((u) => ({ + id: u.id, + username: u.username, + isAdmin: u.isAdmin, + expiresAt: u.expiresAt ? u.expiresAt.toISOString() : null, + lastLogin: u.lastLogin ? u.lastLogin.toISOString() : null, + cameraAccess: u.cameraAccess.map((c) => ({ + id: c.id, + camera: c.camera, + from: c.from ? c.from.toISOString() : null, + to: c.to ? c.to.toISOString() : null, + })), + })); + + res.json({ users }); + } catch (err) { + console.error('Fehler beim Laden der Benutzer:', err); + res.status(500).json({ error: 'Fehler beim Laden der Benutzer' }); + } +}); + +// === HTTPS-Server starten === +const keyPath = path.resolve(__dirname, 'certs', 'myRoot.key'); +const certPath = path.resolve(__dirname, 'certs', 'myRoot.crt'); + +const sslOptions = { + key: fs.readFileSync(keyPath), + cert: fs.readFileSync(certPath), +}; + +https.createServer(sslOptions, app).listen(API_PORT, () => { + console.log(`✅ HTTPS-Server läuft auf https://localhost:${API_PORT}`); +}); + +// === XML-Parser und Dateiüberwachung === +const parser = new XMLParser({ ignoreAttributes: false }); +const fileQueue = []; +let processing = false; + +// === Watcher starten === +chokidar.watch(WATCH_PATH, { + usePolling: true, + interval: 1000, + binaryInterval: 3000, + alwaysStat: true, + ignored: /^\./, + persistent: true, + ignoreInitial: true, + depth: 99, +}).on('add', (filePath) => { + if (filePath.endsWith('_Info.xml')) enqueueFile(filePath); +}); + +// === Initial-Import === + +cleanUpExpiredTokens(); +setInterval(cleanUpExpiredTokens, 24 * 60 * 60 * 1000); // alle 24 Stunden +findAllXmlFiles(WATCH_PATH); diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..e215bc4 --- /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/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000..c85fb67 --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/frontend/global.d.ts b/frontend/global.d.ts new file mode 100644 index 0000000..cafff8c --- /dev/null +++ b/frontend/global.d.ts @@ -0,0 +1,21 @@ +import type { IStaticMethods } from "preline/dist"; + +declare global { + interface Window { + // Optional third-party libraries + _; + $: typeof import("jquery"); + jQuery: typeof import("jquery"); + DataTable; + Dropzone; + VanillaCalendarPro; + + // Preline UI + HSStaticMethods: IStaticMethods; + + // ApexCharts helper (Preline) + buildTooltip?: (...args: any[]) => string; + } +} + +export {}; \ No newline at end of file diff --git a/frontend/next.config.ts b/frontend/next.config.ts new file mode 100644 index 0000000..4eaed61 --- /dev/null +++ b/frontend/next.config.ts @@ -0,0 +1,46 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + allowedDevOrigins: [ + 'http://localhost:3000', + 'http://10.0.1.25:3000', + 'kennzeichen.local', + 'sekt.local' + ], + images: { + remotePatterns: [ + { + protocol: 'http', + hostname: 'localhost', + port: '3001', + pathname: '/images/**', + }, + { + protocol: 'http', + hostname: '10.0.1.25', + port: '3001', + pathname: '/images/**', + }, + { + protocol: 'http', + hostname: '10.0.3.6', + port: '3001', + pathname: '/images/**', + }, + { + protocol: 'https', + hostname: '10.0.3.6', + port: '3001', + pathname: '/images/**', + }, + { + protocol: 'https', + hostname: 'kennzeichen.tegdssd.de', + port: '3001', + pathname: '/images/**', + }, + ], + }, +}; + +export default nextConfig; diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..3b33245 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,6915 @@ +{ + "name": "kennzeichenerfassung", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kennzeichenerfassung", + "version": "0.1.0", + "dependencies": { + "@preline/datatable": "^3.0.0", + "@preline/datepicker": "^3.1.0", + "@preline/file-upload": "^3.1.0", + "@preline/select": "^3.1.0", + "@preline/theme-switch": "^3.1.0", + "bcrypt": "^6.0.0", + "chart.js": "^4.5.0", + "chartjs-plugin-datalabels": "^2.2.0", + "clipboard": "^2.0.11", + "clsx": "^2.1.1", + "datatables.net": "^2.3.1", + "datatables.net-dt": "^2.3.1", + "date-fns": "^4.1.0", + "dropzone": "^6.0.0-beta.2", + "framer-motion": "^12.23.0", + "https": "^1.0.0", + "jquery": "^3.7.1", + "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", + "lucide-react": "^0.513.0", + "next": "15.3.3", + "nouislider": "^15.8.1", + "postcss": "^8.5.4", + "preline": "^3.0.1", + "react": "^19.0.0", + "react-chartjs-2": "^5.3.0", + "react-dom": "^19.0.0", + "undici": "^6.21.3", + "vanilla-calendar-pro": "^3.0.4" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/postcss": "^4.1.8", + "@tauri-apps/cli": "^2.6.1", + "@types/bcrypt": "^5.0.2", + "@types/datatables.net": "^1.10.28", + "@types/jquery": "^3.5.32", + "@types/jsonwebtoken": "^9.0.10", + "@types/lodash": "^4.17.17", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.3", + "tailwindcss": "^4.1.8", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz", + "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@next/env": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.3.tgz", + "integrity": "sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.3.tgz", + "integrity": "sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.3.tgz", + "integrity": "sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.3.tgz", + "integrity": "sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.3.tgz", + "integrity": "sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.3.tgz", + "integrity": "sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.3.tgz", + "integrity": "sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.3.tgz", + "integrity": "sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.3.tgz", + "integrity": "sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.3.tgz", + "integrity": "sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@preline/datatable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@preline/datatable/-/datatable-3.0.0.tgz", + "integrity": "sha512-vvjEjBcrqSwzV6rNMvrx2NIoEHaUfw9BScn/wmkkAIhbffVFhsSjoTKrwqNFGsugKqApAJ9WBDZu1v3bD57vDA==", + "license": "Licensed under MIT and Preline UI Fair Use License" + }, + "node_modules/@preline/datepicker": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@preline/datepicker/-/datepicker-3.1.0.tgz", + "integrity": "sha512-I24IzsM8R9IeXxjLR41s8P0HHoO06a1VDSqXvHlxw9Zra73ZZp5z5EHSHIbcdu32kG252WoEjYEvT/lUavg5Dg==", + "license": "Licensed under MIT and Preline UI Fair Use License" + }, + "node_modules/@preline/file-upload": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@preline/file-upload/-/file-upload-3.1.0.tgz", + "integrity": "sha512-maY9noaNlaZeZEQIdfff6AhgGuPPjQlY8oQmK1eAd1aEHeZZVcEERK6u9zoR98fAg9ZRjlGChyYVHvbeG/aeDQ==", + "license": "Licensed under MIT and Preline UI Fair Use License" + }, + "node_modules/@preline/select": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@preline/select/-/select-3.1.0.tgz", + "integrity": "sha512-SawthERM3RfsEXaY/tXrwsMxPpMZ+mG/A1yLPWxbhtPzkLs4HWlfapRWgYmGvJokNNq36hG9pUk6xQ9r2w101g==", + "license": "Licensed under MIT and Preline UI Fair Use License" + }, + "node_modules/@preline/theme-switch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@preline/theme-switch/-/theme-switch-3.1.0.tgz", + "integrity": "sha512-Awu7a2bAP0jI7CraFhaVC+RHOxbXG6I8gaZeVb9qmJJ2+IF36JErZ1A8e/RUsgARdTA8514URHQF8KIXfIohug==", + "license": "Licensed under MIT and Preline UI Fair Use License" + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "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.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", + "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.8.tgz", + "integrity": "sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.8" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.8.tgz", + "integrity": "sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.8", + "@tailwindcss/oxide-darwin-arm64": "4.1.8", + "@tailwindcss/oxide-darwin-x64": "4.1.8", + "@tailwindcss/oxide-freebsd-x64": "4.1.8", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.8", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.8", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.8", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.8", + "@tailwindcss/oxide-linux-x64-musl": "4.1.8", + "@tailwindcss/oxide-wasm32-wasi": "4.1.8", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.8", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.8" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.8.tgz", + "integrity": "sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.8.tgz", + "integrity": "sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.8.tgz", + "integrity": "sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.8.tgz", + "integrity": "sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.8.tgz", + "integrity": "sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.8.tgz", + "integrity": "sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.8.tgz", + "integrity": "sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.8.tgz", + "integrity": "sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.8.tgz", + "integrity": "sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.8.tgz", + "integrity": "sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.10", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.8.tgz", + "integrity": "sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz", + "integrity": "sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.8.tgz", + "integrity": "sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.8", + "@tailwindcss/oxide": "4.1.8", + "postcss": "^8.4.41", + "tailwindcss": "4.1.8" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.6.1.tgz", + "integrity": "sha512-8NrwfZjeyKH1zwg+Xu4epx8WLjffoiW1Zs9CCFYCJns7uUghzudDm92o+8ROosg5Njlvp1GXBuIRsdrEwBsDhg==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.6.1", + "@tauri-apps/cli-darwin-x64": "2.6.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.6.1", + "@tauri-apps/cli-linux-arm64-gnu": "2.6.1", + "@tauri-apps/cli-linux-arm64-musl": "2.6.1", + "@tauri-apps/cli-linux-riscv64-gnu": "2.6.1", + "@tauri-apps/cli-linux-x64-gnu": "2.6.1", + "@tauri-apps/cli-linux-x64-musl": "2.6.1", + "@tauri-apps/cli-win32-arm64-msvc": "2.6.1", + "@tauri-apps/cli-win32-ia32-msvc": "2.6.1", + "@tauri-apps/cli-win32-x64-msvc": "2.6.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.6.1.tgz", + "integrity": "sha512-67aVLeXcJrl9D+4xQLR8NCQYKXQyZB96Tai+uy53jOY0u+uKvFngjbSS9CmntILFhLWoueDxQj3Ws5OSvjekiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.6.1.tgz", + "integrity": "sha512-6mQp/VikM0pKVKau1p/NMVyGq1JakOFbk6YlCzwdd04OwmiDuVe9PTxzqcA/JnqWXEhSGlRKeyMXUxqifPBPYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.6.1.tgz", + "integrity": "sha512-iY9cr2k3h2nh6I0bExEWCOgWloN4q0p/evhfNBIAIly1kycy+xWHEsFj2WfzU31Ce8RkqxilPHNuCp36gDM+Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.6.1.tgz", + "integrity": "sha512-AT+SpHShi/uJipzj+A9kHPDUgZfzHYyl0B3/4UXYtHB9hQfQUmjh9wLadmx0ai/ESyJFxkJJK6FFRvxotQ3gIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.6.1.tgz", + "integrity": "sha512-CCgE0uqcWTtU48TmK/J03h5x/hxi3PEc11ci3LQ9WqIE15btyhynNzDKbxKwOyDCMcfbDT+MweoiCPnely2ZRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.6.1.tgz", + "integrity": "sha512-2i3MYr2oKaJk7Tz2FZ+R5x8cV827CudvEXW6FzCER26pfx/PofH/55N7aRQf4+qPXi5O3T+3myq88nRerzHr6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.6.1.tgz", + "integrity": "sha512-of5i3FW1tjTXECtMdirQsQnVIzcKq1s5Cad9YLVa6agEnFnZbFU3rKQ6/Wfu5SZbjSiI7SBO1hksjIAq1vkVcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.6.1.tgz", + "integrity": "sha512-QfAgg7VIlOrTa2X3fBLRp6ugbC5ZonSWgVhNCLDgHLp5Cga41XOi5qU7ZtZhjjCdcWNiE0DtBQmSb1YVhCp+SA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.6.1.tgz", + "integrity": "sha512-ee1h3jwamumGjLEXZA4VsSUcVWTtGpuvxy+nqFfu7wb2k6IcBrFEJGa6yXa7sQjuCAAorLfSIXGuDEJARqnpFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.6.1.tgz", + "integrity": "sha512-WEZVYekxuG9X9mFJEeJPHsSAl8sHOEEbJQriim+OziFbLA9pv/gfcRRqsbmEJL8uBC8GLTEOdUVolohwXk6S9g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.6.1.tgz", + "integrity": "sha512-fBsjPqIIHaaQt7tnjIGmPHu5p/BNBVD4JfOhO3QqIVBzAb+W2bDyIQPdoDMI943soLr/+N10xeTiPu+3L74+dQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/datatables.net": { + "version": "1.10.28", + "resolved": "https://registry.npmjs.org/@types/datatables.net/-/datatables.net-1.10.28.tgz", + "integrity": "sha512-Y6SZZCdJt7vXROaTBc/ifwhAqSBg7V0urM+RqZt3Tj9JN1U8KSgQ7EKpFG88g/j4MVrlYDfSH+yqSnK0MaIwMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jquery": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jquery": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.32.tgz", + "integrity": "sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "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/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", + "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.57.tgz", + "integrity": "sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/react": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz", + "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/sizzle": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", + "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/type-utils": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.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.33.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", + "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", + "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.33.1", + "@typescript-eslint/types": "^8.33.1", + "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": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", + "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", + "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", + "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", + "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", + "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.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", + "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.33.1", + "@typescript-eslint/tsconfig-utils": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "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": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "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/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", + "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", + "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.33.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.9.tgz", + "integrity": "sha512-hWbcVTcNqgUirY5DC3heOLrz35D926r2izfxveBmuIgDwx9KkUHfqd93g8PtROJX01lvhmyAc3E09/ma6jhyqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.9.tgz", + "integrity": "sha512-NCZb/oaXELjt8jtm6ztlNPpAxKZsKIxsGYPSxkwQdQ/zl7X2PfyCpWqwoGE4A9vCP6gAgJnvH3e22nE0qk9ieA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.9.tgz", + "integrity": "sha512-/AYheGgFn9Pw3X3pYFCohznydaUA9980/wlwgbgCsVxnY4IbqVoZhTLQZ4JWKKaOWBwwmM8FseHf5h5OawyOQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.9.tgz", + "integrity": "sha512-RYV9sEH3o6SZum5wGb9evXlgibsVfluuiyi09hXVD+qPRrCSB45h3z1HjZpe9+c25GiN53CEy149fYS0fLVBtw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.9.tgz", + "integrity": "sha512-0ishMZMCYNJd4SNjHnjByHWh6ia7EDVZrOVAW8wf9Vz2PTZ0pLrFwu5c9voHouGKg7s2cnzPz87c0OK7dwimUQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.9.tgz", + "integrity": "sha512-FOspRldYylONzWCkF5n/B1MMYKXXlg2bzgcgESEVcP4LFh0eom/0XsWvfy+dlfBJ+FkYfJjvBJeje14xOBOa6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.9.tgz", + "integrity": "sha512-P1S5jTht888/1mZVrBZx8IOxpikRDPoECxod1CcAHYUZGUNr+PNp1m5eB9FWMK2zRCJ8HgHNZfdRyDf9pNCrlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.9.tgz", + "integrity": "sha512-cD9+BPxlFSiIkGWknSgKdTMGZIzCtSIg/O7GJ1LoC+jGtUOBNBJYMn6FyEPRvdpphewYzaCuPsikrMkpdX303Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.9.tgz", + "integrity": "sha512-Z6IuWg9u0257dCVgc/x/zIKamqJhrmaOFuq3AYsSt6ZtyEHoyD5kxdXQUvEgBAd/Fn1b8tsX+VD9mB9al5306Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.9.tgz", + "integrity": "sha512-HpINrXLJVEpvkHHIla6pqhMAKbQBrY+2946i6rF6OlByONLTuObg65bcv3A38qV9yqJ7vtE0FyfNn68k0uQKbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.9.tgz", + "integrity": "sha512-ZXZFfaPFXnrDIPpkFoAZmxzXwqqfCHfnFdZhrEd+mrc/hHTQyxINyzrFMFCqtAa5eIjD7vgzNIXsMFU2QBnCPw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.9.tgz", + "integrity": "sha512-EzeeaZnuQOa93ox08oa9DqgQc8sK59jfs+apOUrZZSJCDG1ZbtJINPc8uRqE7p3Z66FPAe/uO3+7jZTkWbVDfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.9.tgz", + "integrity": "sha512-a07ezNt0OY8Vv/iDreJo7ZkKtwRb6UCYaCcMY2nm3ext7rTtDFS7X1GePqrbByvIbRFd6E5q1CKBPzJk6M360Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.9.tgz", + "integrity": "sha512-d0fHnxgtrv75Po6LKJLjo1LFC5S0E8vv86H/5wGDFLG0AvS/0k+SghgUW6zAzjM2XRAic/qcy9+O7n/5JOjxFA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.9.tgz", + "integrity": "sha512-0MFcaQDsUYxNqRxjPdsMKg1OGtmsqLzPY2Nwiiyalx6HFvkcHxgRCAOppgeUuDucpUEf76k/4tBzfzPxjYkFUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.9.tgz", + "integrity": "sha512-SiewmebiN32RpzrV1Dvbw7kdDCRuPThdgEWKJvDNcEGnVEV3ScYGuk5smJjKHXszqNX3mIXG/PcCXqHsE/7XGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.9.tgz", + "integrity": "sha512-hORofIRZCm85+TUZ9OmHQJNlgtOmK/TPfvYeSplKAl+zQvAwMGyy6DZcSbrF+KdB1EDoGISwU7dX7PE92haOXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "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.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "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.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "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/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "BSD-3-Clause" + }, + "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.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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/caniuse-lite": { + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "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/chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "license": "MIT", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "license": "MIT", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "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/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "devOptional": true, + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": 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.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/datatables.net": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.1.tgz", + "integrity": "sha512-pRXZuk3oR7P5kTl/CRvopcTihlvmZiY+xSBjbNI6e8MjYtgZQodWEqLUUOrIZeLH8CfxapPR/Bmb0NKAvILP5g==", + "license": "MIT", + "dependencies": { + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-dt": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-2.3.1.tgz", + "integrity": "sha512-4hh0PdUPwMNP4ZM184VX+u9SjFzLp5FCoM98ybuk8exeIflTpD3cLhfMBEjPvVUm89jZVCofqggxO9fNgTkH0A==", + "license": "MIT", + "dependencies": { + "datatables.net": "2.3.1", + "jquery": ">=1.7" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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/dropzone": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-6.0.0-beta.2.tgz", + "integrity": "sha512-k44yLuFFhRk53M8zP71FaaNzJYIzr99SKmpbO/oZKNslDjNXQsBTdfLs+iONd0U0L94zzlFzRnFdqbLcs7h9fQ==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.2.13", + "just-extend": "^5.0.0" + } + }, + "node_modules/dropzone/node_modules/@swc/helpers": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.2.14.tgz", + "integrity": "sha512-wpCQMhf5p5GhNg2MmGKXzUNwxe7zRiCsmqYsamez2beP7mKPCSiu+BjZcdN95yYSzO857kr0VfQewmGpS77nqA==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "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.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "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-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "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": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.3.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.3.tgz", + "integrity": "sha512-QJLv/Ouk2vZnxL4b67njJwTLjTf7uZRltI0LL4GERYR4qMF5z08+gxkfODAeaK7TiC6o+cER91bDaEnwrTWV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.3.3", + "@rushstack/eslint-patch": "^1.10.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.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.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.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "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.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "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.12.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", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "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/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.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "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", + "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.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "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.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "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 || ^9.0.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": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "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==", + "dev": true, + "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.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.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==", + "dev": true, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/framer-motion": { + "version": "12.23.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.0.tgz", + "integrity": "sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.22.0", + "motion-utils": "^12.19.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "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/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "license": "MIT", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, + "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.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "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.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "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.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT" + }, + "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==", + "dev": true, + "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/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "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/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/just-extend": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz", + "integrity": "sha512-b+z6yF1d4EOyDgylzQo5IminlUmzSeqR1hs/bzjBNjuGras4FXq/6TrzjxfN0j+TmI0ltJzTNlqXUMCniciwKQ==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lucide-react": { + "version": "0.513.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.513.0.tgz", + "integrity": "sha512-CJZKq2g8Y8yN4Aq002GahSXbG2JpFv9kXwyiOAMvUBv7pxeOFHUWKB0mO7MiY4ZVFCV4aNjv2BJFq/z3DgKPQg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/motion-dom": { + "version": "12.22.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.22.0.tgz", + "integrity": "sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.19.0" + } + }, + "node_modules/motion-utils": { + "version": "12.19.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz", + "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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": "15.3.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.3.tgz", + "integrity": "sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.3", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.3", + "@next/swc-darwin-x64": "15.3.3", + "@next/swc-linux-arm64-gnu": "15.3.3", + "@next/swc-linux-arm64-musl": "15.3.3", + "@next/swc-linux-x64-gnu": "15.3.3", + "@next/swc-linux-x64-musl": "15.3.3", + "@next/swc-win32-arm64-msvc": "15.3.3", + "@next/swc-win32-x64-msvc": "15.3.3", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "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/node-addon-api": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.4.0.tgz", + "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nouislider": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.8.1.tgz", + "integrity": "sha512-93TweAi8kqntHJSPiSWQ1o/uZ29VWOmal9YKb6KKGGlCkugaNfAupT7o1qTHqdJvNQ7S0su5rO6qRFCjP8fxtw==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "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.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preline": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/preline/-/preline-3.0.1.tgz", + "integrity": "sha512-rwtpdYZPCJZaJ+kGDCegmId/xrxx4IZMo+l+YCTaqis/ponVyVMimQ6TxTYjHgdOTpIbI5A9xXMYROXT4Jbbbg==", + "license": "Licensed under MIT and Preline UI Fair Use License", + "dependencies": { + "@floating-ui/dom": "^1.6.13" + } + }, + "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==", + "dev": true, + "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": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "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/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "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/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "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.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "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.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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-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.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "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 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.8.tgz", + "integrity": "sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "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/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "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/unrs-resolver": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.9.tgz", + "integrity": "sha512-hhFtY782YKwpz54G1db49YYS1RuMn8mBylIrCldrjb9BxZKnQ2xHw7+2zcl7H6fnUlTHGWv23/+677cpufhfxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.9", + "@unrs/resolver-binding-darwin-x64": "1.7.9", + "@unrs/resolver-binding-freebsd-x64": "1.7.9", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.9", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.9", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.9", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.9", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.9", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.9", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.9", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.9", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.9", + "@unrs/resolver-binding-linux-x64-musl": "1.7.9", + "@unrs/resolver-binding-wasm32-wasi": "1.7.9", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.9", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.9", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.9" + } + }, + "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/vanilla-calendar-pro": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vanilla-calendar-pro/-/vanilla-calendar-pro-3.0.4.tgz", + "integrity": "sha512-i13aJsfovlfRGm7zkoxYh9WylkdLVJkjmfZjJms5cb5i/lbnPTBaDQ0J51joC3Q4h66sFpEUjA4bXLAr/OPZ2w==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://buymeacoffee.com/uvarov" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "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/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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 0000000..01c3ee2 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,61 @@ +{ + "name": "kennzeichenerfassung", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "tauri": "tauri" + }, + "dependencies": { + "@preline/datatable": "^3.0.0", + "@preline/datepicker": "^3.1.0", + "@preline/file-upload": "^3.1.0", + "@preline/select": "^3.1.0", + "@preline/theme-switch": "^3.1.0", + "bcrypt": "^6.0.0", + "chart.js": "^4.5.0", + "chartjs-plugin-datalabels": "^2.2.0", + "clipboard": "^2.0.11", + "clsx": "^2.1.1", + "datatables.net": "^2.3.1", + "datatables.net-dt": "^2.3.1", + "date-fns": "^4.1.0", + "dropzone": "^6.0.0-beta.2", + "framer-motion": "^12.23.0", + "https": "^1.0.0", + "jquery": "^3.7.1", + "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", + "lucide-react": "^0.513.0", + "next": "15.3.3", + "nouislider": "^15.8.1", + "postcss": "^8.5.4", + "preline": "^3.0.1", + "react": "^19.0.0", + "react-chartjs-2": "^5.3.0", + "react-dom": "^19.0.0", + "undici": "^6.21.3", + "vanilla-calendar-pro": "^3.0.4" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/postcss": "^4.1.8", + "@tauri-apps/cli": "^2.6.1", + "@types/bcrypt": "^5.0.2", + "@types/datatables.net": "^1.10.28", + "@types/jquery": "^3.5.32", + "@types/jsonwebtoken": "^9.0.10", + "@types/lodash": "^4.17.17", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.3", + "tailwindcss": "^4.1.8", + "typescript": "^5" + } +} diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs new file mode 100644 index 0000000..b776c62 --- /dev/null +++ b/frontend/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + } +} \ No newline at end of file diff --git a/frontend/public/assets/img/logo.png b/frontend/public/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff031551976f239e5e0f990ebf99520af912140 GIT binary patch literal 538861 zcmYIP2RxN;*naI}W^XbMopO>*vNw?tGRod$XOq20M#|<88I_S$W>&~JB*{)fc2+39 z=N$j<`_Aw6|3^9R`#kr3U-xxg_jBTO?x>QJFq1$KM6Rx;qz6Gnl$b9VA^6Fj+h-T> zKYV+6EqMs4Ng@4fNdQ44>W+$vI$nCJ3LNUnieiE{#l)@)@e4wbT3p^;U!(LRdYSnn z+e?NDUw3Mrxr9Mn+*PoTl*TB^G{`cNl3K1ODwf2MmX0b{&7eDcfxefbGrA)5+78mE4uT!~P?eLaC^EQ-7kIpqqM8Qj%XUr)aBn_qT@P z(y1-rb5Q;q{9sSe13^1@{(d3e)v|wa-nc=ykoyEboVsuEJmQ@W?>&ek6YiJjT36zAf$>L+DZWVBpW@sBxeDIW+@;)K^zjekRm(H z5FUpnUZKEP`$D<7dsLGe4%9LDbm-abF=5)Kr=!fizjqeCbAJEeQlntWaFx=I_y=TB{6Kh`xX^@TG~hVFU*fMEdw!A5M=3T|5>nDl9;>2O zfu#hQbKym|g@lkp@V95v0XvXKwp`Y$j^c=a9+s{?ul15w2JsaHU5{3{&-$Vs|4Y7# z{w`8;A4wO#YZTX{!==^d->jFa#M%G!JN4RQq20@w|A^Cl$)T!f?T$MQMD>F%9U)sd zxCs*9wRAAxS`sSBk-02QgtC$pF=om$>32we#jmf%V=ko1UZi~6 zDJVg{vOs-5Y~7uK(1J1l17k}xF~0mq7>y;TWGt0c@>i~57(-SvK9{AMNLpwK$673{ zE?3V-&l22n1*g;pYTUoCd(z%ax-WO~WcnkAQ2gKc7FEHFuv%Tb&$y4|nqOXKj_)n> zLVJr`dJvk4az-=1WtR?ZK$W3yuRijIg5#5|L(zg1c8OD#_Y-53E#i!rdHd+CmyJXX zQ$(%VjKqEDSUU18w_$MHgix9dm{}y{2bb_CPgIRGjTB$ns!`qO^gA>rhCBBV~L?yNSgcD>|o ziOd+KW3DFe`jdzKb3b6Up;a8uQX8LKdZL|n+TZn~kyf%N_PZuA3a(d@L9HQbE4z&U zqCiL?tFS_Ms678OtRhyjz(oCFp^wguyD{Z7B9F3phH~f?2TQIOPmE?e+B+UO+*tE| zM?4$BuKaBD*_iVx(b~#d#J(>Xc{F)MpPChd$(bpTsf@9a=|+}jDZ%)&tdIHvlR_+6 z_RlXpcQY`$c6cp_E_HzVspM0`ry);QD)bG!3}h$#D@gS#4K7uh83vcC7}V)3l@oua zube1nGk9Mv_Ig;)S1(0pMAy8y&HP{Zi8Xm`bd*YAv|6#gbz?765+{AHknOIK!WU0N zymh4Wb1f^=+T#sPAA(aBpBsUicNM)V?5gZi?eczl4B=4p)-3GYoXXW0<{Ty;4!n+c zUG{p-7pGTtuR>mle+&55_RVV3bCZ5^{oD2<_dK~gWZr?~L&>8@#P7u3>As74H~nbj zm&~~Jy8jyS!N38<+ALc2;NgDp0mHBDFWczL;sPQtu_sI}f)ds{pPpE+IzM-8LhnQ_ zzN8v-c$eDkP>fbDzS6|I6=T07>c=2sSLMcPRV6ZKJL4>6Y2_$1UD93B^P}zRP=<51 z-8=N#aqmx`J|btTzE<^bB;TCKb9=26vi zLm5MV!vn*~D)le-*OBWFzua@tVY!z>mLr)n*zodI&Z};poQLzY-)U2>j$J*t>-tS_ zd=`!=yyRrK5gW{a`IWw=O9)6zvB;6BSd8);q z!_xntOL|*=f9J^PyT_-cyt16K4|`8mZkYL)8JnH9vTN7n^5%aLc=&O;+jOCIFwjC$ zM%wmdcnwdcR|dBrpdhBLw2fjTPK76QvS3r`v0ciy+dGu(}}Z; z(;CJcR)^<|cNsqm{{@jKK@!1x!W(2VbP8m|Vt)J;_{d#!@)y(j7ZFn%>SISt__(_mN)N|@*wX(|*911!&7`2zn zT(#I}en;j+X)Cv(l2E!ejZGR-X+QG}pB_rg-U?PcafsGddDJURtgXlApURZh%)O^& zsPtv7YGle|>iW%$+>G2}J#xp)w|tWVjfh5VJ3hX2@*n;`9}cjj#|#|(;6C=+o2GM# z(nJ@()qAZ&L9cn^C7+)uqp4q$TC1ALXW@CfvtP&Dq~Y{Itxu|TnyTx*Hu)LvE^xIg zzo+L;xXa+nFZe+3osFO4&RFoE!(eUZKb`MJdIrCp{AYeA>qU&cc%jG_eoy3Sc}D-B z>+5}!W@|djr#1%LPR}Mx4If`)cxqndUiI?zpK6t+pWpA@F`o!J@PGL2+nh$@z~;Kz zdda$L)sb=g8;w>c`H9i!9r9N!yGhF|<_|UIyo&;y4w8r74h;<9iCT(ontp1in*LoR zR(u$c_xQn};lEdvjcrrB-@dfZ`UdV%M6l7_n%mCUXsPG(yXV}h9DLw9wiP~`!feIz zuKj1oY?G?5c29mv;EO<_L*?ytCvP{GnK$k2wZsqg#FE(6B;A*DLfyXQY-an`yPI62 z_#nUBd1bydC~!$v7`&Y+cQtZ%nfNQPuV0hlSEbt=p@K#d&OIY^rUI z=ONpIOV*G2L{skN7v>?PcaMLBr!SS+l;!8$k(K_OHRFGz`8Uh?f$oD=d&QA_SqASd z%|`R1{=K=Clm|O4?)zLvR?|Fz zjAmpY#PHmI-K%nC{@?f0+apGQzwVG8Cycbe_AlS_+^#HtBiYB@ce!QQUwXIn@2lbI z;O(aEck_L%m$MLm<<4~W&?nY?Wuw|hGAlu6e{UQ`?wwv&l^6jelfzm~PYZ$qcp)e> z5`s>^k3v@==#c;f{jz`{$>$Kn;GX+VR|@_wUdZ}DFn$VkC3$_n z+>Ke^Ak*bpv7L1_NmW(JG~|dxT;26SpTlrU73(b|!_P>51H_6r0>6>Gij^ zZ{@=D3ZK*#$)!`;aYRymWWST!eQWN^oaFXppD~E|2O=#6ZazQKM_@C%a$i0DEBeKJ zFlj|acr50nch^FAoh|HlPW61B*{_bixjypKU^9XzGuzF*VIwSur}wQEya*vXh#DFX zSucjTpznC+4;h<==K?ocRXp3*84usvd$y;HtlX15lFxW5brw5Eg?(plo|hHz%B0$# zZxK;pUb@4^txn5l1XC-wYg<#Y2xSg4{fPIUc?Ay23PT90J2?=95okvd=1szgPB<)Fesi8n#UQ;OAHUNAD&}>aYeU7UT7k($~rH5#FGq?+@qf1A({se~ULag- za!mNNP`I&3RxZQ=i>59{8-YjdW7O)kk{9?G&cS&4rmEuK>@y1?MzUV-W$=^`)ajr( zEn0^@d$G83Sv*VA5Hj3ns3ZD*R?*P>(`H9b4~{^H&Ci zAt68}+2KHF!NB$bx2d4Uf2@SlH1bM3S**p3WhyJ^n^lJ~c1StjX zWL_60CsfShfYIZGBVpk#0?f1#oi7=aRO<3&2~mocV0$7ubs$~jpT8?EVyBLH=N0q} z&)^_-WEIS}EBY;jvi7e~$2GVk_Fq?2n7)&|m95VKL@Nhuck_{{Z{gz#K`~H6e^%aT zVYes4HN2w2=(k(`$vN z{ck+>hDzqH|6jGMmE@XK*^t`m4Px@A{6~IJJlY}Gfx4%eH{G$e-{Beq8DWowfEto0 zPDtBe!UmLGk9EyYBdG>{`lPm0HQsf!xxfbw*dk_WMeP=3brx`JR=)Z0UsggvmN~jq zq3Gq;OwTlVd2n7nfjj1_)7rBnm68;9E(kD^)mjKV2Spup{4`EYyWd7AHMUQBQSBuk zD~VgY3U_6idOedIrQChW(aD+5MnoO5VDqYnJ+PRAAgz|e-jA7!uz_jzmNJ6k?|aOx z-teaL@TN=j!Lxrp*DTcl)e46Z4tDsvN{QzoQh2`aD#4i#RJj*>-6j4SBI!>VN-rRANUPC$xY0b$Nw%vnpx0fO>;b zvN&@hH~GK2k@1}l`h*S4JSfhO4nj(Gwvn7lu`s^T($)r^(l-_TH<`bq`<}L2G5y{r1uQO&Rw-5NDC8-xX`&<^(DraEr>_ddSru`>2=j`mso2t#xKb1Qtcu*>GgJx6zHpkj zOb7V8y9AP^*(~?)9EcWhDDASag7DqM>PscL^VOM9d9 z!a2M}#YI2k!5~<;X(4vw$R+>VI3_V2=4=Q-bAM|IU;d?7&X6!!xaD)S15!L&a~Xx8 zU(HL8b*NUit1}kL;oET6hyE}_-Agro9_o&8_JjkK;?xrzfu^eR8cQvZk0$#J@p9+K z@w*@+dmhE#!NewG(uf0l&lhMpV}xO|bMMOvlfnw8n)d-#uhd1@c;d%2bw!dEZbm67 z5!nmH@usVbbXw^``j7-aRmzq4_=HodREOJ0cDF<&#p#L2Z*M`95yuh1+ZoQfb)&+~ z6C0JkofieHRyg^vmdC(V6r7zqe#{Rf-h}v7D%}u)Y)zFO z8@}jpE9h?MSsmSA^wSuHMR#WrX0!2`&wtGHw6??;$=ZJQM!$j-pzvHhY~7CC(J`P) zpwEBlOM$&>6=wJN9&9mD3MhvzG#I^7WhTQmTN|M`0?=g-hSilsKKCr`Dj}K4RZyv4 z9N>RF;MBoWHX^RB4qxkO{+Sl=9);|S$EByg8hDjxMREL4|wqdPThS^`WF~+^={Y31@q>#=O`~ zFKUsG-OW2}6M|27@!u z4y^V9%&Iw>rR8aGEh^=5wUy@}4J=iP(H1pE59t#g35E7UZPJ)brB67q+BLEtz5EAW z&MS^-$v2^gtFpIKZLvL=oN4Am28J#C9_tV*Aq3@LTv_q$Ma3_7UD_0(xbK1}#6&#G z=#v*I*bq6;p}Q8{1*l0TVm>U2FYT@dhFh$P)5ep_5>vMJFr@cWN83;it<(A;u;_i2R$`GxyA^2Hy4D-tUwK(*3-iirUsv( zrHC!>i4E&`=(mYHQ%A_z#N5reSj1yMRZjl3VLGn|lKvk&U(HpVG4c?k9669G-Npz^0Cis*|6fiFTnCUO z(p*tdX<(3NCpKs<99LQn2#7!&N^#o-gcy)AR*IN!T#KXAscJtaGJlr(j<0E0;#vVb#g%!5~#)mA90D!?AR zn@T}6@=6c3`AK;j=59SZcDLGvr)vzxVk$1y%b6a&3gSDCSA|N z^2=!U3xq3408f{FrD;YOt}FE*qeMB)#wSOUS9$wB*suUS1A`>xVzj%&XZB^6kImK_RBX%!1{3ZQ ztcj6|pab!P-iGB#P^P3pC|C`jSEpT$Hea^K}F*LL!J92*e ze8Y=kmzn6~ul*#+AGg{NiWoeVVk$!U)$`peMDfb$RJ_H+D2H!HxvjDxkU*RYV-oLk z9%7YrNAu>X$8MSFBHl_Mtt42Tl9W(6T&bhKewOwwL(DjS|GUiii|D;@IjDH52l(!U zjZhvUevC^!jW;e$zsi>%)iog-^-K;9*Aa*{l1c`Y*Bsp_dmzli zzB9$8WgySIF|QqRR<;#N@T;Rj!CwB{yA%zBg&L;;;-F?nY?wd*YO*j?L?INiER39a z{5>7<>}5p-=(+9)TG!-AMK_ST&j5*-?|EEClb(AAo2!cdbwY~%j+@b?0D@Kl1X&4X z|5UTv6TePB=n~OsF?Q=RI&9-QPS>Kq_Zoctm#3v0-*+Wi%x<92jHsHgj~hvq&&6^J z3O*G7^(ySwkPEHrz$xyBsb_%1Dnfh-E)Zo-63DUrSc_jbMOKXNu1&24v^0qzqO(^G zUMogT@ygZFHGrmr9cqO>AZakOC}dyz zN_Z4DZ#Vx#ox`bHwiwWPssOdCfXEo0h9O$9(q;_JZ@m~G(ra+eF6D2AX0#(?7la9vk9DQt7EV0vs zh(|JCU9tkrgc2sA#9ideow`Z{`80@#zs3Xf&lZcQB5!N3@__j}Xs5Q}gTdj(LIp0= zTEa@YRkWauZo6d2ruD`U??;K{Nej9zSS;cklAIc8bo9 zXlepU`@+L(H_|@+v{u&5 zeJD2Q8qwJi{Co8YJY8L>SQm3~QFU7hb}teC2@1RdvtHfvGoqxneNusI_GUY@fQIm_ ztgsMLiNFDpq}_s6tNJ7T*G&?eDcrg#sh3$-kDhCy`i+f5rofl6fkFMtrfwRNsD`&< z;;j|9eA&#tZ!Y4Maek4~%jKZO#6ufEklv(EILJX^SWiu4dbGDd;O!4;@I*Crro7zpR;YlVD<++F=N2!xp1+mF zn2u+&^9&GAi7sLVJXy;$Lw0*=e~(^X=K`$+)RhtnY>|f&m+rp*31w36==3xxgd~oO zrnIyOs;M3&PDjJQBlIIXooYIq>gB`+0n3;ZygC@!wP+#1>H_=oZ<{y$*9lN%kMUOV z|KkK1(|&~52VpmAb$ZbZ{8QA6RE)j_=J#I;joQ&wRgtx_R4kiinHzku6Oskk_r z{%R;`5XTP(zVa!LVe-~x46AeO!g2^iA0U!?a_3_ED8LrUEl^0)*VRU^_CNtNmR&|s z$Ki9OBL0S42E8RHi4?8FX8LYwT(Dyxmmb zi0RwuhX@2BbjU8E$0`i{@rJ2l956i*w7;VjI<*#cc5LPR>dHNiu3S`WEeo~-qmUO? zQH<0lkdAS7#%-UuOz((b8DfS%U=@q*4uuFZF6tx>S~5;{?T+=m-{6qKz)jqf+sc3( z7>gZXE95m_lhIYZX?@(X-r{=BJb9E`AzrGuh3Z!U$&QG%79g%+&PQlp;~ zF#VurVEP0|RX##-u$^X3e!OSp&l4dx}C?N+Q%@ zlPeLE>znh@BGmF+Xmfhc+9$DUEb@>`Jh@6SPHoTF;|5e0MWsO)axkE;SVSF8?bNaD z42uEXog3|&jmfc5Vh#ylBVF*{*k}@0ON`ee5({$7(fi(Ha>5mAOnI-RA=vn`hL%8{ z`$m2ASafGhRl`qp$Dfs+g~f2M{@SwBRa4544~JlsI{NxBbBUzn~8~WinsVT;kG%qrk={8U+ zWd^#_J0N>?5cqEZp1A~^RC z4nAyO;$V&Apr$AuSz62j?!iq3O6dI%MV)bY*P@)fJkG}9*?H*;!*k~zG9LhAZ9WJmx6=Y z{iN6dJpaK9aaGn(5{ZQ2omdj(wQ)!Xqq}?5?-@x{tuf&W&VBj~d0A;CcSJ$GJRzeldv18DU1PqIkB5Hx{xxoHO z&`v;WE37oMsT@#}^2Or{)RFR=^|| zF4}Hz6h?PeI$ueO@3V5PLq47cNGF6ry8HV;w$sWKTn@9KEYg966kMK_Zp{?{H%g=& zZQm?M#32ywg>Rc8Y2uBMtQ16ez-BD6Sf~eV{~7caTFnvmHPgo`YNh`~E*b|cXlwy6 zL|_9r@zfo&0tST08tOV2RxZFSiHs147xd&LQGqN}Fw#e?2=GZuJ`7JeDhlB)VNu7I ztMf^(NC!blLC{EqduE@V!+e=&v=@jtu%Pyf1(7pKOj8K?fjBF7V$-Lj=|r4tzP7h03HVix32!$h?Zpp zYAI@ddnFTOUdA(goa*U~>M2^#9EwKQB3)`$*%GSXXwLlFJ7#xqbPdA&XU~JJCKTs| z0C?Sy^RhD+$T3I4GKcx1C&<*VeuiK-6%Bhl`6je#3_aS(^w} z0q7oW4`JO@m2VZN7ErhAyBj;lEsq76$=pOlHYzX)V1#uDl(KrUoZ|Plj*=o+hh*on z%on6O>5$#Ae*VLk1xCntuuJ><`yW>JxbtJVDPh0Z5_BVJ{Q67{LDO@*+*!aCuu5F=Le%({dgN3_ifs zB@Hr4j_vC1+k!%Ets_@n)Pb43xg^~x4Os0>TaX6(bovnJaNq)2?%?=v`X2AMhdu}~ zf?DJ{o0pp4U~La_P!+|f8m%DTj>yh;b98EXUtYdAjxlKgoPua&xMG0`;YLOq^Hby5 zDSjQ&oOduY3Tps6za)<7T3ug{=vxXKSy4r@uNX&z--)q27ovh_dq{L?7rp5VtKQPy zDZ4u#s+ibgRd0;^lEA&VbCXv$sO3fT+G1Fol53?L_$B`c)91j}(!B!=s25cKUMy1a zrmrFTU1Su&9P8#oiKYuybaHYcfmxbJEIvdqj7v)=x#%vjP(96QiVWyu)}xM78e7@h zBqP8(zXPXvBO)%=GJ=H$Po@!!faa?JtP{3PSiWCplYd=9uV$_}I$jNq`(`ph zCWXi>g`vieRi+^2E@ml`cdHB;6A8aQ6wAoWEG#L(S1H!rHd0gp!X)tIWR8?D!WZ;H z{sL@PXo6o*GP%g^+*&Y~!wE$j7(93=z^Dxnmbwn94UFR;0~bmFWq*QX_7C?_jU#v| zla;=h7H~r1^PYS-94v_r)v>tX{hdP{G~KqgIbYn)jy(FQ+Sehf4+eqtlm@6Wre)Ax zL}ne^4+rp{ok~o($lMkh1Sz-&Ypq*;4@{l*`AaE%5&3gwfX;))afbsXLPdg@=vbw37RzltCwVb2G z71lN<17s8G%}4_9lynd!zDTfN1Gbz>wXvZv>nKEbjWD2gja(Oe8c8>k3n_$I;NZ zz2Geg=GXhl8TW!@+;T?N{dEKw^I2tre$cn>0hH7YxoBtD>3GE81K}PAf&8nc$Y&oh zbX4;g&Prmbtx6;*DT$t3LEoYP`%8t7gSg7CVr+bsgoL%)gf27A@yDLOX={F)EOTP- zJ!YTHnc+<>&?*r$*oW8shHdJvd27awW?KE_cdx(7^u8Q^a&>V=NzNwCmy~5B|FefL)4v z1_w-OQ$d+X)8v)o=(WYY05p0k>h)_^C2PS*1+vz1y10L~tfpMT~>eiP*En%@2UiR$URI8Z=903}J(6E%3X^CW*>Iu%;S zvT^!kL=))^{4L_j36yV1%fi9FXh7@SJWEpV3-b5ATZe?GnK@wTdw%>G2@^h|b^? z;E4tU6&VjKZ{S64*8n=B#8u;_1*k5PKBA&x=TZwX7c0fK>C&#>p>%_9?YqWC20%x^ ztayIq)~#DqNh(wnG3c3@+%E;BTw^gKE8tS~y3JQ*NNQsYo3|uRp z_rdeBJZlT4htfM8cz#Ps;zIe;4k96IE6TdSsequ$iR@je@>rGP*uEtlgGc7apw^D) z3c}L+uV8?YH(m9#pG|f?jQOu>;@bp zD=9&}iA;FU2BUue_RM(tv^*-gB0| z5^c+S$F7QAOI}bo))85)+=-F}n02B@p)3TPn7hilEni%H@55mqo~67V#R1X|)GuZS z+GH+`h`h(ZtRE>6E$y8y?wz8i&;*qe z;c01BfS-8a8gmz;9YE>b99u)?KG4x|zl)#^csM!C_Sh3K=IX{V;A;k87;TT0ny6sb zcpLX-=hEkiy>&yi%RmwPw^@>aBRBzpff!}+6f^>*?P6 zZugRl&xC&YVwk5#ZTm(}AQoK1uU(Ch^hQXbftaV3U#o>;x#rh>UM8v(cj_*%t|Qz- zOm$uC!Nm3P=A6M}mQb-f+@L_wX4nFSfg}Oo*oP<4Re_ky8T#$eD!h!En=^ac*jU{7 z%rt}AQ8ZxRAvbWVIiPR!>G&FJ#wnQ1$v3CuqtGwss3;u9O4Nyh?$atKvP&};tETkk z-t-c1`ix)=+^EUbfS*tUAqp;OK+zvQ?5eix(lIe1!64|{T&ue2K^LFXdN75KpI<+2 zRZq)&HDBE2>wc4jNkR-h+W^bLo^2Y)vMt>57ymNI(l9zWn$U&rT?0bhyyVEHFF#8p?r`}wc+ z^@HTX_np~ttR&%`8&U(#8((W;{>}{EXlG>+ckRA>{-^H~0oQ==>9EGeuV}0K4|a`~ zM#fh`9maGY4y{@EN?hBZ=o{fq{g{M;w=yP0o`a)Fe~QE@hlX2=Fpb+93sK~p6w1_q z#})&c+-Q?uiX=zY?b2+=SHu^ggh znE<_sjUZE1W#t}D*?W}ue@`acdw&k))VNI5l9h4|Xa|nm-f-BKv()7Ttw47b8EREW z9``Eu(z7WSv1d=oO<9R!w8gW!iD=@wyZ+DpVV1mjFdR&#Ra7`@@s2msS00$A+3-)^ zy89YNsJQy;m(o37@$gQ{@XjZo69~Ef`dlvY`y;pRg9k~wOMTY+t7t}1C)zoH`ic2> zSND#Ajh9igZhtGLOAv9C3RmCD9v;5q?c=j$+TOToka4z&1MbqcZi1wTg+D2MTOQX} zw|B5f#r>B2ujwm8sr^yK=i+YcKAYd37U?S;YY~i&k0*e(01FTOjsi-b0q{wi`2tIC zcRS;Tj7yh29>Q7M6w*GqMR#?onr7#i5iMXRAsO@7r7a7_aPR#RQb+@{8aJ^>}- zZJsp=#=xk$I+~&DuV7I|%z7bdwoHBOfymN3c_g4Qcr5i=f_1%o`7(6ENqQk0d~Yj~ z-nYa=O<)D54g;EVa((s)Jw6@*ioLa%?Q?}erTZ6SdqNdIvBhm zkVyQ|$MnVE8%DCz(i^tMbK;!MM}q2UhthU+Qyef{O{}98diG(=K?F>>H%{x{2Oe#8 zo$T5vfMB;>1|LLFP3~?#JGk*FOPB~8?!)VkjixX#Ku^p@yxwAeTfZd_JRMtGThJZ8 z+%owhJXouDZLqAoBEU&L%&T#7>DUw;lTd`-wS*zg-7$n&5sNOrpD3o5V03jt&k1)W zDi;Cdf}rs{UTTBj_2Aibe!joLq6H$RWh61GP*H#6Px-ReHv zoUZZNGzr@2BnnXFmVDW|!qf1!0aaB+8#Sx|Tp5pRyL`YPmmtYqVkH=!|Hek}?6f7{ zTvS|K24F*TyDT8)`IZ>bm!S$ef;Z?0>S_DjIYS|@IbbTS!nQ!M0>Ntr(zFN&<2RFK zzHpR$jqM=)kn_O60BBUWVRD4jw!UG107hAWKDD~Bp`@xxbht4U0gM68x>q(0uEg25 zot&H~oc|Fp+z(A+5&!Pne)=Gr`o#zcoM7Og%cp$lQ{j}DE=x?uc=3XOoSgh?YoNH8 z+g##Gejvr7yHVL&rGgg~a)E(YzD?hmBq`)5m%d*|7Z-RXOm z`unUT(OZtddm;)gFwFryW0?qx$v20K)CeJrU!n%)59K`-LE|<;yRXL0Iaw*JNAjf| z+_odHB-|!NX&To%J^d+47=d#o*B#d^CTgc_Wyl1NJS=6*FyT z9-sgFT5C)C>({TbC%<+8LH_;ww_-@!*gH^2qZ1QRhlf6( ztca45lD@Y1dwtsi+Ct>bRet_E)BhYDG$xr)AdS23YD-5=)!B2?C%jnBj1G3+Fu4;KQw(2<|AFPSYTO8{c`|3M`M+78qEGqdvCdLtvF=V9;@ z9oo$s0Wk_iWN;=EfV=q(&RThrblNhN)kpGqSJY`!e`Is85p=zVL+WpuznG= zZO^;q>tvSx`sy|5;3>m$qPsdePrw2w@#Xij5k#sKgFpJyE$dCj1BU8GWLO$!JV`^2 z2hB?l-kCV&X}G$$eA1ytb<)7_0d}G%Ch!0u9vjmG2D@UWe|E~X(#wc|Li)WPSwOwDISjKX$_r7L@X z6$h?>IS9D&9?VvoTn7?{(Lj(|Sy?$ibx;x<%3MGqE9!5NY&BeK7{tYycf&OH0WkFww$J|Lhs6+El2;Tu7SbR z)OC%t$iVGZ2Ga(YP9RN$JX7AF9$oVv%)HK|p-}P$D_Ma{K?F=YT{>>lVUCl+kU^QyYH`Y>^}G~d$edj)A=4dz7}mvkuK9fuX}E3xj#fp^ zHP`A&v8%ed-N?={r6h}{gn8!Z4Y2CcdVrK(__LIP4awcRUSCbAhMx;^Ypqd?yx(q1 z0HCd&Ch{srCivtDA0-aBFP!Ig=0Yqtn0!)x{2EMQ*Bz^PZm4Wv z(DLtann_c!q+JIQsq?a3?d?aqjEqd+o0AzAqgP6M>|7!39`GnWZa2#@(JCC;zSU!66D4Lo)IWrS9+%^}}Z}-y&@U5P>eU?B1 z*)qI(;Oy*NW7AKa8*;M7)H1c=UoyD$8$H$=mT-8RN?Zn7-pB$|3f($NuYgQRYbHynjs@lh`y^6duMW!k>bWDm&#F4%;G&xhhTo9|g*MCIHX=CIWs5d(6t??Uk@ z0clm?%$t7G5q$%zyQAVp5sVh3mq5!NZv^ul(Z z;G!jQoXhqBewV*4M`<*Kg=ZC`+^HbnAW1qjkfezq@_elg=+htrZm&F-xRx zmxbD8L!|@1ExLczy{{ih)iqf31MM>vGicZN?Ayj6OE}Is9SY8$5Xt@64e+`cWk7V$ z3s}-BqL%zz+S)}Z)yO7uXj0;ORQmpK`okcz8$RM7f^-2 zKd#7jrt#d?%cg%MndkRC?uz@5R8_mbE%L9%KbE&xh9TztTV?!OWq`X3_zYv$U`&nL zOo~AboeABvKTi9$Qo8zI`>w5%Y3OYr9=c?13LxEYHY}eZ^FpLafGOpjv=VcV?>h-n z?3YYTr!m5=ql4a0$pkR?rChJ!PQgCbh_&&uu4PYKTg#?!v&XR|*QNt0~#o z*xvp0Uw_pIjxzl0e*n~KH_gmmI}QQ!LMX$|-FAIDB}m%7rlLY)eD4U5bHGNa z>~lQ``QNRgGPc${n|D6n)m|(~zoX&!uV_p%sl|2n9fleNpT>7@vC~SD>fFCiW?v-y z!pnIt)vE595#98oT9^Elqf<9|ucb<<%NX3N!_ooUP{mYysP~$0(zK0G@a>wZcJQI3 zgLz@W+u*35x3_m;T_tI!MJ!EBN&i{Y;@oxhdY4NQUq37gG`P;j1CE04*8Wc{Kj2q+ zu>D8di2qpV+qe4T@6^*h1D^zJ9|xI$a}{Er|72O8^_qB3y>Q`Ht)kLCuA=utt7yI_bBfFAuEsZd4(BqF0& z6_T&Pd@_dvreLYNOO`Xcn}{4dk5l6I6$Jy!ZE~e!ehdL6TbO4BbQB!akjMZd%d5QU ze?%)MPT2Zg*kAj;cA+ARt`0l`j_RQYNIhfV1`o@ey0ChE5_~T9kQtadb?+c>SO?Hf z;V)Ij5sh;Jq$5&$iCfbdAx{DF4-tHiB&NZHtE9Hxx{Wq=Dqz?`jBb5R1b9+PBb26P)fr<}6wuU=hWKS#m` zcq>Tu_YaH88ZQNYn-&c6y9s;{V>m9QvM%yEiw~Hao@V!0`HNG+X3*be_TPz9F2Bc6 z?lDB5xj#6%H6VzwWGgDlvXpj%K*I=wXVq^eJ?jI`N49A;dTJ_4F0_X;xPCi$J5b{A ztF_?6Zz4_iUsuhw@iCHF0ZMSwfHB0(+L{~mg(Alxpd*B7?4AJagss1fGY-kofWsvV zb>6)_3BK!h13E1z&EELVKYsjYF{Wv)G{=3r^{CXF9R+Z6`|)`ouyqLd?!ErpayAHL zqbW${JBHM$KA2NDCsGdc1b)EV>)d$~&BK%&Dnetzk>MR!))dLwr2ZkosU8$A*Z zyYj&DRztD5`l1u`h(s-3>V&HJO%*ULTF<*;3e+yD{^6y+GO|}F)YEfZ->L64JdWU@ zgjtN2YW)vc?*Ywq`^OKr>n=s5j6y?J%HE<<8D$k^3n3#T*()t8D%rCLMM(Bek`O{s zgbu#l-`?)f@D)t18yjL%bJ0JoNYP{Ck6$HhU%(g-9>6)I63R3ZQ0^-1fs- z7(!U%&GyU4%ljqt2?+@$4z-_=dg23`Jp0GYJ9VYog-b17@ zL1BKbmcjP?+B1b7*Oy)O@Pg>itil!-F&iCTL=Y_RQCDSct=z4wUCi)Ts4KThs{C$;ZHJDzJkhy&FxZ8DhHK0 z?0JZ8&380S8R+|hU_VMNz51zrY0qX^u#dXBOw)rV(&x>Ns;G{f39P=HrsKy~Cw?i! zdBH`3>;WeCMIIgZCELY?j+NT#%9l&707k-_L8|Px|7oq3ZLSWiqP^57oa-qiSMAM< zhF0?Efg2~pL`8SZ=iyxMzDp?~Gq+fe9-wo1VWh&ocp@sW$-VtgeVo7v_mLm|X96Yu z_2*b{)FIT*UB165bjYaggq8T&cXL(_!Pa%j<@0Xbw6op*L#;X+sm3?OF7De3ZfVo% zTjED=3-y|NjegehJN@)p9$Jdn_OQvlk1FaL+wKlWGxFzTz7c+r>CkzfX0)|q`EuiL zg`@}idb5uE1kKT<-i~DpZ^Geq%y`=ez=t(vkqXB1cYkkzhVSXCm9$5flLZdXc%iq- zOO4J9cE#Ync}dIOUg&th3(G$lV>cwnehxYoe3&)7<~&RXOgWaVk4 zegFRbh3qrOxVSv)uiyJ&-hRbGWd9C`v7c6Ej`Y=f=doqDTYO}K!k zt>mG3(|?*BhA8dp=BDqxI?H%WRW>3cp}qbV`of1`jPBRVTq`bc>WWGVcgeG84Q5!g zE0VBq^EX%Dd+|L`0>gj34O9g3-X*aKRlYr9uX{}KDKrA;G57^?-gS@tW$+yTj&Z8t z;(@o^;`}u=HR0Pn5QvpczE^;s|GLg$pF>sE)t5M!GR|^v9by{%T-V;-?rJRSraC5| zVuDNr9QIcv`bsx5eRv`J)M{y}IWbUHnR;<)#JxgUnjz?>i8ERk_z9TCCv4_sE~LJC z`SK(VDT(D-gQB>{wJs8p*>l-(MMdj@tiBuV?2*cs3550|;K$+ujBhD_!(|mecBfyl zH}A-9+UNCgl1TmoQ&tNp!|I_g7gW%DT0OYLGF>C_Pn4`BW(;lZHjpS%_KIok*4MYp z{<=$P)nbxpqSK5QU!|p0;Ou^B;@8CYelx-df_h9;wovn=xmpUk|RFxnJ-k# z-a>9=MIlB)yK$n#-0ZSk8q?Ar>Df|Bw^bNYa%GN^(c#zHug%R6)86=oTO# zK-1YTCDf{2R#RCFd9K4a?;`Q_Mu)#Z%?8y0%3|Hh z8}Y9Pg8t)8X;l4z3EM=6&-Cj{pf=*K%**I^c=A1FUh$*jJJ*;OhBhzUEtQ5#$3^XF zj5MPo^YZdcNn&PG&rK62H*6@mnS(=nk7fMa$ zA|+B2>>9Wt@83WF+K2ZF)xCoYS-dz6%Rc(46`u)%7o-foMTkekgxsl&sTGdFWRtv@1ru*i5u~TaU0j}Cp^!&OP6+Eey!$# zV|7z3+uy)|$-NX0zBJ@-1}-7xx}>n-?%JZm{pYAQ#OY@osJ1M zqi(>8gzj&bAeHR7MQnjltkz%8`cxQwG%btv=q|K0^QY8{dKUm#m#<6wss+@UYD4F< zm>e}uwKrGS4i_(2pegApr_udzmPVW3>p%7g2Um%&BR}t>kjE9fvAVFk$bY7ZW!tld zd~j9sw69+k=6gQVT{2$PU#_BDQjt+YG(a@NFuhgEJnV7h5ped~)F(y@7 z%7AZODN!}Nahfu%F@uodq6CdOn{T;3Ht@H?+95k*@(vAeCck*WymV^QlgbxMQ(shk z4A*^p#FW-Q2clP@UxIWuqc~|q;eE8TBLIY^Z3CX$1B%OWkccM!k0Eh^(M&&)J69*w}wNPxEDx>860+CG~OAW=?Kk zeX3^iJ0I+OgHIFK91;@Jt-CVcd~j+0v7vh7HqH~5mNp|KBbPHe_I$BGY? zmzbdMG9Gh5ZJ|$^-3W=*gGdqS&m8twn%#2V^}8si|4^V$>f8UIOmDEIXkSE*`B^~v z?>pbLKVd6_b1W5S=+9e?Ae2R}iEp;HiXT7Zp2VeQd{>2qDoVk)#fE|QU6OzfmwqJ+#NR-Btzm;1<}*yng>z5R_WG1vL&VmLTCilwRJe=;7HRX#v< zQcCKup!s*Nq1J)Ui8-iK=lTQf$!TO8)MHP_%Gmc>xDHbfpt@l1!lA*mb*q+SHZT zxi3#}xhmYak&+@_RVq$*kL;S!LKxo9!r zQ1mjn)k9H2-Sy^gzPwa{d^Q+m7o$*qIc!By|y$F^Sc?TJC*`2jq1suoWp(1bKaY?gQ$ z+&1%p>bqGLT{B*u}2*Z@oRUTX$x$si3o`psiyVW?S&wV3HrTWEj6J$QjHUhc{P3Ak0kvi zm&YElr-d;8H`C$1a*B0(RW^OKjFo?V};8m6qKGI@RILuF1~I8V^R!mgdlI^FgTcpf3( zACg`tE$7!5xwlx@b3&EeqRUfb{X~X(YD#QuEL;(cmJbn-GFLrDOW29;L&)E;#fiG^ z&wO=@RW`N$67$y~#M^Q4eHo6S@W2F{izhZ)ue^Vgnz{pw>guPobeo94eqDb5Ll>qw zJk-l_GgX2qDJkqhreJ4qc6}cB^XE(9M~fU|z$^7P?HJ-w_fZAWVQ7rFL&4Vd?TW6v zqbme{!JO*r)R((%6O4&p+YB8Ad*8D(7N0}@C#Kc3hli|$tuP*TVQLp^X>A=#b6?tK z9POBJT>bj!q+{Xt?35kA;op;5A@bxpB3~fR)A0Q^Klrf!Qf;)&htE%ToSp9yo5nGH z^XFq{o*=+x5l~*GCjG4pU~apbAy&)ev)dEWS3mihKSM)O2dKV^?bv=NF~*Ia&$#w$ z<~i!KTCP*yW;-d}L!YbkXSppoJ*4G1-58E8ZGXcA%Z1R}8MUI@(1}ndTnM}K-)@%c z(JzEM@9iE1?`Ed)G$lMDLRm}ewTXOcV0}#UmoLv8*BN&f zkSRqfMVw-j6zL2lvGt$~=W_%jsGLtpqvM zInkGw_w3n&hl5Tj(-`KV+|l>jAPspsE>J5zaba;hq-624fky4xp~1m>%>(jt%ah;U zTCa11z9hHH=P2nxTqf(K2?Vr5xJGUcYE!-D)J?CoOV-NQ)DYxFn*P@1WZp#74R6^? z2`4V~-((t6V)kD^Hj2)#4M2%|3J)9Ayp&0*%rF;hU6Bn?Z!HyfJiz#fOgJ^ij*U9Z z9%@s%1%$A(LUK91w=$OOtig=BkDwYOo?q*q7_a8)?v1c)Djfd(RPmg%vskU@04GtK zJY`ksddsW{jPn4!-)RJ@3~+F8yunYUh_8CB zqVqv=IJf%?nDu`$*O8yeR>BW4!4S!7#2`p)HO@_{s+}`4F?stSZ1p~~W({=wNlAz3 z{f0HWXBJ5Cf^YeB%GjI>B%?AcPZzSk4Gj!n;onY5Qg=^n|McXrzzNAqmoz};v8NVI zYb$UBGZ-M5a;FQH2ZzinM0?}mdj88iI9o%Llnsc!H6ZZ0Op#PH=7p= zG4o0ntz|p}%SE0ap(1-YL3CrYdY^kbW|UYoYF;!!k?p|w0K!P9x}GN{(nM0yV4bKbgw!|}gQ}{lciXUEAo8I7!W#;Y*N@?pAv7yfGFBW&2g4QW7bDF0&W9 zN|>FBw6reHdtDQxY!++0`gd^fL%!`my2-@l$te@}`iSvno4OMr4NXsdVt?fiq*kAd zom}`6_h{08G=98i{|7t>hYseDy^V>AbvW}T=3LMz1qTyK;Y(rKlJxPo>6k_}5 z0K?G9jjQ|8aD7aWkGQDgjv2l?@RCA(CQFdFktqLemJ2fd0}AKQR~MVi0mSGIIDfnp z8_}Ay|8spYV5}|k;~15oRU#Nu=Tk+A(w)-#p#fxeg|guL8|&R*OMi_`_A?kOdB>{! zX0uv;XMtQ`w9M{k3+&l0x)nVIqc={!4P!yoe}Lm_Lj~t%D=#IKsNfmAEH{lxuumxc zJvONat?>8aIL0XLpTpie2IE6?; zeekRV-nZm~*)-y#FIU{iD>>)W9a+Sg)9+LF4eI*P1!UI6)xGFd^V9L8AQY=Fj)b#&Wan0|`>pV8;pySaz@ z8BtrVekwG}fUFJ!etGY))-PYaQJr;`Dt$S<1m=VsgGea~Ws zQOxc&#v|Sn(Mj9)3I1v^OOwyL`t7F9b#cZD$Qm!^Q@Up1U5dopJ~}b|J;Y4{^iuJ{ za9QkGUnON_j~MWV4xlc0HL6<81s6+JW>#?ialN>uaI|MfTAgRxcE9hLjz=L33uqAR z%98^~QDY=oGtB0YU8OxSbl9klwwgdpRd%bbvKd-se$py$itDtzf3|$aizL`2lX3EjI$yOh~o6@eXu5w&WTkqUXPR-|7@7-XzG(Y7e4f&jyj`NVfszf%u zg3%XB8Ndr`R=0DwQS~_t@J)qAUtcQsQ}S+sSPH5rQa%Gp56T9#@7#1&S2xCDrfJ@} z(<*z9d^tE#tA(K)<3))ZH*Vzb&6^v9km4PHNB*?dVplODe3fz|*p5ZPkRai}tn##G zYb@RFW|=h`4RRI$x!*lfvLXRUlkcW$6(h!CH2Y*M{ySiQXqWdN29qzLHN88}mLHjs zjh(E6bPp$rI&rEgXLqeFM%!#l+GY&QFkW3uj@2^f4I4Lj(MN@75pu%3$_tA>82=kI z>4&ijrZmSkyc%c^GM3BRDJ5pt5D?;7dqzeTqV5| zVq*`jm&N21%O1i?#XfQFA+7bNI#pHG5cVRnAzr4Wls7|x`mil7D@(wjnep#&%pqIu zOc(3@cx%YskpcPs>M)fNvqS+#xg2nSHx`ZhL~xO=VejWKLgQIA$g=7|foM`BXcz;w zAJ7M+8@?ca*q8(%H{-o;sv4LF$;{2J->=fnyzdkv_-o5PFQXZuF4!)ATM-x9+Xo%j^hs+>Cljc1*LsJ( znc30cp?RMkM8_(R$rVOitdnRMDUdW^U#W?#Q3;0d*aGO_o zre$S}FH8bIEbLv%hS}7*l9Gx)J*RkbV;zQT<9`q04v=;Xn-_lQ=cy{2Z`*i^me=y8 z33R(=n){rb7bg8rJ3{45#+dS+5ZzSAA@WH<6(3#ys=*kY2f&2$tpb{wn&}uAUh5Rm zW47c)Z}c?VtS^aBw(#2lN@&cF^B3J3A!J#rl=OL3t@FR3NygBWo#y`OgW6~{(ko2o zMHG6Pb@Rd7MgpmJz>X0JiuN?+uCv=Oho>Cc5SB5}lv0M%t0B5CC8zy85W$UWW_yK7 zyw7tLQA2CyS*|bgdO#tJcOy`b{R-k^ANXIq&?56e|5@;Bpu{R(`aBUSDDb!pQOxN8 zImU2dld7?FwLwbT)@<{MO|jNRHt?fu52G<#u@4{M>^)7Rg=VNpF*e`Wq8q*^mH{DKRm35!Y8`)|&2mXP(#w$BuMUguwG zlz4^gdEKEdUoHicHefF?{H$}aWN;%|AQr{whn`Gsvu{{EXgJkwi;WcW$@jB`AYy9p z=eOG!Ck{VrJTrH7H^Q6kskIW=vO|*1Se74wI>q_H)pF*{i=%ENbEHj}x)NL)*RHc; zn|)G7H=zH7wCrARlVGO(t#>1of55kV!C&MhVAe#M-|(ie3oI^}g(|?QFHsyh{|Ie@ zaJ=_D$jJ7&FSK^><{Rotn3$S2+zQ^e2BWqSh?y5}hoWH^<>Wkra~^GI6Zi}tJUU>p zNQ47}ux3e;#roIJS4F#nW7)vHtpC$7uR^r}(Xp6n9ErA_WE{Ox-V#MYS^#l z>Utuza9r-EUF(h9iCVF-tTfkSJ^g(I6#}g#_IhF;yU_hIJz{iTzZSjD)mvvb{w|9& zuh|GotXXhR$Au_C8*4V|!ZdX9?(4QVtXCcy*})8M;{rK>u7AM^1Y>9&K4!D#>nfoO zESHv7yk9f8mA(|D~RoR6WaNA9iui$qXU zUznPh=-Kmp6EO!pk!F1LKMg&L&BeBx-+FHLTst)m4B1g>*npp&2cYAc+l~D{?Wgr& zo`NIb=7_<+v^YFb)2wxWBri3>BXFI6*!i=5`nzkq5I+uTnh8e0O6Odyq)ZLZ$fll( zIY)z!4BQ+$0f*Bw`^d~~8}4k`Ku=T=Fl9Vs z;4@;Q_P&D#jYY13$&6KAM0Bt3lH)@5u^1;J1u7-c=BrAkyH(F+637V`(Y7q6p8dQ1 zrQB9%%QQ4JzO>|T)`?LZ5q?qsDlyvUXjNn3*A?BY5*W#oyNT*$NTPYszPiEeQ z2(?tH;SJ%XVYK#GO)q}mo)AiViI=j!t9e5g`u}ICX zk~{|U9-+KppBo8m>aD~BN{{i&4Q5)G3eqvWvVK3`aaS ze}AGlQY8rl{2-(IqP4u4it1Uc!~B8*zCaGXrc~{1h?D`O3-k>5fVc-%0)wIv*(e373|Poz$GI6DSJiAG&PSnt!If+QP|d@MVD z#j%ZdPr*5Otvt9oD=UjM3;dRkwofXSk3^X!tmI?;k*E4++oLqy5(!J+Gi#{UJfv0j z2XhlC5u)a+#@PbY!1B`5%D#c@8?XBK5AEE(XPaUJy0iF-w>?K!6OqDtl$h6&^k)fW z-fAHZpPQNOVVk75X-{fuiq(mH<_Xbt6FHvyYu#rYbscoN3r`K{nsuCyxy?7m{C%uY zfchyMziteBK?-dH90E^0RQks{J(*08Q%OIh^#Jpy4;GzHE=VVqt&51+uv;FHQh)UF zYuc|1X&PB_6ZEI3tUx7n;v~kT_Bl-OMtJ*9HbpJRo}ibnUY#;DJaX<4qu-Om()w5> z3)y;Yy3WqdmxDalfQGy5GUD7(wp&r$`d!*x&!ktc*!^&2S8D#>q`>SouIRwuqJ^2y zd071G&bHCN$!UzEGao|e#OydpwIr@8I=PStqJmp5Az@fWjWOax?%$;3@wYN6Ycn&4 z;b@YEjrg4Ze#Ac2i(Nj45lux+?Up7a9!7?$Q!A~?Ia8`@^rDHxKP<2#W0{;k|JY#b z-K_GC@6^>MKPa(LV$InJ@q;t1dD)TY+oQK56zKbK$%iM@!kEbrvT4I5R5C@ zwtL7hM&T5#U0@eK89VX8dpFdvA@hR7Ycs2hLQBQVQ)!8r!x#(|Z341>Q#3uX>6{)1Y-fz=c%)shZ?wN$fV7{Y;ekOnd zj8!Qx-Ce|3%ATSP+%_7zYkpSxd>DFRLVxXOnug&NrfI;FbaKJ@u*$p#dakkC?;MZ* z2d~Ih7O_i!!Ub*!MQ+pl%9MI%-R6(}bbjD-`WXzBHr(}4yyNlC78OskT=vYNsw;RD zlDIu$70iqek$Q3un#uyBuHPM^TemKAQ&*M2uL*|XzX(A~L&s19U}*v&o+nrK+U5~) z4>4F2rY0n8^4)u^3RO+L#I2}T0LG8XlL1nPt9gkgh-`paU~fdv?GCh%K(E|3y`S#} z+z$P~+^h^}^GF|(`I_k9;*S*915QZsZ z%_5MxZ-wUqUfi|#A@X&9)nsR1o7=(=o!rwC(7ZQUe)r11VLQ6u>QqrF3|6F*lXFo~ z)pqEc^yg@v;6^Vjg4Ku{wj2M(yGMf6 zHe%41R8d`suvHZ8Xa024VsYHU!s269(9ug85kqJDSz}yc9c$Wcs5S$~d$;F`mIwN~ z5nVQlMEQt>eixpz$`{*E#wZ$ATj+%?~FZNOEbY(A8Az^|@*9vTzSC0~3| z|1=0v!`hu0RY-;kX&IVc5#GAB*zBLV>mr6z@`Lj88U74_7WHiSg=6A8!L?$ddYStn zR;MMj#7S*!1|65Nv!A2HgyIK;qZG89hq6o*LL_j`$e1{F0-TVkUh?(z9g7-q*-X4T z##_rsB?RRAfLYcguTJN#fJk1+-5a{JzU5zF1Rz~JnE)(`=Zst?B0A3CfMccd9{&vg z^FvH&Q;%ahkUUY!FIAUQJax<~cG@yc*L`V<;)QIQO7w(*c6?N2oOMrB%${ug#(&l*iz~pkQ8DsKn0|mp?^kyHu}e z-`~vWux6&+*|JJKLmpGDem$++f)kI+>}a6tnb+qBCdt&0U{m5r~C46X#Oqq z`18wky(|f;B7B2MuM#uKxzGsikyL-(^i{{ZZYT1$ZVU}U_wnm;ykphClzzF-9^rx4 z8T=`Hv=n3-OOpj~CDCBMk;Q75|HW*!;6M z9}T$YtvM64)9g!hTIdbO1v~Dte|zf)Z@pCZ$wC3lv@AER1Tmx0i15RRlz4ht; zB4lvZ<3^eIO?MAkmiVIw#u+QUNpTozGJ>Ahu7{=8NBtpi;($%7bD#BX^-3-ZgCh{x&KMOA1?n)&@a8S z@vaW;l32UcvCnl`p3k}C+C_DB@3DW*_*r1_x8y?Ii>Fd7Pf=~C82~Psg?&>}TwEO3 z6ciksASAP?4JWfhPtcWy%kP#zt$cLsi?aXJXrqxpNqKGfXPyI^bn;1l;%ITa#Oze4 z<4}kM2>aMr{SCxxe)piHq9boaPrXrwiy}9bnri>ej(mfK>}Ggmv`Ab-;Jyv2s_EA| zy`B1K-v*ZiFZJ!B+PU@}^kLeY?si68F1IUUmTj4?spNrqj_Br6j}I9qD-S2ZJzL$= zP&kYNDaZ)#H3jp0?EP&tU9doZcz+)WTcVqLqSt&uokS;oic5}C6$)JZD}M?a+AE`N zBW^UtF|LCCqJP;gM2QLaDqxxO0~(<^d_OliOY@doYXgNq{Qnrk0-H9j^WbN#e7MiD(7L09OCxhjTFJ5~ z!7d?5XKJz?`1^M>#nN>fR_!|+bGN?4JSvNlSS&(l;2^SOIKo!3*JD+t~@|@#op5T2XQJbdHtGAA^a=KYEJpE#11C zW$R`kA_y{=!oxq%dH-JKK)G1FFR|*pjtvWuat+Xqq!Sq=@K9 zw|T)m3^JWF6ZFc|8E(l*;DYDpoy5Uk%#J;Br$EXA9iI_$6d_I|dY{OK{P^=B2_mw+ z7ecuY#@n7a@nhv&3BIjCee79X2bVWKA5`ij#6yXc76~!(B4)=&9g0@P6@nHYFn&(@ zKb5@`_ioO$l5+`HXhe@FG4uJ7h9h*)?b|&suUnl;%-vY?tW8i1-p_br7(W5RA8k0#)k$#dxjwzL^?SVgqa|E^d2HTs)F4%9 zEz%wJ%O1#o&$Zs|A`ycziXPj-D8-qmF$%QVEbB+a zGm-L9hYM9CGc|(L(RBr)`@<>$P-xZlcsdWnFFL?rTjH z)z_-pOA0zruE;BVZU1mRFHFX({v|% zgFHCDDOjp>c6c(xah!{V)N3FoUvmF*B`e4RW~cn~Q@F;>@g)Vt*DFhkuLn~wjXbE* zp42c6oTUsK75ZG~v>2x+C$CQQ9$TGE54wIN9b$I2V9mh)G&1KK!-*q;;9OWyMBPb; zY?{euL7v`c4#nF7Krsq``a+ST@4$|1=ov8f=vM|D$?Xj{BUBh(A~{J2%&X3bM20oL z3MXpOz@d$b>}3uUuyD3V=-S{u9}U$QlkGHcAq^?RY=(Z7GQ z5s}v@rtndXv#C-caiSE0bV(8Y>4)h~eFqQ44n8Tev_|K2s#}Sf+;4VCu)0LqTySXN zNRJmR$@oIh(3VD2wAO#=be#Hj#TtK)sgC^*!w{G)bY>g+U@Ggvq+KRdJhuHpv^d=z z?%WDL^S1mwWXdEeRg$yuMk6J>>B{BHU3hUHe7TB4pWk~$sAVh26aO%D^Wkm=$YDId znREd{FDFux-CQoa5I_x7M?ts~hu!JtN(y^Ubj*Gfy4WJ}EI$6odJ_^0fwzpD39b`4 z+zbxW&+R~#3gi$$x~%p83qQ0VpQTM*%^{<%FC_{^c_iDi^=<7wucTGofGbhL(s%tk z^J%^h`j@Px>xqXU748cZ18`X)krqCKw?83ay`p9J!!SIDT>}bZGQhUBF5Itk?cUe% z&M-v#!EOcNwFvyuR;KiB9w;XYeLy|5FlqcPuIO-?kSE3)e-_wexZuBDBaw1O zh<2kDSf+&kK4@{o^VRfCl=V#jzT9_MdPfCJI8*+CJM9V#toe6^^`)jR`Ca8Md}}-L zanoL87)sG#j*2}9AoX-m!N(iC-p#EH{>ixhyZT1Tg44pAg6C`D-*A$CzCYclhTdho zk~Q>%b9REQV8r%jEt~CbQ^~q(|8z7>hMT39(ium3jCF6$iNHu?*7Uj*Ppp~@v(y?EdmfWLr zO|S!Tgmo#m^4!zWy#%$N-xLIF!$ec5+<_wyu+@AZwop7FynWHqR>@*av8Ry%;D zQj&G(dGj;WknwpZH_Yo!Lf-cdjg%*BqNf91P`nV!h5w`w^(`0DSc2QR_1lDSs^1|p zHCjS}J7cua!k96Oq285NmXEZ+bZsB`>HYMfHkbusItppquQ222%KSsn=-mv7Wn*_` zn1JAGq+^Tl;?)m?Ft(X5nvpKUg+`a1cAe0EbxM}b0W7t@0 zHdPzI-Uio+iJ26b2^9+@Na4Kf#vW}K3JN)jxli@@&^z!)hxm#DQS; z=D?s}VBkApy84FZ>}68;q~i(uBfGqvb8fV0)g6=fzRrD2Ty|lGB9IY~&`BMOD+mMD zh3T)GsQi5bX3rD{dm@h<#7lWLVu6e)tEEn$Gt}#Eh$pSGH5|hF_#Ci&;Nq$7tY)1? zv5z4wIGdKy$`ka9K!OCEm+v|FMfU(g-D+l{MQu5HYon6!0E)mrd1guM^1h0>&jHYn zb$@(FEF}B@luAj#z|slrISARtSFDAwhE-U-MwYjar~+_u#5A;&Es4g+=JC2Z9Iz}L z+eCH%kspAaTEB)g@%cto0@$J7^KYO@Yrk`K)K_}*Z&6&bgxQ$#^V>zW`0AoB&t;6D zi6Yew6Y_@GT7qGRVe(tQrl25yTCUuvL^j|BZxLU-CJcjc1&3>DbWT_oTqKWzG|3;Z z_&1+bo<0%nJEE_XYt>myqx=?$))fG+ykV=^0FG5lBXtgI`YH*1X+AOkCyrRz8v_n% zBdi}4`f5%qW&a$~-^rr}5^^V}!)+hP4{A`L4=&+=b5%Zjb|YE<0ZaGx`g#w*dxmVP z^F`2qu{rXN(B5>BA)3$#wdg2SO(GQfKP*j_K- znUq9qdC{)Z>OUcqgR)kBUWc`Ef5;bTb98SV4=QUSPrh-j1RC|GAne z^l=w#BKX7kSWuL$>`_s#*|ri1H&MsUqJ;?axYnO>wR9ahNZ3=_-snkP#+YFBP4!BA z;pLJ3vh{k74w&ee?1o#m$25ETC?D3#;?ON(^9(&x--&=gNotB(QWf)16<5Gkx=G2O z`FCfWG9&Cfzm%Az<%eEGY>TYjyr*1{((y7QE-XS#)Nf3v;iR;+LkAFthE8(6{?QIK z#^EWbxNlKiim%wlRrsv6s31Ro6s~~XB+&vJmiTl8hJbAni7r62uZ5{Z>@-(vk9OaR zoCpicC;k}*9ng$o6ry>Cy#XQidw570#4(d`QUcB~i?nMoVNbb4y^*j^gieB|h%{Dp zE!s>Z3*y~1xgpoVI>{B6@WvMv5GnXUt^6X>4%l5T8py^-ueYZTP!VbQ>y9`773`yb z`**v2zdrnSd#Ht(Qg1eE{Z+c?FtZ-w!3`FANqpq`iGJ*lQe3I4%p2iun(?D<&xX>M z_6fHJa7V%=8$Qt%u~LH_Q#P>Cbz&BKl|Unp>K7jA^!!C(;eJ?K?r>J$y;*{;oTz4q zFmx2sUBfRr=BOLX9&iSnnaIaj&;_S(&B@rW43NYVP4oXXNjuKn!QIC_AtWXhrGuNk zapuNCs&)ZXVmHMXN6U!dxzVmoWeL6W2THfmyMawkMLG`|!~_ppz7W-dIO2TX$XP>^l7w$ z)%scOschMZaeZn5`3Ale)V!OC+sXPt;q>%0SCp{$V=b}7&1=XkiOpd+$q3ns!(30u z7#fs45UPLvQ?z3hc7U1t;Fgw6LEU4*piVxeq(Y#+qYU;8Z}I}^^0KjiGEH`qA5^k5 zWSQ?$Qw&qUXimuz`1mp~HTwafTZdm_D0UHBc+89Bl!vrB{#8}~IZ0O{?PFAjjdr#N zqVD$2;Dj@Q3iu`&7{lr zZ+Xd71sR42u&e9mQul4W{|3Cf7Cgm(b0~;MNV`gEjartes$AbzXdVbsN(cJt4F9dj zn^o*|1=$C-kjc&sPy;av64T}=_++h#h<6ul3FFP>K6k#VM-M?1H*(s7dsX_MSQ;~3 zG=jb$Gkd7CC2Qc<41_jM?R;YQ4{>t36cf&(Hk>D`<++Tb?Y*r?mmzm~v0>b<6n1U- z9d}0Avw=)YcNpuUK#@IE<&J`qaC{~RfsIV=;>(kXlFuP+ zgFus>Se*kyLYStrSmnd-tx9-6e^4fiPdXLNqOEcI?#S!W=y^+coyP&YVbgaNW)g@P zO@>HPLD{^b^~Q7wE;nEmp=NjWEC3DvteehD6u-{|CJ}w6BFpX&G}^kjo=<&5yq|i< z{WnF$j73F^P?{8Vf4PE_E~?l5>gIK85e$3SxVAO|D{GZN%I=si=W_GtK>H*zW;O@l zxI*1HD&DaT8i)7bzYfJx9|OWe^aFdL1416&K=={HM`T5k5QfVs8W`Ig*0!~^d1g+( z&ZvD4y{iv!I7mVm?SjdVRi8`Xi*}Xizm~41bXntJxNnIKM&b8Xe8Dm)%qD%uBPVKcVnX9oJh4haTRLKY#7s=7$sLf6L0iz7%+(z77 zdPwvQaiS3(5{Cd~V&g0O{Xl0)knO8i{~bGa4971-UX;*+P@g>o0s=&|Hz?4|-Zs=2 zVq3vYUD;*{=Q%8+TL&<@bWX?LI%ybxg!Y6JH6X`H|A5O$Ni0il9T}ZgvyY})b6kHD zmANtUz2C1>mgJ<$Sc9=iRAs&A7{73ALnz%Snkh8A^H`0xvnUR)9ov9~bDLZoUbJh2!T_dEfwTn-4SqyN z_^-T7B8h?62WN4J_@h4-J+|954~asZgjnm}ZWpDU( zN=G{C9eN^j6%9Xo$`Vo@qI&tmZ1An%A2HPtGHGDOdX-!c%F*jVHpD862(u~!&%ZsV z)sKvO*r^OE0xSNzol!QeVg3M|aT}+_-@u&XAUD;UEVV`5mlx{>*)AgQotPtVHdlv@ zG*95_ma^do=ip#G!dj~=sj}&ADUq?C416J38!2Jf@a{Na_RC37fFW{c>5%WS+uW`~ za!1U$0~bkz^wOeFx!@-;Cx&cz4k$-JbU*N>V zr8oWABuF6Zsl{j7=f?J+u#fJ!Hb&Cv1k(|=QHjSeNQrt z$cTcn0P$2MIJ`Gjo$p__#ZFlzQf4fD9;pLFy2ba5D?ve9vl$3WPQ(`04d?J7p&DNa z6*l=>22~Y=)MEmsSZ2&%8qRK0{3=%QIBPL$@Mm+3*CgOG!lP9tvE`_xRB@6QWPe2{ zTvPK)eY^K!tCjb(DFW<3`X&fK^RaCrq;-ry}rZU22vS-JA*zAiV z{^nRZmm{ZwbcR0+J7u>``g319hWfr6)Yy*?&t-1f)_hp8-n;jBW#TyQ3e{imXZW7& zD%PUT*jt2#Uv;&a5=Z-kX37n9?uwjdR&BVzHb}YA=}w+!dFp`8T{4=B`4Lc{*GgS` zOhtui$4u9XSvFsFm+;~=hRl9~TnE^w7_b78hUd zow@Sny!G{UMRx1TZ^-;c@-y4z;+ZFD3pHiI=YMMMkL2I9yE-}h$!qO6+hD$h@dc@1 zo?nL3b&+8+6JuWtuEp8ZR&RPC(zoPTBI!Q5*&S9e4$KtFV~?p$Z>i)a;{Gv^|Ic!B zX~~T0kHqt4=a5^%F0hve+m$zlM9Hi??729{Y`CHmTaD8CTl~*cs zYJIYM3)=iM`f3fVMtQYTKf73+3K)3ju^t)7{&Ts=G6W7p%`BHXH#e8dxB)pUE<K8EvA$i@W1Njvdb#BvqO=DXQ-lMv?4Nwt$9mumhXKl@c zinOwyRUz_r$A~e*b_6av&kUE-6p!A2$e@|e+&Uw1;dk8(cyCE>Ss8vLtZmxN)jgOu zVO5aPx2zH0HSU*C=>9tOmGgY`ik-AwmfEhKK}b36hW{ zs!tR->g%tg;hMT?WaMv49bhyje&LrRBS3xgtqsf_l1q(}<+eXZmfA;-h{*mWXz}*~ zdoH&=d$-Nl`C`+aKk_AZmC~#8i5sIuY&OAm zMEbp!G=^lYKN1gT>YCfy@6p}e zJqvEj*#!k!;fFxLv44*`2MN|32aMLFT;BFn_Fee5%gRS8|4pZ>7r*F~3q8Qrpn(nhQBaKwv- z`wmd%=K3$dHX8YxnLNUSV|28%?@-tuAp=AITaxN*b;;uS{bF_$e0+Se1s~A~j=~;o z&{Gu@z`;1&UKEi}X?Z)Jk`F@6(hnb~Yj4Gred(!w-OcQ$5vLv$qdWSvB|ppEbw+#N zdG)@7_a1AVW$=2ay!p_JTVx^6y@5xk}|0V;g;K=h>Ynii-GC16?lQ^n$cu z?}YV5wR$aZ+-P9#cISrr0|Eu0Qrg3rU&>0J;&dK?So7*!caX(^{wUq_8wZTfnv8v8 z4!DfTQ+Mg_l|R5|SC&dvgr@W^T{Sh`is)BshVyNn_kzaXUVN=yw3R+3*f#Km_4lEU z^@lnZrz|CC4WjN-1-O0n_@vOBZvXQ3C;B~9|5YAaS69iAoHX)fY;i!8!JTG6ypmTy zVB^3qsz?Qz0XF6`h)^RXTnlU( zMYm{na`HArP{}F;YQaxaF_2cm*qnaRF($g&XKRRFPZjU)KAJcF0sIPy-MV)@eoZ7w z%vwFR-FsTb2^%mf)nMd+ZQ0O&2k*Ij4qDnFncTc@$Mwt>(eMz}gifB3W(0M=~Fj_9$Y5$@wpV?L;!TzpScd~ze!*};1+&6$*~;3C6#mVp6+~gO2^Hslb5De|)s}xSW3uXKl|( zSvcpeTj#u^p6P0oH`VEzYi$qko@4O3cTLix@7gy3+da1jXSQ!Dvxt{F@}@SBB7-l3 zHs6IV!)D@j9Mykb#v1}_jHIlst$lVK@zgqAF+1y^CE`9Z<3>rs9xgrhA&dLo2VX4L zhxwH8tdf$HN2{y57%L)7fH1!6e=|bqSvG`cbwhGM{NCfQaXZe~yw00D= zw}OXh0Z{nGwND=Jf1$+o48ID;lax48m!nTVzkNFOw${Ot@x1-x@y+|(J{@@KIzH7x zDRPZhYf0d?V$nyAUEVH#ZO7Jooq6B9D0;_A_ztuw>CINcE^UvLgdf6sfq&u?S+PA- z627POC;ZW`F0;|_j>GpJUyB_s+ZQ)1)gKlS;fZAO#{Sc1?}yn&-mC1n8H8iy{H;8T z4u^&LY)Xkii3(EUuJQdndF`PnR=Uo*x>p=YNld#a-rIkpuOZ8$bZBpVhh_QiKtJ2S z*GB1Tqj2x(!GA(^cBgS|WGRB)h#mh~T-;sT!rUlSTNJfN{j|!|1Py3!Z^u*liMi%J z$$8u#8RZMgyr*S2K3(Hw3zB=O!tqi??qwhco8)xTz41#-KFKjhseN*{ z+5heaK&sEfLt8j*J=Et*F19Sim48=%{WUv4bq3KU+_Z%n8;;zgLNT&@fH!PeKE6xk za_IAVQ*~+Ct&b{P6>jB44~`5tb{w4V-z<7i-A9z_N5AOwjy+WBaqA8p{2}{Gr1qlr z!o35ux|In};@983tEToQ!#^MkSAY`S7AWWKzPSN6zrbxiV-jzK9YzmmXlh=1%;re) zpr9D#>Fr)s_6~I{-`Kiq=jmA7?E3DNijwtyVTFwf<)_MDr7lKq<@gp_0vR|PhW@<)f-hJ)ttH&}j)6dr(5>q+( zd5y|RX6Aw|;;cC;%^K8lJ%V>n&GO}G9iL-;2rxU&z#ud<^j`JZsEe=O;_xI$vJmI~ zcCW8neK6)QLW$5G>i^_4O_%P{H{DJG2h8OX&=RU-Y4SDKoJ_eamD2mpdjD6`sjj0r zvt|lQ^?e*cKDH`{*5WU~cqLK7r#9)%{ONE=@*`OPZzejOYAxkrQmyK z(IvFT?AhgH^$J-vT=49Dysz{m_iR~lv~P*6ms_}{g3R9k@3(Q@BA%FvXph&I6P^A0 zre@M>pHkS^pdg4p3=0!!QhwWnt(b0H7yZJ*v;)}y=q(WsEcrQC^*s z9&?CBp%C71F#AC_6rp7LTA9*a35vaT?^;@U*E9O?qiLoB_ER%oP5%#F?*Wc=-~Nwl z5E8PJ?XqP>xUB4%?3L_Pl`?YhM0Uz3Gb1A;`*(hH-_Q3x{>Slu zj(U#gcHL~F>8V?^15 zWEewII`1glnx*|)fhioSJWVKoy0+^bDW=en=EfkW;;eNdh90@extYjV9>H~jvnEox zWj?aL`@oSdp;nDlK7pUa+Vvh$#t&P1Hv3ATvHz@^)ZB3sDthU;`9m9~LGih1p@XKj zqm83|nLkt14Ky202;7de5?Rn%^ye59r1#~eYui(qi_n5Uc%Dd@qI`r>3z~)532x7@ zHihB`>n_FAkfCWdImJUsL!ipPC|xVawZEgXPlP9B5TB4);ff1q>ipVXZi;5d%0z0I zjB~K>uBDm^)yw}oQwm>Br^Xt;vM-2J8xq~bYq^4)sS9^tT?T6Bl54$S7F-e;yG3S9 zK*v9fs|d1wP=( z6m#+FIA&&U)0?49Q4zwSK8D8RG+BI_cKw{TTI2eikuGDh3r)g|64bkDgCPvQ@R%?- zP~|KAxr>YXbX6S|q;JZ4utXah8#D|Tng$1jmpH{)V}=?#n=@X1o|uRPl4je(G1x{6 zWrY1w;=B1a5R~SLQG2m6JLHIJLS2?c?(=}1$S1qXk%y)`l}fRcB>DKNqG`Qnkc5Md zQ&G1UhFrEr0;4~pe);ZyYYG4(uxs#gXROGR6=gKv;^gO%ZxULF5{^({vCM5btg{gK zGY*g76mj2mo(K3boZL)h^0=);$n~2AMN9FPzFUAnflt!N65N~|+D#UuteKh6%lZ#2 zSkZILw@UP1)-N>Rkp`czWGNpiMAd}Ym~Yx6-3s_@%ssLdsyn-mxN4d2x0x#(Y=Nlc z&-yenhE0FDh>g}r*W*qfvP&PhL`C4H-X=FbH6Iwg>F6W5R!toivcjXNxE*JHCO{S@ ziB6UEdTMIL^WcrcK_@`ybmVt2!Bx<_9B~w4B<-R<||SyXtf?Yh$#3mrTvO96p^~Y zkO=R<-u5c+Xm98Up>BXH0BjT;-iqD;EFI|8>wbs5M@&-7waZc%)4fU#!h7*N)7Y7l;I>sli zQSqJzbA#!OAG-#t*=NttXQchU%dB7pT_Rj2mvNv|j3I`e1t;*!uA7f%s-GG%zui_F z+}sr2JySU7mUv={exXxN2=0->;5Vc9fW8sA_dNgi>e1oqpRsxAg9$r#cPiy5hBnyT zoZ1KL5RL$wK!xjk3G%rEPa1Nx-fx7Z>83|VFMr?O`|kdZIh2u-s*R^j@yqR)8Gp~S z_uyN1mi0{~0D7;$Y?6_(su6@p2J_8(@SBNkW92u)3O7jQGL&%@+}}plonl)e4J2j3 zg<|xISES0xZp(ae>!~t8pvi7I3g<|oETA0mQP+9&oGz~YMF{G-DU*X_2ix)s@C&3M zP4NByDfOR1vI_!3Idt)xK)r1KsynJ3Rm_q9ei}m0Wm0;m}_dYwmFe&m?Ef$q* zMXP6wIh>c5Z%Isff$5MRkPr%a_LlTPyKOmgm$U-?VI3ga{df|_sU4TwyRTM}Q3F}L zt&<$Bk%)P$&@G7tnpS>ReQ&-|YQ(FTf9EDM^UU1IC*OuLGB`sGWyT!5WmL14;DT*| z-xmi2lMba_I|m2#y7waZ(^uqwsVW9_SzIZ8!h~O#iRxZ(tfhxc>&2fno_)-_`Qxe4 zM9TER%b)NEj%$I?i$<5w53d&Axk(<;r$jcyx}_>aL`GWL*idLvNAP~s3mN-y`_&!7 z&{L;Qf!^VGbZ|N20vSad(aq{yrZeVygx z6C`z0P_zN3c%%zWTm#9;zq76KU;Y6m=FM^WQphp_fuDQ#e8x~;AaB22rD15`Zrcb? zkUUq^bCy6AT`{_P6BXAQg=z(AQ@$8>^XTwr?-`ynS~0KRnB1j;i3Xd7?+>-_T6H>C@2U*&sRmAbEUDv!OHzYwf0YOB6m!%=LP+z4J;a z|AGcQ$1S(~8~W_AH+OJsgmy$4;$`^~WZ7f=mi74(%(vy46XaiOU4{Qn*Sh*TTAtbP zYI^mYe9fO%wR79Sn-HtPgR4lLtT{4O&=qu*sS!=v>4YJs58XMK--1k{?{EQh1~*@H zW5nvkp5VN6;|Zk8%jJgo^6zQD0%~6~VWTo^zV|Rfesds?T~3IUl5{lvq!k`?1k6c_ z$HV;nQyosd7m1pwOa4q4mEF5?@hPyHEt`7Kgdt7PkRi4u9S_G4%KtKMEO4y}vrDxbUYI-i2HVz|Vhbwmt;EpVEm>hR9*4=VpyoKM&KVRwRm1R~qp ztTJ@GW~aaOQp@P6u|4Bv(^DH7GK^CrfC)NVN0rs*a$@g%z`(43*TU{+9_ED#u#m5X z-Gi!xIXeZJOXc1ttI}_vc2T^4|I((n6i(x;^LJpL{u%K*Fzh_65i(Bg436XJ0;{ra zv|0uW@m{kG0Pw5ze!CisO9Fw>Q7|+7uemOVx>2H?IsEX&$P(K@gdi#Yw_mfCpL24* zJBJibM~k%%1brSI4Vh2#V*pLBFycH4|G)`J{-2cTeE{IK1L|zl!Gz+{<7OlBJ_St} z(bFh10txsc4zJ>zfbQ83=kPJ(3BPY2R&h!3O?UR6M_CBGM_)NXbvB%PXo$pN!DZ#c zd@^Bj=&6qUms4Vn+?14b7hKROj_8|=b#IgLPyaaLz?$TL4oKE#7BqZ^I9Pz&k@J90 zn#N?6&MQ~+CBg*Cm(BN{>SRODzzo>IZQq8Y2fN;U?h*=qiO{;fXZcUxAr$bp*7W|W z^=&Z7jon;U$!&R3|Kvn>cXw%|9NDMOpM%Z!S$?OTPg`zBj7yHANPs0|EJfu8wj2n8 zw?q@zs!=fH`^qS9NX6UvO%@2I!Hxh@g<(i&Gd!9qKB$k9&J_%+kYye{kB#94eci$fpsPR_5IUw+j8lHFUCau+IXyY-S=Yg z$Q$iwU6!2O+&&qLpaIqCw6Z3!Fhv}f5+h4T?;(6V=%#$e{Zfl?6<>UeKbPsELJasN zUI2qX6HKKR0yHmmxQshKsD-u3GS(WJJ(4~en%vmgU)y`Q*5|@ZhG{#Qxoan={pjQT z^MZyP7HjU)CuKouC6=rSOh~a5zF?MXUztMGvt0OT7dTOKCfn(4R!smdK)}j0`taWd z^3|BF5UsXx4c^WUF5DI<8hkO3Wgn_j_Z~dJ{K#b#3KaNH<;9nPQdaQFe#C`)NYu0L zyWfXdXVu=XH1zasYwtPXwqOA(!`$m>kzPc1c|}`B^|Zzs{A6H93deND8eW*wO*l;! zkC}L>h$snhmyC=dnh$bn!B38_9=db*XYhmM!f+KkbhP^jsDEavOjZ0dd~%JSWQq%FHC>W^2=gb|#L>82TN_5fl;B>>Fz?}*j>w9(}k+=&siMZXp6 zCYXw{^OP-5z4uLnRMJ?*hvLjSyg2XtV==0ZA5I~#>zYE57#r`a@CgGY|INU z=Xcsx89zk4E+xWgW{;K4?7R9-&uGwW zqekgek-@1N(;jpV3er_R(-R|4b2;p0DBq$MN)R#+n-HO#hvAJ1>`j&K%9R#*3^8Js zt}4Ok#>$?cnH$u{*;s3PP3`Qjg>NNa8>rz!iXZnZ<)qkx|6EI|2tcMkRC$iJa&FbL z?(hV(%YqV@!0eTt|9%sl>US-7detU{<2+2q*7xqw zWvGzImffu72}MFz>U_4@MbvYsDYE~N2C9TTpJt-Lg_SrB?g^z#oNVlGf!a6=0el#| zs(eaSewcAny``4n2vktc9g-`!!OOn*nu5~J(D&M8n8PI+qGkt=#udj#hpHA!k56WK zGobi7i^!-Fw^32bEJ3XbfGoZF^BR0wp~uy{YiVeQpt-pNRv#CKI4|97LaWIk9S>*d zJG@=*!(#c(Gsj2rKT|(e8lW|vOCshF(dn0KU~f>?6B~SZ=o@}rqwi2t9F?ly2BUCW zTN{^J1t>sV=>Xa4afa&g6&^-_jy%8RVm1S_ zh&r4;-L3qz;QDDH-i%r%w|OeUt8N0iw{hZkEl+}QB_fpA)B2${BT6ajvmqg_jB5Ay zkHAi#-?+r}uaAQREagu3?M z<0pm8I)4D>e+P%}qFVNcMzn4%baA`8dxDoQE4Q`KmBZ4w7K{f485340E0T1ykS)%_ z)3nxWy&Hz_h^{G}zzeYPyO*UQM)&mV&!?W((zPhy$CqPfP70V7`{9aS+gA=!JXCXv z`E9%}oI4PLyQe%JQsKu^WAK(RB!e>}GxHS8CLb<^`P2+PqFJ3-TQ}L=X3B2J)X3?( zVDEM`Hp-k$0$aNG)#hLV)aN_SjC; zJHer`F}lJ4`NS75ZUZ6%q8znX?R+qE;YI%)a;tw6^(Y6 zp4#4H4rMXTxaa_h*{tsVaNmvURZ15CR{o1qr zt)TTmHWXzT95`{nz)Q1X2#wwxSlTiS3sQUw(^d)94(B@*L z$+^_|;>cSDoD^CG;(6j*Qw84ZanoY$s+R-QDJ;!P%r9}jHRT(Q!M84i>lk?)KXkMy zVx1dg$AdewwF|V%YH8wMaSv-xfxw^{8mq1t{KM~}t7#0kQZUi?{&PvGEROY+q^o65 z9kw&!N0s%E@u&4-)TQbGmu;EP47%Tmv>B@p=Oq~5ofroX1Y$a|MgjfJ<87>bs0RJQ zD9AH!R&DqRyd^he`Lv=QYF9AP+vw7CJ z@6bHZMjSS6sq>lKM36_GH)MAwo-mYFMA*))hng~=iFEllE-&wA!3K+t=H`>gGS?{Z zya8NU3)0~pt_#rLmcqL9`uHB3KU6&BOoPnoYEsZRfz|L{>KKf1KezV|Ul(upUqCMA z(}7t48T_x6?&N^wV#cdoz7);vD#_v_-X+O(=XZ(_f7Egeehec)cVLW|8>*+XXkdTu zUMs)v`MusqFyn&^%WNiXXEq(JWpGIWilv+Cz7J|4eF$EGBr4_D=i%aY3F#fvH99EQ zOZ8@4bp59u$TU?6I>rJbyya>2?y0H_~ebeqo z1{62_Mkhx$BIP$>gTjpZ`rnt%6j?PCylQwUiqCH^OnVtVuSuf$)uTonnBk3-I|-o^ z0kxXwO|LJ|LxT(|M^Jx%s_sO*PVOug##!}(u)AymCvXCqaAG@yC1VNLV+m*@p1Wm% zZ_r7{x2DJti>5Ze$#*`TRH~N=HS&Je8SsV_&4hkpk{VOr%DlW|xb$UT9^1G+8GrEz zCMXEEo1fR66P=aq4@U-q1Sz z*zaJ(FRr!WG8QeAw4B+O<;9-p>?oZ7@9Yy%$BwGvq6jSrl80^t6`+ezf8aY5rqM-B-Rva=$rgB+I=~_(uy@9p0wLB?Lu{ST1m0xAT&+Q_}9l*`q z$TXD0KY^32Ly$U8KA|h7A0HZQ5;3o zXioSPp41vjd$+S3TD!BL_Gm?878mUR2^w~qA|pCY=f2mRwz*}7o*_Mu9rnWS#QX2( z(EKJ|nVqx3mD#u1KuH*cN)UNB&f@L83tRp!w33MmaIo2@p zLQcExv*75#?_$JW>;rMl>0GyeU*7bTOyj2NpD+oGzOIw6XDC6Ot&pvAlZ*Wo?5AF8 z+dJFx0~isqvlG-76@&{T5FESEQa+Sg{@xnU8l55@N4S-u+*oaMX1l^H^I!R!TYxKJ%}*nOPCqJ!?Zk6Pw*C$5bZ^)4I_l9X+CURLINvDT0m}h&H2^Ljrxb; zh|xk~QFbxK9UEL?@B{Iv+U=0YRYN)8k&Kqa?<(tnD1YU;X@(nD_Hf#~K9~ z20`Wj-lnXOUcJbm08(PLb#$O@ye05sON)~d@_YxA60T4GWXsJ%HX4NW{HXd{F7k{w%aFHTqBewo(FkHZ`svj~VvRAtK|5i^$AcPF|*I90e8Rpap72sSCO2sxerHDMI=cGSSHVLQHg;obr~mkTbk z2xP$6C@sw$?f&U*zMzrZF}8p5{{85-{?V9fKd?Zmtjyj=cRK#~#0(NX!C1tfl;OJpN&*tDz_2*(0=bNqVt>mmn=Ltec++f>4 z4@(l*3WtoxO?{t-CeMw&ck(0px+GkEeCGAxT`jDRVs}+;%96+bG10vAfl(u73onI5T=x4sLpvZu;h+_S)kCwIPwGGWk74Mk`iH;b809P zIIV2msjRKZOH9rnllR9f=iZH<07Ed9Kq?M$IR}j*gBBYTx@q2_gLEr!^#;}{V|Un@R%k! z{6?bVyrPF3{3a(;jSfU%4(NNt-t+SEa>U%FyPF6h8wPI2%z7~(;VYm+a+>SDu&5Ls z3z2LCY|TqftTHl;2y~j2n6GD=ufg|D_W`N2s|0oX!xOvGnkt2GKIj)=84EbG$~{<| z=^N-zJ`li{(XkgUFq#j+^v=saFlS_E&w(q?`xv5~_RBoK#6Vk!aGw#GiZvR{_mQDW z3<5ym%X4CL>p8*oHiGY2Y!gT-y z74^5q!StbnHsTEyuC`!4YQC*czL*7M0)h09jyiumZqc!S7qVXc5F?(GlS6@Gnc3Cj zru?Nt)k&V7*-k1o;~|xX{kfinQnA{}=eA-aglB!$YP2oGIk zfMs2CXkT#UqavG!HQeBAsubBJl$ukih2*xw@l3?Z)>dQV!D>=uAS^06V75u{zPDFC zdz45wHN@>%^`C>o3kd`350SA>LZJZz7+)5wLYK8p2%dueEcymHg3agq^jnbD=j-H$ z7jCp#19wV30b^Mu0f$r-SRbl)aEmDn!c2~7Pv|)Z^?VAIkj^^NM%*1Q0a~`5 zqP?f48J?A0j!i3%2ULAV$>gvBXkuM;IGee9dGdl^4^w}-OW4lO35rT!YP_C%VlPc` zq13(~&U%v>?<36)qUvG`WA*sk4zbmWvXmID-Gi;E>WIy2*lZyiQy>&AaXJxT+pp0$qX6u39!UEjf;?|cXjVGx;fO~pHM5!!RVerXuh*PixbCkJ$< z`8)p41Wu=1&6MWt`fVxL>7GQV5JP_^%4_51;bFZxQTMsd$K$y!dj~A8=r#_zvEWsV zxZ6YSUn2-Ou+NteS^agtU0vX@oCmWJf|RgnF*r3XfW3{?xTvZn-hdx8nU5OE2E3R| z30=m@p&=T4hIvDaN4CPW8+2#Oj~31b-bv_V$KzkhtJll^nb9R1_q7V)3`LZ7rSR6EvUbIQeF2KB%jrJq zS82oavR~#oUI0#WtdLba?q2hL6-(o!?)jMLrT=U-W(HR3?X9^U-}LX>%q=W$wRUhI zJ~(9ngD)()(nwdOpNx2erR!ziTdR$YINfufl_Wvc4l$>>oaZ~Kyu8>cC@5aOWMWj3 zh1HrRBojbAG^*AS&Z;9KV9w9c$%nI^=g29j?!&PN2oL%a)O;WWmP^ourG%81C#IQO z&|{(tAjQQASgKi+0YY^boj@XnEFH;oXLBTDot(}F?Vki7VaoCI5f=^q!@Yxn+kB-x zaw<6pS*YR+ET^PM33h@TUCJt#h9}_9{C(l{v^7%6fO0(C#0>4`u=abm?w%g7j{x2~ zL+~CQP!|wWP*@V~Kq+AG{*iv%^ukN=Pt%e=+;OC*Pk;lQy^_>CHoK0To|psPdZ0|pHIc%O-R9_# z-QZ%|0hziQ*r+$<>)}5Iv)em7e9gn(zA-`69g@n0ntcd=yeANd)1i$57ee;gWcB#p zN=Wk7v|0FFp`^7I#zTSp8t0gir2ydhp~#-}-LawPu(hk4d!vHtFDYbNE&O4cxQ2U& zjF4IVFH0CGBtWm^g_%IxSpUG-toSI>px{Oa`g$Q!0s{g{Mst`$0U>{XX{MQTz*Fhy zlQf-8h+KMO8O&!e-oA`;%+)}V?c5Pw*gr{iN0^Hl6+uCW3j#Qsj#n`+ZqT{C{Tx>< zyrRb*yOO6HH4-+OWDMW5CG>UaqzARA<<@s1Eg!SWE|%8S(S!U#(60fQBi?n=3trA~ zN}00X%TDSU-atxCM@Uk~v^4)))9Y~kCIeE84@j}i$^X8Bm7dk3Of-{P1w*&s@qU=! zK(d)*V|5ENqd8~c$NwMpHS!OLz;r(5WTy62S=kfulrt?hLZ!#xU?6Nyx_f)A4?hI! z$lv}LsGqdk;gO1AJLIsxI zjTZm3;AM#b^%=8#+vV2Gz}?$xxnEA3BF zmr6n1u(ErG&|~zuIv-)A96YKx--Eba;+@#~rrsE+K zqV~59#ItZZF^7mCkQ@s^>Ysr2Pk`Je@J)Jks-7!r``ftF5dznWns4C>yckh&HdjdN z6$s?At4Vc%jt&BNm4HX5 z(V-8X=$mO_tx?lrP+Tox(U6xXkO?|?WLsXC2qAYss}_(H@;|Y}q}0(4hSkR{FKgfo zXM|D!co(fnUcZT%c?&PKq!~Zd9y(3xT4~1SbOCr-;n$LrlvPoD=f1`0J? z$gKStr}DZ0nV&&hBo=uJXJ&TxJFr`u5D{T72rL9>BeW+U!0SAPBnHAD2+F_L1@jsd zy&IlC(lOxA90eAD7Vhp>(l=nimRVCHo@0F+oCm!$MpWcZ3Na7wU(Td3^ zHAc$Js?k32=* zd|&s3IU$e~7)Jq3Of^9?C>O_MLdjn9pPJ96%x=P}3ltEEsYyZOnm0pcSo>V3z@2da zYs0}sGsIDOHCL$eqTs{=|35r5(-BnPz(NJ*&3ZcfZhJrijX{AbzI=A_t>^bKGmMH$ zmg-9SF~=Ob?K3Q$U^+Qk@-{EevkE9mJPBQFqVIBZbI(jq#{xbLMGPhGwnzbEr#9qu zkE~1fW@crb22@m4Gaj&xawj)tDr)L~@fvL*tQ~h88L%IX%DpMMxrZ%Ah3>jt+Udf$ zTTW=a(C{5u7@_5-rSxc?ZyR19+cs8aCHgs0cM(c=)jm3P9^rW(t91~Q`RZ|pWPk&5 zI(Xe!Au|P>)Hv!cmV);I!VTN`g9LqW^79|_!`DG8D)PNY+1VcW9?&NM-vM}fh10DH zuz(q|`?v~iP4R&Aw!Jx%!lZ?&Ci1m`ag>wFG(B87Jou6wzz502&0JU#O487o^g~by z)9T=^mQ2_~7f!2usDHF4ARvGf*4B*va83%m*THVeiLn9fS;3uFA|wP`P+3U{woG%= zcNi7!3ejwW5?TZp3s(wn7)H%@siOw^0A3Ifxz*AZCgph)Fd*jhTM}NiJAHV}C{|#u z8PCt(^ww>w8g?)xwjb?i zi27-%Rj{|Arx9c%w^z0V2OS3AKbEc@9vu&hUW~rEe-RH4FN6Cr-`xifqV7(%uz@o0 zf2A_YIGXD34?jM>vMoQBqH#NF+EqPs`|?plruqGGMWrks)_H?qrY= z1_?+=VERf0iHyz&N(!CCw8;9BGqr#t)|1d z0&`u}C8h2z0Hfe%cN5L%n)TPrmAACC9Awo{)NTd;*3{DNs8MbjA}e3t6HOL4cmaSX zqxU|+iYG}abNrqF{`uTTzfXze;{Q3>Z)78 z#xv8ZFBk<1MF_Kd2_Qp6z6y&l?K#4;3F(fbLcBK&;8xQ>P#KtnM{B&kTn-_{mcoE{ zS~gmPL$uQYrvKVhOe)YM`xpIFl9JjsyNN)DawkJQ{vr*{<59Y=EfY4&4HN&Y#hlzu zPJ|EHwIN1ZK#|O=uLtg&Ib7K5fW(bgBzmrWlYP5tRp@AZ0)$f*0xI@Ve}GZpE>8bo z@6?mk%`MaYPt3d7Lz=28;s0qFQ7_=DC@vcud-G6nq3U$g9}XQJhMu18ss3y;xDZMs zS-7Aih`Ijw}Zzlz`@up3xlMPsxM2tk(P8(Zb4#42qXgQ2@MRk9+5>>BC6n zq!sh^nr(!@@|2UJe?gOJ^b#o%kQG~CiU0FA6Ah6Zd#rr+hy6M+H#9wA!XUBj9>RGopXEo~)wv8PXi3ABuMm9~#iWN&CrTStAZ5m-4J$WrKX9?K0w zFtHnO{ui&JMix!f*ztEB)}X@{eY9~Ylm)aU znPyE%4)9faf^>UY+KfU`SXkI**^CNkF%uoXsTW|$2d)nO(;ZQlH54`9YLGO-QYmdyX16aY`&UJ0({E)7;K>eFjigZeSmjg z2=JK=D?(j~e;#3yvhrB7W3mmt5j@OO0W?~3&$X2^{zaPxKV&I$4*YF28?M4_UJpJS z(;$2;WR1B|jn1iXybw>RVyywui7-PazeovqQJ+R8hk}oWWWdZ~X`jo!*N4%$cjBu*q-rDUg?;$Hl?@ACvqw%U$PQ9od$oXGl2O1Dyi$ibmTPPX`uk=rOI#sXlpdPQg@B zL@|Vlqq`QIwNzJ?B>zD*!f#TjTjh>yaPnMg`w%xPY1_OWL*U<+vB0oe6EX>B-YVC?j-(QHM5E9JHzLgTKnGO zv>F7Fk;vV}Js6Wn33ETd3*deTIuzrM8a8cL^9$GC8i^5MS_)au%cy|DH zY?TK#D;H`pecmf?D9N028(Ol|)Tj5o@t~^#>Lg9;JN$va{4ezdqh6#Zm*{_H1IzI+ zXv*^n3!iCFZ}hH~t`5e60$o7a*jDxyJh7ZDsYr zn=NQrx_(Sqa#A!u`}p)MHUIa`1rnzP9TF(Qd7dixF+{2Jz!=qNlgDlWfD58fc6N3_ zS1+3BX>v!gIvZ)9p`*47eLO}=4R8YzNo&C(f$nfX^CAtBX~mtTBD-t@kSiPRYd z#=H0Lw}G1n#6~`^aCr`)$WS}s=T(*9u+k5~U5aaO3 z$R^g(i}rFV4lqPOVpCw>oj^pXgNd#nJbg0pg?S_J37_&sL2Y5r+1 ziz;Y%xRAAuS3}G74>JcRWVkM5YJg-!7afUFi8AZW%*(@93<@F*?4FqXw7P9=>rM{dUatT}piZTuxhC zyLn!9OKSRG6`Bq1}y_ zkt`R0C;>vj4seW_lEwi1hj@8I!~}|6y{M^4mXm@|a;@={6Me4}9byp;@=Z4J3o$G} zh(Ul|lVg^mIx*QtIrBHP-gVTS$61(_#PVBWL z8NrRvvk3?7P%XD`<)E67RfUHBsnTQ#@q%2q{8KR^aLMYtDYb05k1kr-gKI@|*w{)? zR5YyKmuK1i%n~OSNqL1x1(EcjB*1JC!&ubU5LmCReuv)?d!AfwH?cF20CCkxn>iE! zzTFdVz=@)}o7dL%HlX}r7SV6d5is{>1Aqx^mEAo)<|Gv$+!xOyv(dv;6! zD(2&r2(GWfwzqE^cQ6}*`4B=fRTWR*3{Ln!|CU&23J_qQw1<4OQ42nwOSvtysO zk1N=3uZ$xxTXK8!e-}TQRaK%Po&Csd1ks@c2U5sgjlJ{|`?=Fbh=P)j>RebTVY-&h zii!Z7rUe8d=?3_+EK(kynSlKC3Gcd8HzGL{oH$-8vUA=)Dolo*9N;iD*}gE_PfS%p zky+An&9hlAh1tWhVH$iYo4}Ah*1g9blGu=lht~K@H^|T=KZ{?~0nhw{nxVzk;tRDJdLIz=(UI-e`+6kswpe3=1ys2pL!^zB?J|2iw zkmP9KBa@lbOv2s}d}P&s@%Z1qeVd&27U5&1q&c7$KLLBAzgw770kS~#=|KUP~U%t^e^G{VxwQ4IbnX`}-1w=b{M0apUk z^b*M}BJ!59alQZ$E+yFoZ*TzB0-eXxr%$tzi@^^hO7a(ex9w$OM(N~dE@t*1E2E)&MrwO|6%mV5`S1v5Cbyp z(u8Dv!q+{Xc5Q|wq~%nU06x2$|N4=h0IgqM-yPJ}xDOEh)S!f*)WHSm1cvhxA+Fl0hq}aq@8?rdHAYf5LK_Xrn9)`jf?UuFVjJ`=j zN7syDJfs5UY)5M=3P_wlZ6n2!)|f^@w+`RW?agXMxh!r9!b>YrlIW)}Y{7Ni`MK^4 zoS{;O`%>UrgDETP42Cq1DRA}@pSk$Aaq`jj z_nFREE^(QdE3n${>l1{6gS-NoMP__75ykp?CeKf&W_sf=qwJt63esAtWyyUL_X3>M zBSLAKM4#K?!jfbu;scPGY3=wf-;*W+=@h@6k%3{zFT#jI5!vMfF;K;-tQ#`k9U=2C z@OKBWSCkD7$7i@JO(Lc;SO8XI0W88Tc_~zZ1s>HuV-*m^5kx3Dt8c-T^fdD{Is?Dc z9dH#;s{pwlaB6F1(H_8x?d)iEuUxDj0 z-UcXOMixpkT*Ze~?j`5cdPh>3xEp*RwqA@2_O6(qKQiMRD@|Z zFMM6EDzU%-2=MIwbM^s&{=dxbz!g!M1$bDnCgZ^RKDY&6CRjoxmVG(i`EZDw=`;n1 zpo{RAwy|*x2=-ogOgp8K-+avhD6q8SUvl>tAwqPN0*&O)Cn{MM;ClSkGxaE4DYLSq zhwKuZfYekoqNwoxJN2B9-Aw|YNc~Pj3o<%z+cJ8c64Xy!%0SwK-qy4nmbG8T_osn;e@E!%%`UYUu;hMp%EX}b&xC}An2`eFcPq#_ezB? z!SAUk4d2_8vn|I2B2;D{1C%?4;K1k?u!K2&;%?}}v`Uk4^srY3+gnpHpB2e=4t8VZ zm~aFgpYKT_NSOw~2dpu5dt8T(p{&t+f1#{g4kfU7Pgbb;jzpJkK7ZF)sAfad`uApa63N1=!y_K*;(ZY6a0 zrFKrulX*A8-(tM}2zz2)_jM#!N@`O#Zv+=xpbdXOQ*_KEhJaZ#cVvm#X3bLT zz*iE?a{p0`CNg4!@3O@ej^cL!&eZPz>H>k%1Je%CzvGQyl=08Mx{0Z`w(NI+a*KGi zf*YOX&aYWWtZI7y9^V&?_-}9hMs@1xRTGJb3|$aUpHn*NdsNtBdE^cAuO?7^*KeX& zp-TmWo@4bkHso}wuE{I=1{>1A)mM6BLh#UM-NULKOV79bSzrb zFhPPcK!08xB?F@!Vl)L4im@x2UM)0C%T$Lbz^oVDlM8&Y&-Vt90dc|g_!8%8aiR-X zvR0yEz-R7*cAk{T8{eOqm9a$PCZEPNO-ttwFs~AZEIj)mHMG_GPIL;Y^puIkJMbI= zl`hlVv=PEG24XK_<~Ols4=IXkkjkRPEJz3pnY=<_`CRo0>9qVg#Dap@#~xfT3)U!3f|bJmlz9ytHr&w zm}NZ`8&>`CU@)W&eOp5PfLZs|IHvT_i-bWk7;?8L*gp^ht01q?=u~E3D_U)^mf?C- z*X$UwmYW3IpXlou|0nHB%K84r%>yKjH|!#E{Gkqmg_LC@Iv5sCaNROrD3Ab8<4=Qw z&$1NyN1(ApOo&#d6}1)Q$auTbWE}u4)s@~C4*nKb^%Zdm<0;`*6#)|zS=XBSFTlj+ zSyVtJ1wyw4Sj?GF#PRdN!A6wv?M`Fp`iIZspD6k4RqcNN;3jC`u0WCrL9zDxOFofHQE$u;nEYy5}pq8Tp*D=OnicyGQi7&(*TIpYc$n4K1BZP?&GN1+AH)0`@#NH+CdR(`o}ensv{x*aNdq=*d62 z$c1ywllH>Tx#5)-5f>)_hbWLD|NYt=A#O8pTO$0{zB*s1$1|=7e@poy1M{C^!nC-< zPSWkOWH3xxyhwf8BD;5y4EXtQxI1l-bMBmIkZHWEMnMEy?!xJZ;o~dSUt)f2^wI3- zl^gLQ>DEc{4y~TKo5vIy68P3jjh1#P9#De{GZi2RB0_@x zH~qmQsiQg4g9tedZg;0C*H_S*OJKjck)2dM-kg|B^u z7Es0_dkPqQw-Nk{ib`iaI+|{N-COV$LZIm5@gcSC`Jn~7`O0iaM=OHl^b3y~)Ji8N z%mCq{lyF~u{LxnZi&xdXQGap{O{DL^p;}G20loz25rDcADohumyQi3Omd9$y!O;#B zzgL{aQc6rP0#Z^R;e7|28o~gJhehDvCi`SQ&;6=OB)C1b1K3{z`^8%LzZ))|wti<) z#AlttVFELv!4fH*rgw=i4+5D0>Ozk00F4LG{jYyIe5f7jzGWx8=NLVs!$|=zd;2e} z6*S7_ksE>lVI`JbT6yqedk;pyz~~BX?l@R|WS&_Mj9${=rX(dg2{Ot$>GF1*9w;kT z&ZVq^6ojRbu|qne5fFORo}9=+{vhF&FjQQm#$a7;pKY>e{1A5waZXy|)ZXwMn;&=B zW<;=qGlk{RW8jzdA9S^(V*U44)sp97S_RTl7-xuFxf1z3<~)>^VQnEZp(|;t%gb2@ z#M8(cy3oAg@a<7I^o|gal;zMPjP0~BRE`55M{D}|S1{~<-L&faWcwoL%=N(NZ-kS+}m zS&x6&4d-G&%CCmTl*YC(Ft4e|$z$~-QGqiQKneEuKgrENCYM1)i~*p?+S7)Dl{FKn zcd$_{kHp16_FHcDOQjAsr9wlq%6pS2fQ1Ax0O!Qu9xf-!;8e47T>z{{*G%#>vg(|E zAH!N=#LLwXuNUGVs-)EZX=D|13N(Iv6qU{f=Ft*&^NEV)bYX+84xdo zML;1JtRSAO2}?ov=tM3XXD^hK7Gzb^AaCEJNA!e*LiVPHG&s*g%eOy8Z>U$bpSW;$5Gy}LWG>mI!aSX}%5z9iUi02c$y z)&QGS%Cw{hXTMt@!jlyMK`#Q=Oyd}tid_*D2Nag;^H29-r?Pku+aTE$2yO4u$kN~D zuiv>y0U!-9_?tsa2TMffVeJg|(5d2DhHXQcKP7u~OT4Hm zWPbm*;nPGw+II%Id#T5}4)qEpB_&5M&pzTy36cQVemo!m6F%Pdy|=&Ng!kWxxvp* zhvVX{ivY9t_fzV8C10Nex9btjM{740x-HqT|60eif%*31s>7X*!t$BI69koo;1Hi_ z32svb2YkIttJW!OCct5#q0cVO7PbDjWBBQTkAvX5yS^C2aMa!&TqD3E5QzeUNo&5R zFGBV)(P($XLU=m4%ypa87AK-mU55-@yW=Ay0tg^})DHdD z%|VxF-<_ zuBW5}f*VcMk##sxKDpXhZRORuXFW|$JnW_7ke3(yK=8Ec80^?J>0#q_hD8-3kM0>2 zX>r!y6~ITBuy??kb#rU0>57!PwfX~=KK-Dpc1n;kPF4H+i~Z+XuZ?pJ?39^0st($m z6mYoxv9oROd%LXZ&)|G>_Yn{g3F3Njju;c`MhBjsYKSO8NYKyoI)3L(lL$P2?Z?^z z5AC#Bd0aL&5|a~~TW3&|WV%^@`F5&5l{DHaQuS1A(0yAg0|@IM$t6#3xXyKOP^x3_ z_T^bXE#OB8 zdLlU4&q6Vx2;K_DUmSXp6(&VU0kc~#0iZ-VlCI|NI;qi^X^H_e){_#bP2+F9A*jVh z0ZRIK2{G|^DAb!vb8X4giX#q?O-Xq`%m4^#}(xzi>UBKRs=zPq+Q^)#4XCXd3FTs!;vY zG-QP~x;TSf1UgP_i&_V68F-$*e_MIlghRhK?_5J>rk%80hY$S;Xyh4m`AkAotN=&H zfS3-Ua660d`A~pacqa^`?77E-IXHvPJyT+Uc)> zr}zA$QKh%O(%7n!JQ#7c{B)8L{WP*+PTa>IvB(iahma}}2S^>nAc9xq99_rHIGy!R zz*h&~*v$SfU!JdtBbkNm?d_jbS(^n1NIwXK;WuAP`-iX8P4kLab*gYyp4Of(x>*}=0hqaM;Xs;laANKZP zi}pS~KBadD*ulJ~&FzxKy0`*h;+IhMPgG9BHw_Bf$2PxJXW@g3fu0?w^Q-4GQmi0i zyY#!y`PlZOKFKZm4#@0~`hyk=#@8pY?jIhGUz7F+YcGU`VcLO6J0LYRevf_v_z}p( z@WG)QykLFZ$aesf%ATP`i5T#jM^@S|S(NGl`tpwU>-4(Sogcr3q=-{AkR3&T?v;zVj}=|cnk{HZ{VY^ zXlOW+`+JjI@jS=%)K=h;lmNM=lY-<)8%R6bE8O9ui;ROKFag{s;XBoAlD*dOMD!GD z;Y*;QrEPBuOCSYSd`C#=1e2tR?z=bFzKPQ+%BsWz40$0_id0nythe*>Z|qSkWiGq` zE>#n{w+Oxx(`wK2(?V5j5+J6 z)y5NIM!vuoG+4kxa1j?5*QoTNQ=0rR%%|)exdP%MxbMcB(8S=fN|D)@xaQjpJ(wzT zeJdRsRp@l0iIHuwv|tE$|AK|(7kIav)~6IzSG%ZtFF!$0P~Z>|-1LB#3`zYY_m=te z|G4@Na4z@o@1~Hf$VfscLP!YNWGmTwW|dS38Og5fRS8*1$V&E#l2o!sgeVD-LP*}v zQ|JHwulGGy*SXF)*XgI{_dL)2z3YxvFhmV>yb}?`Rk+)=H&F?mCD)L z6AbV7WmquJ#wpSg{2iFRDQt&Q@tR63{F;KZtCoZ^dFHN?2Xl3(ct;q`t_M#|8@rQj8rX&5=K zQO11tafm&JL4jC~IRx>r56F%lPav)f(&HUGbX1#1b+oDIsp7KA%NbDbS>QJNMG6*7 zKlzt6p`$1KRvV z%$i;!1&?z#NFt7MaY{m&MIDYMklq=Sjbp@BVh?GTa*(;!*OzhMKKp$K^1v+{g%V%u z3yW0yII^y4za@Kstpj+-&xz9^e`#(ct>il=L4CORv6){|$Sbu49iUEZK=T8l6T)%U4ZQs=aU5i?y!|w;U zg;Cp5+kOw^0UHM#$4={Ech2!9Hi4YMAFWWG@mdQWS4|1cErPx!NK|;o9s>@)l8Rn1 z-wvFN94g8?!klr42o&OZ@9&Bi1~)s(TU)tw;1<4z2b?=Ak7ag*4GuCBMaQm<{Px-6 zfd?0tX1wm5xWd}ibyNeq5f$!EP#<`Cum2kvoU?Tmc-DXte);nlkFC=%LA8h-@9v_7zlfQbkk4?CN-x@qC7cyRBy#%jd5@CwYG%*C7N*fl|yXz z9G^h!7?>kCJ%reKeiHWP7x!0t{WwcOLBVO~gP(TY2|&u-UaF=&`xEHr_CELaag&D#GkWXsC3v(a=q~wfsZ7>(oK1zY7v+3#p^$FXAr%qqQGUWMZKpG|Y<<=hfz=(aF- zLj3SF+&I&V9}o@}ADIt=esBZFGPm1#kl(@Ddh$ITzAuRRa+X(WMmv0l=DP$3&Hci{ z{qU{&3ng7vmnyuV>nyV23Ee3(*o5rGP^z)hUV?j1-yu-c7D<})|6ZlkEgX;Uf@DR3 z@D$YJi}6FU5_(_f2x zyvX7xIE9F;Gp#h~2rTt(NBLs+YguNzyGpwK2X3H!=Z!E_bRxHO_p36z{)4-}OTd_8 z>sI|-I-0rh?yvRL#O=#RHO)8(k0w76=_)!_PHmoNN94;xAsbK*)Ui z6I;jHL~S*?4=iu#ySA9&ti%z*dEQ#PWX~}7fj;z{U!?z#yn3a7|MAmAJgEJ%J2y-O z;%XQ2HoVhZ`c-wMH%9i`Lh$MiUMohYm@NU5bYm*Ncyj5eu6lb5TJFpGXcf|5<$k!T zy84WF1n855z%|PgMupHNM8|)Gx$<);b2Y^FsY0Vz9LB;;oq9P2) z-5DZ%#s!w2uo?i|iA&l7iN=AQquao?>_xPbET{A&sO-ZE%`c) zT|mP@oWZ%dJcQuk(GSe08Q}YkX(^6oeoy~?OSjhiF{n<&9N`;z;_4D7m%8ZPJE_mJ z)su)Oq{CtLho#_8`hZDs;*l*U#wOu=e@$M_-|TSk4giXQkF;{S!8&ArmpBDKk$m*l zIZplrd~?jCDzCl*FW1J8WFn00<%LVKfXg~hPg~|b(s<=C;8|fR@N;RA2#{giyEm!% z7m!ga)dGD2o@9;)0X#|CY78$-G*ygD`&uUA5l9oIifIf^D9tE2s7k`EvM!JD(}><~ z*9OsH!E#OslM4wlGU`9A#F{BeU7AqoB)@_;Mci}V(zIm{J^k>{Ii4ghU+MmHM;V_` zmPFFhXSV)Sb3ebHhM|B+0J(IT0B8g8Z%=jm{FDUm)*Xp!75=l)NAP^@l0*7hKEDVX zGQ@cYZB%8}V?TN&8Z0POrv5@(XdcvlnG$jZz@|E)=EoSOyjb_B(|?_II&D~SOO*t6 zR_Sd`#Fig5sp;g%RZ{ke#J@<#=81({{?4enM(ofloISfI(`Fp!mXaW&ZER+dD-%A# zs#sU9-C=BhWnGfFH_xNzx3Qup(m*1iySiUo{QZGN@~y~vE=+O+ETFEg{%mr~wccKR zlna^1HuV6vIJp!=7gl{3_oX#pgFStyoHMB{LAkM_{He<4u4GzIK)xuf|098YQB0OCv_9#;3g8(9z%K-Lys?nZY$2E%V3^J= zA8jSx=8RK^PMtc16r45*as={ZK`)kc$b44OwqyI_Q->^tnb=85HrJgxSL3jAy6s0HIiW>KBUE^`Y(~VLz_7_?|*SPmX$kfZSCJp_*!?7okEs z+AbBBrMn+S(Ksswk+gJ#(?eo|S1q=PjM!mRMh0JZg$FW_Qn8H4iy+^6xy7|P@6fx$te zQyEb@9&At%-aGgYTt4gP=mGG1Tt$4v>F6|25HwMUf^~AM6bi*|RkHlB$JaA^QeHY3 z>t-o<0s#Au*0^lf-Xt@z7%~~JX7}O<&3+c46^gto!^r$a0) zKm6XCF{8MGf57b{fIlw2HY%Jvsw&EG%tf&aE?X=+WLA7nl>~f|4|9KB4Kn3x(d(7A6`eFsan#UL@=ks7bdoi5BkQ6gc3(sWMCNAEOT%aI2K zwiBn((BW*##7Ce9PmPR7{j(A#t_Q{&j;1{9L5iyBrw9$>yXm8Tw9R{)ClY z2IbMQ{eIUJ%BrHT*}l@+HyJw0#o?B)&r zJp_|1b8zFkF&-*1Gcg0KZip$?#|QEU6CDVuB~nKW>~aTGlu-6}!ri`=4W?xhDUlmb zl`~s^eK_|%e%FCa8)$eRVn++ph=V@kMd#m(5{#tu%jo^7@S1zS7TeWVicK_3>bQJZ zw>TVQMmh^F`z91)+)M}^a$Oqo`uTIIamo$F94~uTkJD*g-DX=pR;*6@y|7Qx(z0@M zWAUgCR1Lvz0#ppa83ljlEcvBYU?nznJN78i5RZ=L;MA8dvUtCr?Yt52T7tbA!7Y&ZdO)AkkrhYF%UD)QV7>NO=i zn7Didwm?CU`S|gkvp<+0GD-P7eLq{_`JMJ{O7%4+vY{`;q$$K4K`e%2vSGw8rm2CuhfyO)6Nff$3#=e;|OOYq}Y09)p9Uc zRE7aNRj-%Ja~BI)3xAmzO3^$H)k`4bk4A`nQ27fb5LS0nAz+wVT3T*`>Rju~V8h2h zRKzlg=)>kKFYRmp@$ji`dfj8Vc1(?&8=hXYa&;x0d~4D0@(bfLt3jC*^nuyByueFt z$4C01P|XB2(GWgiaJ<9RjoRece(F?o)M}NnuF0b>lWHVF%yH#inmAu!RC(?3%zsA7l@!S@#Q)=D&)$Y@huEc*wLDC#Up5;~f@ z$;lUg|N0)(o-nPSZy32+#Y{jtK+b0S(r({I768M$KABCY-EfC+3+>bos6+3GQl7{i4`Cy-Slf`>W$7V>D>3?*B{Z znSA*lp+{j$yQ9-|-w9YwX}8&y+!FZmes*U?ch^qfY3yyvSZV$GJt-4~dAg#VpgAHy zBYDq(Wx)He38MkS@uG!&EBJojkxsYvB*6PROv-s*JD;*L-&!ELKKF)U&mJ_o&DY$c zTW@pAlg3D7c9621UEaU z((iyxkj#K|98az^$Z!*=F(i?j;P8U%l=_jh-f8>1g@sE}$cz!%Z-7j=BYxj+VhQfq z`7QW=4=zqO*2r-}YydqVa_eS7ES8ZzF$Vi%kTc|v39UQ1M=9ppMqI<>vI5;Ol;99p zPK%2HN9MUvbmbY+l%R0&J28C_k@57%Tr{>SfO&j%sBNVm^r%xj(Ujz;1ik2J=x zjIg@8&AhBq)~76NpLsPH1j0y~EMH`Yg8iVhaDkrFqEDz25T>v$iY zC=9q(80iTy@or;9Wm45zBp88~b}Ld-kja@hsSS5Aq-xMOKJl^2bXjQ+_|}%C10N+s zKltvr@Svbz7vX;eJoJ|-WZGC9tZCMNM(7K?7M_7n#@NHygJmESW^6M11J{PfuJuTe zUI;ldnsAuz-Ul|H(vnBsr45&Lo7jSAurWer*yT9vQDAo93+JK}^eyy7Z!aH}PTLQ2 zhuet__uOJ{1J#B<433A9d3HUK-a-p19OUS{HX9Dj&0GBWWKo0;Cg>>m#6)ss)1URV z-O>gEySHuSeSP+CkXM#}&lvDXIFn#X06kY@ZIO&!@hc#7*rZ^;ix-&(cE7Gz?~Yv3 zb%ao!<@C4He?A@YX987&X!#KJ3~GMwW3!uO&V4{BtQ;H;k+s5&251J`4Hvke$v*vc zf+IzQ`PdEeoeb49>u{v+j<_9m_bxNEm(A|yz#dEWS!j(KhG`9ak$~L(dTlQqH@_tt z!j>Vhk369Va9MQ^3=AxvQ6ZRmX@92DxZ^{8?tSq%Ku0b|ed`qO(efNqPIFPzxgpaAZE zD=&Q>nxge}UqY0hIYgJEe?*M*#S+ZfH?&gVX1sr0`=kmpp=^25?UUHIw=M@vVWY{) zI}ofRLX(0j3axGD41}L#7c$=dkcwnEe*M4hDI0;!f4e7J)h#fv`0C_*%D^OUskQ{A zgaCU0y8^h)yol44HZ(gXn^3gS#VV5ovgc0TJgYl(gI**xnwkfJC%3DGd)+W?!DgqR zk73)`*L9_mdV^1~SpN&87pDVI2RW){OrPUB5g`r}7Trvx3tYVy^ZNGC5}d-nRe)jw zukyi;uCD6-o_memPVRTiFL;)LR(6yyfUW)FFD~Cn^oa@CpS8?e{9zXP*e+%AEJ%z% zX)bzs(*3+GBZmDow@)c7{^LrHbm3j-0RL;=>ypvm@=C8VQV^y(5EY;?SgJ{{`tmR=gca>>|-LI?`NZ2HHmm9{(=I#jE~3(;h3%ToT9}~G-_eHbqt?rcTTlN@iei8E#huWlxu)E6RG_Ejm;)Ykfn`;Q@S!M@Y`Jm!Ax>uhX*JCqYYA42Kt>04Rvm{r)L zc`=&2CrBl(YwB5l|2FQNbB=S|!sb)T`31Ql0TQ2VJVqNf6Lap^4_IGrM_Z;TpAkh| z6j$=VIW2F|SgA8l9e@6`^(#)CT#O*kUf_X!A7HB3!&r`~Fr&~vDll0~g8i~tuaQf3 zc@D#m%RBRJqA5U4ex2p~8az>u3tph6cKXepD+X5P+y#wC?$rN7QsEiqlna?`U{DC6PSF1Az`wG0y zj{F>{a7o4Hf;dtKAK%eL>w>i`4lBjsvS>cIcU8EKaR7@VtsYM8bp}!@dK!{XEJ(2E z-WM$Rplixy z=zEq07h({YnKk5pB!c3+qob-$$%Nf|sMmCECUbfLXvebyJ@qSzSHw(N+3GMzqy<4V z9#1&?%?elDmJ90!9Fbqr{kzUmgcY10ruA(Omz+AUc-bm`TlB`6!1MrHHX=UW_;C-s zpKxw=Nbk4^TtMFJ{4V`MV|?>5Pp3(?pvIcLsQkeoBr1)6r^V$7Gg1&TMpLbFr)@Bp zEdR}Xnl6*s!0^;5>K@(eZc);lL0NBqKf}q*EqL_k-bM4=R-}6tK|78w4cX9#&iB0` zAy!@>y?9E}VEF_THERz|Tuj8Im(cSg02ybg**Ha24F*E@b~&DL?B&aR`-)X=C}TPtuXf8QiQ-g*k4Fnmfi23BBn zfnq^;cE+0>NQP{V7_v;xMEw43GIu^+15GyGt}UoDU3FD=sO3w-HMkZ0{QPwHS#yfH zvM}f^Ydw+i&)gTPKHfssDuCQZ0v(RfhLj+CaS*c3hXuLHcENY5zS_J4D*~u&(9JOL z2tgDM3t@QBc4?HTf2s_3gy- zGf+dq(vm$}1;-fJ(wSDc(ulry8+@!z%03VVt0a2*jt`e7Z151rzcM-UC@m!=;;WBT z`^iQ3Cv0KSGZU`jxX}ST@7;_U$f2{xl7KijFnv6oRx=|OSjov9Jv|BUypRzIKr7Bz zaRwzHe+>=1K6|;dB)WUvQwjrQ@OfAmzS88;ht=k_UX% zL|bx?dQZ-;tW-w#NW8o%1>R|g7qE0%^X*>z=z`EYU~9`cd#{q{{1B9f>r=KGD|upm z6)Q6a0n;FKUuo!oiMQ@4<^af{)Th5Va_s8Z6Q4;G5=wfs&i1+%CrM*cu`isOVj}LE z%ayFf!QkLF9ETA-c?KQrHHQ`f{Q?IbaFz02E6gBE+h-y`B+&*uRx9%^ppUComzjL9x+J9e7-jVUhCWN6hPwxVwUu z!F|(q`#wEDj@FzKN6dy&rUsd+G;u^JZfWOna+)s33N{maGYvs%S$}_-Ju@D>tg*Mz z%UHsNJsicsWPjjJ zgYVyANoE_qEz)ppEUI76u%Pr663@*o6i&Z+1qJ$7wd(CY^eEb~v zR;<3Fl-n0-w8s0pghWlwMm^`;Z=akhhk<-c!0S|LPDV|CyWHHh-2sy>CpJ>3X^#;X z!-0+_5o45c9tcKL-tuF!92W*RnQXbzr@&G%eB;yZNX{p^eWU)vyJ>l(D$Vd46^wx8c@ zA5_$`)Z6$h%x}SLHOsb&9w)lq;WijufGPp6NUb*a?0lR|;PMjoDnyu*v^Mq@0OJZ% zkLnZDXM$h`B81=1%!=AYSjw5%Z@9?DF>gwtOMe~K}fYd8B^)AtsEck(XpP)*e6cQG` zVJUb!aayehVsUg;w}_pauHu9jE5iLmzt#NELc^ovYl^+a(EGcv#OlhhCff^4Oe;t8 zOMSKO8D2dSu=RA{F+Cbue`4)0-1}oBi1*<>l0!*SBK^b9lqdIM~DmG*uLuLb_Sy~p_xQ@SY|4@+W}17@XEO5lt%+pl8{Uu*YYms3BFFz|O)*;=XhnyGQ3%+aGJHx{0%r5M2L>z6gfIKhd zi??I0qt}}@hjxW8lyp9P!F#X?Y>JyHVVRkXnPh6^-QC?mm?)l?F^rYLaXSRBAS(Cp zyfb)K7~W{Fd-=U?I!EL2I z2&W*Vz-xcm^=yN<*n3(B!Pfd``)5SFNLN01P4=9i{wJ6mW@%Q*>)?yzGc!u<)k-KX zzDVqmw5Z_Rz{z7P%!KFoeuwQ$Z@=OeKUfs_%=GEOuyhX-CNLK ze!*hsDy_f(NX5`z1Y$30dSxw!fM-t{7#H+Dlwb)LflB!2vWZo$PD8xC^}fjvG=G?; zW({G=Ek?u>`4Go03v{Bo#!jrlq%VB`F%%;zhB;Q(b_mwXX3D61Eh{S{9MA|l`{m0= zXRk13Ucc^>&v)b`(L$JYOeTsefQjU|8?xYdQ%6Hb#w$ z_8fN{8^6hFTkQYp^vLSvyYRiZKr4|?wJy1jcP%cN{uV-w4^QEv4Y&L;Dbpfx@~y<8|J9;e-G5U`5C<)0%h{KNtFkwt2TiaC*|$96 zFN1>fNZC{R?v}el`^S(Jzx{T3xLB2A(Bi+rh;K*2@8sNr-vr!CCpa$$Wcb!vi9`c=29+szAru_ zyOw->pIFsDtGZ@0$eO@_&O`&A&T?mB@N_Yj+F8Z<2GDX|2a66PS zqfOtILFpoxEs|y}ALLd=4LLY>8ajRLop!5YI9lmRx=DYU4U&ykSE4sHIg`@+aSXf- z+`DJ*K3Ne$ER|S1R(vK;ZxJ+y>(6Pj5F#&-gqrY!I8M5|=?LczSMgB~!Wli+^Uy_% zo!F0E9Q(+np*hg$F`V$p4x@_J^iwLG?!WZ#vp7Nyy0IcXhL@F9%2Uu8#BpLth4oaF zRmN+AkD8v|mTxl@ubfx#8O)W6|2kg|t|vk}*iX}XMxNn~*Pe3w%?(80teYEM(n)2* zmY0MlQw2knr*};WN=eCY)DFx3w*>i5 z=IdDRXJBBU?>@Ot!i^Lu%q!h50U9qvlIo=?1Eg;kXy;;Wmb4 zNsT0cw=ia~hKbYpKF*+MQ=Ab0!>bV;bNzK@yTV;3IT+-@IUo9S)E)&nIk{Jb7(k)^ zysni;q)Gy8UOATi2-8RU35sz{cB;hKG3%Y{k;gFunb*6%z9hXhsTVemg*ufQA)TGC z&o3OktKn~Am&-IaUF-IeeKqhuLw}W*{J>}swL-YV{7wN&wixd}x{V@O>rc5M8j?oZ zNXnG?sGO4GGqtf2JL26S8of$$cz3;gc}Q8g1#uyrmozbd(4!tYPIDZrRL$$L90_7vcvQq$Mk)@pg+go7!m`(7Xo^K*|L#p$v@nmFe2ib)F!M0 zaT+w76Fs@O_>ZFe9IC<6kL_ussHU!8gu9(6S5|W8R3bxlawlLGu?#r;@t?X>0eC2Q zc+0yWr6Onuy-x|i<7$8hSB{rS*dQEQ;Na@&L(hr{<>yUYaGL>v%1A$=i|vj&?rYDh zOZXyEpE^fIM1V?5M;Utbzb6^NJNO#zK)Ooax><}@=Q7KV$nnS0@pE%?^>&+M5Q88p zYR)eu;ETODTy62ov-U&Q22+@bA_onkYV-CtvK_OIZjR8_c*b=D?=P5!H{va{b9yo! zVA9dQ36mU=fKMceRpb8&7r7RPke0T0xl7f1<(ZJU0 zB=T-b=S-0nUCTu!?BDSY-1#zH`_lwpLC=mL(;aC4Duv|odTQ@?I5->bsH6e93rC|F zN?2Smjp^eXz>4+-n$61(!up}WlANoFdr|(t$j?t&zku&=XJFb6=*iZ0Tho)TiD-A< zS_(E;3Km7mT~c{6%zpIrtr?g!PIB&=d8$Zf?q{`y*$TKm{PX-{xz zJ|_x_TI!DJXfjAKsMRK{wRgT#&tWfnRAwDucsOHJ9RuXRlk$v=>IfENrb5(AVP zl3Yz$SsU?DmZjN~14>q7!ri(C+1Wo%Kk~kMm6&7xE~%BCH)#`gengHyyxJgAeL$N$ zx@sSR?en8oIzJvZToySC5jc^Z-3Rym;g{2k{v>QR{+{^s7oTEidWD4LYsR@sYQuiD ziq+#`Zu=^8fqPV(QZIoX2OE-gwO1CgF@To~5p#dm-Z2 z)IEKb!{0Et5E$R&-P8xc;R7#_)H~+daJJOS+nZS{XSbisF~jJe$tmj_rOR_2=TrJp zeyu;B-6Xz);e%{A?GZMWP4Tv8ifJVU=${Lv=<5!0o~Pw`GOaou`?O1~*rvGb?%*ZA zgnMsQ3gWrx?IX@#s`*gXdAIDW-RCk%8zIepqqsho&q?}`@lT)1(i)g=rsdqUWt(Ty zTBv*oogB@k_QvCzmh21ixfI0POAmxkG!C?XkPM@euGyZ{mJ%mgi6E1;yE8?iqSve# z8<*QoQig6Nz|Ps(H{KEQYOLl}ZsC0^(ZPRecy_bSk%o|jHdETDU#c{<5={K9m)Y|{ zO;u4|G;Z&f0K8ErPbN|D4ht?*>9?93{zW+L5n*L`a zVM}Jmrt0AvtKLT^E{*xuybY26HQHpt$il455ku`GBTvf14Ri!eq8gW`58FqTgHsGq zEnRni=;`Rh_NI0?h!iZ-INod-hne#8i3v{ll|Vgl^75{5PMCm0zdjyFb-_xMj@Cy8 ziZJ|?8IQxaUi_rAqsxSiC*g18S1*$}{oBu9j*Ch=P5O<=f@=?6<=oxfM>KzJWn}fZ zvF}BqF0Wqr2g_fD5&Bnma?y|tgwcit<=d3aNj~gxsL$ze$hU4ON%;Q#;xA=o>IfJA z!3xItj`I3NS-{x> z=0_(P&!5|K*En&!&c5uJukMT?X$-9z8|{Mnvj5Km5fn`|FE5$i>@PmYMRzy&{do4o zn8e1o|8FYuUY__Y?Ox_k^8S>LHJwlWiYH5CBfHQ17(X~CjmtOz ztzmtL<1008Pj}Ec`|8TzO`VUVw{>c>J*Z}l2~p&bQ&os9N4AdiulYSJ2!PeLNu1V7 zh-d7uEpIe6*m>vHjhi|b#aSSu*~aQML1S9$?S4kdT7+2%SR(Nsh#Vexe`l$zT%H{~ z27s5et{n#*PdF(X^UcQDC2JS0s&-++M9F5suU#aOW92Lf(NfA}it?NAsKWRt?cMY) z3p&Zf0z5Po!{&+{m#srNctHKA@L3T);{55V4u4m`$jYA$gL8NqJ*sz!Ceu5W8PBgj z$O$CwrEB$xSXNn(^;cA~b<#0@9~@~X8=!0wbkt*0=9oHhO?~o%tD_@Nf!7U1Q#6jC zk2%k(+7vSmGsM=Em6U8Le;-J7S)|ihFF zB=e945c?@hOW7G}uZy@^mJ{A0_G>B9zRaMk9DlFl zi(6X`HAeaRut8vH8uloF&@8#dN<;?ZDlcem=L+p%hYj7W;`+4h{ z3e@F}Z$|FjxiheILii3}!J|RQlY_TUNxwdP_U6r-*!p7DCtN#4n6uRsbWUvv;PLUC z-h+sQ*w(DkwH~Y|TU`{4n92@opR};Bkkj4!xMbiQBP;7$#|2kCLwR?R z@ksT&PIxZmlpSo1NJyYp%sj23smV@F%7%Fv+q9V?QW^~r=BCj760XyU2M+eU<36)} zM)dHKt{zz(Lri3fwB!I!1fqI`nbc*&Le$Q->5ZA{eOQRG;IME;#o&k9PeqV8m? za+CDFo&F#0=huMXCFkjT;QE{r?vJuS5^Qj##$Wl$Ut%Bb^`4Tl)fQt?omJ0fXN|Hs zdzK_FE>4$T?M7^$*mWxD*P4^`wdPdS!{q9YTh4U-S0cqDCG$@m`m@luL%PZURfJ~udJv~lTZ53(9gU@XIEzhZ44(=M z32jchu0)<`Mq-8M`N9(GZ%vDu2I`~FoR3%95F zi;T}lw|;4XK6_p>Tc^=hxT8ja!)S{8X_xA1_SG+rE|H(}Z`wIJl8w1C;&LGT0?oHw zb?-^}EGKV?Fscj3(PMAlFb4DhOR;O%qOUb2Y^o`NOQVerbRGfCj- z5<3Gdqy@@DV?&KbkB0XT4e_<^m6VPR#mTQN^?h5^Y5E5xojU#J^}BU<`hU6AH3hZF zW=zHV`P#CNm4<-WwbaQ0O`1`t?4365wY2AR^Cat!##fB6Zx`_8DIXSa3 zBq;wV63$E_<$OHbV)Uy&r##C2u(SHjjS`)^Hw_&KT~=x;>xU{pUdynEvN|s?0g_~i z7KeGQcS6$b1tUIDs-%`cLycdBKh7~laOGf}rP?d5%b++9LNCNH_PHwD>s3ke&Ip0j~ zZ451EA=Mxo>FlS;Kf03pKfAZk%7TKPXk}R3|6> z;gFo?BslCsq8o7NUXN1~M(k}{HlrHk=jVs*+r#cb47xkNT#qN{y^U z`{cMYtuuW*a25C9X;Qw34z`?S1G_UqV1L$~aS~`JU<|C$kDqkQ`c)OxSU-mt z7lgby8~kRF^jH&V6+>GIFjASNS(&0-vpe$XvTzIYb>#|*-gng$7*|J(eyup|MqSE4o7#}*?#LUKbVdF$^x#3vvi>cjjA!m0)TsK*@Zj0c52juRtCH_xmt*Ynh+ME}PVAwXf5((`6s9F6f(nH z=*`zbc^Yj_K?&(dS=qZO10akHSqi3>4lJ*y2H3<~wSlBtx~C<^MYTOK>hB|`y!fHE=zabnetsIa{UKJCrD9eif3`Zl(bvt@ zb<|_0h9FK8(i0p;vri*}R5Yt(mSG}X?n{NPL2nd~j81}SBC>U`;}kr8JRE~(b~abB z0!P*%@RrAjKHk;AaDJ%){}n&x;fHF2cfKl1`f16)g6B&MEaMM%$+x*4ymaCep=d4m!tk3&MPCY%MY0qEMu_}tB6_En3_#kS(g8cl3PnX7f z3*>_2t>l)ijrNF|9N5Lr*qRC5mm>6&-$_iK3GTIh_Zuq9ya_Nu+2X-{D-5Y%bl?AI;w$@ruk!UORDBSh5TqN0;9(qOH@& z>*=gf(4p>JuS|PO(R|~^PvdXdlG?@nTyd(+)4Ms@C6M!(v`U z)X=ijD80vF+wje-98gs*)GqERY*p9ba@^r|+``7Ku;-d~Op4siSq~NGWj;A*W_y52B-lC27yHp?ub%;ceCu%SBUf zH)pSeUMVjrxsII-0^5ipCm?VGMQ(z!w3Hp^>E`m5!=6g6;18S=J$#EK@cvqKwey7w zC$+VsEO)r9+&$S3zzr?Sk@0DSxm*?&J^7XU;8s`htYpRRy%a=4nkMQ>@ySr7F~ff- zi;YQK`7CBdJYD_*NSpGawe|5~F&`n#_!(d(qN9njaLVw(4RXWt5&dO(I`4c96Q9?u z?|9e!gz7Gz_CuYWXK;ev1$oHGhzaNDcCO(-g(=SU&h^33aq|jlfZ_#j#BM2a7@C{! zK{a@3h8aejB@hiQyQkgaW3z;!L6|w0b|%kHcV??!=cY3Fek^J}{9r0Tm)F0ldL}iV z^QEd-T6adp#GEdMk7W8OC-6A@9r2Q=sw(O{44NHK4kJYYC>5I>$+5nj)Z?UC(EmM4 z7#5*P?*kp;V?(V?W}Vwx-sHgI3Z8869=n>;s!%_o-P%;$Uz$U{_*tS+#vwk*puyB4 z>eVYVN#m30r%n+UrV1Su_97bd7z}L{3j1upyK~-RmO4Ti<>2YPWcbOJ zoB5-~gL204c?_i*o6D1;qHBoJDlj8!J%g|F^Y}#^4H@|w6_nfUva?SerO>@a4tn7A zSq0H5w<%gkYg6KC^(Sez^mk||BB}s>{dULlI^g3Cay(pK+PpV>04|Ju_eKPIXI*(K zSDCVnxw+AwoAB70RtPNrb3wdHHZVq2E?s*li+Uu42Dd|i%D+1a3Y8fU+gKc%WHK-?L~ za>s`+yR(iFH|%Hrb8MJf52pRKRsMcC2dj@gzO>NF0OBXi`U6Y_YUO1TKS@8WsqrCc zFxaHn92rV2O}wadTU#C`FAZP5+cj0k;lXEev3i*F?du!+NGb!-ilF_K%=O{3#V!=r z|MiXg^=}7YB~~nQzwW~p`Y2U3Xbvh(Q+osD0rj{+>6EmUIf(Sr`2LMwPdAk9gqhqV z%z9_97$p)s0s`GZ_%BWdLq4De#UAzdb#gn+{jIGz^2EuNq*z;qhFGxV!#7C%EE6Ps zlX4Q8sDqY|^XU1e8U%qa9@eGUTK-<)vd;FBE_-gtVu>i%oZ(b#x8Ds6-0Asy-5L0D zpwTdzOPk|f-&~}1Fh3%~Iy9EHWy-G&$Nm1H)zOi<-H`(C#J1=N9tuz)4+*fDhjI$H$4;85V=M$|KWi z!|>a~8O%jV#$$=;8l+TZ4%U-qW(D_ue42jaZmG*#G33&0-M!_GwhuQ|X2&7!g9l5U zxL%#adczp#+1uh63Xk=S}lrz%m<#FaBQ<9>VS z>62G!yPhTa)4EA|eY&3g0LbBH=p;Kx0O33gB*$1;gi`A5?EH0mC?X}m3~t=mC_=s z^Lj`H%@eZ`8)l=9Cvy#b z;#$i*#Wt#3w3Ifku8c7%7w>(3b48NL)iC`}C`W_QruY@Am{+e}5u@MEsn{0Q=au*7p z&Z(dE$Byp)ZML=L)ZsHa)Ogev&=lI@QP*~rSl_vcbJ@)iQz4+fpl5EYd}*X9=+e_& zmvm=C222k+Y?l?j6Vx&u+%m3YZ3R03)uKDh&~m=hhusMWQlc6iL{KEy9p5|d{OyC9 zpu_6+b#89tC#p>?L)!0&gEU~gMYZ(tGC}ZER8djEzL^OMCK$`U|81`ZvnzdU2yoD; z{4QZW{cx)q+QL)0%#9Cq8TTIfcD!@|)+jAk>etM47rHfZ_PRKo;0^W)0;Y$h9omtX zU#c{eKhr&O;0tL?xAK|E4Bd8hPw8%wz_E7b^O{WxkyIP?V_&umUyH5*P#C*>PIE2U zh=1*dT6XNjZf<;$Q=_-~t)lrz6BK`cHKRS4+r?S^L|C4j-A6SU#mkh&>lJ~HUc z(n6*m@KBf6@iPNE=IV$S8R{>hf1i{o42X$|i4U)T^-2wX6i*Ishn8Vp%>RejCYN>@ zUpPJBS|iY%pxwe0W{JH5KTkzbQBmS84eq#2hc2p+s`3{XZE6{%#t(aac1&6l;m(Ey z5vO?d0Mfm;kli$-#dj04WJfG6#%(UrfLsN>H#UlX0PE z<{W9$f5ol@(Zk(e7DMWto(vugCAm<$H&TG}d1QF>ITZYfvK`-KZ1s8cHcn^u3_g$K zN@#6W-S*H<$$VTg{1@U1XB>8^u|D7if$qZNKs*VC98{a+(*==;3ezpInztA4S>_nf zlLy}?I}P<3EuMA&rmJ-)7clc$hq6`8?=drY)z)^@*xq+J7%u|kK=%P*v@IWuQ$?r7 z5u*aktzm8%p_(5V>VItqLE-3NGPMqil=*%jc_8!#cQ{bnQsHFDE8C0|2|zOCufEE= zV+{`OazOcnmB0VS(*kAU%K*zWy9{EpkqxJaV=?PHE{g0@pxmG|j9 z-^LGaqg4J&N9L+g3!~4e7QRS|7C~DV!08v&H5D1YPo4MjWg1T@Y1DS>P=e0F}N1S8_n%98$RFy$a$>}<|56MHRb?A`CjZTusOJ!lt z8$J>+lVA1i3VF@?_G;~iGK*x52j@p%hJXX?r}v4anSsD4pNRv%o-x#2BLss{CzcqO zz6~dL{0WNw2mpbsWt0uTYU2_Z`VJ074TJr%J2bx`F;KnY(kC^oxX?Tdwyv<#&tLL_ zw;AE4(o;5l;>YWwMkg+pV8J(;as~1=4;BUK8!xOGJu0cm-`v=zrY4b6$A8CkW!Kgg z(&eHX)B(h!P=LAmj1KTtvU%5(8`DVJw!p?R3;Vl1rrL-L zN2P8dtOdr9gh|WgMaG^C&gaKO8)~qDu75iNqGn!M%;)zx*l%R#^KL5deE&Y#1CTMO z(Lh>`esC^J_@WgTCh7Ir7VsY2T;?1$eD;LD9_uY&Z?^v1_2!7(D;>Q1ZMP()e2EfX z_#{@JQJd;AzAMm=seB7tef5eQCWWI6^V{~)gc=e9?}M`)W=2l z61f-tt2zERKnh4pS|nu;KCtIz;~3-ht|{6lZ@zpup;u(I*J`M-F-#r^V3YI0{KBU; zXb@h19mEa`0H3|juoG=DLN4=s4GN?$tGP4UOA=fexXDE>wcD4b!(Q>;-|-+`lQAT> z+o6m>+T+W8J;1cBB$$6c2)W*Jva|c-7&$J@mSVT`KH@VGd&Fi(lo z+2M)k{gO*-iTVR~(I&f6SUdEGXJ=>gj~v9qS(1+nZkUZ*mVc~G%5KfW&;N=4xNKPe zjr9g?;X8_)v;#lAMJ>hw!#LM}P~C3*$PoRl5LPws8n?^8Bmw!9k=f(f7-O@Klt909 zLISsl@m_QX-2JR86Ca=7tdX(^SI#7s&z^Tq-ab$Jop@g_9zKme-agHDPlve8slJ##!lLFNV z-Jkv!f}$g8>WBl3v>-3&vx%1x)447C!`?9XoUlO3v4QKK-(Kd{PR`D|-C3;wLc!es zs1^q%3L@Sy^I?{ssa`C(e&DdRHhckQ295(DhbLNAFKbiQ2Im z92Y~^?irqAMF4Eam)`S~s$(yeXusnrl9WDS;D8lH<6wWowCYdE?GGLZLO(uX>wR9K z+o^1{^+bZ25>+`V`*!%|!|zrO7G3+u*=y2WHt&5O`54OJI~@|?iq-|OxJWY5BO2K{ zW99y9<XfzysO{zVqUV;e4uGQ!{QLTCB=N>TxP*kIR(p^A+ZR~ z!c!g!#}`{l%5 z<&^V-R6A9wa-8vPnoLw%(vb^m(r6$se}Ww_fxcK-4?Ft75YU6dxVX^e=4Dg7E#Pp`)6qJKfOX|SKo zAv^8;c(9G@p>ZlcJO6W`y`~crXT$%71B6Tw$XlKkp4t&Ti;9 z2Mgr^=7?u=%RBXbD?ZH3)%b%`=4I)OGdKVsKIvE=RV4_M?s{q}l~ z1;3(!-O(sCR0|R}9^~asKUQtVUJ9j=V7KM8ad|NEIF`+94%Qg}-1e$1x<+>6RQLn| zh?LGrzP(sALMxf5`=X^qNJ2EkR%b>f>~_h%C%y-9HSovj=(h~$8Dukzb-~FJ7^vVX zPEuS{6#ab>D_HX2BC~|tV1!bq5#-Z^1Tteet+4(tBVvLH89iy{h3(>%Uy&$={|~O1 zk64~8CAZ%Hv5h_J7h0(XRGHCHYCw(K2NVDmIh~ia3C#XdEdq1aY(4jKdeEleD!ag} zU6lZ@b2?0eH8NeufK^-hKWx1RIM#prKU`8FWrQd@J7pwfcNtNl%YUnI4os@h z(!a(LGd%oSpLRCbJUie~tHXwegYAj=W3C%|+&-^5pVg+cO_(PQeW|Ocp!mWrGB#E` z+ona;fNKc*(_&Ocj9B_YY~DXCHK!KmC{`*h|5=682YcRwM7uJB`X^&fDMQ`Pn@Q zrkR%ii~p!;sBn7#qmL)Xksl&&E+;XVBo{n+V)=Q3#KZl9Lq$cdn-85%d7N6-v2#IN zJxY&Up8;SaCM_M@+FHbxU*~%FD`OaSoe~DImD`E=T~_N$8*$2Y`FLU&Jv7rD;`M%P zotJf2;hORI^M*Kep1fTQC}bpLWNy4dXF(dA8MylpKs}(vo9lD`bEB8k5cKA1KDt@S z7|?NtK4mIj=cO?O8F~;Au*A?FenMR1<{{jy(J#O4iyM(s0hZHQJgu7NKX43C>BuFt zGd#q2lI2ro+f=~u>9aa;kEtKAQJNMFBe%VSR%TF5COW9JXmdx$m94!*^jP$(W14ni zv};=E+~yE}gYtobEsTy1b4jc&5RNL;L;VST3Ycoc5MQ5Gbrn>bw3o|Q}NLhUHG9zTxCbNx+3~bihj>n z+8n{(K?)dTHZmv=V%l)nm_J36n}KR`d0*hM@mb!fJT?&f&0r|(LcPn%$&d6@J~!7h zE3=g>D6?F)b=qC;1DF>++S~ zK_z~igD;LJFFz+`)cqR+RfzHQ+3ySys$z1}4>}*(nDq9I>&&}k5nX_!gr(sPnmgiy z3(KO?(r>0N{50jGjqqpM#--8&vVV=^=chJx-iPrTF~4d=LKtFpgN+YX zlvo5)Xg$<9L*^PmeqSrQ$v(}rS+V*u=unM%+;K0zeg(th5GIZk#m7}ukK*TI0q(Y0 z^Mfjeu()L7rE7r<;`eXQe(U?+jxO`FMiatU)L7P`#gt8M9J&IDY}=yGgtP77^16@D z4-D_!-u&O8N7=f#aK%X9xFIUo8t=tz=EX+`7SRc*)T!H=j87$vPbUphF1Q~=JNj2h ztJS~#d|t=oUET%Et6CNB@<1rAmW7bT>(HjjGLTfDZHZWq)y`F6ZE$5V#1eiAbSeH9&ID`1i+PHgaKcpT#`g|W4yK`JDAgpom( zIzHPVA#81J4IHB2&x7i3XOe`OUXAslxd!VN?vzx;HLy}wOGtG#WNio>F26es_Qb@0 z6Yi@1-08Gmf3GPORUM`SK3oL44m?R(Wp?kby~A&ChU-s|o8WWt{lO#rF%1zov+yI2 zbxQ4x!i0rFW?p#`(`poNUbj^KeD|u|ks2kV%5-?6o#Fbc3z+k&z5V_UfMkvuu*Tr zpTop1!C~Q8%QShdI~PEc5+~<4JI-El8OdGvfh010si_5D3A}avQj^$)pT{gL2BPD` zfH)I9qCogrFw%Ua(=PGQzt*Fk4K~gab1a>1l3cCvw{9T469SD)17)c1K;V_y#tC-| z;;x71D_u(JZdqy))!TG=ec~%JII{<^j)XLIt;Oe15^ymg{Y%E}2NK`koxvOM+7BGz z%$Z{vyGd7bKAS{}96U&nZcwbyQaoX+{J^)lyoUSqI7=Az^*;I}q>pT`RlJt@%8ESb zwfoZ{>0MDfnWnpSd9j+{4ocLP?^b+qzeB$W<>A^Bo z7nz#dgIp-Q@9F1t+%L-fd*2u-a@9s`R~Vd>?-)dOxGx-+XmAAp`tqVaNF(y z3}h7#d9ns?!cL;MbnY2=NW2=IP}WbmB!I zGlyXLo(|>DtcGv<0^3FjQmM_F9(-(Wz5nt@0D?R4e8Epf4at86u>nG9TE~CxqUN2K+vM)+13lvtT>uxd{njtZFZ}8`Yo-i>?Ch6EfXZFf0tz76ti@3p~c*|f+}%jGe|8-E4~7Wul4dV2q-sY7e089vUuG9 z6BVrku2AbU-)OuLe~XrcGvcPgG19v}hSjd)xhi*IHCMiMVnxM9RkdELu7`;iGVuyb zmqeu{A|HgYkrzORhBLh0@OKEoP>|Z&5f}6ew&0E-5;3`duzEFoPW8E!~5z~lf;Ha3OC-Z&q zF?t^H4EE_67~C%|CfqXc;7E=sM>lt=uQCKvAV|G9z<4DEpX4d1>5trY@J44VJ z-78clOaPg63Xxq_&Fj!1i=&N4y+%DcIw~<68+(!A%8s^<=UG!2)mH_^zIeC!m$t2!;e!v%kW3o3HI9OIa8tC z;Dv14bb^~nu+W)YElVtK`6Ee3EHd1-qPDnuQGTJN%lS|0=O3{{DwHbRRHzed#Je@3 z+vJ5kg}so03%4BQBKE0r_X(ZO?C0OxzkI149GiKccmPlsCOWUTbNFpSxDZA{dtgLT zJ$?K^gLTgFpoiwMJiUl{Gd)yhpKpv8xvcC_YMfS*l!Nmd#f(#DiCmB{G z3DG5ASm1gp7I^!@YMT?jc-nYJt?V65Cr>^u!~+`X97-EfRUn02j-BI~@y^J%^hI^u*G9{e>L1qg?_|Bq$7*)3ZG`9BxFApCQKFK# zc&hfCD6=;4KG9?i{`MB#M-{<#QvibNAHUkPcT_ewlv4-d?YT8;R zns(<-&o5(1%9jg?V2wPKr4&4vGsK6Z)u&oPxbRDX%1G69GrojAg_k=l%PA7Vz-@

A*gepfw17W2cH5F2B`r^Z)l$dgtTEgLUYXKYyCy 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

QSo{;U*CG^feGk<7Nn^HwwdGXYug@Yr zPFm5eW7h4BW$b;=%8?L2XK{>?iy9+$E^E*?rw>nQiCqUJ;~bOyfrf7mod4u5rJKUa z-?x|>4)q8k#;{i;F)NF6Q8}shW>2 z=}0ax)1HKDfFb_s`IL;Rw4K7WAQ87^@Joa%^wJIu4xwLeaG6 z2a6s((qj5?G$i8yBew5(9!fn|FEyEoOr?sw*j_aLvJg&v= zJ~$gNbhl2WfdHA9k0W?H}OVDuTPfb`kd|2wYau8z2N2tAL!WN-iJSjVXcYDR3>sbK8KZ-e@u z;X6;UnNh-|T8>4Ggf3Qm>Cs--;V71v*1@mIWZ(lKzJU{RxcQ(RK|aXrk@f!CEJ~>k z+E9_7A&WKi8^j{ax-xTQC1gdGC35HH^-B83KosALZ`&_wqdfF;#Q+;c`8Mj#mpwA% zi8pb$a6v-v>?@g=3bv z(lFup;i+gY-CALxKqLfT{gNQv{XzFfpj{o9vHdumuJhy`zXw5U!4uGA_FD86Gt{WS z5V>e}yrEJlA5VKu5jFmX;qKtWdb0jzvq0I1Y#q6_JdKFc!Fgd&ph5d){@Pyano&n{hd>kzMnP=^dkl zq_16^XoGd%jn5El#&z-ok!#vXGVSr6dE{@-C%~q=N)|++tG@J6W(ybRIgC>SAn_YE zOSK@p)xs~k9(mW)T4B~zD^#FipCscX0YaLtTf5qPU_B9!Oz$p<^TzbJ~__NI-*dQFQgCoKetltNQ!IYD%$@yl8pXjJ)p2@Iee zMaG5x&T0w~8L=%`ZupYil_i(u+YdDI^ z;*uK`G&RcCU{%<7T+O7 zb17+7OcJNccU?*Uon~TYrXfm)betn}-Zg*Gzi*3Ci3Yik)F)+W%4USNI+n#N$7;Nj zv=HXxa;79dQ97qKxd_qeE}Zy@E3btrKX9VPfZ-zY%PH70Qd1922{fG*2{{}4w7a={%l;C6DD70n2azizqtFbttVR%@U4;(p1i zL!B6boS$OfFR)W>*Jai4;isuSsBGApkTj z;>lsl3z55=?6-P39(}YVm|&B65rxULRnCd@7nBx+h-8MQr(tTr1{uJciGsMCcu%Yj zpq7Yw5xwKN?{5pv%bW+er#^g$86Ghjm3|V*io-K;YI~73y7*|Ri#ylHnE%%$d~s5c zoyFOfjIafEsMwvW8n)Z>eE$u-j{$%EEL*LR@{@IcUM`u~@cBHt4r9`F3S~0IQIQXK z84E?R_^4-cp`RpnI-=N?K8#2_o!T9GupH%baD}`(8&d1isrJeEc@Gwj8hR$rqm(`zjNYB4VbwDO8+0vULM)nUsIJ2gr;(lGI zATVU6%~xQy`QX1gQzOj(%v>0W;Q$G0oAms4tVv(vzp!agt6e~uZvTO2t=#HvjGqyX?RA2>u#TZMSSXdd@a#kR zlky&_EmFll6xE(a6>!ssK}T*bbATtk>guZ-Tu7caOE?~5YT-3G6s-9jY?3G@m4AcyeMXmdz= z1t}K1lxkdK!~V1eSVA+R$RGf@t(8~)F#+MsnZ8)q@c8{vjOoNQzc%uBo$Z#e#Z8N9 zkKDEMM^m)&d8jdz&Hc*w%Yxvnn!8JQyYk$vWbv8^2nh6e)O~Cko1+)f`hxOwvd({< zPU;7wEwmDJUP#Zuj)Q#GP|i}ataALJoJn8dxPs(9wNv2c_p7y3EE4rTRP)d-3Wax* zLVRu6(0ZrSZj&)nRZ4!}8{{IfvfGyX+wVW0kqQ!lRylVmm^7Rhs-E5CjTPm=_D&0# zu*i8Zy;Uz3I91d)f1sxZJa;>_a^-u+M|2k|nhU9OyC!~>dWA)PhQ^!_?801rkM-s_ zQl|!u5qUN$!;H%n@u%z+W`1UL92QIeF>%06mx;|C9!v*+dDjd)aoT@3V8crWVKziI zUg=A@vO(XMYtpd75|VpBXPu^J+Ghqz#}Z8g759sr4diD$cE-#M7GffUBo+79(#R!F zR7AXZ+%8Aw;Wbo|CTm8lT9)VV*<}tRA=L{`U3ZeV`;a=_ZT^M_^5u#zf|h`l3SZ0O zI1iHMx%f*R1Toax^GCFfF7&WkHNsPz->V&>>~=Yxa$g`8jOt&K`Y@zXM`rBUWR^4l zSQ^vY0gUF&z#Y0IDnC0K7n||uB~B_8{&_PtSC5S<%90YU<2z(m#_2g5%a~QCkxU2` zG+qUV8=R)D+Ux=~q@`GKVm+ES=~11OVpB zZEGrcDS$fN653+PkjgtC4XRE zrGKxj2cocufz+zrFLr(Vj?l)m5^e;*OxcBnH)mi;EW(er@>|#gKvGqjLA`gJyh zt5Ulg4Hw3JNuyU)FpujMk=gD+G#RYygyRTjO#uOCKx*KXISJ<@+-NG@w**{ru+gJ?*QEzkYI<}%W8&aeH!?G==LGA8TElUpWf@=HGD z17F!*7Wg^DAhCH2?AC;gFk^%@HWQjWb+O);6`zbLib$p}Z`7lN^N<&DIl(Vt=j~=U zMGjFiq{A;U-@*ZK|FriU(v@d%?B@#w9ze%*Pa)W|lbIpD*=CdCD$7`>#5vdf?sn#~ zXy4I@Pb}Kn2sC0smiSv-ZIMYtz{yqcNfS#M+v>};{>zp?pbGP0+rdtp#5jyfiY(i*EM_Sm=W zJkvd&+FsZjI)}va)E>IgB$-`ni@&jkaSUbW!qRyPWnPP+_wNbu`6xQ`#yiI@#wH{L zV{%1UYUaIrB(TjO9W}^Lmz;D9@-v?f|DgX{WsW_Q56hpht3rvnr=f(aw=&nGB&P+wXF0-|o0=4yDW(c^ceu35hH|)?WN(HIEe9UqNh8 z>c8&2Sao8zM0CQ;gbxqWFxY#vq5sOvdHSs>G=}lbkbKr9oQk4Nn2=sjG2d{~A z!>>}Jk+FE2L$TJvSW-I>7DovAhDUNgY{-NI%sN-R>;MB!a{SR*dik8vJjQ z)GY|e0BzK0djzH#GJ0MuA{CrY_9|Xn3IDZa=718uxSVc#5yaFG+79KXB!NJEZTdBm z5DZ*@Z7X2sFo7T;ex5=VCmq4HtsiUC+NcKCvC*y$G?Lb*wjH2M!xM7s^X~9vc%@x;-VDn zvyo~)L31~P?!YY_#6t}V>K%}Xrq|v>OkOs$JIHKTKMomO_QHytQRuYCuKYj?Q+oC1 zN3o5M0RLTHs@A~uLnQJlTgFtF726LbFUGo^Pk?EfFAbTGphfPX=|CuFRp6=i4#Y~g z(}g*>(Q)7;s99G z-`{Y8yJT|=#u5Sre-EFpdplCPex78fxo757&^I~%xpY8JP4F6j^ntzDZ1VfhMak&w zeUc?wUfLNKPj^JntIZ1fZu=q9&6O7qh*686no%G+rM;da zq?+&(M%EGO#<=g6u`S+jp|3r}>kj_Q@UIITsLdBDpv?Bf43F^@I$^@1_R;s3wl!%y z2jUB1zyJ`xIM8A}iD^&yE5p^8L!1fnk4=lSZl}NMCptwrzG1KYN4x2W{%X3c>of61 z_t$M)$I@krTgxMrmonJ<_v{yC2$|d+I!Ra#3-3v7zbvzx@AbXj$$~|HkOPjRD(rYL zfO|1>_+P_1kVMTngYJKvw0^Z5h4IA$58l1K+S!Wz$!xq#a}dT5>WhEZQ>eN+RAofJ zI9z?TmrBKB{Ifjr`1SdMo@Et+tUSEt+Dw+QJ#10f?*3 zpLee|82zLBsc*lHz0*D8S{3fd%U3~_;`|T!!bnDBCjoiSx{PKGvs7I@qT%uOT7C%l zyZ#L!*4;j7;cs`@)A59g9x#jYAR`f)kyws>W$-O#M)SsZ_h%bNiM)DyT7@TOubcFf zmT{BhuiwpyE0lGAX6{n9omB;%S;DIK>6iMY*<+2rk>3BaVrQUwlyOngcyv!$c(cvp z5=Bb#;OQ&reA(SQ$_BNhBMly1mks48!mUBT#6JW6`b0tKsablSy%|k8_s7L7ZFmC_=-V>9jiV` zF_ffS5hV39XwqD1s~8I^+T2&)k8HF|c|ww51&_A!j}wqEq9dUL(MxEXPyutwqgMWa zSehf8&|fUew<&RiG;$P*0vy~xet+K- z-v5_(?^}-F?w2a(+?U319V3c+`kgC_}o6{?)xJq(R>%ab9>eToh7$;q?Dj& z2=Xz;yLZpFoVxJq5UFsmcJtcHi1)MADj^(v9m)5yD$g-1_5d~{e)<9x4il~eLdd?q zjyVj0n|+6lPSs)@C;oyq>^RYg@@z8gMD}kpR`-+tkRXXW!at1&>++-pX|@@I<%T;>s>wvjB6WO@7zG5(&wz`$pNd)tt9d~x@e z8sVEi@+CPK@@hNvchKTQjBOo{HxMXUdAIWGg5~1Zy?4izihho_`-JL|!Hf zyzWG>XXd`^J5tfcak_n6{83q1DTk!O5J#vf^-sUS{1S3Qt^7ES_>)EAzMv)Fp=jdS zOyi+Lhvu=KG>&@UE0W0d+73dT9zSttt3wbn{?lpbk-)2epjUnj@o(?}m_0B?V?xH~ z&xwjiEZ#^Fnu+Jj-UrZ^+%N(4_!gl62qI(us5hF%g9+)N2JWYD5&VVRFSsg(92yv)Qn)5=$GgauZ+l zjj}Ssvwij0B%pWM2?J@JZ7i1Cn(140epM8HB@Y3d^M0q;NS_ZS={EcLhjoG|sIY_2 zQu1&fbYQZxkjT*M152T0q6p9ZT8 zpwBQwi|KQ0U)6sTfBD+lUFJvDBFswNTet0(SVD26H4FXyKi_vh0-s=57a%ob*3hoWbDNn5szry&>GCq((i&x1*dFtLD0eB@@(l-my zs%6KDrp2SMgDIhtvOC5We;b7zJM_iQHtY4{Zj;4eX?x)v4D;B$h(j2mL#z4@Y{37w zxrIe8!b=dfPC4=#?bBg6H0CnWw_^*FRQc&IFcy1%tD9#jx5m9{t-kIXCG}%O1A@RLN@)O3SU$>; zK7Dezreer`S$B1kfoScU{Nut!JQ2WGGN2za6<;6p(X801Z#p&(_`!*s3Hb49oRN5qjkf3)0t)_MUjS_0VjET zlzsUvbSbize4B;s#_WfEM;b5z6(6M(cJ38=nM6h%7eqEK{3rd)?Csg?mrR$PR`Fh<~1M^U)g7Zm1otxU=<^iFHm@u;*u7~ z2}yhBh(sttY;{C}xJkHn0?+lQdIvGnky91uDv4#k+iaiGj}JBgj%-L>kS&u7)ZD5{ zE@`h;+w|g{);l6#!#mA~Drtm-@1A>M?cX9T8WT`*Lm`OUnp$??$kwC`;Gg z&1Z`88SJK43{~?Q$uI=%NOexN_qZ| zD%zMQ(sQg!SiZe;=KG_WW2a;de>n7l*@#1(ADHK75HlE8ocrNUfLNe0e6^x16Z?!_ z4Gle3D;0y_Rw(&VMzW86bYM&`uz&JSz;e433u=b3NQ5Kk%ROWW+??}ofC4cH$AJU~ zYC>Q0D5@YI162IKp_RlFI$@1=s1Q(8JlN|r+KD)MVtK`YE#mVVrcpWQa1&==V`sm1 z&ATUiaC#AU)rH4D96KNwvAk`!Dl6cte&d(E7cataS+Bye*Bn`nFF+8=6J$-nC8c9w z!37hP@o)8P9$WF~f4OtGY|)V!+&>laWJ1|7c{SD|G7pldsk3bo`Vf0xqGeJRU4{Of z-r?Z@hlFOl^&E;Tdl~habd{j+(xa|8uG)L7ve1Vg;;r-@CSLTE>$@XsocnS^VmIT; zB!>D`!Ui!tlg)%Is($!~>0id*6~ET;x#i#H>=7F;@7%s|=F?jAvTM1a&$gF2Skx?k z`h7_Yf^~+`D_XLn`dJMC&E+M@P2ab{ZuDT9rPt@ zlF|DPUQuSUINqumW4LG6xNpOM`8fJtjwN1lI&(KVDUqFAEGod*YopZQ5O_99Voo6K z+Os?6?r!{)aIjq4SNCiaBC)g|yX`f3kvLK&@q&|*5yr?94CUx35DmD>aGCVJcya9> zLmez`Bu|QLik=8qiz=*|dgZ|v{vS|ik6)Z!g9cP-`Zt3KpZ^u>7@PWhl=omi2;!`;=MN`j#YNq-eM%i*BtW!~eZ zlJ%vV8^w;#9q_gtr1oRHcw@so%1XB>Qicl#r;FVWy1KaQMsy{_WkPE102Eiegl*z> z|5F3!4Gphn#CDd3#KnSL!_|w@II^GnD#Zi?B8BtztM!Ou2W=M(H-Z9qY^^LMOEP+?o}ZKb%ZKjKNdGl znH~P@(Cr2p9ci+ek-ahX`Ev`&poX}FgY>H^>C2^ek(9oAH0VA8m`#*yWcG`vvCU9~Uk z(i6`NQcz5%@w~xH=MRmwtz1phbwwNF?O`4@Oqu*&U%It)q{D305l&Ox&Lne^z9S

t=&!#l3ATSN$x7D%KyaugHQKUnYb1z5mjk9YHFviXtY&ROoN&saPw8Tvdh${O4m z%1p$5f_7?u{YxZUW}FPqWTHjf1*O1D-{BgsHf?dwecSBy?k1ns&?3psvi+_Prq00| zZ|d^$Rzt_xLV9fCUH`Tt*cA=t3712@HKA+03^vN)C^31_~9;>(1z zoPbWzGnRR*ln!DhSuwD( z?EQW|1#eDtr<0JcwAslJi<4O**_&5>JzUv6^M;!++@xd~^B~y_=SVWu%^wHj_bFxE zvubSU`{W~f$>531t((P#LqQ9!E%lrR1%teW{meovSC7@L(X}c&TT9_;Asy-h^7N7I z;{<^q%44thdL9|h?&vQ2TXulQF~x6J5odVKVY(|u&lf=lmZ7Cvfr zxW?%{t|JFTZ4s;yPC=O(dpzh>r%I;0gY1X4a#=2T^?lTHt&FjRDidG9$|HgsY0k1khK+!nvCS(>Ye{s1 z=4@-mq(F zb57d@GFWX*PNGh}&010}7`>DvISX5d$!?AhA{Yk%aPFMtb-1NL(!=ZC;IHqS!Z?cc^9>I z&#uo!C&i}-uA91t)@ZD|rt!Wg*Q-P0vc>D{V~jZ4e##n!?Mg1&x~}Z(i^TH&zP?q} zyBFVnh`EDB8!~YwlDHlhC-~{wo0t%OEPN=>IObQfp5|SWG(xV{^>;tDJf(z>Ht^8F^!O3%;u{w@m^}A$}~RHooa&{ggA-* z(_6z^iQyR83gET~J2gCPs3O=;-08p~LH$w6U-RPn+b7}EJsuSu-Os`#oCs=!^lJRG zj}wY$l;xmrc} z%H173QTQAJ)J|L$As2x5desoHA(?veZ=u-1N3jH8Hw+sSTf|j;9RcnTq<{Y8*;_Oi zD3*N6!Es3Epu)z` zClhRkZOk01tifHPlAZ5$S#t+k9aZO*2f@>4Eb>9q`?5?2#RG&}$GsnHvtpBBJh>|t z$TX^Nk8I4fe`b#p5i$sFY+ppB*m+YORj+pMJK_k+f``~ST)VZ#bDUsKpWim1)bx1L zE#GG`OW?5`cs<`_!NW*p*Y%{eFRxvsR`YA$p3OQ?LjC<#qz-$gs82Vh0YWj8P@!hf zc9I?;hIfX9SmAXl>A3<^0WFouDwe~iVcyNsvJn#RTsDO_Ii`^J5zanMft#LFCnwmkbM+OsJaeASHUZ`Z{ z!uKz`?_XYc%)7E7g@+?|^=AjpQVG)rvw>?)o!8u6U9)j$Ke4UzR>QBochXT|H}7s7 zm05aGCC@{xzHDcnd`grs5E3=WRc;mXW#gxaKAv448Y5A`D7*S8m7m(= z`xc?K+XuPmpQ`+*{qbUuq}HE5e_ktGK@?{)oU!=I#p(?XmZ>eI_KY0)J8=XYbO`fN zGx^k*Va0s8Fnf)D1sU(>UB}ja_FenU-@TFryOVd0sf1zYt}h1 zT+uX`F@gyJ0*y?pklTvV-|eORrq@iL|w zq6=Dc;UOrnvXUN{eAro-1QRPLV-ULbJ%1j87M92{TMd+Rl$0aL6^M3*BzUNTn^d?|ZqD~O>-i&amZj0C7P5Gm~Y`Q@q+{~gOH z;E_{SjshKPQ}1Uw@-f14S7wtKi)54q)eSe-8!Jvn-&lKYHU1rn;r}wz;`8C5HS6hl zw3Yb6-neg&4+(MLroHg1`a(28mmmhPzR3mYI&=8y!CQx$ktlKdc+V!Nln;K~7s-3W zoJaO(no_nn3*FUE+QEvj{OiKyy7ScAtv(VIHg6?95Ph4oFHj+VWy8fAkB3_QHazNZ^0KF0|2wp2GPKo&9Ut0R0yyFhXe51jcS^PF#PV1THo4Pwacw!J$W8;S3&R=7rm@3c zRV!RuBnQ53$e>KCPYH?P=LF)U72cTIOW!ih>mPseZ`{j|KKJjYEC{2RkU2`KqI z0uTwn$^jn*NgSG4&&=HI$EahPn{weLU?e;T-xe1UZ0(3_K9wLP{zwY(q9THV7x6u0 zWm4E^6r5{p41$S__kedsJ(N6_zaGWo!}{jU8}?)2Uq#`U0t!VwNfdGDKa({;CL}K@ zMbBwYxmbAO>kmB*sU)p!$w(^lR!asD^~ymf&~{tVf&?c+N=#d#o&Z}ha)z5H7qtXO z7DT#w4^VMmr5XDsReG|-NuK9NaT(vs8D;?{-@p}cdTj?E{ygv^ngyFJnT<&k6nM?o zn2Ps+Cn6Zf%Aa>Dne#b8BgvgD4L@0^w&wr5I+BWopDca^g*$ePfuA|fsm<4#y;JxA zml$@arqSC11BXS7W<-$O zc6}vJb+Oe!^VBIBlpV{dsNhke4R2l*+urP=od^lNZTTK}{xAX|0V$|nMKgIco^%b) zH?G|*a@Wj9Z0dG#l--_U^RMUxy;UvVpstJC zDi9|d(?#~+HFETQH*O(x5yNPr2sWQ6SlSluTah;Eehe64U5V@kq3(u|44D z+aC`${0QZOu@uphB zxQmFAkU5;C7RpISJ3Eb!vJu>JjM{7wrb35{dm$adDG#n5BITUILR!cdWH;8T zuV$yHpdur=+REDo`iLBD0g4#fgp%PaN|CmJ0M_%%&ZF`?eXm|6vGv4JTs-PjJ(T%_ z#aNDdEjN9QDiNi+LdVr&L`l+M3=JOes?DWzaDVm}Z`78;o6tLd+w#~wOTUx$8Z7(KfkGs4D8TAap*R?bn`E`LMsHYiVzd6- zC3|ka2HTwGk*%icm%w#Dz4F1iY|SBMA$mNMup2hP(DUykK6=z1)l+b*aP#p|jvOJK z>|#$H(xJ*O?2&X%w5I#ZD7xKSlk7dcp~T??Q5roWR-;3O3koUa|WNq>oVJ z;qBwK6X!_$Dpnq=%ywW)U=@+2jU%AOYk~m|VUN+KHA;Nj%j@8K!6KZ4s8=fTh7sPD zkXirID0F>R9B5dND;VV=7-)lxEr&A4vj>Sap;|c?DMF(YXWQMYn_Vje!W~c78<&Q5 zI<<_9Jk1WJiIWhf-f*o?A#)Wy*A5&H5e1iv@!VsO`Zj!aVRnOj7!ITIg9-yVo@8I5 z``KHCgmk1hun^N8*&pb+_Q-Fazq{~Et7Ls74cS#m0wY3HuHH2jbnhD&Ak_f4tj#}S z>@u4;vzwKk0%~mMoJV4Jr}jk=7J7TY{ba$14`uvFf}RLrg|MCDID4KscriR9vq_`#1KC7vEzh-nvf`8(>< z*^DLG_09dH;sM%r}=>Mqj!#Ufq4gH3u&78tK}O3(?(zk8F68qK|R|FiM5( z>#0`9Yh>KWy>s87O}1654Wq4K)csy1E0Ba3l0%qRQ=xlpKKjUSYSe_YDJSMT$n(TC zHg{cbbqP%_dOJze2&)tcz`B~89FBKCr&*AKImP%?2& zP-h@x7ggGtbz`)-wF|LSYs{k9e69ycx1I?hbZPGW6Sg%Tf}7BmMXCa{!s8W|P98D9 zyVg?qdWI~HFza=yv?y%A1=H4UbZJ1j^mXGHW$QOz35(y$-p)8H_93o2bE-UQ|B_l|FRO z!+qSP`Zd{l2W`(WsUy^G9`NS|(sqR)HOs0v(FkXel9@Rty+uK}gcwG5&P$4SEX!`c z`kc|@D9-~Nq;@TZMWy1^OugukqiFJ$O|GstHnd)0sVMs485E>_ zT|{ICWJVaT=NVX$D*+R4D>UGq*rSNjX0j)HvYw|8Qw@UTL2Xmr5)Z(Zf$ZxmkaTdL z{q$QqUmU|}i=kM;{EIdP$e!_g?RveH*BkZAZe)V_HN#PePK_com_31F96PxV&aXQ- zlLi*3GT638JY-P`diipnjAZ!@>%4suYq~^s9Zql%!&}Ns+->*EN&Paj0 z{cib>$sN5cY%>WW^&WUjZN69@I_Ej;dp>Dk8<|xE}&r@x?Dn1 zVhQ?Jr_DGxlTYs!TAX{`_B<*+-l4lE7^`$<=HdDl3QGXDXWg0xwdRf(ti>WME5UJ{ z?|K-0uZgcXHV$;0IgwU@0#+jka4`YC~M>9-%n*3$vHtVd%|!)+@@hVyz*G@ zm#A+H?dlla)sqXBTP>72u58kx*~+y}4Vf$fpY~@9?GEVgz|^icp~WCf-|~=*l9-H7 z993ZQT5m)*1&9G)hv}I!ilyU#%*VX`fW8@vwJRFPzTFIhgBW2Y}_0K8bYjK{XHrXv)Fx{5!iO^_F^}@rs1QM zdE2tAqjU7T_bG*qb_(2fM=NT>1lSsV4 za_6^k9!UAHSAgM%bk&C(PY+%`%zca z=ayWvcdGn{4$_@nuG!Abh{^!_^S@V?)mM(UITDEwRw!=uzw@!Hs7QJT!6Q-1s#Nl_ z&?QytH?9fU`F-cnK4LFAvzI=O*o{$yOPmxr+Ja*UGaN@=Y`)MIre1~27xa`my0Dw# zyKh=-`B)a|q-mYPriGWGX=FqIo}Lh9(G!qmcKI2q3@ObL!4QqCQNQ2EoN&wRy$EDu zp?iedRkbt`@Wwdso8S~D3kRBO@K~iTl(lq1$xI$HP`E&*w6T@L`qs`Kg)ke*zNDZC zejQU1lx-wn#*xIf&=J`(T6wv6z#(*SdLpA`ClAxd>k=Va!CZ$}X)aECv&{I0U#F*} z*+)s0e&ATm;`1Zx`k5V=fa4#R?BY}~T6f>5&B4g#U7#Q-iYqHU=YQ^81t{tp<^M$C z2p?mH#WDy__KR}3ePe%GPXRrh`#J(?->Ci^vr=$M+{AFKvQC*R>|#r z=7i;Mj%Mt#`z-@kXXl9N^EcYZ8w>U(drUnOC5l1FHt?Y9VkE(Eg(;G^`Xu{U(#NiS zc-11fvfT_-ZDqD{At0(SJ99TXmJ&qYjM{IP@noer*xcMKA;so?GrsV|Q6;{tH9_nV zTI+kRK2xYP@1RoIq^Oeh+_(hmeb8bBYy@&gjssmjg-loT@?ED5=5}4rJ+9zUu12Hx z%S@{tw-I?6u({wV@#Bi5cmRsT^q~21Uj)slquQOT4mUOK{wZjnXWf0NQ6oOwl>Gd3 zjLnZAf3lM`d_|p*@(L$uX%C~?>*RY?Rra{y_Xl1WC^=y2Mnj7RxYZZ`sI*hS%UB`{ z?!ot}@=>T7T8W_6EN24eIkaiSOZWem^TS_nW<4ORd2#b(WU-D=T>eLw_>VL~sZaDN zdvRI$t9K5j2_HFmou+YZX_wfNADgaNT@facUcRi}*DaheF;>D(RF|}yC9^ebaL7(O zBCWP(${JsnDgT9~IeX*5y{GZl@6i5bHhCm$BYTMDVIcV=iU$mMXRb5D)R!;1aPgne zjMt5Cpq9HvlM7gDDJI?AQDI{aE@Nil;;TIdLUAH&^a>lhLe|VbcmRZ9(;a92)%Uzt zBR)%JaC>?e0X&o@epKGMbNiUlwt!oucs%=P!9jB88LcajOD*CN4_Q76y@q0?!mOzx^1YjOmN80WEl& z<%mZGMDwI?tZv>aw2drU#`rvvWhBLs1jWETfHKDob69HD@pH`zu|o4ncfap|;6asr z2ULF?r&11y(!6bw(iY~ge^zI}Al1-T+MJQfEKtk_=p>|@mi)Vwl{cPVGup*y`kAA` z`sPb?OBGEQDChObKB!DsS2}<-v_qRh!>Ug1akR%?+s27IXC(5Cdpo3oC?E)74%HI~ zvlocdQ|e*kFu3ap4j;>+l1{=V49Hg1L*jpk_<(wFONoY>^{)O5khFkqr`+ ziw=E5$En5^fyD>Gc0+gDiD^3Yk(vZzc^jE$!);13Uc)%iR!y(Z$ z>e1u?C;45IaGa zShp0IbsnOYLw%h~m8Y=){QKOOX&ITjRkoz)@r7yyg>UkwBXO)_t zc!)>2S!<|GZ|&niu+GMOM`~88t`4VkiKzH>oEjiM)S0!bTAlEhEZe}n&8FtjPy1t1 zP8P)!sowz?8UC`WI{M^V3cH14xp&8iE&-Rh=gTn3;~smgeH3VGG*@EAcz6ncs^&&kedT53jtICSR=SIDk`e*55M6- zumEJk@tu7OHSHy+%INr?NwcNWiP2MpEWBzn2D`GkN;ySETQhoqfi*#1Ok!v;r-lR8 zfwkIY$S51wm$98sCKxI=092Zb;|5Z=fG14PS=-~FJg^pt{_I5&>DpL2f09e(y60@+#C2igE^ChzTJs#LfB|Mps-B>fLTs7o++uBWqLSdN~PBK6Uwg9*- zDDep#l`m=$&k)|MbpEG8>baCQ=QQJGn%q~ex&p0=Ij!tErl7?Qf2O8t#T$ffI%<+% zQgKdxXY@Om4S@H&pOj-5^+*}uQ_1V=Shihi`0+ME*Tgfkh-17j&*qwZE$=Yf#_-=zq0&eXz!$os&@T(wA|0@l~QvJ5FF zuoGw}Hpu245-r)W`@|6g55YJ+0ZbIr8=b0#u$n6M$SG`$0m|Z3d5jtgcC?nT!|2mU z9z$qB26TG>qJWxL%IsFsm1HdKVvc>y#MJ)DdK-6`)#{6@1Uh6wuV%|{OtY7wsaMM| z-Vk5e$aSvoGu6nDv3co0Zed~A;ykgb{CmqAsgk13QMbBOh`DXqC8P>Fu(Lwiyvr2$ z^b93WYRufi(nIn4;AO%qwyh&~oggz~bH3~J5Wp$)GslPX$uh1ccq}uGpq5mUOMvzU zUd;R;p@GoHdOH>8J$#rwa9j^ss3ppK|e1oXJq&Fl;k{#8mjuqNK9 zn&u!wXmIuMYC!j;1RuI#cJz_6?DcFPg{X80Cb6}yCLbaQRBTG!C$vLV0nq`#*Z>ft7l-~JLGtLZ7 z=#KJ>DIYK6kE)26C_Da=_}u_cWZX*r#Hgz}>5ZUfOS9jT8G5#uCyY%98zRJ{aCWgx$AlO9nsb`<=%;Gz3|nGtwn0XG zxwyasau|I9U3(9Ys{@`ku>OAgW{1e4{!PS(@WiOWD%X(mXyrmu%d< z6$1dl+mI!*nhLf7fCLV}^P%k2g&^emyr`LuPHPCmYvO%NO-;pC!6{qv&|&*(Id%2T z_$H54?)or&l}4zM^WDH5u2QA~mAmH@xEC=X8!z@xuzmVUPqNEiv}dWEPxG$o zz!qb<`StVXEmPLT#yMBL-&U-)F^S*J$Gk~Mi0*HPlRPS^PHd2d;0<#hq(dRY!^1SX zds?Khb;3*VadvhCK1#ddm)E?UoJ2%lSBS)$6&ntH_jLeaK(pC7EzF{H;;tXUf?FLa z#j!@e%mlvE14AC>?Ug@2^1^ z{e1b#&vLoLSTy3UFw-12E9QVyp_+LM)@qAVCM&Dq!1b4DS937z3Q&92roaUdpax>5 zeQ5GTFzNNXcNMg+*t5!F-H;&{(102Bj@tJ}L8~*$lOKbAklEc?mTwl!!V0dd&)Krtn+HS|F34;<7uOJ&ys-ZZ^ajLlDL?BWeEi4>Pi=-sr?-eUJ8*_?c+8}Ku@RHYpVeM36RuK-Rhx5zpG?}DW!D40Wlb4a3p!;!^1HM z!bKty1OJc`a?Bw=K{FrK;Gt12q&=XK6CXsbUfFy>uEWo`^;OEo>udKWckg&8xJt;^-e>fU@1AVCgo@PC6jqzW6vRejvgXy6$oOotjC5 z9Xvl6%EW)4C0gM6do7&ogB^5WIk1(a+5}#3)c*5i%k+yYVn2tpL|HiHQ(aRv25G4n zy`5RFGIEDSx(NJ)Y^r(6|9=E{spF-_k(fH6e*Vn^;dyy^lJ5$W^_cMqZM=LeAlyp< z1g_^;3w@bYW!UFi92L;6^Qi~ge3Ye&yQ(L0UBX~)=aB%=eUJ@mg~vU|At$5H;2;Ei z#DQ}rLwo18BM%JOBDT_8(tL4~;q?8FMGZ(Guxoo<16XA4XI8*??ayDo_QT?y2Z$7h z=NQc2ZHS;GN(NA&InDQ5=jLR?!ox{$FI7i(w=OOe;@`2hjzShU$Yg9T_)f$E z-T+`iKR5v;rS>@ub~?%9ShCPh#gk}9R0$+tXkZ6+jbIs^y@T$kL14nqELWxbFfLAn zrN|sTHPC@NLi`T8|AEA@F{EaY+pN6)Yt(hmmgv1B#@D=R9Zu^UT~wheVmt2!@OC0; z;K_S0og9|IP2=+s$CE8pNYzi-8R5n6-@R^W1k5$AwR&iJ7?CJi<^B#rp<1i*;zAkNk^}S`~mp&EY0i6=|>B+s0o5LD=zI_ zgXhBOjEW{;X(JWdCQV}n2|l8d^!|Hjlzz94lje%0hbBu=2p=TF9(6bDjc61YbH3S_lm;-4ytD@X}5;P`UEX9`!PxLBu zyNa`>j$-4lmQ-vGEOi&Z`QRb+A+VJT^g6_{Vg0~*YaDSSL@ zX0} zkV~L!ZC@|t^Mc4t=;Rn^;?ZQ87fgPF^JeVlFC_&9nxcMvYtEjFGZ`NUMZQ%o+))2Q6Kgz$iTMM&B}yYq%T<|}nH@YlJXCU0Qd1)d zT#g+JFb}l2)O(Z~z%UsvSFS*=&;0JsmosY`Hl$7sDVF~tk0A_c$=eR6%?}gBM>@#u z)2k&mVC@24lpW5cka7P5Mr2Mtx22ZY4%(9&O*elpQ7=3Kt zCopwQ%l^eNvG-)~BU_{=g*(#;DPvf`S?XOHl@9AEsRTqXqTs+*p=Wr3K~%2erxnzi zzu}=D0&N3OS_cxUi~3X^`AShov89Lq5OM@F-qgn>CG`Z z=^8dxynis7H%3>O06wK0NH>-)d3XdmJRC5_%HijId^m`wKn?wJ>sVf$-mc1S^8JrY z;C%GbmopF7m7e~z$QMb8zx~5k=sXT)(28%nk5^g2429=m7hzxXb*Md&8~74ImDgmB zT*12_xI6vO*8>ueve|Km9cT~DXOF~wOP{9Ub=L@;Gk6u*s>x%iSw1%=?VIfajV*MT=&HRO>k}a2r!8j$b+K0q}j8qVv)||u9*6Y zB60;omi5gK0p3cPm}qjb!=t-FV1Y%4U|j%Iw{Np#oszU-kC0rxo}dBpQ#a4lJUW^t z&K+Zg^-W{H(*~H5^#!^C%->c9e91h5Fw?JMOncD94dYRt7IDSZ#@whs0I+5FmQnR8z*gVVb^^I zE+0T8EgoYwSB^Hrp0+rBDPEu#B)B7B_T0Plue+jMZ-|cJ2iFEi{?nUhUG?kLrCnhv zSGLD9(W<`pI&0=zo!SkL4{0^udgvY_zIvn79^(SDNMa>|n}J1{~N<1aMGuGx{?!iu`z)Soh`ry7ZlH8%?+w8kU8!uq!7MFu~)# z4L3j2Mf;Ewu}1wdVtmZ$Y=Lhmwq*dm%nlshzB_KPKDB?;aG9Y6YNozyo%3Rr`$^a{Ag5+p+D$T8GJvDfvfByUl zu!co03L$ol1`+8{uR)Zl%owb<7bI?hS*x^WivIV2qiG2k3UVB0$1VUQjTva(ag18cm zZcvjRJAA;97m%_Fu$k>u{O?FS3@$1Chl<#(;mv2k8ghL2mOAIQp2s+k2&RC9o-X<$ zMG{d@Q^dw}w%ZuNdl=k&;O~lUu&x6k~*Er6vrYOG1NuL z1dOhOB2*vWIQB|t9>|=C2*RubM;C`{y){kE4SWS+s65W85LJ-;t2b1Ev;y|$&$Fj# zlx1y~F%e64GkCw_)CUixkotgOyd{F_*@tCpffpg}EUAA{ZL!#-;z7{V>})&Mid~0g zl6b!P+xjvme9{)$BoP&iXD{H)uM}Kt!qDm<##nHHh5ZIV6r8pQD+iS z4U`^)Cbsj>*%%z0B*BE}kRLwWeDIbHkBNlXxr5<&dWrZ1Nw*LRk#iV$PS0Mgn8Fi; z;Olp{TtWL(EOIlhEmY+;wvR0XF`!EC3d1Z-1;(c(*<5Nu)%5s;AnEe4>z$TUQfS$4 zK7R%tDS$)>ri18V^nGUnvG4wSj2F^ZzMop*!f>)Z3+LJ>SwoO|&e`L!rulf1`_}i6 zUfqc*X{BO&@j))<%<0Av=USUvDa+#0#yDPe_v}B{N9stAp2viFe3#5;%_MzuwG~_v}UnWT$zJ*oW0Z={a{xBJaBSx zU0JCF?J;8KRh7zK3YvsO`yCI9lku}E=3wxt^CekqTvNqACQ#oLfN;Bu*Fay(#@+6zPW z6OfGOmZvb%P%EALz7@)%qbe}%Ar__y&nf9O9e?YW7XU%%(G*9@@ zTOZc%kI|)mzH{euao0U3n*Ir_%s?z`F&#{Y3B9$WBjT!H3s6A*X-5Q6?>cho)t#fj zY6rsi=Sf5*uh%Z^+O}j&C$wWYMTuityQF8*@y&zCk+#W&QLyj%(wwZEcOJ#1K>&yg zOn(iZrpQHn_SQGaZO=%nZT7T5$gNwveP>0<;B?WSKwNZBx3=9u6r0^>Q)t<(&I5sg ze?u;ZIWDl!{{=ilu3!>)i|Kb)05my7MJ+CJDj^P^HgXW7(T`M=k-gnHtqn~Z+h^o# zc6;bV_fVc9Ci*Bs^X7fkf>RjY(ZkxbuC%LrS%vnJT5*=ld9}^k4&N8?;bwd%J=L>q7gdw7eA0r(~H+kpz3o%`4!?Jnq{94S{peil3J`yok@m$Yw?0xw8Tk z7s4PeueclYMV$}w17}6@n~(0{m8<;^6dS>}sQ*qmQg3UT@wXdpLT{n;ZJJ!mN>PS| z0Oo#pmJnE|zZmF0{&f48GVGl9FI{T1OZj?^MB`Mw050G5Nl8slB%a>Uyd$h~34aX7 zQ4QFY`GN94&XwOiD=`GlCqLFvBTYJd-AjG3fg#Yxc`NrITe7gh1l8DNX)8KO5$0p| z{`vQEzL_M+P{0c5!4xe}D4NjecS^gf-MTddnu)J6TG&U6Y!2UqJ^?!F%K$H?NqV4}RdZtskI@mu4g z*tPKUm0j79-t`~-q6+y@*_jI(^JR`QD#w!nJ#KU>78*;43YUB&=5yBaM@6{xd$w(7+uiwfN`aLZMhVNf07{81ewN z4EeV2KZ^*kU8j65fIcq#qxPEXQ6!7ofm%EgMe2V}kb+xd=;=-e926XK^@W$Sdverq zMj?)wUs=S5ZXAj8yJF?Y3+wOiZ^>WU=S&t@@B3Mnm^QVeu5zbI-ndbgm3d=YbZZd8 z6Lu(c(cR;h;$Uc;GMxEdkgixMGxy$c14UswClo(QM`R9wGvhwye4shZh(`1|lLK_V`ljXY(md|9dQVU4At1IT9WomBrpooS2a@X$n=LCZUBBn9P|1-)l z)3i!fAIbNaOy8Dq8*xlFE3biz2q1o(oDs-e!?FH2cJK;`~JCj&^*&vyc;jy!tye{ zqrAY&_~39Yr_C8rQ~XDN*&?NR&TJ0XO2Vh*uZTCHAe!~{GXBu?HdEBu)Z0{6RV6J} zKruHmk>>E;rg_`KAd-N7C5B`h%!#`Dv;4ffYi< zl*NhwrZ!_81bXKhiLGIaCzYb*CQ|G4-Ej>Q?AQ)SR9Y9NBmYF!$14E}$ z*A`+LDEjjk6~&HfirFy6~@OvMZ5gl_FfGS6l@E}u&5@D}a5Lag6i%FEp(NEVbDeSEDb{)5Z zD+CAbn#j-;TVQ!nQGf40e1~jWDDYsE0|WgC-$zES_l~kihU7{BZaTS`(RB=gpAq*@&vr5TA2z!= zpN*WR4^j4|15psC0v2N@%5GA3bm+>76DKsG;EkDt?vo(bbC)*%7AUlABgG&~q)yYK z{p*263EjAk#mCn7^4^aH#dYpnwX})K_tL#xdI*mxxqs}QP0nyy#7U#0P9k4cq}MEV z2*=*Gm7V?gaim@%07B6UHHZ}5tAT|gG; zWAgnbcL;gn5H6=j5;{}*8$|HA8c+7|e$!a1E+^VV5+0^ZE~E`q0JcKSU?cI`V9u)e z`TLZMOVjt6&o1{!JHe-#DFsEvyz=r>O`pe$VemSk=q<9l`p`??8F^icHIFWu>kGiI zxC^wy>)kYKM?JXn^5&;^ZKWkPtZ7G+45h|pe{2(&fTDZ%!+P91{S6c^M6bm_fARU| zzdPKC2;fG%nYdGS*dLc}%z~#I{&pGdZu;OtcCS+XIZDnxXz8z(2nLTtUZX}?b!3;>Eai>u~ zV;=OA_p2*%{vHH<&{pN9F?{g!M&3`wwF@6+V}6`29G|Zl-Kc*>@tUR1ez#`dwd3ab zW+%+OIZ0~+WGqMh8<-WkW-g0yFyQ0zT!&);m-jVJ5!4sK0T={(&D~55`LDnJkktYX zGNQp?#m#>fKM8*2Gz&!Ji-I8EC(*W&`~|c_D6=LxPPEZim?6^(n2uG#>h z1QZgQ_&Oos11w@GBg-}>o@4;=och$esaQa+n6e-;VJ6Y*O^mRcNFCw3j1%<#xL!QkJp?L^=`C}D2d)CPkS2a`4m z3kA$tE$3z%!U5!VPpbcK5V*{$|%5?Jx4KlWyk=Hdl<1|VUd zpx%3iRu`&=t5^nU9E9#&l4BHR|5nsG>LJL+Dj&R50&V2LtRD(yv``%Ubg*va?=LHv z$LU?i$WnKg4w% zqfX0x|BC#4r^h@|k+}md;v&g+<|Hvv5t_X(GMR)5o# zU4U&%$J;&#cySu(*t_&-#ylFeQ_NGgm57qsL(M?LK7T?ikEc*})nID;z%kCRUp=d# zwZCC)^ylLqbuEZZ!G&G=m+L7UtHL($W&OQ6#*5R$3MA7yiU>5mYbvHLs!kEt(#rm}6rl~k12hDv2lrXnI!lC%{<8Iy#NA{jyv5h+`y zkc^Qjp^_qz%tI2ABu%CeDs#wmuBY!mXPtjp|5~l}t=iuGy!Uh8*L@A^8t*?rf9q2E z4Tz4kg2JmIle89^PJ*0E={*ysm%@kj+*GbSA7Kyj`bXoue$URRBv&T7>xbw8GneG8 zV)yY+99-B0=_XcP1Wh4%Nobk~BW1qMcYYOwQM-SgO|uKt2RGT>VX)^f%PB`VC2BCp zz5A?kuHNR!7|#g2aSZ={fu&y$2Ff3UgJ1)+z^DSD%M@kalYy!nS%ImdPwq?VLmnX< z736(^!mtJ+Nc@RlaGRgu((v?6fX~B=w*rh!_NNNtIzZo>aYe^5d={?e_m$XdT0^5( zLRGR}id`^CWqx!&@zFgzQ#nY+a|qw2(D~NNG%L$=pN(M1ClMMhWh*yB3{0}!HaHv&1%Q<012pl#XWxNmndlubs) zdb=+6Zz&2|y5UFFXHb1CvMu2&%Tan$4n{k8!6Y_AV~GT{Kyr}DuZ!*F7;%k&VLBhjOrV7wX6go-2`9grd(Mo zOr%LrMx2*M^)*BBtxVz(fG!~gOFt#HPutodDdj)WEJk*$qTUtn@!pPq8|yxCH!gn{ zNLW4#ee*axGCh};Z3r>+zV~@GhmelovCSCE>EIecXDUN7c}YlK2P{|DZzqcWR3cVs zhm>kf_};~tnPiSJZi#1JmN@Q67Vbvq!gdTO52To@=4{1Ye647BW2o}M&_ErC0B~6o zp5w;Gwf5#c+Np6ZiKulawn)w}eA%w1cPlYcYd~J^ecjY@kw+p<4)-&^@0`8uVQwuf zdDLEn6@Uu#kkxaZuCA_RbFaKKKk?jqb|;#A8W9)#yQ}spT)c3h*3CMG1w-u)z6)}Z z%G#Up20t_=$Qv}v`3b?5fR~-Y=Lq<@Q|AC6C7VD6wxd?Zl{HUWOB|{Xk@J5Ztu1`j z^dWEVPPh?}7=(whis(^+O>!tPS5OV^xcAOip^)T#Ym|)EQkS>5UtD}?J{h}HhLC`+ zLtvtlR4a_)^Wma$Jg8M=P`wBLbq7tX7GU@?IxOkE1EXbuziSFcSZ?KYr7ZLLuyg7X zk7rW}(YBiKp!}lmU}8-MYnksK-0h z&hur~*DyT$b1r4q4aLksmVgX#ZmfBc`B@$2(>KIT~U(D;z)?R%6bV%K+HKM4mL>2EA5AoTzPKu?t~ z+}8rbw*Z!XQUvl1=Q(7HEhrF|$37?Y^df%9T|>CF(|mG0clG!6xCB6j>fO88yO+A_ zxC-a$Zoo1(1`DwC+lLQ}Ra>*()@1lQ5MTjY_nQSPt@Ot<_{Z~ZBlH#b$Y!d{D(TyL zXXJOIM@2`JV=W^iL(D{)+BvtSypWKReaftAR=2A5+=>*kPB7Oi02MuBthiPiS_Wla zmr3sM800ZB@>Je}1=0>T#?(_?DSzK$BKrNNc^$F0N+UvzaqXL8-d_7kljEH z^LIZU=msg7Gd97`zh>mmytD`F zuVb>IX>PjwYyY7S4_;`1$cYv%r#&Pr%nI5|>6-P2fpBkLnl5tg_AhUt5yuMu^&FCE`IdfC{tDU$v&G@oMG$PAu~!NcQs-rCeG_fk6*eBHlY8BWZPJO zXkbr)i|#V_HfZ2R7z4ZJT6I1Dsg4QHmydVr7uKZV5uSJvx%rfh4H(l*NkJR7`1JEB zQJ5pMQw#;695)nCF%;LlrosKuK@JI3#O(R);Jdj4tpgJ&Ff#dXoK9ah?juZ$cG0S* zA1jA2N1AzgoVMKJl8ww&DRes+-Xfx+wz!Eh4Zs7IZ}&6H=4ZhWd!uRFhh|JWk5C(9 z0R(}o!vx+8_ANkkK?bhS_ww3}T3;3WnYH=OZW0E_lbq*H_{q##`-|duiAKmp+pec`>QY?(Uw?Of zi3@$RZ$5_z)E|UDynkO6i=Bba5hw*7KiUr9N-^_nP#gq=?ZY~+2435oi8rQywVZz$ zB}Q)7m|088y4Bb2PGzxV%IGe2R1?5>9eI}j8W0o;BG9l{`rGaSx<|dB;G@0VLvELv z2J*(F++r!;8r!ZTGk89!S`Y9Je(fMtettJme|tMS&EeZtRI7;T{A!3#kM7V$l>&L!#$3n&K{p+kn?`4-=Xi6@Y&GF<8 zeCPOVZS4EU9-U6y22eWW}z4p($$@>cHvC%IbP0 zc%~SpkMSi8K^>v|X6n2D$ylvw>E;dXP{FqN7wlL;7g!bddUijN8mR?JZMl9@%6HLQ zdFs6ZthG0Q^pBo1fH>RS&*5-WzGpe9#B(P8c!E%F^QzsN{K5r!9oGq*Iy~i4B(TNt ze>54hVmHknM;KhOvrUAo5G)=bJ?TvEHc927yFfw4NxsH%jh5z??5EKxi`Upqi3gXb z$Qvm`QO@s|58Aww_LId54}#$jbu!FX0gi$pi8?Ye9egQK)7^c_jsGlU;E+eo0%O^BUiL*D5`yPbU!iHE?#Mz>#;;P}i9+C}KM0DRS+ z-W>Tlv3d_DDfo^9hM zqOkl3uUxG|D;{nTU=KOT^{shuV%AeEq{}*VSKPvY@1h8_ZK*yy7VG?4-t7AVPn8|* zoM{nk;dk3lpRpC7TlCdi5_EiN_Ig{+27OtHk38qfN5Y5h?b!%s|5*>%Khl{wF_AkQ z7Nna1n)}z=uq!BCAc^G=Y!M^fy)zZ8#59KJ(m{~-m})y}@JJ24_YaSFUk#yE;0>#^ zOYy#VM*Bz#tDIa<*zVt53(Jfjpjr|+5Go)PFYmN>N`wh*yM7V|O1K1@K=<^M#A@z=A2{$`DAlx@Y!G&y69=)EeB|k|gH1?*3Ao!_NSh5Y4<}2Ykih~} z4$yphr`P2HrLTk-;uz1i{w5}~75n!w96Y#h&7`vAQBm8NqlS$uoCSFY!W&vm2zU8O z@jWd_^`9+t^iJKIoUcl_v&U;akUE~F3A9|~BNK8H(B#ylXa#5uQXx;l=41x$0-+?f zM8UP6nM6sESC%xoO4KI2`R}>s76YqJMyhfuVsyqr7BJd1wSDWG)w8j^h4hz-1+`8Ym*Tx;#BVGEDN=3srkjon&SFDxgmYICKldT7$f1t+(T+^jXV}r%-!WSA zI8R+Ah$=WV8)yw>1lfy|B`rb&Ax-YWP)yLqmX;Q_*5QVR24ZYgV|E$xCL*HqsI~Fj zPBOf};UgJ8)2?-g_$d@623<5C#H9i~E_@I<@C0DOcJN)3kI+5g2n`5oM)p3v@M1Y6 z0Id_LrWv>(dJ`EB9RSF2*xGy~({2+9&ml&3E;ml14=aguUZA$=) zKnlpZ!`7F#+p2arJR2Lj0aWI`f}@tsEu^)8G38qh;sS}6OsUd54kiaN-nIIs9Siyq z#MhP;{worDWB{#^@JN^WL;WLml--0KO5+i-j$F%rurI?>?*B!9E7OwI-s}g%zvfMnh<0S(f z@h57!vzzFK@Ru+YaW~X(Y(*nWrdlXfM_-OyKK#Sks+!OPr^D#|Q#HHBYCb(M=j{0s_whN~nU%bXqyGSJy2n z8p;2lv@kKylZ)aX1#_!FDi~qd_S#fl{(>Umx%*;?1VVX9(*=NQby?@(14=?BK=Bb4 z5e(R)X7bV<-9U7s)}TixS}Q{9Kr}?N%B@7acIZ&>8J~mi#=aeuj7fuc1YTS?wu3}U zPmnb~zhx==wkv`pj^$gin9UmimSB_D4SfU~Y1=6d znsI{8+c~q1TaMGIu2h|8s{Wr)%qsrm>RA=}<0(gIZIY#K?o&fX^P_=#t66<#_S2Q4 z{J3Drb@$OD7TBd-!RVtk>teJ7r9%N>*ueLSz1+~hZ z0sJ#+?6i4kV1OEJFK18H;K%v}PbWl#$sjAzpB4^)I76LY8amYOu7SA5k?F%42lP2> zKKok;zLgCHzlVsup@Bbqqa!rS^2`~McoOCrVVrV=IQo194`@e%4MxsU;IwfQo*zAi z9~M%hRJEtIyzpHA=fw>=F20Km5S-U$pOO(!!66#YtIcY)OEJ!pVy|0$TG|t$I;;47 zUQhqi+B793#U~^j6QLM*vh>gzLM^34O0WY=N#% zd!{Z~Ze8wuEGIYjAdvAZ!>mHPFZ?V=-U_kv!aIA=&BzGa54AuF$3xwQ*|I+1uiPxV z_by|5pvSoaqbMpW=n#?D#o*bqC1XP`oO(dk(-P5S8ru@I;x{>Za)6PvGW20YB=imz zkZz1jz#lz3WZ{$RXjg9xwyN9oLmc%3a5}@M*QA$jLId*HcgY8rX6@u9=;crjtuU69 z6x2`6de8VSjVz6wmz0C4&?q|clMw$fy%3frEg50oV)FViJWQPXz>;3J`Pd7cO<=Y& zSBRCQShVf3 zeL8zP7w%l6=YLaQH#J?ax2eQS1R?dQwam;U>r+~UWtk;Zu^;p8I0lUU<-KrrJPs?o zv6=q;)uhnz&X3Ns@7zPdCFFxhnocz`Nb>;Hu8VWr%-1b1Dkxm6LgXkO?0}fK3pk6U z{qgvk_yS%(D1<~m3nQ)7*Q{!-;p}__I3sp$=Zo)|6df@0$4vvXJY%>A@tGYfyxqPc z_PG#6EIvD=%JUc~+w&W-E5XEaWrMlLGP=iSS_DZ98_`@4mLzNw-+G`ibs?CKc@!%# z{o?%;qr^Sm_>NzAQ_fCY%{Ly7-=^{1NY($_ts@?NZ?cRpf*Z|0z2B9$Cxv*xGlnMC zjf+8gD;#n#!;UNNe|!N9^jqI9vzX=5_rA8u(>ARUz5OAir5F;|Q5fg02Uk_i$SC@4 zcRKSU89X>BSjmF}8^AN4N@UOike7E9x4p>xrxyNS3r;%1=5P{3ZxQ8q zmp`CRN*n5YXGHAg)fAa$UcPT>2P~FDh2L1AWWz zSd;e=ZqT!h>2@sZ+SSSzzV3Yd$=Dhfg&k*k3m^L)%lZkAG7d+QH{wVFHBB(g!o{ff zo9@957U?-62(u$dB&lnm1RWn5Rv2(6 zHgPl#W9(`gG_~qyo4I^KIBLhLyUWUlA0PV$`&lE`{?|6+t4o_3jGf&$Q=~d-qC|nD z^8&NoLx(`)n*H!fhUo$is<=8_H%5ZT16g=_ro4kvd%O2FcRQ!6?;Y_-vAd*Jd2{<~ zc5D5YYT7nrbmAc zVxDJ9tVmwnNjxheltJr5${KnMm44Ui-7buDARK!vElj8Rd^Hi_hg0GqZe$-<0^zP| zD56!ruCIq1G7B2QHDL1r9U`WBI4B(Io2T8>TV(-~j`*(H;wTULtG2M?Lq2!YbFYOd zzT;8JkL}quNfep=o92;wurqUl+PbI|Ezgd;AW&Q?`i*3mqYMDFv0ofK?7&$1k3bu(c4O`u~QturR zg=wKiWwNEZHd8e?R!2msJ{Opb0kom}0~Hc*i3`W@z@5&KFS&5s&&uj~>M~ON0M_$kr9Gms37)AqS3su^UoJ&_gdsE0yS$JcBae zbcbdUQsVADZ*LBJKgAA0X+yt5T-I>K6~A~v0%>rz^=riF;=%TgOwar3I z6#_%b(yEZ%McONQSSMJ2aUbtaf08HEZE{UOr&a8P-ht6=ZNBC>n40|T{+oDsu7$qI zOk#(_1vZc{DGgMkNN?uh*~&!qFTgLDNs7xJB^1}<1ct4P)pnd`%F`&JS9+9kPl8?e{d3-yHcrC(@Tk+thF!Z``2vaS*A;ym|= zSiE{^F-d$A-^5*2bnUl<-~ulPu`-39^aEq_-GA5&XvgUz0(Tw0qq_#blP`byergY4 zzWOc>_=f#;Cpf@p#*WKDZFyMtAAdiv>d{5P`KF7dRezPNVVXssu68ctLj2ngG_ zfd^+O;)>{OW}BU2Oq|7z0TI`;Q6^>3WBKZh_PK>|O}DO`M1 zd<+i{x8MrR^25{STf?$EZZMSfx1yFPL+XfRiN=7@4M;mx0^N3epNcM`#^~>Wm``Fn|pS` zfz7T5z)P$e6#A7Hxlfd{5*d5fiS-p7F{(R!dB^~*2G8y7$94|tI6f)O8`V=AaZ_Mp zUg=2__6*s&$MJ!r_LOl{fRz5iY5NBmJN5~gDsT(eSBd=-)tch}ftf_!`skBOERI`@>m~+u>@Fca={RlTj{|m?%fKCfxm@-;crwsl(7}tWXYywm z)KL#WzcuJ_2G0}4fV^|V?epJ7_QpM1F=7a4Y&5Rf+jhQrOk?sTwt6!!%I0=|Yu+6- zxc&pOxaq|Vw{BetG8wc2wHWrh0lKue2SO=fODpG!^eGk@OK=6qhExcKPLp_PljQ@#Rzq~P%f|K zjkdNN+~NRxy3C!33%ZpW(xo_1H(XyCp&<;+f7jRrr9|h*StU(7{7&Rsti8A!UmYi~ zbUqSygO(T`v)y2UZBTgq@kjob&oTG@Hil6JHzpfsv`)_Kjmj1iWD~uiH8{ja%&w%2 zb=VptCk>(8#riSTu~(NO&jBlnuX4p~Uryi-7(D&=tAmFJ7a4AbcC8OSRm%Wy7`8#( z?D6*r)fyxaHYMg3!iFYr2ku)JrDnpyz<%U@|Bi|?rsIx5ku>Z($doB`CZyX`O92YeQF}Ms$12^hd0x8G;ig$mCRLLbDc{*??*T= z;Peg;V3qiQg9gqS@f~2t@>$tlh-Ayeab?>AdrfM-X_IW$xXc)9w_%m+ewDjHw zPz9=_#5&a?DTRiI`6D;d0w^E|X^MVbpfITa@AM_R^ z5nW=e83~K5TiGABi;AkEIY9V4$Ih6;A7}58?RS@EKKCsZ{EC#ZRTKP z7zM)sflE~!?AuncaK}pf%^=K|$cm&-OhXmaBhj`UJ231E@G3~(aTO=+5@8jaH!DVE zePgZlNv?UeQ8YT#NCaa(#ZQ&)>eZ{@0PMqN1Dl_y^Dp%@WOeHL%HqCuQ-#>O^HtJX z?Z7G|?$6dXLDSeOGoyOwy@YP47wz?*nPgU6*hI20H7s_c65Q<6V%rC}_1Vw!2v7yD zv=3i3-Qzm<(c`98hBia&*N;a!OMs;8;FB%cN_3%F@tzYM83nyU9i7~?EaV6>@~COM znMw@2=EKg~?vLM*+Uz99N1{T}M*==-WW2kD2W@XI7y&YtUA^0K9H`I(`#(jqm#}|M zwMMcXiVV|v{{ll(1%zJci6HQM!|+t_nGKYveSku-_#tjm!UTnW#sKzyNh$#Qw8f!)z&iV$N?BuPXKm>75PD%>#S;A?gK`*UaJ>?zE~W+&&3Hc& zdR>w1wW(RLs&5cAgOR7>SgbteW8x4E5{vbt_nV{ecEP#S8q@L3h9VtSrAw2daC}&v z)27rXjctK$rt7=7qyL-|6B4Y8|G@p0SPYAm@r5hW=tv_?dLd-)?@`D> zF?}eU98Ud0b7_glm)@F+=_dL;6BTy0h}Tfe4t)dm9DwGjF_35gt4mWwe6UCrJJBbD zf&iZfY`|_z$Sh!J%)=0FZrT83ixks+D1SM-G=0@u!v;E5LM`lcx z_gPCAi;|6}wbsnSSh#PZ)M|$}*f~&RRObP+ZgFFD8JL*uo?gWtv*u}0B>dzWwq@JX zC3f|Cm(16K9dZbN{*CJS_^=ujo|&(<70@PAjk6Sv^8a1FOo3ft$$7hg!k@Cu9M{wR zgEWk?k{DvNGSUSDXuD$?)Gze+{Pn*IS;K57Q^2SOeT2pe41u*zPWj78-#CVl+-87!rW zwi~wkg|x5_?bxY-6L%x-HIL5quLZ&Af1ZfgknpW@!eFRG;UBF z>~~Y}bXsxI)qk|#SD5CuC8}Ou#V^)ASSH~4bF)Y3iERxcfb&2aiJYQV!bc@yHNJa* z;);b<|C%_tl&N0qnP43dDYl^o%@^*+)KXndP0a@a>`d=FJ4tFzH@s!^jAC^UWays+ zzCyMIXrvVCu(_fU)g)AiVSkZ*enG8b?a&}YEFO(4&jr$$V#WA zGSS-R^Zqq(|e2>sT&W8@aEzN5*4%`H>MqgcDu=GT?b$X^x7af$ z&bn`!{5pC};zGFcIOA`aQQfyVjkIE79@EN;w9ApM28+e>ArUTwNII00+XKq8*5HRe zdDk$;7rJUKvQ7)-vs(OGqGHj_twmNnV~>+}t5Sl>8?XWVG#<8<-cg(RTcQ*I39&oO z0*s{~8SksE{dFPOR@W(2GlO(y$1g;3Pz6C=(leI0xtc1t9$vzl(W+n2l1fPM*Yy{{ zTd(hSZ&kO{8(Y^mW$-B#RROj~fB=`pc~A4=6%vR70F%6=u^4vxWPwDkmZo2vg-)F; zbRI~u1+Angwkf53c&u-Sui{Xc=ve$!F8FpJ{X8K5aB1GPEUk>Z|gq1!k3n17M^>%_gLG zNQgw;xE_$LHguyfP(^|bWPQuZ13VGY^Syg?)cH-@R_LsmEPiegZijOzc19#^8P1W3 z%_PPPx2iRig|H_2E>Jm4&>MVYXUDYFW{2mY_AHqnZ;%#Y)e+_(_3z8hH8(@yCjif{ z=WfO5Av87U$7)wsXUW|O>YMP!dWB>cVQX*%p=7X74|V&faV3x8_=O99(mTVcf_N~! zLF8st<(DEs8Z^{v0Lx=*m$$dG&(0OaJFL$J{tog;`!M|Q>8hjvh=MwJ1>X2*DA2%z zLTz=)_TBK>BUy&du4ndTx7vdg3a2&p2}Sl(LD5&6_)v^}S zrp7tzh!6sk=ootL)XYqg-|d_^mZG#HqCy|zw^T{FE)x~F&0qz42mrk2Ppj-y0RWaM zzs|o4%J*)wmhTg*tcqKN8U6Rbm}0%=6~n`k>_L5F9v;VHwS=u%n?THc!?~3~^ADnkGqBoYzRrYU zH*AcR?LM}&R5U2U)`9lFp)+P8R1sb)=*nbL3M7wW#Y0RoHct$b?*;Bg=e5+X_#05t( zMx^h7r6lBRx|sv{A9h4&pm0YD`guT^9Q*qkirYfjgAtihpm$`g1BBa?nN7FRL9Q3Q zH8G=6S)8#(0~FXkAtHl*BDZ~cLHr!;sfpCiV;7F8x2>e}?Y|^xZmcR)ZkA;z{&6V1 z-Rq@(Fn_gLPWNKJ^8|~rKmUyUhrjY|s4NvRZrZ%`?HhcmOP}kcv*rm?>TG51RSk$& z#4TLR=Zhunw#0gX=R#-&(9eL^`l`X< z2@q1U(uJ9N;*-~+#-v>#3OhiV=FMxav^G1DJJ7R#W79eZuw$@Ny7bZ%srf@^V5(X9Tnacj#p>`h?C-vzvz;DG|*kCyg%2%Uqklc?YV@j%?+26==V`t zw*XqS+;Ji*kU>Ds3b{Q!VWE^XpdqPOLXZO9 zGR_?EVd4E?%h3mAnBG=O8Wag+5d}DA6vXaL*zNP@=*fc~OF$Y>fxz+Odwi*rfAO_d z0aLMncFK`QHBy<90dJ-0o!3=_k zq(DtQ8ACf(EWl9NPCcG49PY77K{Q9)3#W?r(r-I?z>#u?cgXW;P&jdg@n3AYf zP3@o)Ae9j^bF1^vLg4~~Jx5qU{pJLL^*Mkj&>t{j$?lSs?XGl(e8)grD(8x3rC@fa z3>c+kL2_VV0O2(?r+)tdQs}XFpz*!^RLI%=K}mdHIy!<-e5rdHCThW)hd2OZI`ZZskMLdME`~bG`evJqX)_*AGPLjMzuL7ha5gv<~l{9Z0St z6kyU+O?q zt9TPwQ->sqd7q}I{7nAxn?mDV3&Punx2%z3h@bg$n# z0-?K6ap1)rNQ?V3vR%(N*;+yq?`XrIGVBtGIuXm)$6$%TMQfCUf8Q6V6rt|aWul@v zZMh#M=r@DoR6gjYmeZ!|Wd_JZHu-`!>c()uR<;)~(n@Y$Q)6LjDiUv~6-Vd%t*uJY z&jg6mK0VpO+J5fm2fsKMRqv%lYw*du?0DKu47UXZ()9;#E&pW@WGKEuT@S_&)W%;I z>Q1#^d?J9yq+LBf5&J`HwV*pusTeX^ChlTRpcyg|3s zJl92OiYND{^XVg$4;d%VHg0HSuK^?p+_kiC7~V;sxW`TILil7%QJ}TP+`EsS%Dhlk zuLDYk%<~)Kc00ccGlHN1WR)oYfP9iXj4fZpc*wQK!maA->uZ)<)rQr{bprf44kXK* zW?3YOZW- z!3f%!0av!cgKwCq(sc)DpOKK|tzz*dYNx|bU@Gr&ojOY|ziuBr*0CHmr1@Ax64x^n zl;6L9$L16ZAL4I91`)WP2hn1i^>6z26W29qQeh|G<0J71LxcI33!l%qy!>Zr^yEou zQpYN@vg8wGJ`3r{D*QVlkqov^?EynWLv4jj1W)|gHI}Wa3^^g8)5o}WzCkyD3htsK z#4)Iu*}gxmrM$04ZWSEx#upWNSc$E6=fc-co!JFKQa})`t|gV>D4XhNi`OkfB|f@L zR)$CGXw2%Z!HP*&qY_rda|GO!-L#AA`sdu}=7BB2I~XGPWpy&uPksByj9ad%@4U+; zjYH}nfq2Vtqzd#WtCQzqf&1y77ZGtEj}itLEq?EgQ{6x@LzNU3-#x#)vxe}ze*FGj zi}EXc$7o}49)lI2MPjE1@(vi80W~+gFY;I+mS= zJsRB==)MTIuh6@5p!Z_$pYrl@iII~VH?|)3?%91En?ht&ZU7<&h+-$SS3s5SgY~Yf ztNSJQU^*XokPmh120Lz@Jaa~NC|!deN`x1%b_Ez!+UEsxTd)rj>GaslIvnIUIT_pI z&4pt+fxa#!M7y80c3fBGzDuv>?Hj?c0opN9&Yl7t#(mB;1;`^TQSMY_XOJ#%%Ti4j zUCms@$g?tn0b}KX0~%g4^*5^-1=d?Ra)|eTWE_J!F8eN1H9jgNz@6jn5N|;JqBCcT zuoej-OI1ECF_mFWBorVrKx zD`+>mUXM(Z_^QXd6hTmb^n%O6C?4DYm^jF?~y!2*U>87T8)w@wc-CRv9!M z`wYjLkYE+i4hv0Ck;+JD0?JSA=curA=ik{E$OzkhjDg=F_Q=`oRACOXMwWD*YHv zFBy&j2P!6?6$cU-i%N#DIrew2WB6;&c*b6RRcCrGm3*Z{eD`Z6#&>pupP(RtOTn!x zc{3TZVoTJiqsEP5%PAAOTP1UXA|YLAl+`&50_j1?nBhw@$NZsDJ~j45oPw<85sB@L z{;`|X_3T5$1S89Ig%lGtipCasZyY0Ty$_5qnZ` zJJ^%xhh$2Vnuiw9gMVv^b|7u$iQ<6&+RR@3I)&W(^$g$C@5lK=mL;*f%+EKxN!8dX z%(ComNeMT6f^PA*Ux*n31gl) zlRHB!nlZ21`jj3yWm8 zp#5}2W&=)}=$U`J91%*LX)OH}#6e*c5y_vycT`eyS}tK(*KO%T2ht+kLs|eN&p-k9 zw!M8r>u_dT>mZrW@u4>MiqJe@abWr|%z$1m>xgRFhw|6fFUCA(L5^k&uai;P>y8y> z=S;0ULm1w#K6Vf75Nc(X{O-)vR4uJ_&P57G{g>)QXq!i22(rD4ovJ3y9JOACf;&ul zU2sk1+sxx~aU@p`+pJ4An$I%#I|Je@?ktiZi~_tq z_}bK2cz5Njevb9oSo%pjyR5rg))1v4);}VRAyofgy*4Y83j;|No>0^06 zfJv93uVwnGdnz$>WsSup?Q~X^3p*oc0~sPr&@tCkv4IpKA50aLN@y&3b3${2khB`@ zT5MFu_vwJH?6kBkDeYd^4~s0^NwwRAI9!{{yrt`}PhPtGx^V+GPUv#fu;U|_dRyDN ziK2UdonUBBz(8yaVBISyAJclk%N%Y6>+uxSjvr5Wn^H~1`kI(V;8z2KhwcjQH|U&? zh*tmI^)GPKsl*77S>>~HpGTpo*&-to)m}XgY!gPpPzS1|yq$R(gFpnFEXYvOb0_8& zuquCG-2qxA2%?_Bo1d#(bjR8V=HUHPB@7iCeERuU8(iiMhC-iA+h|;8kfJH#rog~T zPoMkZEwjNYRTlnx)ywfx?QeAx3v74onO@~_M@E%m=JHULnc+bFBX)lcDNuEQaD8I> zw*o25Hxaxi^6wC7M22ac!qLIC%9K?JJmvK*rUnqqsqT`c>@;9~T7SI^pa=i<%^Y+# zG|98i2QWNwEPe*Z2Favpj~`Po-b**De>Z@OB#HFpQz6j?DOEvnAZilnGX67?*9zu6 z_Ph7l-=YC$3ACNRI)vF{Pf~1i#liOHR6^BG^7(5wPed}FD|Ohqk8t_; z(w+D08DLyaw_nDU?##^}3|5|}rmU_^07X!BC7 zR3qgAxCmyuv^}gQh9&tSbsl@u+C7AlM6{-d|L%beuhHf@3?mD8GUz3X^BwoHi-A zp_32W^ZVOOeqGp&gdt(?UrTdKi)9;6pF1#ITfiMyC5=$T6WhR=3Blspj)Mjd3uM-; zL}}fTw~2Y>{{$!{i96V8fA4rDbM6w{yG%oGThr?;4>etTl$~?S%h~<}k3Su!$AEh4 zBg``C`5xYo=Vmt>t`#+>Z4}OVP;%Y?R^6NP@})z?{>7I`%gj2v9STg< z?|4&W#ydkPS2cvxF&sh=pB?|{XEOt}B> zVOGL-!|NS0jqu$Y|FeGnF8~IWtHeUY7$X(LK~->falv~xmJ2HxC}Z#qf|1ZoA5uYh zLJ;X78(SaNI`3U6BEx34VRVc}qqLG3JSVsGQiDT{ z3Hb8R_JX7zHc`Zmf!z|7A2=%R(cdBK5~xEh_61zr-;KAYeGocG?*e)h@s_*BaMkACv$idwoPa(q8O>T@IXYp$E$1tM7R zc+%pT)<0ZaB;3u#+qqbzz;2ED^%;nC;~z8+Xv@UcD)C^eio^rwlGiuGskJs(y1?*a zSCZ_52M+?m0*j80u?JBhWsSgNLC=Mq7XR+uUM11?a5W+5NPmLU4WIciFTSC8Qq4C4~h#q95_nl4W69OUdxCVkJuQ``}{r&#kdjiGe!9vaAn#j z9xb?g_hvjnLQB30wHoHkf2^}j5&WBYeJ<>>-}Tp%wv~;24@W$0Z>EfN@>?bO7Jj(X%6l4d;v_DMsDYZhK0crtSjzxQqW&-?`OmFgk%c0wl!EQfNlVSJ0isc zD=cY;!QmGjHC-&zQaL^fwDT*Sf>*b+T2K4I5;*N01s4P zhf3X*8%1M%XuRtBNri{|CR+A{@msBf9Z2y$M`3-j=xf7F)%RZxFh;nY~3?)<*uvbZ-J$OwD zKJy;$^F*M*C3|*npGewP#%1aIr@FadTY6YBX4}c#xduG{_lqdTkQ&zD?`&YuDiJ(q zZS)sF5pOPU@Jhb6eb%VL+$?nx>mt$8LZ=MVL$t>b+=G{mQt_|P8Ne4ONMYoMHfCU= z0&6b({JH?ULCa936fXs zq?fa4pVz@iw^7xS-c~1zQp*^fo*us_~YXr$8YQ2LjV=% zc_%M>r;1aY=I6Kp0yOl+zm>!nl&8yII##OP|=jIFt%to^PB@&y}(Y1EB8YZ+ry)9-6n$F2z(R0l8r271-U z53PJG=(6U2XzOuip0IQ{ewYaPx^5{al7L9UF#zw?8!W)OW}iPYC9p&y&0LKB%S7vr zj7u_T`1u1ObTxO4kKQsTb5CNWOyqNcYSo|XXzW2k=j8e+V{JJ8s{C|uA!X{f539`D zRC*P)4ss{!6auP@&5izjt`Z9@Kq|0Ax(Yj`vDN#}k9cmok@_#1038OgTtKJEu{dFX zf#o2tC)IF5E)88TrEM%ITeT#v(Kg|xYNBJ>QfPf8fMPH_r22EtbO zxYmd~4z-2+ZSWd$29OCSOcuO3pz{z==H$tgw<+w(Z|$Eq*BC`H2nyWPU|?jJrwhoc zPuqCF!d%a2&6Neo#Ju*}^A#Ej4{%ESzpnkee7=B@EsZG552Q)=w{MHqB3S}CIcHy6 z|4U@Vd*6Sy8VS1_NUi3*^h01CGT9n56)|sz>w>Qb@_tgWuwT;V2;kD=j5c1gIsKa5 zB{bL=*3u;oafACIu+r)XE=_ zghPV+wIm=PWL@~;i=~uD!^^_2jwD}uCOPwvci77fu>S9b)J3`umR64;$^PN?C2D)U zFfKWwc12tarUW`@&!K0=0000269orJ3BXELiAjeR*nd6U`^^BqD}`y9r?R=T#;h|~ zZK8DR;F_@(zGnvtp0iEaTS14MeyQn8h78}vy~tR4)ll~prnZX7*5LcJ3R9BNGdH!< zqJah#mQG2Ku(F7QylmT9N}V67PR`D!YX$H#+;n83UO$NpH~)&eBuJJW6nnV@O@9Gh zEGa0<^Ok&ID(!z5cO+=N%^r8~l{R~xT!1gf z&li}k{TB<*dbQ#TdMZR(p#MNdlgz{7i$WMPiS~!w%4j7qRe( zC_lJC(VrIGX3ycqag{0<$9jdH(pG7?y^oQzQ7XaOgJ%b5Ja=FAaGWG+-Dbp*$@NXE zK+t^nBh%Jf#Ek+^YX&Y=2UGS3#p!1Sm^S{hy(+}Yq{gM6CHsqP03sNyZop%%aJwO8 zor%r>9t@;!59o*27aI_gG(2_73eh|JlGzqeJ{Uw z?|KeAJxs=v)6-S<1>+aK5fw77qmny^nc*D(W#%$V@TC#>>k@qW$)B&!G);wI=+O(d zPNDZp@J1m2xiR|}hc~g7KO+@`Gd@aeWB>6FH_yp!2J1=pj?#+wd$6rX6dvJRidy+g zgc?^#``!1~&-(uBX##&Lq7Er6fh#`$OnLLlBz$$uOR>rsf(9j=o zTdtMBcM_XrPRJeCmS5kjJi+WUm1B|e@S)C+BUY)#ISP9%XFWdUX;G+d?o}q{GH!wgHifQNb$XMVDZ1Le0Ktz;`xFv&@#a+g z))Bq&nxUMImK`sK=uQ9BABkM%b!)=gy)F;g-1t=DDKp&t3seZ`=~4Ge`UEVCzZxBi zS^dfH0zIbp9lo;-WC(;Kt+4&NIA0A){f&Er`SEKs^bAcUxH5wCp4n38BUa;>RwqI5 z`@xQ338r3prly-FhL4+?N`c)q=%D!0yt(12v;`AY@+kv!#Nq!#{W(e<^Gq;B80-v^ zU5AY}TwAQrUw~MzbA!PO9$nuq4NI7>&&NFsc;z~F4dawJ1@*ZJ?h#3zs6E#IZN7A4 z55Br6@)+J_`C7c!)dXNrfyYHS$2fw3zuKuc+w95Cn@rL~y`Lb@3TX4~xRh5o4MHQo z=7G(*CDWH)J{}*PdtjU;t?bY*pyp50r+#eI(HG08nOc8OFU8$n(fC7NSsv_>9}&vu zZYc;>4b4lB5ocIy0)!%VX@5=|p(>y?hE32$u-8P+#n73Rwe*|~W3V8R{ zG+vV_^XE^nH45Y7%X1f+2H0d?d}aC1`Dk)-68XhX7k3X_t+67^AQuGgKyJMXaS0qo z!3N=V9PJ%R-kW%M)I~Y{+lOng6sPy2gK>zrN@oB=3Oor~2LnF;;$4cb>x~;#+!oWI zS7^TiNneV*kIoh`R9w56Hk+=W^(56^m+8vwGv*tnUfVGop`$qT3AGK>=*W#&ieoFk z-1+5SOb{yNtN6U7de6$8`y^C+E%%?dEN$cTY@km_Sfr;7g8)PPy;kv*13146bN8O$ z;>c->AD2m~v3+n&Y#*a08ZRraCjLkZFE6h*(T3X8v)5pY0gEmK*@r-+gNK6}Idi*tfS5L=>ZXG9 zf~Dc<*B#L>xu-qTSqw6QyxFQ>E7d>z4niH+|X0cCv3}6*Ff0lb9)Kc zpCq&=8p)}+dgaPe z1cyNUPVpk5i%@c;!V8Zp{<_T3K{P{Uq34#R28%LDh_7j8kE8{ z_|Wtr>E)J6v+MzotPfV7)MNm)X#-23dUCaJvJ68f$Z=NoQ=E7=pajvLy{z(iacqn` zAug`IVFV1hil@yg!LSMRscfJ7`}ZFKhD3Z1oE3`v>KKS(FgiNw0dJ1)KWv^keia}3 z-VN3_VRVe^YZB!=EI1s#mBan5!9}SNj_%U=n01zdf**f5~+evx_6zO_3W1D zj}zHxm>E5O=G9sGyfi`eLG;Q=d;xd?0aI({348pVv?E^-(6I1Jm!q8^CMVA2@Y|9& z!!3XQ#n&j|rdhd4TzgLk2AEy z%^nWqu}_4#kI;_NyJR=_*ZcV3D&0q#(vM1dBnebg{yOkml%Q~tHTb$C|Hj$k*bvqV zu~PxDVBhhroro3zzWTAux6D%di>ThTpJY2@W;@c?@3)C#Hf4Yr0qHZ2Cr8!yU6hr3 zzvOf3tLcXq@6s0DpF9))D0qBV$wnTYnlmAMPwM^8(M!WO@Kwb9$QrsU1mF%E`T3K3 zX#i*|qzt(7zMSWVaty&o=gvu>8G~r=B20dihGrs}_~es8W}#GS7T!(*a`XiRWskTR zH41f{olt<7sDdh~cdjacvjdKV_Ur<#$}vitJG5c_)bddH0I;^qw_y~=ipR4dp3LFc z6qC@Gu}gcNfs#98CiBlO6MhQI1FI?y3H~8YO#)gzcT_HKO7+Y z2k9Q<&|{MX{wKD0taN1KG|XUyB?Q#ChAu(N+LJo`%0+i9lrj0!bc(mWe|N6mT0F1A z0o{#S;68pub_ME?*7XlHBu8d{zAFXSw*0A`B+e2!wcXofp@}tTw;1DE_XP23Sbp3k zmfr2*#2wq^kl;5H9fc3~oFAmVwS5{YVz%*mQ1%T6VW2X4PO)Jz`0_EZ5&mZ3jViQd z#K|L8-idd|07n8*yW=~<2C%eZ2u(0w+w9!joHgynW?Z3|5)ai_;st)sMAD|n#^3vT z-8S??xIf5;C@hrEXm@ntgxwO#-QAp=HDK}t6@QhpfGrg`ri6*Vrno8g{#_B- z%tm<|7D0hT#uD>fOD1ak$?;{c*mAK3QEyYee(!18+K?U4!Dp2?K7}#Lhq`a`l=AB^ zIJ32N+p^vIR|b#H4hwio{Ik;vNbfiC`!PKiWhFr4*Ix&0x!|o>v=)3#>O%^S_gJ5d zbSP0xoZf9PP9E_sbY~frz_M}M2JXnKt<;YhlI-XQmB+OQ) zv;~DyfjeyMSsF-nk}<(;wIXRPT&)F}Phh2K-n=0gu6BfOiwii)IJt%ZWH4k1vwtbN zabY~Bj0$hM;q)gh|A(gUfXBLR-?um2WZc;+Aqo+dJxWp`MJ1b*l9rT_y|Oik>{-f6 zQ8q~h(qxvz!qU(g5Az}Sm_?mUe+ zguQcR{8!fIyR*ni89ckVCp6Adj3*=$g4M?ik_Y>Ci(;s8;EtLc57U)bj6|k$lTi(Fyop6q7o_?JD^stqEWjM=jpFqMDQcu&~C&62+w;m*>w2GugMRIjW%$4G*+EfI9k1S` zqC$|4I{l9=7@RzQECdn=m@5(@l^$a=-egwbh&fEn<(|^KS8mh&o&NlU01wQ4wf~CY zJ@x3S9r4%rjwHN@K_R1}a&_9O80R%bw!;JUXqc%N?;Tb%A#t&!1B5t4=>tSsv!c;P3-bAO)|I?r39F1$} zZHY|-YOWc@VYm)aq2c`w74)&rMkNloWj@=bd8T@KV@1J21r+GEovmT*AN4_yB&*@g z;tNZ-J(f8%hut?8rXwa`u!m80c5yM%>Q&yfX&*1Eq5aq0t{(FrLMh;Z6!S!Y&YPLp zS&WrHxG-S3z(-rwTKHKme3}SB_11;=k>5@@++27EE0s2sndoF!UpfN56iD~+yKmTB ziH0=*en*&78Uwf{XbV^)1bRap1sZz%J9+?66yN5eZOB;pb~I`1&pQ5`oS+LSQMcvg zZ}aD)PAgj-eu{_1P-k{yis7cNKWO{SGwQKqZjU=1OJbt|(z>_pd`L?xeO%`bo(Kks z+;h7?$Kxq4O(k5ajRvEU3*vlm1xg&H-Fi#gDzfG4w{L06S+5uVRa|&Kdh+U*f%>D{ zJD}a|ZIRQ^IxQ$ic}*|(t2E@ugHoUC71OsWd>*KKtvbr?a?oCYC6EUHWzgq&y>sn5 znbWt&J=*uz#(r8dD3cmYEPiEtvux$>J$A=kr!GqG+V_6R@B8OI<&w``;AAswEe>#D zVt&l^68nO9xFD){-p2y~dqiB^j*AzoTmOzfjUje6r$-uS^-i1d@_9~L1lVn%N?=|{ zC>9Xm>*GE>@u1 zhcf%~Cxx4Pbmk%rN%%A3&IJDnLt!<1*Mq#1y;*SidYXEwE)rOL)bCrOI{um#78d`@ zR(TZvqQCa33YEdIq58q#z}A|n3-m_%`gHlGDM1(w+tN84KQ5n`lyvd&0u(5wH&vgV zI%-(tG(B>iTi)&FOD(St6t(k7Sxh18ie?NQpvc;>4ii(Ss zC3o(OYcY?QZu?{)eql0{EsG9*`fJxjFa))6sM99oA8T{2`OV3#&(eB&Vq!x4GZS6l zNJ68ycw&rvi2bYAuj#J4)DGBQYQGQ5D1FE5e+Q1HPv`YyY-DI}>b^#%4hzU^`hMWo z06Z;`w_5W^@-D0qfhY%=#J9AzGA}Rsz$ri`rUp6MzMiV)PadXoIM_2K6mbZ=gEWDL1|{K4w#stDxV%RjLY^#GJ)|X_tezX z)39B&+`pfD-Bp_M3qNd0J~h}-Y~G(LH{vj{CyvM8Dms@<3}?d4?v`Pc5129}JbXzj zjCwh#(d67YRhhl%(KvcOeEcW@h!*X-@y?xkCMIkf*Xi5IDJqJT(`CPV$>n`S$kh4F zA61$X+UaL>!JYfBCnhLMtwhPwSSwtYsFxbHqD^o)D2#NZ`2{GYY6f7z5tJCB@-{xAE1mK^ z#2&8*=QniO91lA$BN5!qeKySqWQQU9P=1R3%*p{-UT-8a5CP94zrP4HT;~rVmQP36 z^56OTI1;Ai-yz1$&3)Ch9i1w(uPOZb(YuUee-suMb5yy>CO!Ml2?!lUO}THlkudSjQWNaE5V3`J|-i<{~4K6tS0 zDh71PThGgHj}Z*T{PKT(*%hshs#Ku>CjA!!PaC&`KI^6`DKBqw^$*{fCzdoO40^iJ z*Pl6mFX=HrWMqq3&tU+Wet)~*n7QC`t#Ms5Hw}rv@Zk!`;9Eapw>d8v92LV5_Q5|ZvZtS&mGLiI>l3F&%u^2d?GhbPT-hbrA~wEl&h zRCWVbY|3lor%->9TykZO1z3;93R?SqmrT^+s}%G zCU)!Ju0W$fN+iatBy3am9_87yXUW=rTc5^>Z5+tX;$6VqdFky3#L?#4jZgDY1_uU! zTYu=ap&yM4pz`yFogRNW3YJ!_Xg!#*TCwYRue-8+vN zJgJ&wOq0b2!mgt?lS0V_pb0uu)&b2d&5c_X1Co}%i*bv>c9izc{$H2Q>4oPXGfmUr z1{;W~?8rc7Q0eKh_wTDpuUjW2A)$BwgvMTukDQx@ncXV4zPiWwfz8On!Tgyq%{sqh zKi-&(l}Uw91Z9s^b4al-^JT=j-9J>8&&BGixwKNWhRV&|I9Q(d!zjAM`%%%^@cRC% zjy&AlwAD6!lA2|OQk0gXRW9Ndylbo3n?|{cE*Ohbd_%`Io*flWJj)@`RjP31<;$1p zp|!Ayet4cDBq#_Qx5?AOrz%&%q%I7dX2x?J>M>zn0hcp-5tTDSI~LOpKA6h+(x&SVTmGgp_!!kUAIg6P`wJ zOOe4L4vXCUd`UGmzR1YPU=M>WVtx)v*}dWUn~Szl!_2p8Z0PCT8d2we#x3AE;LrPy z^J6^dswJGiT^-s7#D&(F>tI)`OcWv*|*uu>coH8mS zp2%VN1(YUG>UVBVqOdSzApbA1GhprSybxW-|7eT-lV|Pr@BjE<3UGr~EQH-dQL)Xp zTE#9ybEorfd~?Mg$XH}$Wg8%U*7}`+WM7TgW`g*Q*p!u(>Gj)}!gn-d5b8F>fMy|N zlnhRgL0WU@JyX!HU*}9yR2ZF}M(e?d#q6`7DG6?<^|vdv4;*%y;S;4lX*3yCV8Kn# zx*BG;RIN*@AZK%niHS{ryH9#J6afa3gJv>G5?i+lva+%o@7`@>YRcj0=t#j*iHKmS zzh|&;bpb`0A<%1dXP)rztal&T3~4EhYFZ&jGAvVdp)$dQSs#8UaDY(DZ0ooY&lbVt zKqon3Gd}h08;7oHV*$!A<8(1F^+drg56}}95G)Y`r-%Nj*^=7dg2eX5r$aamM-`sUG^`tZG`EL_ zhqK?_`;jZmVH#=G7kNK|9tq(@7p^Ka&V;%P2E@8Ig-}(w38|olQSunlAngZ=QP$_e z!72Fu)xG*FxZh=D+1E=-(s48|_#QdQ63{miSz4;}Fm6fmB{_~@h|q#=o1W*&JC9ay zkKp>;pXt)WB$Q$rwy@xxo0lh{sK|-e7ZDS~xiAy5>h$T;5m&A>!))B4qTln&>$SL! z`$}G5?iU3?AqxgrICL*jvPF_1yh2^>fPf_1iiJNs&(-)bHp_VxGVM7(tYb%c^i+tA zpz5g4b-O$3sW=C(i0GSfZ=1cAe=K84!k3RC7nN-|sPfTMgXzic3JU6eKMx<2BJam% z-@P3xDOJDt)7f@vL}=_xUQyA@GP1lB+glW9dgHJpsxF zZVVo^b<;TcT!MiaQRbL*maxnBme~DRD=xbAT-)UN4zLO71f5DL<4gN&Y@z{65cZ`< z#^t|%KF{2-TY2tIl$r}fcYk8we$nvuqhStkq!B9h-Y?IGt5F$JXe0)~`T+qQFoV*+ zdjN(_^#4-~{hT<%8-0n`#8Wr9ay*R{xq_%Rhx3;k!wE|Rvc9i#$?A7(?4UA^h>iWd z#iz|pmF;GyP&$L5UELsVM{n3OGhVhcm03-)2jExAxL<*jX>@dy>?=Tv7W?)k#K(&t zD>K}1!wE@X)GcSEiEav_s|B@};O{}TTn4*t^H>pVSL?@Kio{0`xEX`<3$yf2jacNB zQl!P%j*N2>Z;k7}<|VA9rKNTAEH2(%yDizlsIETe*uZDH>^k-cP0MGx&E;MboCcja zgM8X`btpn>T0cKtx(hDfyl_B;D4p0cUd!s6`P|$aPF!GnrY%ir3D5uHP~EljjVd?A zDErQx^@UgXL%MY9wlSb$JlNhmQ)9v+ER)0vq>Ntl=tjG`q4vb?!~HSXMtVt%{BG=9 z><+@J3wKfGfjdiD1;BD(12YPg=hxQl78X4I%j05B=tSVGwxiR1CypAo;&*Bt#I_iz zYIr5@Kbp~1vZTbv2Vi9qxT7V4JJ+;<282;DJHNU8C9UWOn%Zlhi|`uF@KA!QS*CXC z{^FAu%K}k1a`ie-7^1)0bja5z%S;?77&<@Wy?b|9SiH_$7FFg5#^%9nkRFb2^X}2) z07Nu>!@CQ^B3-)$e3Ow#2;T*G3fN`lNN5>ayB&^T;os;zPmkLXW@`~ z{QobCeXl4jO~$=!jpCc$m}+6#)ZEO?pUNO)(75E)-QhsnMtu{b6HlxFFp8 z@Ski&4jz_}EWCV5WT;%D-NK3TqQb%eFcHumpqHv~{k`|5s+^ewlZdkV8l)r-H^ZYu z=wavEo}Mun!U)u@Or2V#@e-Aj^2q^JoCZ`}Bd6UB))T=+<9YVbi1mQ|$f}2#I8%(0 zA|q%BS3u6m9UjNji@j~ZSHUb;?w(PEeXvGfNHb0yUVeVUWW>E}aNBkeM-8`t010In zF3Al9RsTd^Dee5w*;PO026YqC(xM4f0P-$kfxj%egM-$b#lb-y{Ri`M8lM|d!{NfP z&WkEh02*o=E{_~;rX2HWSHa5;)P5?>83r?5j-ynW(!o}5VDHLT)qMr{_#{+RUKc!o zNvA*S?K-xr?;!oVhDPIZ)=zv+{|+gBZrZ*nhcevJbb2Sk+_f4;Wp74Bmh|)DoKd0# zJB+t_YL@VXU?>fG?GyJT&i3*uKxo+agBx>-Hm;U2r3j9dk}3va5lygN9@4%{CIZt< z>|~=e^X_bFY9hHAM4W<5bx8B$Uoe5I)40nyGA71|5a>)y;H)=UDJtElMJ{gizWqOD z@Wz-FlEU`J>;tm>_?_rgQ}w;WG4?~u=)Va>2$tj38qef}gjZ6J)~$`aeuIYxC&$d) zQ-18k`3rZ9_x!{D6W;h6PayG*=qLkMb?pE!kC2yOGPW&vGxJ^S60P|HQ(AAFP_O>Kk`@a{S>S)Td^RVy){C8r=B|VFHViSSz*5G@; zSps$AHyG+lbEuu$ddrSIiH5k)D?2^)e)sDT4gsF^Rl1S%j;E&OK~ICoj#RGNmsb|g zFT=B_1tp0&_G{9dOGQ7xtx&LWK^h{5wCe8QaSeD3?i6{<^qeg!GE$G2pF~B)-@1jt zImfGi8-i1yMXdStde@5RQ7RL%;92`Learh`o??BS^Jc)r%P*mE4PV%aw<2t=)+&0T z$8zj0G{=R^-I2IY0muC`f%@w0xFH^9Z+rE8CeG(D+US1FSBpCQ&wzDTB#!4i$kF&8|X^$1za{t2D zUn#a5-Tbz=zs@Y=xamOW(=!eo1)uxZ_=W#voEP5S{NBMF?d7P?t}c7nV_8?lzm}}o_DHdu zH6##dCFJ9kS+cgmJ4ry=pu-5gMyk-*k;e&Iupc)}w0)rCRCTyP2{;>*^6p|egm#V@< z@?YVHYW?WkF+67xSmP4eGHwa5^Wr;K^lN9DTq~NPP~fG|&uVeX07Q2T7pEes4Mz=_ z&KVVQZ=k3WzE;IhvH6ECM$h!qUjn9*0*qgG!ATB9x3rlzJ=(<-KRoVVmR z{k!OklE|a98kn*l(&FZpIAIml?UBtAGRjt_w3dM$gN&Ci_c$Ij5vS0-#KDUPih~~u zJg772c;&#PFjk2<`GOS8;Az}v{ z6o2#P^E+OmjTf+mrx7mt?ylNtM@Py0y&0lie?FY4?mP+k1DtTozVfMX(C1n7pX%5# z@%e?ll09^*Ro*k%nWuyF@ME{f3P)lH`raiejGnk8J3C7Qll@}#53nt|C)7wXBPqqc z1WX|K8b*d03aw8xR!wkjZ+Y_M&pW$`L#Jc`KZW&4a1f*mw2DJ_x1+)bQjS4X9KeyB z+sGn_6C*Ja*pb9_Hsh%&yxTmwB%8~#hsTR(%xFT6ipyVpo*fYKVO?>{spQbal$0-L z2XU=Vi|Xj;WLWuJK4C#?KXCt8&A_S$?^dg%n0g+19O|4)VM+Y&)M!p-iD(SAzRtBO zLc^58E-B8#w23R69>s;kpvw_kTha2#TUlOO2T|xDKWcV^8V~GDcD1oGv4zs1u|$b$ zK#mh09ty6WzP>(*wZBZ(fbfO6-M`sn2Uv!!V)orr*JPqpUx9zV>$uOh!WqSNAD)vm zDsVcUZAty`=@U6VK?fGQeoxz%pqAW1LRT<9d|mQ)_wL<fr!=TW2Up#~uRbs9`fj8h7{ZxO6k$=nj8Jd2w!SEj?|$|`ZRHnj1qBY$i=(GyjLdFM02B|K9%3`@KiBJ~>J1E!I4Rmrwg$?`$S@5r_B-fr@4q>*szl-i=1`~Q9Bf+-VpWJ=K`ryo&p8+Sw$Hpik zB2!69Td1SL!ua@ZlS!)03s<$jx8H&t#Z@=D?5l78>5jVJ)@d&%Ik!J%{@CXJS^q7D zsvKnHBR7>k&6w36F5KE^qF~C(uv5u~5tzar{)_Yx&z$wGtOTB!NKshyjJ}RZ=&Ddy zS4K4mMR>cDTYCZ#iAYGCYX?h~4Jc;YN$ExS?_44N!1NCg$AU*WZLR)FXW6r}T03r<%IF;ke@_KW zj{bCbb_u8CMfNn5QJ-$n3Y&t^tL*xMifMM_@tiGvataD9#KIQ5=B4v>rHAf%qc$K( z5$~S~1;XG0g}4^cW1}^hD%)MCOyvwRO2*>d$&R)$2B$B28h+JS6qPs&Foq{nv%bCv z+`rMnTX^v9W{*XOgfQT<*na+7SNQgL1_OFGCG>ao72bKV?=!>SItH5LP72-3-$7$f z?z42G#E-Ht@e=K*; z`s%tJL-#i{Uegt4;KFebqOY)vl|jEyoKDiA6jWXK+#3G*1`$E{Iqfh90IK0>0m+Gp zL6|U&gCaBA7v?}kKlJPVoU8dRbIZM6_VYeZl{mI|anNEAq1mJP%@qMwdP|3Aj})+e zIt}cB0F%wA1-L~-I@TK$zyk}+`R!mZc8!gb{#n`Un>8eLS45u2O8`qEPHH58J!boO zFBP0)IYQxwrIli7W%7S+Ib>`|-gr^hKX4$i60n4~U4O=G`aqtE<;wKm9H`3F37;A7u+y z*OxgIac5F$cmsF>tQwnc>~HZ5*i4C2sALNx})h`rcC7`PC-t7a2NYP@v7a<@D9Q>_Tk$br-+q(&8M7 z#OU{i?WJdTgj$o8oqTPje>2ymN(K9ERCRjFLEs-Pt#_aMK${JP`45xY20NGwz$#E` zbDo|w4hAf`W*BoYS00+`B{s%ks8(QNNG~j+L#{w@$dGPOYE`XRW};1HV2^m+>3Is- z@hA(4B=$cX=2JRH6M%SM967M&xN7I*!^5uyI;Xs`?uVSy)8{pX5!Ja>dhH*}D5a6M z4?l~8n#K}nYA$`aq?Ic2zp{8k!5SIK%vUqIC1L}Qm*Aq}>oFPk?@#oaP2M6k9j+C_ z%tG39V0X@D_U)dE8sRX+%4JD(sQT_LdN1WhAZ$YxY7bx46{jp4eWjD^Pt&Jq>Dc%O5u` zX{E=~g(h6%-VH72N`f5hdQT z7cDz4pa@Lz=$=Ne365ZSb^UTUr%4_UzzroV>Sz#p>YtJ$62A%3vIRya76_ONNj*CP zaa+*25h{OFwywElTe~mIyBbxh3I%I-u;SRdF4DK)W~;im{7xgdNzt8`58?l0FQC3U9&)%P< zfgiLsE+Su#;qLAa9 z@69{Up?HI;(7uD=_uzaNsj_ic@aT6!W8J;GBVcN5d^`b$=NNVo%)6Ce)!NX=h`5as zwA@GZN=(d@dP#?CGf6iC(INAxK|B*|(pmu9YT7@BEpF1;5N4pE)6jewln9&})sT_N z-=QHr$7#TBWL^c@*9;(!5kyb>$D9UP&id|wq4T{*Xk%k_h&&F2Yj6qhPQtEVzaHOe zugdn=YSk+CU{jgdHCdh(dNN6zyCh;*B9_an70@OmF4JjCsB*N%Ff+^~EY5^?_lVSiTa0RQ zr!$R_q2WT>+-f)dluD%b1j3jANT?uYDa|M%mCk-L%@9~#c0i%0fzWWW=iAzh<4Wcs z&{zOeda;C)!X!Xk_S3a|m`HsCaf`EAe@p9?^UCiOh^}yOHDe%*pjC7`3+o z7&|>PW>mjub>IM`hW4=W3*>yU_kYeAK^T=fq9`szJVXBwQ*ddFDUK!w2L}kdX`|ex z0i^lWrBiP5O`zzb6cuHg?9*$NI5VZ4V#=>$mKu0~TMqerFZXMt9biavViC|~sNZOV znfH&Git=*r%6WCaI+#tNf-RSOVpu5fpm|iB42eTIv)J{W$qGzT`n)a$tb-zOVDBFllQQa zq);jW>$4r48m_ zI84GAmy-`-2z0@s${KoW~bNUrc<;pwg}K5)lgXkV6leXxkO zN1(ou7J5ryV;KWaF~~wU*X3*RbksBAk;B#e6a@`MQ>}+<>^Y+Hj}7zQ6SuG6JlSXj z)xC_XZh}C-S%Cl@v3$%ofO{*xe_>VlYaMVt;}rus2RG$3cQQ2kf#EwUs53({=!F_a zJt?#a;;aymz)1%+PDA90$`7%y3V8MDdQ>HUd-=lhZ0Af9`^HR!gO7|02na0w(ms6m zz%!R-%JPnaH>3SWGoD~A`5i~X@nyUF#Y2G<_tjtE(9K+*M@a`e4J5i@=y2kG&tpER_8|Bo}!$05^Yvuq-MSt)jhh0(O?t(VkQ%^ zamMm|$43f^i(hE$9)`jSZ()3g&Z2qTh_G=8TST)Kk&O*}e!y$Q%0IW@CgS+Env2izk=?ToKh0?@ z-w$w{%a6%jGs9pQ+^BJN&H$z6(ol~W?P)B~8veEp*G;I6p7@9cWCTo*hZMs4t5GIJ zfg$L=J=N8kErRA5?`gE?*K730Rg@sMRUcA2+70}&0DAU(;F1c41I{XiBapqcg`T8Eu|McMl%gtS1 zarm82ZGeHCFg%Ro|$&t|q8HN6aiW;~c0io=rm3S`W8goe%rglSwg_2ElO2 zP=)Bl2~u^M-07NS)0MI#`xM?@gH5vSHf`p^=5wV=d_a0AVbtdR;F(CSymC`TzZ<_S zsf8jUow8&RMAZ=HLS>PaljCHju=w-*J62VW<`4z;)A&gcc>4!JaJP8%VkOA6zA&Jq zjmau3Z2PQG0VA4m*zVBY%Aokx{rM!M2_#(m%2|jXh|hbF@HHRb7-h^*s{*TF0y_h* z!4W{#5-EF&ED70)oJv87Z=c+NyN{HnX3gh$lx9SEmFQ&|FG%i247r!TpDMF1Jw3kN zmM(@$7(OUp7GQuH1$0?I@8?YhHSxewB~JF${LS{C00Gq8Te4ASUueec*w+Kf0y(!0 zMNXA$cozjvOvT1!>AHXqb}4u|)opFv8*^D-MSDppDRXP!I#ULdvH*?%ZBnl)q;jtN57=_HNJ zTbh2!fGUO^9qj0UVwl4&x2`(SS)5A?^2GaxrZNvr@V%+KpNfiLw*2o;#;EK|DxH$1fIr+Dy;kQ=_mU7rZ_{`j<#%?a?p#UkLz81ryLF2pA1JyTu{^Z;~Vz4E&yu zissjZIfnH!qOEQ!P}Q>!jPUdGGbKeh#`ck}xw99emY`2RD<5oV==|fUu8z z+=r)ljm$0e1A<3GkBq6m&}VhtTCINil@&OrAFOoh)= z6X*Y%N$oR82(29e3Nr=(<_SiSFpT6c8BgDGmPxqP0o`(t69WmHh0zg-FPJG>0XZSy zl;7mx8k=O6tfN49wg2s=6-RSSwA>UaL8_ezrK(4p5XA>4`gsz|SwK-}yehX3 zK%Ky^>SYPM5Dd>6@vwYE-EraI_aklzQPh+lV5Xt&#DErGkiDUF#ve)**b$)E)^b`H zGj@WV9F5MF1!#pP0MlIfG~$b3Selx`IFsn#rw*fSM2!$Eu6GIZE8xmr7ZD0 zh-ocOwGG&5Bw~CF=eYL#!$Wr=l@8j>zoj=|+sb#HJ`A>I4i>ML|2k7&h9+?r4N-NLG0Be{fKwtuzfe#Q=-zpY zxMjibuzbVFa=d+G{fBqzc*H2;5E;H5I4ndGpe=w7)Bi?BQL)1bc5Oe;0L>h$?6oyG zTJYJZ6BV)~ic2B{5Xss0=&otWk;j|u4}$|htQNu3N_OtiVX6HCR-m_^|7sqdX|aDZ zV%ZtYOasLte0*;w7k3vLWv_$D2{Z3cdOg6Oz^S!m%TL2NB@~|y#s{^Z%Yb4KqA(_8 zJjyETKo5n}0loxd@;@Ji{1!Ug;6_S!j14+Tz)VIbPACv^3GiBs5J8BX@1DdU6?k(i z$=VHW9GSNv6s@<%KTcV$lL6KUG{AruHp3eZvmMadPy@Z4bhXb>rqGQ|=M@z_JG$N( zbu3Oj3}XCl?@dihQ^3(C^?OmcSxNbQx|l4z`Te`TUfbAf9o%|#RjC{>K#6kp3Iue} zRpRfv?>ck2b%LP&N=c-jT%fq(qm!E9ITT%UUI@*oVQainULkb|^qX%=*k6GH7B6*$ z?|puq71C%AbG4*jpI->*CrpjAL+beywKOJ)YW9QR43n8)Zf?s|*pNXu*W98X2;sJ^ z?QLxh`}S&u60Fa5>N`9#qb4TYpfB-kp!zw?j6H$%=-<&duFQ82Tmg(nGVNEj4TUt2 zJxM4WpMMt>6)nJzfvTz;yXxLSd%vt>k22yZ(MAJA`3(q+eWB_e3^^T9KY(1|Z1$N| z6>nP|7TuTUE)_$;4ix1n3{~{`!-1v2XP1Cc|7+>+Y$GoHMV1D>+}zwI=Bi+>4&5ty zP|PjJtxaZMWB}QHymEMU3ZpSV%-F`(|f%P8rvVbyMDXtHhBM`C&eigDmtny@3KOUG zzZU1vz<_#V^;ogEa+FM$cHjvqgRe2J{b34aeftWJyn@Pzh245U%I*Z%|?vFy>T9F|{~Fmwo5F zoM(H?+IZs7hBw1Ck?fbE;=<;Nqe-^JzzNqMEWMy{f7m-t(#ElS(9QE+y$CuU;4Kam zv_MKglH0j>^EsULg5Xc^Oa7m#$52&(^HUK`Z_0r?l?CbF?L!=>|6>VtOwFFJR4Xk0 zrE}V)>Ztgo$Nm$$@Le%Ox#Y5D7SP_4b+p``u6bPhX%oiNdMlKb$A;{bql>!-XWzd} zQwhsYs?ij)#339O{CEIXPwR%Tyo^mvdDXa1WxvOx@LZaDNQkuy2$WcK@to$SfSbJb z49-QzV!Y&D<>d z2^EnP&P-?-wd1D9ybP`oi#3H804iV#mQ_<@Gd;xc4~#wUKOb)p`gFz;cJ0Wv;Xkpt z-`8r2bi%?>M?zO7iSgIa9N2D7xa(+zN;ZO2LU_RwlcD-40MpQhF1l<+`!0r!gwvT{ zGaQcZSO9>WG5FpnyKisQLhAHrEFw)Bfnz`=Pb;*~BqWsmg|20h?wk9$C5^$X!{tuo zMnr${ecl)RHtmNUot^VO>5Tyg3U-*97R#P(|M2q_%?FyHDC&C#!?jXQhN~%am%e_b4L>V{yot z!w_L-l``iJ++TmuuKg^(oeJg+a-QqNw|^8%SBb|=XHiQg=^5SiEf+DSLne@dxYOKP zT<&PHm-!BCjV{poy-9rED8umkXPY>*(`7wH<)Q0uhk3qVP zGl+h`Y1Q_o=Ft647|pP-?`yQDias*5TevQ=9_i20;yrKQ{u$b=uHO6OA`|`AyWYKD z&QxpW6nZ;z(L8({rFk!tpO-(*iJH<&7uD!o*sF8S1ySLEgBFNP(4U_@YXruuwQTq2 z^N?)!`6%kw<$@KtIv;SI>m7O7v(o<_NR3gjN8J{j|3zYB=0&H%qjrhK1{m5~#+SP@ z8<`vG3QH5nt@6;$%jqFatsd*IE=Y-zN(_@Vt@=2TZ9OG1r!Z{NS$q{Y{bCceq!>1q z0Zk%G>YCOcS1gK%YZh3HTp3Fz1|JYgVD0h4+(CO0AO0860LFL=Lq~}bKjL44sn`Bh zJ^pT0Wa-gq{;qN)l*e?&6A%hn+tOcmF(rb6hy$(dZr3#4jU!4y?YH}|behoPo<`Lu zal?gr9E%@>91QbrOH^u;6SB0_GuiYndw~2~(6=FMMG%qio_ubUQJ7PX-V}Fv!QXj( zs1bvjwXLT`jpQD#FGOPpO!=AW?kiqaZe2d_<y>gWr!z6SI@@#vqq#L|#>h^eu%O@rxJS0yqo5;5cV}QXQbp5#5}^VAQ!t2Xyx&Wm8*H2=6(RCK;^tHiWlxR-Sa`A$t^lt4Ow_-fYo zJqykF!Ra8Lh(`N~b-FvYZ@=_Hh4&It7Tg7J{YklTT!ix-{?EC0YHsa{)p+kyY&dMAh*<9oGm@tDVni_gj#YVd4%rKx5tW+DydAyjv;m( ziS^&V93D@~mNner^D>l@xc|O;?*^D#z5Ma_dqiYpBfdpgsAnIikvWNq#^Rgu@7yBH zRf9u;h%ul>UhBSBix)((|0ebD=FKfAxFQm3-_+d1FemVcU$gH^o$W-J%R#icdMNiW zo+PNi-MdCW1%Ozsb-Ra;v1GI9QXzW;Pu2YF#No*;mou^rmmUC7u~_~sgB#9!Wv-Wm z;LTsE!CZLtx;-Qs5Q$oZ91dbTkz8!v+%shjBRg0q5@x{+c3r5|^LqR*3gW+OB?LJr zc=!$zdgk5n?G5A2W<|6`Z;xm7uFAOd4D-slP}Qa`{pV{U40W&aqlkxf5F7idY`{>Q zWd;<)z_{0M)rH>ytjpYmS_kvrE32C$6zBV@OZ7Khmm|C*q#yZ=!@h4*dd5BjWjU6PtQ}5qxgq4rn&@ z6h#iWeVgpJT{8(KmCXMAjEelq4hQ)a+M~Q|GiBx9zBvmTax5JlajC*Cenw_8eF79# zKKNNuQW6+9xpwjK;OLTFR>qA_Bs`3@>fBS09XoOX{Yq%JNb^i$!i+^UmsFG3Qludg91j?za z^Y1!DYg^-8h63Z_MOuN^WWJBC@zRmfe^_iYIbtiur4*sntAo+VquEQgswXXAS*z%3 zRrSU%&T|jzS2_xu3?Ydm;X8zMun@?YOhiE$<6}(snm$}HN+uwf# zzi|X$7VPXOH7|`>L}4Nk2#Yi%Xl(G3_2=dn<+_=_Qg{785vc^5Z(qNkJY96^kfkMW zi*ZY!VGKaofU2|Pms)dQ3h{>1IshljBc%fqhsFt*0Oq$z4 zy&~)bLb_qj^JW=(j+)w1`=I;mA5AC*SU`lBR=@8LKS?K)EWx&#=QM;dJD6*CUBUkF zhPO5`)IjD+Oj@h-OEmE0Z_Ape*^zCiM0*hSWqNsnX|YVf2{6LQ7<6@UVN~XsQBHlb z`mT%0MU;l>m(o=z*Hlt$?$<}`+3{^xUf3Nq1~FWF{tL}wKjr%r`7BKW=T=45iUx}B zMDkJQiw1Vy;36i;_Hs~eupIvzaL^`DEOKjDPnI4ssyI2tOz zqUxEw!(*n6UX`ajNhXJ*9>E_QZ+ zIrVj!7Pm74OV8Lc3}g5{Q+*QdAQUNXv7W}uXSZi&9^1<1%h1x4ov5E;Dl?GKctS#b zyG3&bM+;v6II6N1v_qmH5kYZX?_|IyrsO`e=jjS+w7qqKr zTQZ#l#_iH&P_X&ITvSuv4Rrcq&2tZf*N~KBuY9Z;2=iD@Mj5 zb91GM%7(;DygdaP3!K}2AEZiZ^dr}yw~`>zPB6a%|CQ6hvau2DX`G)pxU`1{7aScf zeeEs^hz!So2-A-;XY~>SI>6%s)e=e(RFDMdv;A@K+!}Qc;qO)BTp3T1jM)Vgi;oDY z58SgMG?udFnG}@UdMi7b949<4hOPz&w9^b~<~H8U=c5@)FCBWna$2|`SJveI zrnIYyK4I%&u=sz*jtKy0@G(HL`+Z0kCOvK_(=nSM)>g#8MsmA?u*BRd+W#j1p@1S4 z8M;)blAgp7cOMK{9FG~q3pf9%(qqxG;G^vP?cfIPFrJ}O;%m_wyy37$dtF1rkiM*i zXv}uegqO7PtX_Tb@a3N$Va7uB%=v){a|m(boVJ16#5QyVHBmg@37cXDypHaD$jEzvp2}Mj36oFa#ih4ZYUxNAJ ziG#X}V?_Iu8FV(Jg7F;~^2AN(2z&DDjdc9S?kuJMb%^~Q= zbieae+?hDicD&df43Hhuq-vT)zILyAzpL4XwVRx$Ue`E?z68$FI~8gPXdEL-5D2o~ za^3Cr$Xds~o*UQVPRXQaVU?5yrD$nJ!`N}`ik-I%f}Gd9Y~|FSNVpwf{8fxeKvI|u zWE7zM5K%{pM0MIcI#)EDUxYBw%ucw+MS;YXT~YDIDYd8P0EEDFfS>s_hmTx%7Yc<{ zfRz|F8L4P-E%0mp^UORo^&C=4QU()4USHoDV{^thFrIDoeTF%w{i=~42gTi5jeDT+ zDI9)as&f7jCdlSU7AN>@QBmYWJ}+o&fEk5Abw@kc)7wifV8Q$SBYs)3Y@ka(JBc^T z03idCFv*vte3nH~gOX{1L&YyOQpy2ae8rHV>G#)Ma!DNs4oA1QWe;Oj3`Esy*05_uSDzzS~dA zw*9DC4dgPtcQYk5qZmf|-M1FQ4i^v(Mm|Y4zIzY$uW+ zc=m+d|9B2;oRVViQ(iT&+Uu+Hdpwd1{$-it6Sl^tP&1@vn4ud%sRNV7juK@Ys7ek^ z40vy8`fAdhJ>X2?<(YMi9ud7c!oFs8+o_M-L+tyu$xM zvax#O4QC-}!g^AG)M{Ph4uvMmrn+$b-VoMhvKjo+0aBx3{QSWGmsvwm^4>jZm$d(Ac46FLu>~{qA*U`Dh%Wlk9l&B^_5$pPd@#XG+`=e zaAUNu9B??RVccP;-!+mNC|e+>M6*@(P;&7B91{;WuXJo(iMJh*S_tR;5uRH`>r!f< z!bQK=-Cd`5?auKH`_@^~IbtA>UX|(onq?%O&tRm(mVS!h4G@3H=gk?|6XrUd9rEC2Q}kyYmKDEoKTvo|?e_F<-75IlYV|R1yk9^x-wG{HqLo zeKpCdCQwJ;0g#i?fuhKn_R&^mS+xp!FCP3BXe9cj_`~Qh;jXIE0OU9KeDgzV1zi6| zM~;Z#l|ca7w6sao1WeZ%7=)AgapJrCQhiNV`+kRC1(Fm^Rcb4I`WXttdy!7g^h3MvleH0@R3Z;!8NlIGBUG{v&~1R=7Y92!$~#Ut2@ z0*wJ%!)XkFIQ@f)zHe=NqjsEkXMR*-|2i?z+}bSSX1;6pP*u;JTDkxm34;(5#+X+e zSK78!u^2F)YUNzaw{E+++f6+g)?=5ZL>1&^TNZZio9?K7Q;2mNP_gx*{yARMRx21m zC8~|?Txo6q&*f6_3zk3^CDsVMYjkHTqI->vSq^d#S3NA5+6TvuA15v!m=s94ZNP*N z_r(|{2;=YOSLTOXK|_^s`sz*>^1_b;%5@;^zXGZNW<~a<@ z7!4u1Lg@A+Q$(JNCryN0B%^Ltkx5MAa>Bx^aUET2Z;h8$X+}rGD?XwHNcW)21 z_@UQ{*EEurY{^qxZB#*-_L0(X3F9jsa15c@HmO@|5%zKe=KyEEZN}&BTxpEq5LHM; z^VdAKwmtKW*Jxg^-3}wCO)9)9yz4*q-PxpZn#W{$qs>3# zuhRzucv8t-c_jJ6zTVw1Mv_BChuWJLS8=N&s##Y7a36K-GE zvO&UVm9hm|Jmhp*Wk7*rTaPdZC}DS+3B%9`H50npp%dq(7%*o{2EoRgR5P0&i#YBdai+=$?Wy(Dr8VD>^z4d0 z&ov=a*G&=M^(jK5zw=((EFjft5Bq~r1u`zR;N^QA!-W;R_14Rh)LV}Z9G&8l*&g=# zXhG&;D0|<0BdxHO7j@O$CI0U=RV>jqf%*ANR5&?!J;*65;#Ta~O+X2!vr=2tj?e^r zZ?517Fv$xErWfYocLn*XN>3t5Z|#jn=Sou6p(Mi(!nw32z+_F>>qK)Z!swwdOHh{- zliL14N@g?vAI4BK`D4D*@0l0AU)G6u~2r+tQ*{*tqo`ya~{k>cA0fl_w`vLd{N#x2#^Rd2P8(` zDCZi-&$EX^Z9o6zeHESux$<`Hx-wE7Y=nbxdo(o=oGJgH8T)lW)X7?c0hAB4$AuCtsWQ7Q1rcOEyqT>gg`<8jI`OXj?OWH(GY<+ZRu&}HR9pq@oD^I zm)$r0#(&X9%O9j|y#I3io%>W@dU@Wq_@ccc+b$D_vO@{+$sxtxY#=$XRy;59F{NPL~UEc#Ffgoy@&SB zJFdwN_cyY6bZge6K;o(p6=f1{X9k}`I%owXx5_ZV&g1-6>yrmSNFVEtbXpj%xcv0! zpf)4pNX&gh%|r^PXM@gw+RF}(W+nFkB_#`9O88Rs8$0y(;I8!7it1~`f~-53Nuj*! zzaaxHjAl;pwtYu4-~F>Hu{FZeM5+NphX6RQpuCO4@1bVN-(n7oj z*KyaF;{j9sxkXs@pWAvwcQdom(lth_wd-5nipnlw7UTkX)H z!?dxr*YdrSCL%nQcr(>*HYQG9m7v{i9$_Yrs&GVuOD0vMxS6(RG~kJAu+4@Y&m!nP z2=Lo?7rv5}mu-kx_C=K?wLx2yhBN0G3zT6SVwmopJn5-n?d3N2+uAUwl z>kn*<-^&XL{V;-o#Nh-~!af|+U+=NVbqt-v_W-GwnK?PZRytrR0X$wq^wfK&?%cV9 z5<4EIB72h=B5|ZP-|;(f;zVaBs9_s^blzG|wj|hNE8l;xE40I9oDCdUew)Ekp}M9l zz;#foknEO#7h=Y|Y({Zz8du%3{sch?PPo``n7}5^i?B=Xx z5wNgxXVvnVwGXBiISOL^VtmB>X`G&3%c{7;zV#Lp7*v~6E7!3ng28ju1f#W<Pk6Jgv{Rki^Ip8~oCDy_D>_ZOl@;Oq5)IxkXbG;+C5vv9BdJZ)Q@J3hsACmU-xVd&8qQ zm}rSB|#$|!<$lVPbdvIToL3IJu2l~}E99O(3fQVA2E)_|$KFnmDa;D8Yb z@}Uw&1Y;RykYiNiehW_Y^fcOtRDYOKU#D{ZYj=R}Z!HH^K|m3KpeZn$(u}Parh5re z_R??07J0RJd~9SU@?xm};ZX}G)FedRs0{W!_$IW#Iac4@;0gGROlDsohzoLQ?vpEP zO-loeH+O|bq0PjLm>ZZLWos`dayv-E;1y&bWWzE_V|{n*q;9U93GJ_v^07U-xkG9k zd@zlEEX@+)0UeH4`Czhcyu5Scd%0{TdNj*#z66zzzdC+20TaSclb4e3O=h*R1=qe| zYu>MTb<1eg)W3Ya+Php<|4wsX_M17Cyv>j6x`JI`bo2?;hpLT@0|-`@Wy9)7R{Ug3 zS70h*fSM&SXV;@hG|H z4vOhkRB)T@ALHF;6&IU&-hGONLppzK{@+El_*aYOD$(u06NAf|`3o5=60{P!T(nP2 z#GrtPEuZYB2-Izk;b_JYXil^j7}V~s|9lI!t+3eoapCeQd>V3@;Jb2Je|n_T z$jjv$ns$^X7^w#_P&^z=v|Aa1EG4e|ZhY3HDtOB)w$WzcfMHm(gKGAyrI5;w&&}_T zF&gbFRZZ1he@uG#R!lN$WYzzp>8zuwOy946=#*}0Bn6~Hx&@I`1O!PbkuIgX!vv*6 zP(ebvOTeN*N*bg~y5H-W@9$k}{+StPjdGrIKi7Tjy+8Y6i(u5(T26~eD%zLnDe7gu zX5`cdwfnZVy;np$-Q%l$KaRj<4F0kf3Ym8rj)}W{OWs(OW5G?*u%1CR7Y!WTc8(5V zb?<4#9h|a0zNg(_c+zMYfA4#%fRG)Zm=21RGBiw)L&@cMao;)*ZicUSsB!rU(1w&Cf)jQ^Br`v7@aC=v^tJ@Y1oF+s?)~ zTG7JqA|oTLI(mwjq5$t!I%$ zd(N9t)8!}ze}@0%oU(~6ADL{ozU0eJLAO*@#RdnDADOw_<(WIAzg4%>U`eY4GGd(S ze9)6qCmmm~xa`zVpZ7dwg6r^q(FfR{X91oRx%h&>U9*(oD{Ui5l6MF0#w7<}*BgaG zN0=OD4$}}xQdjr+^tlWyg2Ry~6iPJAtyCd1_2U&c#7^i-#yjBFfb^`QQ$^~)I}xdJ zfEN{U%)2T*_Wxb?>>fXEhxx}9BD_hz*6Ol9!MuH=agPj9av-X}DlIL2O%N6QAs9J+ zUO+@UmLcR?sbNu0_npDGoUBrxACMrcx|1$jz7+dMTYe!(6Uak9c zEUPCXyNhwrElT_O@UM8+@o8cNcUS^pVQq|*QS)8BNETWJqoeZ4JLw>_85Gw$blZ9J zhWt=g^=RGZw?S1h-8Fk7yFSPJ_g((3=^K{WP<|-#f+S=f#LE=OVZjmVI=ZP>g- z!G~`*g>MI?8l(te@8Cs$`}QlugadJ|O=YRs`d+0=P3`+L6!mW0*rd@FL(F|k$b`3rmaHA8If=I@rOXt8CyU z_JZss2`Mce5Yo~g5{FI&!A63Zs;StLC9-J_CIM8t02e=ZaDFaE^U3~=?cTs9Ow^I5 z9$`QR4Gy+^?ifA}>TkZz777*7T9s;)g#WIy<@Woq*(i!NrigI7@<2Kb7{YS?U{ zNCR&rO?+n(zuv$1u)x}ww+x&{>b_trY2M-mt5=}Y65Tp4LtMbH9XK3^EX*D`?fx?v zq|ripuTSYAWcL0dsAmaiutXs^6c|7Zs~nAVHn{LwXW_2cFb-Eyg*gP0_&hy*!#mI$ zQ%M4@mS2(fAjo|^JgkTR5hRoot%a&zzI-WYKX48FSeWYpuV*U6(;;Vo+)`nKItMXF zyr+b)um6hdxS@{<EY>~7q(%8Z$4JkU>;*(LGz}PuCAcl?!V_Lufkx9TuOvP_zVLsEHG8i z+Bt>PYqnj~#6&c9D8mTE&Q7_r<9g(GT5z-_cTW0wq{QkCp^vN-!+hJ_KBFhgZZ77i zKK@k?OqEt^+nusb)VuutM^w)DSro=^>B?WDjjDFkxWl2}w~9lKj??7|Uv+|`oIvKC zy9K)ITMr1qp1CuzsNHa$Ki-#RH%93B9Bi+6t_ImPS>?G3UAgQUuQo%cy5cpD* z&I(iarTw?!RN26`5(1_Kb65(>?5l@HYkb^$Ab*#K0)$fN;zCP^k>8FB^#reWRBbdX z9$4~Fgm?OLOdm-(cix)B4XMGcy1~9r405_60@IrHV>)Z30eHZF!WDmu?y;(79$6j# z^_$w&Z0?S{>kPlAZW7-?BO>ZtyZLR7g6rrz&9&}ZUE;mzo%x62vkU#?hW?kv6clgd zCqF^CV#A}y8j@JbOE*w87ql_2)-WhqBqc@}#9&do?A*jDatHFAY*OOH9UW{6{e+HG z!eD#q`#lu_>wux5-!~i2Q|YpV_nTOB2PhWs*-=DP^$cS573+i;@tU2?{H*ju^$gfA zv1}qS4pONSK0jl#CJY^To{QKB26W$Z@$x9z7>EfC41$7;MikU<9;Q{I1m3El)lItB z=fb!$gOgQ(zBoS>v+ritNHB?xl*|PN?8}Xw%u=CRng__X4gEw~+&+juP(U;PlULa( zC~{z2^udPV8{kxGvDkeS9S+{(hqKPS83_fpIbm-9XrT?ig-ajI*Y;>-xw-9dK-q$- z&-?ZBgKDDD9&-UiiUi!rry0qux;1{#bGzpS`(6g&q7Yc*#df3|;nCE8Tr8xl^g3mLc2B1mxUZ=oEgjAqH z&6pM(fw~6o$4u?tt*!Z4St!tPI3WD133h3?v?Drz1z2-rpU~l51Hd(6QxpU_fEVg* z%%?@YKistdj!eMeeI80sHNz+%B<*18iGTN68oDL1|9xHi_j>o}>XM!*dAXD2p{8R? znnu+Ds>EzW6Tw22@A5lzM-B0@!}TtQ-=&)FS5k1qi4NPq$lrs}l!I_fu2QQ(xzJMaHV_C3mf6|c*Krfxr2a0MT%l~!O zyo2re%k=oYJwjy_wa^@UnmAS1+f`IlwYF9rNtAP>Ea)b!~l=8`SRTP3?8Drn_$HyL>>^wKQ(33?tmSXM7DIuxddyUO9JMwu+`Po ztX?EH4;T*=(0|Zqw;C`BaYKLf^G}9kYRsi zCFku7DeC{Y<;X}iViw3y>grD^hd>e_(lH0F<}R=lg}w;C;h~xR_$y|JoJX=2DMq+r z|5gjkMVKmhg#tV%rzHLe(g-R=ZGN#Yee%q=s94^5E8)G>>|C=%%K^p!tZRKr8KQBe6`7u2m&i)Lr{>*?duye&_RC~9Xgi@9&oZLJG2*YygLgJ0w6x)0zg~;0 zeV_!ek-ydP%d7X}Kt#1f0nfcfvqT&j+b?iJp(73Ec;3%?-P>t-_?eQxEj_-3G z_8Av>1${elqnQ~A!zTxfg}>K-X~yx;MmL=Ky?T?N`p}7SKv?vDswh_ir4j)>vr z&{i#orDx#E?SkxI8Bp{CTFFBazzlgfhARROkYTkG16a2(6QN9<9g(>i%j3_HjB^Sk zZq4TY!u}u>+AX6p)I}k$00}%iNQdWiD%4=L3xJ202p(-j9s}!Ugh#-eM>~tjW^>3X z3IEEbH-n+CTST$sQAZUOC!scMF--X3X4X@y(mWDl(CmC|m{UdYm4pOr`@X8VAdxb7 zk>2P&bNVJSn0Z@Lzz8U6x)+NB#Hjg zoSb|7()ez(Ubt!CP)srQ=^9O3$Gt1&!7C%+6>raP|lo|ED+8A zZXGsey}rT;um|eQprJiY%@k?cwDj*3FVtHJ&~kcIgO&OtSVVC@QLM8az-$ z%}a&sa0#*5oQD1^f1W#WR9PjuuhRSaqS>7uCt)7oeK;;e4M%6w+Y`1IxDXYP=AaMM zxUI~~rxZJee;t*-wUgIdLLVeS8>&P_P(04?O-miKR)g6`Nn_->Tdj$ZrD`d7DP(f8 zUrqUjxBwf0$LpLX(TAKOk9Bf#sz%WA0l-dAqF@eDejoU_eFLfud1al8 zMxoOVXeW|cHEv*60wdX!mDmLIALxQ}6%HQg*y=l+!Bbd-m7xNIoX%V}F!q5Nif;UX z9~wLXExK1|P;mDP(Js(W0saWK)@VAMR$+)m82%5a%v~dvFLw|NlL^9T$X1FJ05}Vb z)Hq-9LIJgb&5-8Kr&aV=5h_BK=XZzi%U8J1DA&8cP_)4a{y+I1*a0lfG^+$6cYOVs z41aSQKP?nzzHjyFO7G+}=7DhCDR5Z?;4q7q)5sFn8sB=6Z0t7ip0~;zmy+JTW zn3tCe(Ci5;@564|-Tmdti59W7+$sS^wUv<+sQu5=Ux(*L63+%+9O2weJEN0CJ^ZQO z-tbMp@QK&Z7_T`@ZJrYHTog+4yQ#D}`0vRMSRM|(n33cCslkKc`e8iTjUERW*ihtB zdqpU$<$tV%b7L1`u_*_^XrtZy8;Cg>UL>3P6X{akbC5|TleUGI5z@wVv~7WEdc;)s z4~828ZJGU{pp7OV0nCpyUsQHIHieWBFnI8Q`U}=d_S(QCRBOeJD`7r%)e{JOBMm5V z=B^!GT~=^-!Oe5K@Di?7+i+aOyz@)}wjw|YljtHtF=KK{U1k;G`LO`UXFwv`f=ND7 zZ(^Hi0U(YP30GE|Un#-hLTc_>BT3Qa_J~iBpCQ005Z1VR_Z8RfAVqo@nh=R(OwQ3; zI~S2@);)_oCQhYu6^!DuMzTwveWsLvRgpI(CecN|97PIK z&8x>0g6rO2nLNu@)7kqcR_hS@Di(Ll$`gMtDzQ=dyX^e9k<>c2OdNJ&IkAdDr$AI} zqMGqDY!0mqsCvjAbbwWV%o`+AGLl{P5iNedvX3r4DAt7wqh&yZ^)-Ge+@Qx!b3)QA zNb>a*we$s6uL!sX^(_DL6PZB0*NoVi@67(-b1ep+K=ddmk*>hGT2osl!St< z3Yd}Q38Y<LQZPGtWUr(f?WlZ?d3vZtV+YW*-c>)m{MB_j}uHClS- zb9Z7Fe7NlJ@7P>7tg&Wz_HKZE!Rd5>j}C*TmR^;Wk*tB4eTRhR8G25K!fZ31c0R8Ezlb~XM1hOF`#P24444_gkj#3IhDWl_2p`wM7bQ>sUyH#Ht!f;e(964~3G4SeZH-B4>rz+? zNe&DMCyD2v7UKxTVrflH)9u#m)by<&E_StV2xjU|>`~ZqALO7&IFea-G_j-r3oB+= zBxY!cp+KSuq_KIYF4Gnb6(nx;6>|kem{yZakFOE=IRV8#D721!2RZ&${RjTNR zKT$!l5Af>A$^0v?G0*@};YZeEe!&e44w0dTeI$|D+QI)y&H_WpU-pKPfTYPZ+{-;sLstiXZw|Lnz_{3>T zIWlPMD#rs7fg}jnE{z_COAxlV)#WkMjG~a>J-W~q*sKr~^zpDa_}`J0As7f7t8Qy) zb^c#fM91TL5JHf`j1)*ff-h2i)gl_{4hsEJtDCKZOGXUaCV;wZ?0SEthA_7P2pP?* z^yu<{&hlCxojs5s$A`%j;RV239ttw>g4v{`uEGY38Hv|S`JV=u>Feo%6akOcdCYsz z)nG$~_}?Je3_EWD%dfbQoJAtj^j&}&%z=#;m|B3k$qI)NYL+%kaU=>4GqBY7=t&m- zHDFp{1)&-8 zmXuee!+sKm-Nh$T`^WC-KZtrgv10O3Z$fw85&gqtkGWV9yViYoer~#FCcavHW^bgx zwRe2@Th9-b*g7nOLfR}loj-g#r4Mx0MLjbmOvw zzFvyoKWQ$kY3sTmv(E9-V&R)*g^2jv$IC(76P_RUw9|j=>By-WF_Q7ul>Mu ztBzW<9*D6oD2UN)y$nF9DK@DUGJgQt8H_hsAeU@6KwO_j=2^wGR}vBj3OFdwyfRu0 z_e>yC%S}OP6xsx|4K;9H-2o=j?sfiLWAP(|@JoSYDUtA=}A^P|?vIt!oE-49Gc9B5f1(v-TGBsWs@1}PE zVE|Fn95_jX-2FL$t4S2uZiQXi;Sky$;Xsg=t5uWOpLGB}l~#j}4nms~fimt41gh}QT|p-a@zR8)O* z#t*E%t2AO9xqLA)oKGPxOyPQ)V!c1h318P=gXI7>QpV}+W`KA9;E7GEYuawkpru&5 z+u&?)NI9b!T&Cvc$OS%m@N%JSz^$211^j`dk!G`q?+&d@0jE;G(j;-fz!()Di@}!M z4lPnyBMP~L*^RmFiQePssO6QV8F<6f^TrNUc))o-H~5)pwyXJ=Qj?FbMoE3Xk9{`q5H&UDrjE6gL^BU^@-g1s?-*AYvrL`DP9y@?j6MrM_-ZQ zqTp2x`z;P+z-7?5VY0Rfy?)^Eh@$Ck(M%QVhF~)aQMv#`EzhxL>(!BpbOl4KdVg(n zbbLGpc`-qXp1yPgGGO3`fzbUMvsN(r1NMd#s)h)zY$gp>&&l7>M^EQtx&K?IWOQ=Hl(a=__9zJpGg~-^Lxodc82rB36+<(uDu8{?h#C3=2ubRR})fMu~%b9BLrF z&cV-*K5hWLiWO|_q*OXS4*r0Qs#KO|y3b5-q&ZH!fhR$QrzcvS1sM-Xov*F*`4khZ z3P0*uC=5_D0hHfSlVO{HG7ox=CI`W{xxi9LMS*Xbqdf|G8v^iX zvcZ~+1<$9f5i5B0ksmz#z$v6}+!=)59}Ys)X+GHkxB*gE;`XoQ-ZL1nL1y0p*59ef z0n8q{_wI$mvw`sL0y@;TJV z-0>rdFFj+!`KiS+;%@qm*NnfdiyLOcuKN^K!+lmOEs`a&G*C0a__~gkaLJ{`S|q1D zmqBFl%n!+z=Qdt3i0$ZANi{bcK7M$aG%q1R&nr~!p7i={wD`2omBB5Opp8tw5FFOm zcKkhUY-Rm+<%YVpwyx!W-k)+$4pn&+SlvYF2+?Iaq{V*aF1r{mV0{})a`N~<6ba}lPt9V|bQTx?v45BK7R6Nq8^L8I7ct-Ec@ z*LDbGN&oxC7V@9xm->L2P?*eUDYLA9rA)o6#5fP~~qf*AH=QImJ41gEK%skOgx3;QG1)d*ZBVh2eCIp`+5 zoVu6-jvuGV`O?wa8%4z=VE_Cg^CpMlLx3pZB)3u{Hx{9-fV8UlM#&#gP4} z(K;bXduz^a$cVSp#l`r|v+I@1Cq8C}_o%}q;?UQLh_<{|7g7vgRB#Rd6@~a=+uY$_>^7HNi0Cr}j5*;%f}ahbr@kg(uPqsrQ4OD`iRdLr zN^6;(E|4~#R>6=D6QgW(CS-Sh7n}ZkoPdOb;MTb>>HB;}N;Ow7>i`Jb{EMbm+Yog_ zQl%Ii*6uKC*G1vB951Eq(bL!gw>x*EtLym zwQTi*PJ$cFLE;YsDT{_mh^nZjmFIxl3c=zJAxM5O6#|sk#1|~ ztOAMu%^NBRRw@<@;ypZLAvA*$8Wt~H8K5yifYjITAx~FG)Ar|X10$mqeN!GYn4w!h z#yj6^hFmgqHJttlfKXIG^c#dVgM{|yU^UfnO7@5R*6G00-M`s+d13c6!KH*W3Zwn} zkS=2XVy37)CI%k~kiq2>E&BU?fXN`5o+Z#SSV;YF2M`=EVmTkT$?E<9!XIohaZu*a z4s-NfJ0JwCPC=bx)Y%8QiX$<2m`$Tb29Bg<$(Mn>_h!H~z@>BRiodiL1nbs|mRET! zQrI|w=Gm4Mk#FA|J4nnPp~sQm+Nr1@XeX;f+|!2jwX=enLcX7Z_YOzOuxeh>x3(~G z8&)S9G9pH)Ftf|OB?&;#>FMi1<;nC*g`xY%=X}s@?CjX?9+J_2}YxJ&_L@_WOLu-0yvJUWQ7BZFlJmDIVW%Wbt=I^O~1LA#Pr zW(RggvG-45IWQZ|nK8rn3QqFb;rnJCU`N78*Xk;~ku3-79)fQY2%ZEG7yeEqu=N4| z(HwkN(B8@k36UW^FUUL1E)BT(NO_`)yyaXwT>5u_zz?l^*WqiHr)FgIc4WM*De9u$ zYeNxS>nLVGEWozv6?6S+Fv&9~$~ps0=4}-yYW8JP)@6gjjG=P7<+@+07#*Sd#-|$x>zXw#M#u)#3FLwaG8E z8&rgo>Tc&k)Th?mbr)|9ecKdAZo)(fn~U-y_*{R6I_W>dPb-w=MR98l8;Y zJ5~4OH(hJ&g!l8@uFx_vGQM~URV8t%RwcYj@v2Hi>Uav-aCAZ7$TAX5-iLvsY@2fv zvH?hWxw#GQq8fJd?ZaQ+?5GhIdjc4}wywhNdM(JjrOb|nP5 zvX1{;fcwH{K3*IN-1<1709VtQn0j)`LA5*htP4eXv=_*zYjkdYf%M$&L9gp9Ki+aZz^G>Ef7mKeWDCQKD4} zZV+_nlvWy<7mct5JmleMmc`+Y6>|NTDh%zTHldnA$*0! zGEAr(7~TtC4Iy(u$iVz}H#nTGb?0=R=z<^^(rgWO1hTDTFqF%lEVCg6LU>!Lj! zQW~vSHISqk2t=6^Ofan?W(Y^I)U2oVMy2LxP)pQVAMxQjSZ9#WwQqEkCMm@)IEU+3 zsyHz`D_80&uUWW|(b7i4rme=mXJl&w2#_bkI|#56p-Z*y?5lhT=SEg&!Ai>6n(y(i zhvT5>GEz~=3huE;&eH#3F0N3b;rWKO&NC}v&wBwihrLOJ%A80vTJH)iT0i#E>pQy_ z*e+Gfi2R(7!huaK1}6r7CSCl%v^FaBm-*mn>UOo76{y+?*Zb&(AD!mQ-EH+S zy>O9xNkKL@t#@+OV^{5d8QB!O^wy!b6ZRpEC-aVJsYfX+%g*YhKiT$HV5lDO9 zCTh)G4kzRT?FbM^Hc1JuU@Nsy+2CQyf=e5-DB&#$_Q~1p{ZnWeIA6X0;K9$riy3)@ zF%*(;4+-jS$x^7y0*|c=3c$|a?Lt$952UNN;h!j#jGT&gy5xQOq@i<(Br=T3JC_cS za)73j)$0oGUN2Kpq5w}k3!4XWksdgUci_JQBOlf^elz%Sw89tg$IpMS1*G4Cus1O; z$TS-W8weS8`8p#2C&35IAt8Go_{3RP@DzW?;DssRsf4#adYzXX&aI+Pnw_}JvAOz# z1eZnimhsJ>R4c?3p94QM`j zMrF_^e!tPH&^az`QdAo^ExUWw58&TXgo*MR4s`VNI6drFNtbU-d0uWhjITIY;S(pi z|GD$LKRqhyqUwDk+0t3v!M}_vH24xdMr#5x!USVuMx%Sbucmz2CUQJqW-G$KpH<97 zkl5LoHEF4q-c3{|H8D82w$F-RM@erwQ6rs?4$7|M>QL|-!M=Cc1@{)iJTd{`y;8T>1;J1G zc(NLH(6GzdE8K$NZ^!I%-wfJa4ht{Aj<^#kcZTMBxVc|==>j=i{iJPJ0U>xgKi~6ori~plS}MAOdCb$V#^?IARJlCDJHkZrf>cRMBFM|N-J19H`s5X zSn4&R5a^(Pl>Z9fg4=NtDG8dqmHTGgNXAMKs{w7@T1+Z_+DZgkQAfg`Eh?)&)A{mm znIaOa0^{T^54>xYe z)%5S^!d=0x1sQd>yVoDk3_OrTIJxX&Tt(C!Z9mx`?T5KhZpu7o;!@Wr!#= z4x?1dUazJ7=3j&>x^czlpw_nR>7eR2JM5JeBa}+(teaKG{@K=F!$$1QbKzmNg`7Xp z;mbEz>&U4)1OvANRTJF7aK_B(jj8v7Y$uWWGNG1$dS)i$#!h33%g~zz^GDVaLpImx z)_G~()v;Hc2zizaY5S;8cnEVW`Z?Q2w2FOp*VW@-6Mu&}ofI-dg-|}d6Xs#rg$R!Q zcE|<|W`E=*=HUT=M6epG&vw3%-=>8J90rPLx^{U*f3DB?{vBpz-LK_s17*Sb8FF%J z^=S16th10(F+%+Ut^LA4XnGcN91VgFXe^jtLM&-xAa&5X)dVzFB?pJqpbaRZ-GM3c z#B_S_HJqBrCjxo9qAXV+QX*eOpt#{De7}#lgW+qvPacemX||FY{_VcJwGkCl;91$k z5-LP@lK8#OmW%suK#fk^>*D(*HFSu7n9EcZ~--~7Ttj5NVJH?-A;!VLY& zoW%n!cg^O`#`JG#_d-9CrnZ=+*;;?9(mr{E#HK-~xmmrwcTKtM#?>1po&Q#_u;ZKh z4K(V=e#CWm`A}(S5m~PJsChPc>PG7W zD$D7BskSC=E*|cdR>@LRTa=3KvIselsGXzu+5`zPppZ?7U;-fV28F;%!Tyh~iYgrb z@$*Ft*gT%hT7{jh%E+i0^TwRnDi@VFh-OGro@FXC8`$I zV%%srL!a{5ryS+Av3|4|Vu2vNT_(rE(+2U$YmUp;YWOS3Pi;sJ{6A7Gnr^Or%pI*J zvf9%9v-eNrUG-aRhk5&^RPii|@SGRVqwtBlwgN7%@|xBXQgSwT_LAqgKCK< zqBga9fP>0<8i--Oq`Y@8NcigWZ1X3AtwWB=|GsEy{t+OE-qmwmUTZ(v@4di@BwAO| zQzV<4f0@QQcc(SUjgqK#sx4c}glVg|;G5@&TG-M+fQ-LMk#1ukt8_x2IIDQ?l|7?1 zIqb*PY=Yc)9V+3Y<-6{Gn*8t}()3g_H|XWll_OIJ)?d7_Hwzi)7hibZs->+eaT&e; zbf0QUzLJ#NmH}nlIpf~mO{e>{=~W9xS;x(#ok*Wnk_ci5@{vE;Y_+qX<5DR6_>nuy zC<=vajhat^iuE7tJ@yg&6p@wjHsG7Apd>DUPmD>z1%<$Uk!3N#Cn-t86==?eB+OO- z(%kXI`g_m@f`x^+)+xEM9E^4mFlgX1A{1?w?l?d_av&lDY{McQwc7ePSy+HR(r?Cc z299?Ha0+xSk&~0}WL_R;0&;clv0q`!72mI&uSgsWNhi&KR_bH1^Q~=j+PC;2L99j$ ztt!Vjt+L}9Bf0`VbyaE@JCHU)@>po28fjzDb9x*V41BH;!r3=15JcMES#d)ID`C;R z?h_VeN7hlGQ~L+A^f)~n9V!AqAX)D<67!Q?^^t~hJ*P0jg%zRMqWSC@P&(p1t9we+RRaV$sBQn(-+ zC66npnyc$^U0)kq=R<4zXjj*u{Tb~lfy;PQolVpBB78H@N)%EuG7=zBGDqEfg!P8s z^oP{#0hj<_iUTCmMG%~2V1L9Gk>v(2liAKDIfRibACC}?I>EaMwH&RZk`&;09p4EztyDiD>wxC#KaeD8eBqdd+;FA6tqlmVH4gmG+&2hUPUosZiVQytsH&+%vl#FXl)0hzvjT z)x1CT3(q#+s%V*dr1EP|8B{-N&#i|_9g)*nbHvSUtBZvK-WLo&{R=mqbSwYOlGtJ@ zL}VJcNlNkYLDhSijaeR%XN7OL_O5tvQ!Kkm6VWeG5DyLrlaSL!A5Kq(FDql)<58Hohz%PSTya#;I5?UuZuW~qTfL=0h@UnC~_+r$1mn5NbBIf0|tgneTXz1B4b32$q0yN3<14ONPQ# z8A$P&Cs*TDkvJtRjg_80l?3tTyr+Sd5O!ez&D+_mhBx1byBURouKy*iuY&(Yu?+(S z$OcO!e*c*emS_N63=Ohfc*ZIx#{{9aH-B~#1S*hXM6h=Q`0>j9t+Nmr3$T=t9Bu>QUkL%j&VwUpubf zxA-FEa+o8pdBu4Ld)0l&JHy;B0h`V}YeX51=yz~UjUh%|v4$$uGK3T+h>CeLQ2Wsj^0 zv>4=~MTw^(Up#+r_vCSCe-_3a;YPU^lLvXr=cF4|vRI4%g!>9DszrH*mz-}M?_C_d zd$&a7Jr>_+VT9Ax*8W`15|iJ+U?y5lE>x!8OA%|PyU4mIIu6s2%G2h$UCUd~Y7~{ows*%mOFj6zB|v<*R1CWM#s|T`M;sw zkzUfw-qh;m*n+JQ`Lg3@O$Uda7*skBlajT0x*5pMxp-ev4pCg z)8T3;uYpMTSLm&v?MpGCg~nOccseZ5s6cC+fpz$YPoMsA>v!3dBRK&?_5;XW0^mEJ znVK*a9lcDigLO~I+gnh<055PfQsSRKeqcVT_p%b8K~@d~WJX5<{wE&)<(~M_E#Tz? z0(DxJAo6nAf}F#{380Z9i=`u=F(-_V8)tS>I#}>{bb}=?b~IH}GHZ!dMJO{sOQ_H{ zY&Pb9@TM0PDYw!ZJt&LXgFiozZTaVG5Y0dqEWh1Go+yXybjgB}PvQ094puF^Li_x= zT|-tl;ylPf_e!sza^j9aFRX6=Fv5}}f=&J~ExMD~dFCYI`qAK}OlSweW?Nf56&nX1 zIb^zLT7uDsU)~wzJ8`YqcR$oGPS%%syk_FOku^ejpGk1w_E12R@s^c`t=Xfcg^+CS zhO+^JqeZ4m)TpBmF9%_u)@?=U_N-yc@NoAr^d);A?K!XMOkebEfr$F5O*3?gSG%5$ z!&ems_k#96pRw!ym0#*kdLb;dGoF7KA_NK>E}@*P2kxLvH|tz>n563*Ccwxd;YwJh zwDLb%2lLIF#_KvLiQC;iWF*kX3oAmfE8Ms}3g!SX#06JZ7Kp=@Q3r5d5H9H~xqyW? zR=!qxOiD^hP{%?7sE`?siZIxLpaI(iJh=YIKFVZ-=2w6~wSsOT=(&0q!B~FSiNFUY z0sOLu{s;^b;4X>1-m#HW4xf&HK&n>&0&uPKa1%3!%PU$X)4wA0f_~)X_bbq1J){*nl4m+_C3MZSGCUeRtgYs%_SVv%=*$% z;#1GAqRa(oz8@#bC*k(oEGEqFNsB(O_qON>kxJ9h-!n1@eQ|422Ujs-f3(QjMfY_C9Wzy9)pb7MGXh7W5H z=~GTnui$Oh0-B?FnIRN?h9ecr;7x{nu#1HB#OqACKt`wzLB@P=fyY5%E?|$II^OUE zzFSA3Km228-B{c?mXC={`YX4th?7o z15!0D(pj82e!|0w4`e@VR+b^S0D(KLwQB4_5p8x-u3nY-om#}CO=u{4r3uuKP#=X` zf47ymmZuy(Z+wT(@IC(ho-{>;GWU^e4VAMqJWTF?W|zlS@L&X5?f;-W0=+8qeOi5DT;LN8W1lL|Im7fRCOni6HFD??B z=MU`5%dE%np@$tH!Yek7rghc3OiMXWY8$lf2S1-Xd60QPd9|@wZAw|uJJHvvS27K4 ziJGF#Qe;Lu@QmRCOpNHLfOjPEW*i+#D!O(;4_eWaJgHqg#48G0mbyEKRJL~=tX4K9 zz1{!#{Xq+QE;u^;5eucPrrJUu)@ywGfz$$FsPpGbG5lBp*OdX4hP~D1Y(1Wx-oWPH zY`@8IG3^C?FVHJQ#4P>Bp4izvR&sJ6N=wXi_u8GNgbNnObNjr^6~LOnc(_J2|O%FJod{Y0vKs@AzlrdP1sF81z38`!!}yB zIuW9@pYCN$MxwJbe!9zp6g@**NJuAI5YirX_|PtmEhaV=pvGU4eyK3mSb=>7ICfI& zUYEPCKpBVij~`WQrr$qxgcu3fm=|4Q!2YA}I&NIiTYe`P+(Mn(%JnG-?yvt4Nfq_y zGcK2p7!k1$K$EcXOs|nga4I$>@&0^4_?5(UcKnLrx>wvStxnsmfSBJsS4xd}vp%HO zayQ2K?YD}uNA8x^Y`6y3YM%xeai}gE;9cZ2-O*IiHAs*p-BkL(zu~;GZlcyV(KIy2 zWLjyYS$kUW^n&m7*J5!e`HA$_3j5Q&^sv;!(o@^b-%HJEGH%o_Q=465J$D&4jGh7N@0mXFN$bLjYdBHfHj4d30#q7>2F>QP+}!!$WPR9TnuLlqihspXT)Dwi{8}n#!sUJO>+- z@s}s(TdwnM;xq&^!+$(9qjg&CDsy{gQ5XdW6W(+q?P;f5L8+OiO|P0*^VWX;+cTU_ z{sn4PtE*47K7s1{Fi~6wPgS@<0OxMG&hu99ueLGarR~J~7vaTPR~`mzc$!H0ld`EL zM)0tbQQVQDem2SQc(M_DWEZQUa&5P~U|zQ*(=?HVf62x40!H|XcYS?}d$*=84*WCM65gNIeFk}Mgpz+NxL(lIEVcgPe2T56U~B1@=X&Z0 z4R~_-^_hj)FrEuxSr=h2yyGXvAp5$|PAsPkKvAfK>RbBvXjX{gAfibqiO;*baRs4P zP#`aG&HM+O06PN%QQLhp|L~NQ|8N-4XNA-ZQ{ab3l~|j@6|uAM9F(EP0DcS>#!kpm zY>Za|H;qDsXoezR4n)1y`6Kj?-nWv_p{5izJ{=$fVa0=>z=&u}velPJb2uzZJLYS@ z{RgX1;y>(-xywr$DbV05fnHzLf)kTJIBW94;t|T_e<5~dX|(6KH-K=rU@b4(p51O) zt)zvvZ!8*cmU>AhMGyNj42F#jh+;=7@~c_tvoT)$uHHG5yP&1mDZP4izM*d*V@-Y_ zhPU+QDGL4V5iCA?dRkrX5vaT%%MFl0+wgtova+?b^KY$W4s6J!Zo>|+K+6I^lUORH z$eqK1IN#3I-~1*4IM3vM6K9s(ndF|Dnld3G!U3?8j-CkFhJ)zETEQhTIB#yEW-j&S zwqG96pyWfx?AN~55Ur?EY*1}KlaWh8Eu55#Zfq? ziLxhL7x3mj9)^ngIoMOSg6x1!r_T(S7SGfxw$&2=L+%52OmQ(k@^ln{rL~a(XtdCL znnRG2fi&Lu_)jGRocrrn<-}fRKvm>*6bQ3<^y*C}y26sGB|aPUM09pv(9UDdZQPOX8=@#r{jspnXd zfZUarogMR?o!2GG<|%p%(ptwW4=w(#*Or#?0>&vzJ{ZGO_>{b7;e+g4w$$^orKg!} zyL;~sWYK?qxuvD9qG&=dJ8{8%vFqI&T-C(rzDV)#$9MTM4Yc?U?9ZX~?DSp)VZ}+i?D8JZD3NXFW>^=8f7jUqXdlsi6Y=#xGFLJ%63G(x(%t2=$H zGdpncSAR8553OuRvr z4=f=2cL1JXoZsyEF9HEzeuzxQrp8;r4!s4rEvA?|zkuHQ|B>EDOD+&ZA1o_gyilI7 z>Lqxq8BtSH6GTwfnqOE*pq6;jg!T#e1dv7FJ3522M#q$I{m2+vDq!Tpr^`)+%?GSg z*qE)JvVj{13Yom+H-hjmvlkW?m?b60wj5nh&@_NFdqeQEyD(FnwBKeokc}ErotDgh zv6;j5-X^Bz>r7?_7=OGQPj;O-Cd50H0i6XCw^D#TEMi=X&uz|9$6YUe=;deJ%onKJ z@r>r^-Z~qLqm-q(kvPH6daV zmT%By(}_btR3u8PT4Q>MB4P7Gr&r$9Ji&dHH}b=!j1KbZ!h*|@Y~SAwg_;IVcNRJ~ z^;C6F)Eu0wEf1E+EiOKSY>WPYWTh#kXvqheEq}f?OO*dF;;9e|wM>UA!=EjLQfZ`p z1k{L_=K9T~fB0@STxlVwrTz2z4dEvZ-Es!?7g|*F2Tdp(w;nU)>}G=MlGG`$^CtvU zpO>w=!faWOHpa298Lhq=k5qYmk0uED9mBLALCDxC<;=UVs6wDl`%1a>Fv6;^Du)iQ zh@{%Peh^$qJMRi2drcQ>a`%<~Otf*%)Ve%QAt3vB`YC3vG9!uxY_CrcW@7{~6Qiq# zB3IbI)bi_i2u&H3yTO&c`swruL?6f89W!&A}Ymeq)F*eQ0ELCoaN`xYjb-0sIzK%E0 zO7=-fPVRz~nAYu+N5RY{@KvMUKSUZyEeN7W43$0V&Zd7VD&R(ilqXf;<^R@h4pZ)` z6}gFLgr9NWj9G$#hESs`9(~5E@a8ktWn6a+{Gp+;EpI7_rA30Ic(P5^YNx^>|MEFJ zMYR(5-wZweT&>!zRhd_6QcWc&qJt9?EC#zXcN?Ak6V<8HwDmN2+STI!jz8V?ng3k< zT|KU#NcYnCo54Mm;jEoCI-!!)F}{J6j1bn@V)p@)t!ws{H_6pBmyWJRj#c^)*9RQl zE>0Itq=i|}%?+QDa`BeWXT3pm>m9;Z{uQD!cDFdWU9R34)VcTiPlNP}Ida3J@#}tD z;?2P)H>tj+`h2k^l8MLuM9=?D^oq)xGc{u@Jt1_wm{y8-^XG9>Rp%yGq&6HPYjgibvjqkDJk)di=Y&9I=bFD>a0Zc1%BM5?(E1rNH) ztR{>|%lK{bbTNEpnwz4M4d@NWc1sKSJ(It!Jr~RUJ~V){7xO`K9|0K z`UUrDV^>)9?vc;MG9N_Ye%(~cZSVLhm|He1!F6%?@K-G!%X#r5ji+67}a^P9d~hZTc2m*|W~^pXqQ+$CRJ^OoBw{eLW-cRY~$`^F<= zWRL7kR%Gu@$O<9J-h1!NvbRL`%vPk#?47-mm7PuY3cuU={{B1Xyv}(Yd7kI0zAn9lCps1NhBXqO#pFaR$R=kqm=XMV)eKo>GSf=Kil8iGm#=Xe`@CfF?USIjpUdW zu9$PmXRgq4o9=DxRUiiIT|A+=m>w3Hk|KQ5e?YV-EY3~QsKD)&sc7H4rf-Y&5YFY- zr-Ap1Z0!yIdW7b!=r|_LND*NpBerfxkMZ<3;xYL&#)afEqMY^eS#b)}xH`kC1(so)Ff0#p!?sT*R3mAR>+3+e< zH%2W12x>Dr->fw|eD@%u&HbCCEK+W^aE=wys{pr`al?1`(+P0&EIX7Coa)}5(T0ht zp@l7lc3Q1@>L3de;dhI(j{5AfnBc7@mkDK%0qwGRm=|Fc>WOy3&eH^=3bo z{vm_Y?it!E5j#>dW%p71WjCssO;=88*3juk?|((4sx38~N;l`r*QU+#P!-YH%i}Fy z`-z?NV=p}0!1cQz>3tqCN1c< zZ%^M&E5?v`_j$5@+ghLaa?FZA1j++PWp%_=_j{e}{1Nmt$PuJR%A6(Vw%GKv7uAOk zg{=Lqg;xy`DOMDGLXw&vOpenja77Do&~yFZ5{@Oe*!05x;Cvkn0_FX^=9`RIaRY@v z9ZFoESz6q`A}Dkp%^?O#JbaF+5i79mvnlX>9Y+TxMYNNl^5iKFtoM6B`kgFw2;glP z2Nh^^ai z*Dp1yWFo>OqA&%|&+iaiACs9XJc-bjQF#=Y&6;cVt1orq^vwwI*!_Ro{LSXe^}PA{ zjE4)-nXXY8nhx@6&v^(*n~GaM*l%7>qN1rbHs+eAE2|vrk@l=xFye~y#GfYnw%nQ- zPIiAQe9kK(J zJwqc!d*Ua;-(l(4xXk#jPZTrYa`ulRz`pAzLhAF8@YUQ^I~z`ViaaC9o2iz?LXW%I z^o1S2=p?B@t_d1hzq~Xe4*gkXlaPz=W5dJ4%*%38a>o;|kvm%7+ym(!YI^Dt56;Mw zcx2#H1;eSzvvds{?rk2~0HB zZK~17qcAcwf!=9=cXFM!2Ts9A5NylxPEP-*ciYO{ylJ_M{TM>T($!=dIYMzm9*ERkp?Xx?mVOd7+CvrvaCUq}#)PN6w25ry_%S!4q?}RJ+Mbx%>enPu3JK|A+-*KoA-9b3bR~b88&%49R38fM@lj5lCfj-V^Y6Y6rA8mhX0y&w;7y46peyD#SjA{=w=0mzv221& zDauh@f=B*KIw@e$<_&?c_duuPICW=wU0nymx4mTUufg6&kk4zejlZOXsVxe*Hh^ z8rI#+#CkQVDyeLUiWQNAK82MS^?z9q_}!oL;FK02Ery_bnl%vn3){QQOv;4puRtTH zwx286I-`(1{5GmK*D|IchnU;U)DDoGCC9fl)_$=6HTs4fdYi1Z)C6-PQ@~mXdAqnD zKnQ&B>`DFBCyd%X=-vupo@y)(D*3Ub!N)JLAnXvl5_ys368QxM&JbMlE+b>Eco`Kb zqZ7n9dDUuqddjdP9(RWoAEoAvOA!x+ZOaEE(_apQX2Xz=AuT%8 z^q2g`?}VgGIhx>TGdh>4DAiltX6zsGHL{pwNeOK)-kZ?-okj8@7l&ESJ8qNeX9N8I z#Dw2Fgq#>9Oes|ks6>}IM+~lVBviQdNZ^J9%Ct*d{zD7iiIBLc+_9tkRZE)B%H>0$ z()3lBljPAu8|BT8kp%USzvZYqv-|?<=DXC?O^^B8Zwt@mm;f7K%eYBQ zq-YTRGV4BL2jYB>O#wtn3oa;`Oa(6l>oLjrWbE1vqwGIP%21=L@H^kH!cs^uMI`te zBayf=oR#b5!K6ipfkc_e7eTV|@PVs*{RohE+m`hb;KP2K*!2}M zmy`F8vgr^w<9>OK$UX=b{aKjhN9vyStZt(qjdmAe4$0gwKUKYlmKdzi#OgC@c~3Z9 z*Pk_C#sD5ovs_8EvmMe0^!=~g^lXuHA&`C+JfMCyU(u1~!Xe=h@4x>B38?X-P7Qrn2$ zjmGLcOY(1l!-w%p8a8jX4n4}1DM7m*FOhC)q&87g+kECf3{66_m9^6@OP-wKl85iD z;`%;ry5|u`-KP*r|I>v+d41A8>vfv(oJ#n|p%=+(&LWQXs3#G&SfrZJVB}~|5Ah*> zWIdjnZ)4tjF6V~cSaXS-1 zLL?l8M)I(7C#=l?5UMuySSDph{=W~d@-@-;aC!il3VIj|r_%bw_&7mn4l*M3MOuJx zh^#U)C6BU6M~hgk9;sZ`R5a%VE#ph%AohrS`4_Q#ahx^$Q}4dK__B@v+xO7_-|^nf z9YZBa?78mebN1T<_N2|lot`KKFd0&(fAviz6`Mani1}UkO;cFrI>ti9X@} zpgV)zv{=^TkZ9!}nqMH2^yeZ;Le-E6@^^uz3bYDIJ?f^<2TFa4lFuY|f<7u>Qi~Pz zas|8JGZ0FrXDD14cS2B$kd)HY%=G(1Ri;x1(Z>#)R%`k3F23Sra%6GFADU#SagZcY zTnd8eZhpyXym=>?!dyE?dr`q^$dv-hTQK`ykoE!k{q@O|g^;Ig&-L5XgUTued3kW% zaV}f~tT%v{jINk}B1J6>Hq-0Ra4_G(uODcqLO!nMhtN1cz&yG7%xyZ!Lep*bdf^yJ zJT|N-KH4wAAbbV1a}$qfr>FqP`v-!@w|OoRCE0HE`|R%Ednqltz(7zNo^z}}(yJiH zN)5qqY*RoO2`}jEr`x})h+~r*BSC;@oV;M^%e{uVuGm?CULwxi_A2gwpC4gzNaOdE zYjN`E1SXgEWB%a=4+N7T!O%Im<5J%7r^e|IuT;-3)J<3KE1PU8_Hpu2S#|6Q_g1;qpF3C$AAnN1}0u`XE~RCemCQY_VzP>kUl*q*K9wie#s->3P8 zLI0yONP>6cCEChXw&WXV81LJZ-6~HU^kf@rkALdY?OxtOxN2tHj{fwU?fq_qAUpp2 zYL~S^OeXcuI#nS{sCo6^awc>quzd`Uh+oAc)X;b=Cn&OS+&;B3sCI$D#9=KAVy5t? zEe{ZLvl|v&WvV@&VACsnSN>=k8MNIJXyOHgPrpQ4uDIGrY2&Ez%|I$Z zbMTh)VlAyY&8wWsno=CZ|2>ZNI}LsQl8ku&9cNE5`X`oqVe8U?*;_e*G@W5T*Z;K4 zdn80DY5Gpe3wrU<^>G13K#|7BmfDGwZg^{$37!V-efQ#nI z_$1X0sJn!|@ogkBYtWXEvEaBqK=d7I2Zz*OnAyq9&Ko|KVL*Js?Qz=>vWDP>MbJJ( zL=j-7{*gd0tF6F;ZtTT{gxG=~jYk6x0N)afMb`!raaWu{^Y_a`yRC^NYrStC;-J=( zC(s&+|CS%kXFK@JzR*4-ZgP|PCSBMMvG`&$^iEI2+dn}Udb}30q+{;#nL^L1mj?vM z?2hWo#Z59(WZH^M#q{^lV#O~o`26Zns(PbBI^^~m`^*mi{N0-Wmx@>usd{;|aIRlR zU*y=o*uwBlL2@0+coX=Ww;v?k z^LSovZf?U=T}@3dU_sE4`U5l{a#Z9+FwFksbqY|g03*D6`$cL~j|P)9 z$-G08NXReB#mP$%CPJm9N&1#d*l9>9U@0$dnQ}=Y;JHpMt0r{HER0&>%{Q=sR!=)p zCV{)5*g)Co7M(s;6M$d()bfR92!laB7a?jr3m)FjTt;+C@+ZbONSXeBs5%r`%=jJ@ z_bSxKXzm>;ooL#z$?>IUl-^^ImHJk~Ls8Z}E}S{yFBI!HPx>T0CrDiM7)ev}eeIn6 zuGfNCb(vn@XRddG0$;JYmzS6-g_yK8?_aAYUPNAFFpfHL3CvPU2C>DLGOdu@KjI~^=@06i`UoeGb;YtQ71IFWy_zRe<(FRU$ zw^_My9a$_}wsdYP>&69^$wYpV=AEMG$a~h1bN@2jeC4d_=w1L)0-F)XH)GKenY~aH z?mrLk5i07_1$d)fl+g{2_j);;xhjPG{%U_pB;p&aGA}Q?WBPS9q5er6y)F9{qboKA zN7tR#b#B6%FG%)(Apv~WI!|$2lmNA!mXsI|b0L7v|FA4bTx-nhcp9mdllVRe#6sA9 zY{-Jv<90(XQ zT!2E=qho;aLKMBied5Q|*23-$8L-Tdn>A3Qjg^Qp-+e(H7Dj9_{;uWz!@h2rlW}^S zbebMo#QmtesYPR@`Pa7Juwt%UunQ>njVpsBhGpXk(Bz5Pj4f3qT#9Nhe%3t9>t}?fV3X&)#urNz zA%`ZZj6dP%JWq$mOglE65B#jqRCk2iJWk2~M9hVfe7zxFj!AN4wv(vw@lADoW8u%~+{82=qWI$$0tpFT7+v=+ho3AMq18oYwipO%Tyq(lhPqmQ;GRUZh) z&-&CwC9_T*`?8Kv#s8h7 zx3}T6#6|jR@64=7j3MEM9nT_Iicr@ugdC;C*VcIr0JhHCq zS_=N`xEuUnIKO1!XOTypDC@v$jfAB&hk3q7@jfg#915noO8=_=GD%}4J7b_+^JG)8 zvZuyeeiE)b*(mfhI<`Kc6dZi8$G!+zwhQ$N?}){1nK&9xP!f<_);J6|k;fbxMAg#@ ztX|&~HXAP2fBU!L5o_XB+)>QFWQv^Zk#T2!JikdTByhCS`k{eMfDXJ(w#PDRn*wUS ze`QG2`@DXL@~1^1H&#;E*j}ciBL%UC=(eXnP+dMDjd>)9E}`RV5|trz8E2LPKr4W= z81JBi5cM{9)#zA3MP)b14X3KAN_FZdjKEKP1U>|yKDL|wTG0&(XschoZMP9K5M(Gb z>kr1N@7EVwLf+%PUN9_^ep;87kwL-ZyM1fpJt0^0_7(!>x$g_#AW&lU=gLO9Lf#7w zHnIgPOmxONW5Of|(jU17K0m?wiyB6X<7ezd5pE_aA9yFML@T5O4WW|tUDEP-j?dp- zhqzaGPjeT`Vg>Nv_DfZ4*D?FJRudYZZr_SU94IE3^LczP?BL=F9wEM)E{hX^uG-RI z6BRmUh_f^eM&TiUipNMwwvqZNRH;9 z+3)%t4;l9l=dTfT4m=qYVAvLG*tWv_%I$dK4iDc;Nt8VL^XC4`pO!~re0yID#F!q< z%oiW$Gkx81#SZ5uEh=?r!J=nOSwFs76tLO0RME_5hbx|zv}YeZg3aaZvoI&3=vacu z&V&vuf@y$*87Vu@vo=!Uxo-?1UhSLsC1*My2MCnQkj@hGoxUnBVS$~Xoj(K?i&)+O zA`eOF4QUuCPM*PutCi(g2Sb6p&1SPcqW{d-DupVPZsL4))8mVm*qL6*hEnqo_9OuD z9WP9D*@*1xHwr2)Tst5oLAbo@XcYc*+@|vla2CZ^P4P|8)oqx5W={8*W-2L>t(YWAyed^`f&_fOhbRNv;`Rm=9 zC~~1hU5EN`BRaXv(I*Ek&6Fah#K*_q{uS=sp%i?slq6}T%_4E=L4MsKV{oH;^0AjI zlw75$LP$YbxhqHGs(tCl)2IN%qw5pL`#Mk3HQjMWLJ=jCWyW}v8u6IDu5gaKNfpAX zp0Qa|W%AK0022KD(a{mRU|@~oVp|2HrxYO$T?X~eeQyZd+TDZJz}1JCKk1ENt zhky3}j>~iQugWZ4cz-27Wt&z1T=6P=i0^gvx36mSaSY+&lf07pln(x15(O~LmC03A z{Pr~J%}vdn4tG2p56f#LiBDJW`nVtV&tJzFe>;epXx)4M-cupB&J0iE;CRNMTzYT( zqy7$0@4F^fS!r%8YJM?X(IpI}h@i$|63lh(&m30Ct0S+AD5soH3MSyw;zk)wba* zn`QO&sX&uUfCBZN@`zW#K7>(l5vY*vkub$GCtd|=|O`nR0eobz78@I^4_f91zvZr?b zY=}*L*H<4*uvx1@?-}g-BeAH~AE*@>>ZR)5F!ygK>xLf9^YKFx9mKR|-Kx(LzasYb zJsU2lWLz4K*Sd03nJK|FP88-^F%G zWUH#Z6gt;VOU~S?UzuPZU;arSH$7v&^E;kjKQDCQ+vx|_Ge378ccz_} zq3C?}Hsczhp2wJ{%gRb`y94!>2ge9 zN4tC1RkK#$)0#A!0jF2OUpY#j{+LqN>fXm+{Z;<61=0A!eG<-uDUZ3B<<6VGv1M#O z%H7FF74|=87zB=%Ulj1zO=U7F5D4qB)l7kErR&ohPo`oPVXTZ6`oQUR!?l{9G`vEO zi4!%Nuqh{1t}>CnDichy`v*BbKP?@;@Y#LvNZVoFM>p>J_w|;W!=dOT&7887m|Wm) zTHs69?~RyQmy)5A8_(vG7nJ|iVEh%_{9DKHL6zn;7X8l3m3Y2IJ{FOL=ica@-lByP zm(gcN_Y{^KHSOf+P;)!ri~wubNrzz>Eb{pQR17&nf|d>G>FIHHNr{OvTS@juJ2T0! zYeIS@5G0 z+b_3gYGQ#v6FTk=m9gY0hh9BTStWEcUEqj@+dc}+Dz|ipxos~Om?*iQW#FI=GTtt_ z2L^6U(`r*rb+5<;o!=tdMR_}+3UA$RNHZ6Ep@SoHI1z%HRDv-hHA}?V0h+O@E3=X; zlCj5PX@vKe(J?FgFB<;ixHcYx#5~H*fa1OohGNFumb!=v7f#oaoH? zn1;?$?bUpeXRH{2fM%MKMJ3p}tWZ3Al_9L-xbK=Etu#l(g5MRpw(;QRuF3;a{UxJ2 zPE{1wn9Cl)*OKO0+BEGH6_r6a3VSO~Hw zvzC!s1$~0s@rjGTdaA0h1s2%#L3+|P9UZ0vF)Z+RQN*0IhPRC-%n^z|@72bbYvbWu z9&JdQn3%MHb8HV1@nH0hSbgjDG_N{OBq(YH{)Q>oeC|_;iLm*%o3#cZ|JyRS86Efy zW8tZKH&z(;{At7Bpy%b)=(ip!;QGa{_pxDm zWwP^w`Gp_}&Gyebg?)!vD&su53OpZ*=3WHm^+%8wrq@|T^I~cw1-BJ8BRu$i_5*`j z_I$ZeGyO1H={^pYuG%D$s5eNW#7O395q?#ekuBdLKu+%SRmZ%%z+c1#g%fO38T(zO>R{s+AeGuWxI zNVwkmU0pZ<+k4Jdh#X6+{ADNjHg0iGz^%c2i2>Qqp8HF2)5q{d!ju(d*5TXB_L5*m z1@+L8sKo;q_h@Kq7nUjqz?tsS%RrNe4quWK{9LyKqj7iIlULBE7ucRe7}I_$eewzo$$QyV$jZ_ZLJ||e{0W5U`e0Ag%=g9?ZKjF8u^Jr-h%C*J zp+vmMH>|rS@3MbvtYp3M27ixa{`XfQLmvhgir3<~U8(EvyAId){MS6z8yp&flQVr7 z>G{QV57@P`bw(f8Tvr^PC>|VsZayl|pBXbtF~NF3#Xr@fq}sl5DuEm{>?CxIn}Zz0 zjj50zub@CfN4Fg1t?vW)-8Tj8{Xc%7PyK}7mg`@6DxruINJcXV<)baWr~Ul73?O)a zUA3)3QMpIZP*U>6ZA&ZD@4_k*jAmM8FC@VkR~R*s0-#)x{8Py!Gf15z`#Jz_O7fq- z!1g-EE93=*zH0x&wQ3nZ7u*i!dGhk_1v6i13{{M3rf@CbS=d@4S zosfp|1DwBT0}Qi9;3m(wCK-IYL$c@ZW7O$+@RzbN`~(2xQ|S=FQrdj z=HWG7@Y@*5E+31DdVT+%h@th#_-B2z$d^-Ue*52TF52t7)S;BAb8VZfYLGjUS;vyq&~(67BOLAVN+r6eDASHV4U5XYld+OmOq_^ zg~eF2|4l{rHSkH=ck$Vw1A~mQCXH?ZzkdRNt)Ph&zZOsxzv6+38YdJTI|pi;aFCe; zIf3RIgv{6v&y&E`*GSe|1umN=-^-BMCOR-5>QovB+n>CIL(vG1wErH*?e@6sr3^l5 z&CCG&4DFkAv^dCfXv)HZ4uoX)9Pg$g3`>l0Jbdv%AY+%?y|X#{5@&z~Pg#cE)yLaB zfB*RUO{IHY--6!IUnSfgRu&e|oo|za)|G5Hdc~hq^!mn%Q1Ws~Ij$j%otrT>GOA^ zh(cnCTYtPSm4B+Z*TNm!=GEpIc4u z_#pCwS2*q$b&qtbA-66_#lN8WPpZwYdN-R63_!DT-I0oTECQqgu%0i1#uUz!6#Yi; zky2P+A8*N-n=?W=qL;g?WoE_zTuC)~JD8u&=17p2Jo@`u8#)M5=gViPyqGouFeY~d zzT~F8HfUKkCQ2W`9z<qI1#UDgBCLAD_GzDUd;VE^IhoXrr0j-q^$f>F2D76o zxk-?uY~~u%2~SDHK}7z5gf11lDRF7>q&5$N=oE_V`JK%1<**39G#5pEKH2RyeZ1f( z+kD-dm>AYjkXkTzoUinwMW3`P|9(agdEtVHQFnFU59GYAge2VSr>Zq5y$Ld3dV2GL2OwWdMlxjDhj*1y{W;WFwRlN|{bHHgp$K zQh2WZubUO;C=}WZpZ%({V>OE&peB=uo_aaModg6>7^lVMSD7&Q!)yd@`K1std&?S8 zP*jwal?5ClHQwG8Wo1!NFb+C%o0{qr_}^UL?syH;fMw&#L>)uS8B|*t}c3OUnp^xj?UQK8e@s>4!_BAn#OpAT6Bd=Y(F*I`YqR;wv}X%T=~q z|5&!4wwDq8N6$gq)jqsPXS|ajL5&(PW}fHYEN16_DzCcq!pjmLyVbEyl-Y}wKQV#t zk#JXE$x(Nlb%DDs^PNNc$g+Z168XvxwMHH^4#WiR4)a~Z*O{7`m)d@VUM_3HH;t!L zKZVmc(ZUI)c7Xm;z9GRd^wyv{*N}_&*GtXLoA(oy?7#ap=g+ZJuZ|ub^`MJJ>k89{ z%QfBD5jB5%YtY5|y2io5vHlrB3TtG9;2(FF{OkuR3hh7Z1v+&9{yiivL2yC|?sOaA zv5tG6j+f$~52-B?ETssR&b2ycT{mHhN+M%o_K2+{?Ui|QwXPRDCzN7OhrXId*le2Y zjFJS7Skem$l2lER+i0r@13mFOh*jZn7tWo0|NcD=NhSb7nmo`Da1DpEC84DqNaF|k z2zerPJmnWQ?%S>9n7rTh`5Kf(i2bR&k!uODyG@LyD!V;cCK zo3*%Bw}J*X5A2WIe%FuF224#&;XopR#fkPSCt3L`kQRi^*<%;)K%Sv+x&hil!X4hp zS9vxAC%5x`igQwQ{yEn%lC%gN>h=5HC)>r58B0sXJjxhe`uwB_`?fk~^y@aJEE zd6ZPl!O(XgsGF=p!iU9dntTdpFRPFB!#_De*Z>D}5I8brjIEED7;s1aYKd zX;H26JmqMkn9kjtsIE}UvlybEt($!B-5H0vrV5E&VlYUX01^n+_FPs!5q28PJb8tmFv z**#IyE^i$Ia-2|7d82C$b8}9`&|?2GD}Fbae@n0Mg3WwZtpL;N(`S<(btbh}gAH|S zt)ayHC*)02-|lrVuDSW9tMMcuPqkPEb_-K7Dl!M>F=%52_`;kb0t(cds=%}0Z zu$$aVy23$o2ss%7>*@zilP5FPv$L-t9SK+c1~if`&;q(8cr0>4UgU4cEeN;-*wO8c zztR&gxucXWz-fz6`RP+kTU%S0HB(5RrnX)ujI?Ms8*HbzV52E%ZOsA#AO_G28A6dz zrdz|#$bdv3Yo%De=_*9RWBE+}3bK}V;$(NBI`()`=m>BGn#g#_%+02bu#hzQL zxO-c+D4LrW?7BlenIh(U0VEDb*%Zwl>u>5>S`hOkDrL=aJARao_!z*XK=cwxX3CV$ z^U3*+Ic$+I zT{oAT_Icw2ujQ#)Ghw2>sR!Y7IIj0bxwxiW{^BIR5_vPERhI7`tAwt|YO0T^bAI(G!GYd=GhU+G2G$AvHRelA+CYNB1bx@q zUQn6HL-R)o-#ug($RL16U)-J|!3>W_(xNKK?Papc1Cqaof-& zY*1QFlel4X)U707$!b6n1`APSFoc8yvm&qB4f?sqNFA2eu$EK9!7#q5JIsIlo?fGj z9LGQmUP;eI*UBN3$br>6OuLAE=#M#e8}D_&xlFpeIrW+u4L-ef2B z+qUq_4uh;Se2+PQDg*zjND^)i3z-|l6DlkbD?%*3UT!Px%HpU*j4vWIOcpJN;WV8} zhlAeF7GXxVUi*eBDnX`vES#{`^vC(miPx4B-rqmX*UIWrh!1X#t;8gZ-OX8sD43TP zQG`Q&pNoJ<$7KkUU)Dw5u59`%?%ih<796?(eFvh<&n~w`5!X~#w@!as%zitpZMCHC zGtKYWm9cl5o^Rv*>{{v+(YB_XdGwLFV7;>u-)!~%;9e`C_JG-Grtj?G0$r`1J>|uq z2T9!gyD67XZRLTwp{bc*H{#&o!Sp`a43 zp%Qot7Qv+sAdz*(XJjZtAsBiE!+r4Y8UI~qEo|+JArW%5e1_lziZXz)CcvC~d=Pwo zZA3U27#PK+rF0Ao7d*=pm5`SVOQET-3rIIjW&Ko(_^$XWQ5P%?w=!%%9GJsjZqGMo z!Kf6(qB)^`g+R6hLOC2b@fhs2)cIl%-(d!C4oxiX)6G$^=ZA{;J3}EHBI3>jjsMqj zt$h94e;GQ9Eo%*Gfiw^}{#2F#O0ToLU0$&X@z_h(pemwAAZtJwZB_6mdyExzK{oI_&QWTtP#aPb?O zuOr^4@hu|$CQpo&Okj#57`(ZleorSiTI-E@b6P0=?BYb2jq=w!Y4>{y2~lIZyhq8S zYbZVHJb-kQB>e=d@G_ZsGwVdjIs7!3^iyIaCr7q&6qtBXzh83Kq7% zbWh{6TLOI`+O#>SreG2_`iod!D;)gh)v~89DmDy=IRtwJE_BoX(0|C}| zX0aNsn8Fn}o#>~(K0^$o3?mJ*!0uHDKT@o$*s)|T{p}NpVKIoOMg^iO*@U9c<%1D9YQ2zOkSn-uFUX#v~<^22G&H5rA_c)qvq$w|3 zW98HMqTdgR_Qlai=Lr*YX!#y+j&U@!9fs0Y&Y4^2za$-Nn(m$sdQC1|efMuS)eTZW zad+Rj+7tA7<)^86=3w{;&8))wP$cZ+NI%{E8Yua#6UkLl)Gt@eywj03%%G0RV>Q%Hb*oU0KiBlu`kG&MnI!OY5<_x*c1RFQDs7nhag z1IDQ4a=i0CRQ@0y@IG3XggbtkmZCjn?>2>L3dTh}I}nfvXT@%XUQw|kL>0pr^?A>- z2mBJ20AD*XK!BIS?Uky?Z#qt;TTyXaiXLn2z7=y%yL@4VQr!<5SyDKTuO(ATq) z_c1FjbM6foT;G%nyW>50pz5x|cRJ@U-t77Bv_8t@xyWf?$$(kDejH|Mxvm8-U;c-R z9f!B(wHJfuMyHdnum6e>lJPmT8C4z59&&Knbtw_C)i&wPpKI$4X7JCoM1Fo0)pMFn z&v5szxwnYMDEGP*mt(K?Jk@aU$XHb1lC!vA$~iwb)qECw9J~^be6g)s$!a zd-&VZP{EfDi@MjiV2a{g^!Kjwh^>cn`=gqXQV%K>0>VYdUv*obgzudFJJd8?J3ipq zMLaG;LJaiJgn2W9yn;$@wf_8(hXuNMRSJCnaY%TQKL0soE@6NQ^Z9i+avypTQ06^} zMrWb^IWbWQW+@a*bp6ot?}vjJx)NV!cHq$my9|leEO)6Tq^0#$7`6WbSE9_-8(A6@ zsU$N1;(0z|aAQ2)t6T5J;eh^%}GaMrfl=kdXBOhSwnz7QerHQB;G|z;>qk z5xtK$h6@!y)8u)dNO#)uxwK=(zej#sRHfc!_)V%CbU`nBSB-tNdl(eCC;S*&Hq^5=C6n`*vLngOA_qlN`id zsYHENHT3nnCMM@(o_4gXPCeYSZ6Y@n20|8f#&p66Wq$Jr#MqPli@x?0@@y z7*baksI(K-NqNNjf+1x?`&F;>>HNKxqqm;q_TL)OH`i*ikf;^EYws!Kn7hcHX6qYh zNV}_(PwM+)5U#GSJUIGuIqw~iJL;@|btNkpKM%pe6gRo0*R<{8GmoI^mTG^7?Zo<0 zC|e&K_KMDSIR78gb6)mwG~e(24R9KOG$NNBxBdFzQIcc;?Q#l7 zxQ>|%O%rN8B0Ro{5!_a*y!@tcp2$FloArn30+he88KBO)NbzVNnDsh5{(jgh_x)&g zzPEQ*QgW{e(qbEV1m})=Bb)q!1P6mk2W7{83q@JYc^FH?ymQiSC_1Z+Y8Cb7{4*O~ zKkZRJn~2a%@heoa#jA?LVdgY4>zb!-cs!X>Qgptbj2^OiZ|Qx?@?qeg_ciFKzP0e@RM$r|?D^hNltP@r zqKN$_tcNbEb~`s07S^5Y^^>$DAR_9T4(5ZRcpaqQ!+ZdS$p%`RwC*iV&gUQe^9pMN zS!s|T18FL}_C}7%H$RX60_vw$*3aLiz~J2--6;R`sWI3PDXLu>=4fQ8!2BNxL->$Y z>Br<)p}T9ZA; zuU6t4KMJ@V7dR(+nk*zH>k%tYJU$I8TsmA{2%)+;P@C&^oY@(_Q^aC$)VtbKQ2zbA zSDi(LKuvq5C%R_7c>V>}J>RbA)yC$3!Sg%wLy`7mW_Qtvcij)k(jryG4SHLe3RPb5 z@r`TLTZn^e&9QFyWmcVTM_cuzClR98XfjKgW%Wpz)k;CW%&Lc%EOIds-Q=7n8Dmv= zUhqB7g+)1e<%){+a*y0Ek8n^`uxsXP?-Zgq&Fz~HEA)I(f{7Q5)9YpLqqY^oS!i2X z$W0>d_d3)LtfJFKX_9YHz-C8zat3KGpkkvn1Kcp~=>#{r8V44oNRR)`r2+Vi+joWi z{VbUe_#J+4*XZYQXzRIY{t`pF?T}EdW}l_N$0?)s1u>9XApX_ql^O`D)P->anbz$) zxDeG6=rO4K0%#S~`;#z#d>JjbxsNt@KUY_lmXWZYRjV*^yI<+2?R1yF!I{N>=Nir5 z4T~%U$DxcGqZ%C&m)#fk^@~sLpq%`O{^72y!Ht$6bv~{B>b*O?3;(54PGEwegxzz& zqaS{w{pLWPpcEar`!}OuS4uHzZC|>3JwB<8Lj$kwy8c|L;ja{X!|NoAlysHZD}V8o zvq914n1gG-X?*J#IUc-WbMjIkoSgN?=H^J>tuZjy;=3Bm>M*d&49}~6T9Y~%_;tnX z{Y!&BJSu)Z8ii+brqRDF&@8`B*Z!HdNfGek;?w0mopmE)`MdG3PXgD?0~ED`K9LU& zet&uYLg|ThYO2YON`L%+lSROqDm;CP$NIP7PW;cMt^0$br?XfZLiV$@obwCC1)^@m8UrK3uSrLEFu_*97f@MKTnijRD#YIp>*?KG~Gx%t-=qr=h4 z%Kz4a*StoVa)_hIT?7z356{rZ&FOBg=l0&5a0sbAjaWhx9Df?El0Prvy);v6<+pV_+Meq2WqB@ z3z>G1UxOV2KtXY%b?$tCmqdfxD5l84&(BX@t#CoXU`B1+47l3(4>yzT=U1Kg_q(aK z%sIrw#8xa710`_8pf9ceb?c+wxL}cykgSoCp0vC`C9k+!a^I5lWxt4;W)9pi{ItPV zrxq*O2*2hW`!F$#!G=tY8hGQgJ*gyOLGSPTM@P(WPjoQtHKohvCQ?F(l|pQyD`Ov` zQ#(#_zP}%0UnMW&;?vPyP|i!x>>H(a_tIrcRA_w4CVcen5E4yGvw`h!Ehc(^K`dxZpZ6q|5&jJMIkA}n2$+0~ z1ut4QPGoSOa$#)Q9g*?|9er(KonM>xA|nY7J%8=!U~A8>vezRm9{R!XaYf0LN?wUk z9PI-=Go6C6`WU#36C=%)*2X?6p0{V+wDq*!_58=7Dr>7vjgu}0Yy+(lQoEzUUJ)B@ z^lJ1_K|w)qGUqX=u|L6GSJ759A$@w)2E$$VUtPwPkB!>iR&?JiMRMF02VgLJjN8LM{~BM-A2>h2bds{C`r$(vO}!NhSbC(wvEsBwkPGOuWy04J z57ma=HU!zh8aH(3|5!T9s3^bp>(hvUq@whfMwF25PH6ediC~ydy_m zOloY@1lMK7{2`0(Yx01Ys5z8dqx`eS%1yW9skN_7l-MssR@Q%{eaUlNazIrp4z+qX z&VTE~ie!yQpA2a!iJqP)UdJ;JvopptcN=`916*-05PlZtl_baIntlaIpLS zaCUoV94aLB{c0}~Q6jJg6T(cSrR->OfbeMyA-~bt;v~8G;uP8-$e$KYnEcb)tP9zN zsOF9PmpG^VT6oWpiH#BYFtVbeB4)Vdo6%v##rKYjHbij!0uLVylAlo%C*5HEyB%7` z+)Ha+T}?4{lmao-pyB3jkmJIS-qJ}1vypC44}ivN7sz-QyHnq46m;s2M*+*=G1~JtFmkefP)4Z7aQy*sMGw7sAktj&B*w6xI{nw4eC|_|z5$4!&=?nbbx9 zU{2ArYubco(}*ju=DDfvlW`M4fT$Z@nX8TiI^IC*21TAOb1biAYh+gCOI??vced!a zVumW~Aw%pLb9ZXdfA7y6IS^UvAFv!Aw)r1Cq-@!HLhtHGtkq5xg%5iZ5zA%up zLVIwcUh)+Ok}ee(9u7Np^08^m#%=>~aNuygjkSKZzDFh#xwM=pD(C2W+-&09t%qX? zj2Od{v;$_uI~D_9%gg5m?i?TcvkVX8Pm1SpIAvTS7PWK`B3~N@TXj`ay^l}^rDYva z)1o{OE&`A=$egc53yzJAotSc=cvGsz@XDVuD{B+sK}j{X)tTRKG#b|CYL1dux@R z96k!(9@W*aFQHx#i6Y8PUOUUb*NST%j>1|po1bRo_ih#dmt^40iFj zm@gShA*O81V*d#wYraR|yS!^VzBwJfh7nnPa@`VNuz3>2nFob!emG3fUadkt~64u+l{RNu*wve1I3p&pzQowcm#M@FaSldumj7o??IL4o}3_9 zaq=)FFF&6Z5MOl6f#-FF3ebJD*Rm+V%)_AqjOD2@{NBdlM&yXKlOqQC;uA0k;)|D9 z;@ew^=%9hMDrkS%I9(~;fa5*a)eYKb4x0)9mj{g)FflR4e|{0dGkz-ox@aH|Dkv<> z%*yfx2k>REd<3EKRxIa|!Nuv13WzE>wr~6XlWY8W4${^@OVWKBf5ZM35nV|ECU;Ae zp!}C<1jUA0B;!)VzL{=Q!JnRaIMbXsjy2JT;U&4Ya_^SiH{gK@aa<{p9c*AsFm$RqA)Tz}cRg9C_P=t z7Cf03;OF&sg*ByrHqt{29n?;Z3hCdhQjDHA zGJ^fPe(mK4l*GE_CuR!Q=S%W*GER=~=HM)3XAw`1|Eyayx=#$OoSrLmxj8h0PT&h6 z0o|_6?2mZlMLlKZKcL&;sb+P%J`NB_2DsPd86ZcPd7$Vp=a8hbuLW^CxDP2Oq81h( z%UUi8!Ic{RPhMA7*B@5QL^7EZ5+1${#v8#sr4Yc{eilwI9_TnOIyBA#%v^^OzIff2 z4w8@BaL=W>t`zQH<%6wkLk$@u{BTdY&!ev~g8t!b#)K#%bj^fyeLJ%&H!cAwq!+%|Wa%NkB74bhw7?owP71Kk_h=UN>+7eJsAkU;b`QN z2Aas472KWQ6$Z&R!&^7m)O~QeF`ZW=$RPd})ah?RNTzJXzft!P49FgRm8#Okn}R-n$7;?x4$YGja4);J6J z?j+-*?v!7EC8m3!U?oH}>U&WNy{94E##agQf0YM`T{z2D!kpq!Ir1&SKa>3C4__sP ziAPaUNrNakLk)pVLFp)j)}uX>B#G)*BK8!=k3I7U}7U^5p zUt2o~dVF>AHT#`}*zWT#(8M9Fk4ZevhMQR1_L1seaw^<{0F<%i4lAcV$G36M)EvTl zWW9`s89^0hIU@x-qlv1t!E?w)Ij*8%P}jA2Z8lx1|8Jx4uo2vVr?dNIXQOPZU#{f}CGD1Y5)oVV5847oe9SZw9uXo6pKe)RIg zTK<866H>R~pCjw8xm5Z8zeUpAt=^7jFSk7J>xMZBH|H&DU6tcQY?5E};v zgl_EF&bg-Pr3ZarfBt|Z>Qzv{9x>OL=2T1k=K-XhI2U@AhG?K{t+IRs0S5w4_jWoI zDqyAzn1|nI*p+x?RFY$3#la>j+oqHR?6}6{K9F*lzx|)5EDrPvBrR{)**Q4IMntV#M4TmBmLSa-9p`+IdobUom6j}w0vSHArJI#65w#(Xev*|0p zh1aTQVrQv^doh?WtGF)`%`K=E84P!>MD_pI|7YMgVZT?mcbO^eM-<;w~ zV7%>$3SZ8DYVS~*7u0m}bS1rc1!uGzNYQuJ{&iE$ra(SzXF487b#g&h%|}{ID#`?J zX|Gi73p?+PO3*JT`;5s!r!&(06~ z3Tklehz=Jl17>Ch0$@_6j5b%NX_;=t&HhU zff1pF6)Ir)dPsfMjnh8Hi8hVKpapFuoo1n}Te9XaYrcH{*G1O%r#7E^BqAFjVr{*NIK66PJ>D;y zdAiw_imD4CxM`_!>XbO`38!_xdsQTP-do!gaW<4Zu;lLgme1q`Tu?^!HIg7fYHeu*Br!a+e%N=9D=R# z^M?1~_CnjXj~X}^3fJZJzi}itfS~JVu&CHWJV>zyS|PlXYf!$r-E77KKLe8i5fDRn z$#E`zAbI<_6r%QE~O9@a%i3l%0 zHeZLgRot!o_li^?NXhOyn^>A*=IAa?%wDaUzSO6*#{rxozZ|Kqi_cjhY&Jy$rgvoF_(^+tkn zQg^$%RM;CqQkxMMA8!)TMd_m3^piw*UTv)=0hGGCJy0&0C7j#8B=r{`XNjOAf@n`j zZaD~;!jr)0jr_J69i;gI{Ksov z6il*ri}1k9JO1bMFn?$Kd|MAbfulr#KR8~Xaetn($;#rdt!nfDsJOwQ2rmHR2!p{) zJLqLn0S`7ylo!mT0qRMNARW9SHJY7Rz;m7s&R;MihgKrDol(~r0*J{AHqo~Nd9TH4 zrE5SyGNr>eFgO@m@B}bx-bd3_mzje``^-9~1=`jf$iU37XYd*Pw!_m944j>hU8X?) z`9ef;oQ){spQqNO0X=z-siBt;nXiYF5o;q9$ds$}Y!AuSqzsZE(dZfjvMc0_b^Colpz97~Y{EOWQP=%AXMoZQI6|HcD`)Oo=Oi=MRc zG2^RTZy1?745+VqlG->?`dloa)bT$nmo)4XO z)*jOI4}O@&`Be0^rkTxk8Aq;#&Y1LXI7QYUffz;ttPQCC+OjF-0|F79} zFG2AL#-I^#aejUHHwN!I5ljN zR`4DQQYe8Z#E23KR@ zUAGEufcfAGPf5vUl1C_#$Aj^#h;nA{lM|A<&*aasRp;IptFc%G@8`0dRI zbLd_cCm+T%sD>~59glaYsj9A6_T^OUTucLqMqW6W&-2B7@bIBd_Xz7V5I!`zXdg6U z1!Lsr?<^%{LH~iPWA@k5PwtBq0Kh=kJhR*#%l&V*0YJ+xY1Lgpfm+JrkW8rF1qe;)mXap|5=BLNI=QHMZz3TrA5iz*)0#F3h zx@8Yuz{$gz2mI!>nTmEBG#5!SMy*;|0$yP60{Noy1X`egusshEI*^4|3JCZ9njxkX zN2^H%COr7>6lIOnO5EoH}_7A*JRq@b0X31kG}>2Gt? zRoAPOSL;(5t*ruUeO{-HC{!7?I^3qwL_FN!E9-hqrF7DkO?)#9ZzP*G5L9CpiE%3) zf3RE?-G@g5&wN>?5>X|`B~y|iWg$?#n%Y|JBg#ql2_Tl2@0Xug(50#qG}Q{FzZAU3 zd_`*&deB?GrwRu_8M)<~=%q4ugc-u=&K`B;vpEV(TXmXCorh`)?KccanbX3yG8Lkor_u06ov_k0m&0>tDCnaNL}p8&bU+3 zQTd!Q+K$?PwBYcjFyqE2kJd0Nq#V5l#xn3jq z@N3>myZw@c*J*w6YVL!jZd=$HEl`FoHc9pW#h8umQ(sgCo^P`^o0E0HHC zltx>yzDvD_g-(yKSvRFnyky7s&K1P?k9}>|Hg_Cl$7E#O?N#H))ihcS8fxxDDoUsk!S}D{S5c_S#F;(9rOwXgiczvAb8U5oKX}-bcuxyBg(sJ#Ahws0-o1Xh zU9>9ai}j9U1Yp2NwlXqQO#w5Ok}kN9z-o zwb#sqEBS)A0v!H`6My#$#P2V#GP6;n7B_CkVp*t{MF|6c63}^-u&18 zcu76cCiOC13Wq|Wk?w$;BXe@l9fA;M_%gfyiBm>KuI_LiuQfleaKKs0jeD!VJrrAD zta~AX-<4uwi2%4-2NWNdL@Y${U~aa1SbDC-1q>|#(UP2en`r@ zPgc%dWo8yD#gdcKWuyE|?A_EK30e0wo5`I7&3~o(yU|j8Sw3tBW-GMIcO217DZi6% zy33y8_bpp74d31k7!Dvtmy=k+rQfMb(aX9QsHvh*Q=heTNmwSjV)}4e8Qjm<;HT3` z#N|YbN=0PQ@ww)_pr-sq#MnmcdEG@778Aqje84@B#_iM5=@&_8r9a9G^K(y8m6Id> z@L>bBT>AJ-6)bXH&Ksjetq&}cyCE){o(6uflQPHd#GgU(0B?sl!u z+3A0AQ#1;STzYgrH}RqfMH((7F--l2qfJ-%@Fw_oVH1+~W`De+G%$n%9BY>eTP2X} zsa&?4{$t>~On92uDg{Ds8?eEsG74>_U;5s+i;abeg7`d80Yu5hIR~CpPsOg_r^<9LaUYujwlqI?N#=t| zW!*h?1rKGdlBESo21N2Tzhv%O(G)$XTx62a)B{sHnTRtSAslUY{VF_fFOT;np?|)& z-66`v4b0HyWt}spC)HL{Y9`-K2$<*o+gf32Ih&~{jzC)<`q4YB$Lg{nh3^AjclA<1 z+8|zql7%)oE-2U{uXUl;M~h%!y|0bGv;WDBBkQ~SEi||fIqmHzS$?N<#rRokT~I<2 zN+HTGg;F({MZy+V6>d#69JL}AxpC{iG`PxDkyKJrVSiOS-pK;Mj=b^4G@U70m%MWba+rXRCJd-+ zkq!kxG(b7Bm~>R*Mwb=vw1f9+Dvt!1Sw2%+q~)icGB?3?5dP|ip(7MMe1+K>1IQrO`p|`gTS*YAABxU5C^0E)3}{MunD1fwR46_-Ur_fDy)ziaF&G z^KX8lIBEV)VNpCG>nJ<&%AIf^k$C??R38qhEL4 z*|JyR)mf!75vjCewe-VYn}KF9g>q#+sq@kP5o_7}_nm(F2rnPyE@`#hUsqHM%+~jrhG0ZT=CZNKO5d#k~`a zj+4@ak)uaVYNk8NSzpocu3bNz-=hlx*!)Tcvb&uyzx`Mzk6d71JVR_LKr|Xoq)H3D z+t;Hnu8WFI@eM*DEU=7aa52i9oT%D4e7Z?mZTCXVq5ArFKN7E&q3U-FN{Xe&3~x9} zepRZ;ERR$c)#wJ~%+ejtDBBCANmOwrru5U&H#n187MALJnD)!psOaDcacuT~t(dsOcu zN$TtiN`T(;Sx$QTz?hgA`3eh;qGjBGHga~G&zU){3b!hM#v&p#t0Hg z5zgyi9E)`j2QM111I#ZdpaTY&pFoK+d>!K&M4_*U0m4H<2Wtb&*%}VuCM=3+Y`zf6 zlZ+)0Mh_A{-f_a+Zzkqvv!b}wo+C0g+`osDcy#$7tx{F-nlp2Dfh5Sk)bWps=1m^+ zg^#eettxfr(Z+?ad*6q$ypdfh(eVPSUG-hH24?O=`aDz1<|knzUF-i6XSpr5o^i{g zhMCnRDH|ar5#i1!YvSg2wv@pxIgvqKHge*TIS_hvcJl6wi|4 zw@Opzd*bB74iCR43tA8<%*Av4oOUg#eMpKYEA8DsyNy{NnX9v!KiEE+;qcfuE1U4m zPuaiRf=B)RZ%w7QW7zqETLAX`%tK+WC(dmsbZRNaZy3V#L{(;&<9v7}5Z~(F(t9c( zSDH=&n_l{{=XU4Rh8l%r(_Y>jQhPE#cYV9=s(lzzbCp?II_#7i)`8=%CrM|;X_m5QF;wnz+DT))blwzsr z*F*WVAz9J!jD_7lbDx?;$IH1>+@{J1Zd}8o9EZ5S94(34n)1NS^4nH)(H>u}ao+SX zK}jmxhTEEa`BrWR>;Y0~V~VLPzKpQ?v)E8V}s1bbF_cnzqJ!@7zzX;%anUn}2_7U8Zz%KdziU zS{PdjgK=3f-stKzD+I%&k5BevT$6`wu9xQLe$SRZ+U+%1Y?n=63}4-n?GV>A5sW^H zH$h6j-?(AUo7X}tTJ&5=%G&PSd5Ltd=+eX8o4#Mv;O#7Jxi(vDH%}7i>9st@X@=B! zka>H=)kJ?^FDq3~uD$b|Za8PgKS}U-0az5K~2sXI`xocZs5f0WH#AA;1V>=z7&awmc zG=wz#^ygjj^9LMdeXs)oHaEeYF1zZS+}vGVAE07Pd(N)_$44HA2C)Koo;>e{xVMQH zdo-FL7GEAf{RJG^6MaPBh>#rXD6WTMg9CzDSA29a!6pJz3kyJ)U>B2-7kf>Qn^b|o^Ob05)mJX8|k^D#_qRiSaBzXJm^oz zd==KKil=WFjM5XrC9^Dm(H>5A_tOxf>GV{}nZWym62te)?#bi7uZHHoFw+V;vA1Rr zIM6olb|)p^4+vv;wEuc)c~5!IS0Zg%aw1now)mX(EkaXtw?i^b?jTX)d=zV#oXdYy zpw1K@;4AtpvuQo&4-1bE_v?_PrP%6q+-62FgjBP)m#t}3iT2D2ESwF7=y!VmT_nR7 z6c$}hoL@d1AyJH6bjK_HCTZnB&@uLz#hT*ynk+PZrTBnm|A2AMGtx46mEveG_j04G zZ5<8r`+-E1+|_ID_7dG5^HqKs6N!76$O-#MOKJ9%U<5x5lF3JlG{0Tda-kp{r_p4J z96#KU1bCvhD!BB8!MbARuQ9;jktSL?=jn|-8iM%n&!nE`4JU{L{&`7fD<{BKEw0 z5h{djdHc?hd9Wh;gm)|nVHT?n%j5RfI`}pJ868EqAvFKZp{NHvTUotc*_Y&+_uhR+ za)Gt&9x@@pJb%4gT$E9*od!Mifq?>s{r;MFdG*^W{LLdmpy8RlY}pGD+9G zObo?z7mxx3n2cLzA51A?J05ywLT(=B^fc74QOA3ye-K#Dw@+tPdJlfR9%ot}7dr}0 z2X$>&eU7enD#>J(NS0*jY@oyxteT~>Eyg&A?DHCvp^|>7AtVciDCXu{r-`gwux9D| zHO}y}5q`&$aA=#9rUZ{=O>U(V_MZnv*Q+yuH&70DJx4#R)F1OrZA>IO$)YC;!*}A$ zeG<(3Wr~fJW{#{Q_v6fMsXf8hlo4 z8vslG1-Ob<0VEF8RAN-x?}J1nB>Wg7GeB?u44DIpsVIOdtZ9*=r>95b5-u~o9W%+s z8Xp_85A_3rx<$k${$rTiB#9iRSf)PM{t{;NT-r?w6?+CqY;T(Ez}0E-Q%^<;SvTU~ z1b8a~GIzZ;qszr#eZVF?C*dlvNN?*Kws!cXIPd={ZlVJMg`&EU?0)UI6(6HjY_oR5 ztOXG_p=mclaWdnkl>q|C{==*AGlQu%t9UG=rL z+iEv?=XE}l7`x}X@5c`(%yg?oAH667n~wtm7+=atguU94hWYrvW%l6n=dhCCNW1|% z2*wl}mTkGDuH34!y%F(llS?sfnXy7E@nS)+$OE}Z421G|OqdShF5;@MU#YGy-I0D9 zYIY_Tgv1!@IiZPrga5d}{B|iNcqmZ!$V{}jrVEGa1;t(6GDF_&wR{|DHGvUi;`Ti- z&+H35baG2R*8ZBO8FSU5v*10Y#Ld&SXL(Icjq%R?73i?erKEG%0s?kEzD<(Nvy8k| zvc4RfnR#m;h0hmV0Q84Hz)&>5uXy}fVb)+=RVXjK?|5lMyCiu>|@t8#pg`LQT{n z>A>sBOiEs+tAzV!dE?F`rH=zIP_ZQW)&Go{4`!J#He|l8eRzwH~ycaWW!(lM) zD0ydsxi;gphoxRhPQ-jwxl)2Tj6z5!O(XBtit5?a_VCT=p{4$)sMus| zA>_8xY2yQ4EhVN@W|78Y#Gi!fEBDUkM^$!a>4=H7;2bX{%crGz9m|&kZ;DVi$Dj7C z5^OuZsQv!hjZ84O5=-#dUBa+kZgED_lfo-dK=h8j&kdQJA;G$KQrn!Gw7hAtd7OfH zibKO|WIX;~l$eDm<#sqppD#T@xiQQm&2_i!t(?*0BaDEq@VC)ziN@E`+Bj*kJ{b3T zD5E8CSc29-lR`>fmkCj)_+HO!UN2O$j3i%I=Uy-RK6Jflkl;!E^4lSzo}+u2Ykuw7 z`76>sw>|dpWrz8?vi#DvVoh=~_q*G9kG(~~d)BFw>%-w_=zhnMv)9pdntR8QaQ;%$ zea+bg>x?_ygsXPOaAX_ICl9b{GSr9DF!obBlTJV3H>Fm0IhhhBM^d3>j|TJ^{xM-Q zU?Xhm>S`9kehGxshBy{LWndiRIRiq7Vm-fVY4ro5$h>cdVj#dl{9kiYW|2I9m09XfdC8EFY5m3B4jILpP51n^o(r)TeEFmGL$fP{`svN zUIYa`NWl7^`d51sR-|7%Nobu8MkDsLRA~63vaA_Wo)f3&(m@}*nn`v4%1Gg5 zf`B+&RirGbANEt^KM7xlLX<;~C&LyODpwl6HcYn` z-NMi~$EGBQ&)l`gm#f+j#k5X!%+3j#!v1PFS|>nC0u4BZPIGfH{tf*&Xo$>padAAM z5V*5NZ28?sYoq*T@Xjn77po@jsiuh%MI~yEq1U3GE!14RgQEYSLKC^q+S)>vustkN^q&S6Z2Bk&31A#p?L?Zhy6~#_mK@njb_TFiq zcbt~mv@Q;}K+udvsDu0R*$xCCy4Dk|bU`8j{0_$R>+fw4+5zm~jkD-95<%dWauiiE zXl!Q*0~jF$x%8L4IDl0oB_*3t!D6KG1=+hGXea1JSCzltmJ!IfQ~s*d?^vmPEp7U; zS6iM+6`kHNe^J{tf(_aV&%cWMQ&10aG(;i6o$?(+l+7O!A#_?o2Ky?dma@!CSW$Ym z^+B3jcy7cwcd06TG*yaaERs(o?2Fp*M4PVR@v+i^+cwB#ssc{hx`vm(k%AwPDDSu3Pxf8R)K_f(7NJCxWMhWwb9=Fx z^;v%EXCo}q3M5+BU*GqY%+~)BKt#QBxS6||w&_hxKQ4`b?5yWP$6H&cvujcy4Wc-+ z`FyVLbFq=sporX6iW<%gu@+=(GiCHg$6_|$pnLPM{lnubzU>oB$H1Ah#tLNJ-b@N7 zXUgPm0mWj1dzum!$$O|txW%QU=W5_9*hbk>_scF6_CAFX`iG>qRG3M8wIR>QLrbl5 zV3z%K)dtL;9(WufqfXd{6yiKZA1t##inkZ0md$^d^ zzgny^#sU~3az@7Aczo#LKpNjRe|CBr5FS4LBLu*1#Hn$w4rW#Az7zou^%<}nHNFh! z*qf99Va9_C6++l((t*+yy2mCfhDa1F=$TPJxThMlk-c}2#K7QsDx-+d|Gg>vSF4(+ z)L7|Sitj3uwG%-dV^iXv=y&QA%zPs@jAhfMw}ige5{a6jrJe2-->_k9IF7IxltO%} zFP2Ed3hZTM*aSUp=eKxudDGqG)#lR$L=xK0y~gNMQG;Q=(%WK z3iLmI+cOZ!fJ%1r%2Du`Tp20)FC;(u9&8`TEZa3_JPYHI)!+V*vzHM zH@>}i$R*G-a?t+|3tHi4A$mvAv}mII`Br&yaLq-b_A#j^TH`KM;(IS`_aS&LA5 z_P2DV<%+>dBosB zLh?$3OBK06GzkSRHav&<%m{VX9-xrlTavLFg;;(!UvA|udIYA{O!;T8^|;s4S&_W) z%JSCe2YE2STq()U%@hBOlw}xH!HOU(8@NS7E~#QBGjcfM39yRhABxwGDnIG&M9P(p z|I#{5GW1!g3TQ2BnZHXeJ)iE0|90s;dqqkcVU-!SYUNsV)jizDU5o0`MPvoOIYfm ztU257sC7FuOtWpiBeD*0$CEnqcM{gc_CinXn1!}}A#=$jT`;^~gb?1-;U8YQ9*)Zg z`Ri$vrr6c{u8uPrZf_T7LAD2h6lgarwX0$AoRHPeCz&%kb+OZGei!g-(Dh0(g;iNT z<8sJR4rY`$&q_pU{rI|!03j1Vae7n!>r}L+x-tl-#r4zn9`cu%_~_*1-br;`8BsZY zt1aVb1_t6fUd86gGokcNq2+wV3GC%M@Y5ezX+t?gZqiUqi4I67MxDHVqj&UR)qac^ z+pubbaackBa2u}@E0kMg9?(h=L8ldA9$vRDFmy=hQ2_RDRQTQllMZdi>==EyDU2ZpZeES9nJdHEUZBXbJ zn2o&rD}GmrOE+M9HxMmP`W1=I_N(xDy!1jPfS%;Yv8Jr@SgZ2e8Ed zx215Z1$(=ojTkE364Q-w8U}t0l>0o9tHmiEeFE9`v$Tox>E&rZu@$r?A$P>Xc+G+9 z^Rnjy`X*5j{PhtNl<=}1j;Kw$ zGcC&C^!JeH5ObDhb}`~a5Q^8bzYu~aiY42r9L;5QfIl8%;=3<=_VudTNfIEmfjxF} z;)}YHw)VhD76sUXwjZVHRk`1BcpP7^YeNV5NG*P6>x&8ckup#i54_zodzf~&<(NQJ zgsHK}d?XAOUd=`sHZ)UJmD8G6%);7?^S_usYDhmX`EcrTxlt(i5caxw%G%fk0X-_3 z&WrT_+GP?kNbDLuMwi#^5Vgq?6>kE8L?OeX^zt4I?5xm@rk5K4uAi6+Xyncq3$7JwF5-#FNpXvOP)&oV&){d-6aWD4 zt<3I9GQoqmGk`-V3NEz{kZ67YqbmDzDmON{?CR?Cm_s1yM(5Eddo|ihyPfKo#^~{U zi%C{HSh%Cn)V=@_psC;i56ZR7gWs%13m}ZGIL#R(@gnyNz|ZrxuHe*)96&i@Ds4x} z=|AoB^!yf`G-Bype7LMA#-ca>*t08De)byCZBF{p?eu~>;qSXW7BDg}|HO&ULLbv7 z3#~;!^Y5Vf)Y5y*34b&%FfmOMnA3rzq$lWumQxCKq>@L$74voryT9FR`ZzJ%%-Py{ z?Lp?&69X5IbRmxl-HjZSiXOm&x+k$S2y~l#vYAy?XDuO*-^)8zKbucwyv@)5&OhOM zsEFv7gFU8CNM$We?7B|QZ6mGCvb|T{i|lk_HH;9!+QKwMnCvm?k9{fD_IaF+nGiTk zxnS04>dSVVMDgxm!adDf`;4DS8de{3UEspK!;hG)^Q;!Q$+;S$ZE<9Bxi}OTUUmae z>#pO-Y=FxmhThx^-zXU2w(Y8WZdg~@d?jP#Q~H;Ho@Y=uuV6#VON$EERFp*?NiIF3 zW4ZLx1VK8hq&2hDf)2sJLY3ObmbHE@>E>++O08Q%nBM)CjSCUg<0K_&ac5xF#W@o0 zjtEYsi1Xqod#5Yk@}bx7%~lSc#@g!ES2O?&yRvUZ4!wUM*&%&*;D&-5_x#-Tp3#2r zySwXJc7^RHx0zLzF~1#vNM7X#UGs8!rBQn?KKX?1!&nIpTCNt4?zqpUIcAK9i^KDT zi>OxPs7T)zQ-MI6w5&IA8ARDd?}1&sagGl_1Axk$;^}@{klW+F{&y`eQHyc{LWyRL z45wD+7=RRm-7cU{0`XWX@TLQ6UEAgPQgQslF%wtgm+QF%}T zM4Itws&wjoVlAkfAJs(vR(pA{z-rBpl?*sEK zfn9gd5b-9pV{QZswzc%Wcn!_^Nrzy`wSHZ-%U>(lCJB4AHw3nkp8}>B{y_YCN#Tr zq=Q^JoY@n}88T{2<=2VIsz2QHSuRfAcmPDcqSN^c%!`YegIBF{wZHCQu5ckJ){Sp5 z?kC{}-)DFlM0Av9CSaspeU2NY`o*QOwN{OPn=)Q*A@WyE)nZJHg1$uob z@b!gIrEo`~aFVc5&EybEyo{v;549>SB>}I@(V{Ox09(!i$?%ajDc7C|# zNnR|UdAYzni4%Ua%mAUsBXlp{Cq?ANZ&~uFB29Ym3<=nCqYocO5a40!=Z+vQYH7F3 zJ!8L$lQ2ya+R@c3gw#mtASQWrZ{34V^9f@Agk_)RvnVOzEP-a&PXK*Hc726*nRa)^ z+uk6}k$A1@@LG?Z2Phc{Y6dw3htQA~eL$ljujSrqwJZSCpuHd?pdMHWffwQ+#s*0J zq}z%;^F9TIq>1Mz4p-EL0H?=(u)Ky;u85I>zezDK%8n*~5E5UR6pAUHSY z59nEA-B{o;bQ#qW!Z7+@hz5wBk@?_&ifQegk3xZZ30q|KSTl^rMGWU-Hxa|+7B;s5 zDaqLIH4s`#l*`pVM9Ht%>Fr`wf$NOZg^3tGXiQ!&YS#o~{sx4p9l2Var7FIfEDP)6 zfd#G!iDX;x!VVu_P+21+W9+?sc~Ngww8 zNQyvQ{96?MpBlmV`ka82ZG>i!#JkyVD=X-{kzSG>_deylh}Q?>KPJ|)U?m=Dh-Rg{ zg@}ak=Eyge)I|7iI5?DY;2BY~hu?Ww1y&G!c-c8Z$4-CG-bNsy0S~+T-FBtwO%wmm zCLf(GRN&-|8bSIB&PwQ2JT@7@^6#7AvPb`LUH4SuO69(YAM#u}ISH~K3eR%5S#OEe zC2<0thL>D>do6T!m$8^z${hpuCX3>z`=iWDgEuJVZL~MybV+FCm#g(SW?QWw(Fc|s zO&Yy{(}5(t@(Vv0_Tqv|45Z^q7?pqFb`R+%FTpiKF{CktzY%)E`|&LgORiy9+rZvo zpltG8rF8awFReSs&1L(a{k!p1`bRN94*sEe)lOA~CYh~tADmAH9=9&htc=~mLvcRR zX}1(GyIKQ0n`c6^W$TU6V6Tcu(cdWTnHn?oCFCw3c;2ESM`#BMb_YD{7F}4u5706z zmOee_jx>MlWG)gH!9|MHn-D0=|Lv7<$F3R(OCY!HD9PSxr+SF+%hNmaCf~VaU`~|w z{O|miIy2(0u;r7%+)GQic7n!68*@#5nKe%Z;?0O5?!Nir+_%zFl1w%jZd|1@Yf z2ZkihV{AX<%@NqbHi`Y$YIlhzmB04~>J}2`7V75TelTDmUxch(D2JJxT)iKajoKJa zFeNVBROXO!@9isN#SzJ^Rk&L0KNJmo81NKU;0o&f*I&^`_9tD>ws~Mq=AjBedDOhQ1}S9U&vm8Ebsw_n@M z6epTBr?N9h{`CUSfX1Rsj`ot4ZQ zAHE(!vS-W@oZwq3-Xb8Ns-U!$btxk3kw6Z1_c|^}$sTV4drwv*1$h3H2;Sc~yRE9E zcemm5o_v*~<`L27dP|PGeUc;?nN~Y%$9)^|V>SlCfC^Vw!Ah|8VNC$c=Xei$ZZ_NEeQ(3dw^ey@_P13OZqi9n(UDcGA zJ5og+AFnMQuRCW*&vtvmemlc{d+kfQVlSwK`9=cIb^$GYGnc^(C+I<{AV zZK;H}lw^@hnr0_6MsQcP1BOONB~K0$3552CL=H{*bavgA_5v@)KlZ8k zvC&ty9^wBIYZvReGgRV_=;Sv)Fx_`DfN2kXYMip`df*{0^~^XfUSIEb!M%HpWgiJW z8|P5261;B;Y~y=j6xe$*<9-d85LuYEQ^WF?d8rpOKjQbUX0-Mn$4iLi&oSH_Nk|=! z^z9RC5(J1?VM^rjn?nY^vu)pv7$sj5$ZK)y7T(wux4>Z72LHtzLw;ESnF+WorkMLz z$zpK&2nM+&Pc~K*%PrZhKGNSBy^u1oC#(5FJ>bFPciHe#9cl|O2EmXkWMH%J#6v&Zv!#-%lf z6FDU9K4bNyWsT=_f4U_EA(k;&+ZGV#IrG<;tH$lgRoAUa41u@_G--Kjr+{(S$R zg~`on;O$c#NwEjNMR+ZAjz^UkditbJs$!<;MO_e)hNAyG+SXcjZmut%)UvpCbE=o? zm)UKoxsvE688*Jo}0-kqS$XEmZ5G}tY*@+)dmIqC4@Q1uw zUQZ)S>dD7vcQ7DFyBlFJ65a*FyK()~h6aOlwr7)FGPGVdZ=^fyha6)V=ck&mjH+O4 zQHTrVJ(BR-Bty;{#{?J_Gi-!nt?<^Fwlf4mmNZe9{3-ik1sozlnhTkEKaWj|5~_?!42b2u|l}6BdwK-#o>Dw9ao} z7?91H+cYH$38&O(#96XuXEQ%|!r-DguE&%%VSpq$a+`n6iNVywz-fb?*s{F8@>6Yl zLB|NyH`JZMMgNpY6sIP8+;~8T*DC3kb(Merf`iy7(vMapGGp1rdNkDQd>@+jX@s<>3*liPlY!?Rlq$UvF~!cS)Is3^#b za$p;$=`eNH7o#9v1-+NrH2VdDk+dzmy?1JEm4%agdvm(K5O^EU+&us3obT+{1e1awXjdfLf`iNRrq-2;yT}tYe`)kkrOTu|dQ11Om~-1k zMc-R5KKD7bo2)-qy!=7(5UM0Rlg(`e%1ppBQB2bzuF(%jZq)Y=I zVJ_8m;AX8|v1j?oj)B zvP?k0%7+l&R9PzuXN-q}vuBM}A#X`>y029j*IH7@*a{K7EB-8NdcE(-3^e`JR`<2u zBnwH+Nu^Yiqg zi?BF*qVdT3nSmb=lnV`-jBdLfC0>l})iHXO-C>&MoYvTmu}{D8rf32`m=Z$qTAf?* zwCsE1S)XfTK+mJIp5?aw(gjQNQCwr6b1MV3EYsXljf=5_&yMR6p$UNrM^ZT)@VcDr zkx<0Sd%Vy`#9uI8j8Dg2GWbKaZnoNDZ5zx6*=GGObIuax!UEF;?f~U+5;Ok4Fqw?V zo*QLy8w+OxmWp8)%>40hOfbSl@xW^h{*WL(zYQIA%it2bGLkq25^H`jh1XHbF5RNy z=LTuweUb5V6*R*K|H`J<^ zPxSP{oB|HBUe0VK^tugYi;9-84|>v!zZQ{Tx=6Az1S=r&DXl=$z1;S)$#t#N97h&* z0grRkkD5I+mY{!15&WV3UtqOo9;ulPIJXeXKpT1Bie7O~PbV|)$oPOEl?!1p!Ykw_aoQ=eRH2PjERo&b~ z=oliy=4CuyHb1+#zrHrQ^R4rwVPU9LOMp-6lCb4B z|7t}BOkG>jpOe2a3rSao4%kD-J*8f|)h-G9Gu%q*^-#T5IR?BJJJIw7N zh?f>H&$^rScyZU=^S6>P#qC2^8c=L?cK*Iw{`S{{n5nSut=)v)=m?3XR~{Txh>Wff zt$;t#2Dj~VkRWM|^3WX0k?#alj0&nbx(H0v_Bn@HieD10Pk?q)pzG z-@W2KytL{*VQsiK!{a%0Zzg*uK!df^%Ef_d+=4Q> z`J3joQIsaA$y&-bRfq(uLS2XkYX7w26HheQ>RhdL@brA_6|l1*3IKxavdUxYyeMNsA{ArXUzFlRJ~YN?Rud z_+SkmO2KvVUWs5PteppZA#`ba;d56522qw_ndn;OQB;S}@2q252y|d1{1!fXhA&E@ z++u9!EodHbGP0#k8?$6ZY9WZ!Y+0E^<{K1i9=LTbjJy&pSstmjwE55&-{AlijVSVJ zQKx&??_YR9v`Tx1J}F4{M|XF+g}g}?fv>GlIB|Q@7ELRWZc%gQJ<6$({^86*f$XVA z)jt*@oL&-m@v?5wWNTpmruF))>u`8U&BTZNz<@l(kzJ6LHn!t?I*G`t`~;ceXoySg z?SX{m?G@D@joirV2;xrjqySWZa^U%8AT}hq@}vAWvLTIjjZprpTtYO$n$rx2bPK0p z@lJauWs@=7fYHjp!aG(eZ_De%s@trGFKovG+0S_Ut*)O>r^R zjCUpA0etRp8udz7&xRBQ&=okyOTAq`u6e~-sdJ&PMxIGK%C50#+iJTKIjY~1tEJDK z*d~1imWDeZ`YZvH3+pHE*||&?S1!ouU}4Sx%lM)2b}%Kcwiwu!f8A=FLfAy*j+SU- zh4cAus8#P=2ek2SSO9^T)Wdpq&1~(_#0gZ-4A28A9owt2=p%QKc9?$nWE+kvCykAb zt+%7ayTgo!LgeL@%)@chLhnXMaJ0O`%>R)n#vmzc8|#9RfJ`UF<8}Au54>QpKL|e% zucS<|=7!=j(?yyiMT?7Q9hL&R<U8IGsGwVLX<3 zQtNN43acCHBmsi$U&YZ1c=cH?^siQIq~DBN_k~a=Egs+`+$FOcfJ4^(8^~gB-Jxr_ zBC%N&MzNtv#2tpoMyh%Ol@hl+n#Oj$g*fcN8N-z+1i}-&nu8d zYV04v_XC`(?$q$QE!D9`FZ!%w=mjp3ot^XD5>!f@mXOHX|EdS!Q%@vaUwu|$I6gub z#nLT5>a1;TUByS+(QivTUdpYQ!IjlY?)>dznVhpT_01oXn>$Zu9-OTWs1kOY7lcao zv^^4)W&I(lTM;`UhPLp>MK2itebwaLGs%M9)3!Gms}Gqt7fz93nb+zUR*ub$nXS{< zo#m>NE~@B2SJ?DduGS~mCGAdgPn!JoMZ12Uka~Mbh>pW^o>@6Y*K4`oO}d!xp6qd( z>|YUfS-T&(BPuIX*Aw#;GvKP}anQvySMB*kd7eD%+|<+*UiMY2;P>JAK2VKcjAVZ& z+}iOsqU|V!lC=E{R%t=BQ7;tJs~h;ty;hX58kLd1}?XrHN8o{idlP z+?SBeES;mxGOvi=v?uxFfYbd2>NI86nbRiP;2VukPVE9UB!K?6g}{~fU#Nj7M%&f$ zc)Hk2d`P=>|J7_jRS5%RJwq3(g4g1jI^I(pE<86i!=XLp(%d6aj zA%>fvwwvj%4p};9rk^ zf8v|_$1M-c9y6nUs^s{N=L{BBJl~LtpYS#=b!u{TFFke%N$XCR`zzc}P&nj(uHam9 zE*k1zI?SIvH}s=ReU@e?t+I2f9#^!|S`_Dwu3FiBj*MlUR+0#^`x%Cj+VNCetb?D> zOW!91B1=V`J6z(kS?}k1arE+PgY=Jyt;3h{(sh9$n?X%6NZTR74+Mu!mr0ieV z{>ZiA+^4gFy#KsxOLpY)V7xCH-&Y6-ve>)^3chlNh8aszmzS6Kip(Bmeg6-8%_Ek| zb<&HnEc#l)AIrJ<6bR_{@y9Va%=@{w3gRPW8khyn_-zaqR*~nzqp+)?x6UD`i zQ~^X@A8QD#YwqYPpY@K33KdOTGnuN0R*WkspiD|?*q`L8oZtc=HI{qcIL^)EZXHQr zv7Y9p<^7~f<%Z#&LQ?3;Hko*YZUUP5sUxrvdfpN!xFIxWu++LD)i5hXdYd91hotLr z>8yd^s+)^F;qJ>rn(nXl|5%q;i19q#lTV;de`3O3RrN5zfY6;4uWEm4K`Ju$>S~SJ zDJ#lJ>aVxk#dZ4ik8>FT0^axAdF-y~gMr6|7qiTXMIX&12M_R_U%TPiHO-g1+k=AHn-kg&SNmf-)yhxknO$lP1_v{ZX zBrOmWl`aldaph9AdM;Mj-K6Kx4eAa}!#uSCMYKSVzgnbMzeAF}#hB4}_p<6SH>-N| zWxt+Y5*c<;g@b&c(Di(^=zL;Z4dGBn!A~0|HX=t0Mf1eI$70Q+^f-UMXXIEjhw#&P zn8KuTwVZ_XWMNQXa&lMt_I%j+WZUq|cZ{Iq1aE-Cw>Pw1J0z#3#u?1d&VFoW7AFJ7 z#{_IjCFx`2?=up4=7Hs|N{Up+9a@o$j_@9i&R2to~R>q(f%wA(%lx3Gf|hS zYb+_3EiQva)5=qcs<^a1e8=7q#%hrtHoBwLC;P9-k^Xxwos|*w?RlH6O`z>hq=kBfg62$9Q@hd!?S_JL8`QE)NzHTl|-gz9!d&2xT2AypYm zfNtc_nNq(m8;;P@Z`|)+B6aIAH>Fm*kl+y`7VK}6Z(7#GZ#v}SzYs|id#rk0yb^%5 zbb{>sIil7SFplSqv?wC&>pm%#*ZiGy@dCL#9cW5gTbfdOR1tb<|e70No!G^ z2XpRnn(x(*eKp-3lBSI}55Gp%pesa?eNAVrwlGbY_A6nF=Nw@rzSkc(cx7`v?NR*Q zXNh85&{HWZYepR{ppstv9BdiE;o&7d-b3+DKX^h!$F{h`eYlR)i z*^=-GD0sfUoCyyPZz*Zd5wHm7y3UsJe>QqzhnE4BU5}t3d$}@ntI7;ZxroDK;)VuM z3Tn+&TU_c7(bB>~a4NC38eQ0OUcwA+zXMqV!yC<_ky?VvBoLm4m!gDrJb2x`PI~wl};;e@C@ z8Gec`zA`R>wqN1%9I(aU^Q2efZXOx+Qhbo#(znafLi37oaX-}z8g@0?vAH+bo8X8fOce(*3h@9jJqKT$%quyWYyAJT%u9(p=GJG?xvF6+i#LMI8J2V;=f&*`- zhWBInB%_*{`>H&Vk0ff?mn~9OZ3z@$l-RH6qvG#duUDjY6nCu4r;Q5?Jgk|Lu=5B^ zn2Rz{mocGD|5Lwou*nrxAb_~@LUWw+Mgl!V=W;1mT7G7r;T{mGez}r{Y%5tgG>Y0u z%8K_(Xuih%JQf*@Jc;ZPJou}AL7Cg2JH_G1XJt~Fn=yOtzhAdfUN~#>?WiGTSICN+ zlx-%NfSOjR+JRB1;!KJWG`|%N5{sE#tCKu6)_eS%=md2bx) z^L{OI0)*-(D{Zcl>T1&5^KUlVy1GIw9}5cP)oLsao84Xx&HQ2B9A9kob1G7t>j1-< z9;OT6-bg+Jprlr>FUCJElgVHf_`qs0M1}-~FeZWQ`;|sKa9H$iWsso-UB639d)aOD z_X&9L@NB;-jHcZ=JD(u<4S07#46?gAGws~^pnf%Ii1}-f3FavTmz^NVGr*hL_Q$ z`0a#W#x}%$UdqW)Tw02+pwRSVNXq+f;lR(B@HH|W81U(&j;z@baoAD2nPK8gr9Va}np1g(tO+N5*U@v%Zh)OPhX--cFi! zLQ55#eWrTGM#0##^d`GJW4A!BuMk%#sNR5f(81%Xu$0y`sJKE(@80KeCyB4!1A<}8 z&h}G{0?Q8FvyB&(uj`BM)G&O;++9sU)k53T|GF)wNB(-N`aZ#M2xC2__W)sa$3vsM z=hZz{ub!RmK?Thgb`M&SD~b6-~InuC<+_bY_6#53B2WF7_ zsfWv&_Q5H$`;GD=4?)f$GR_{Rs=HI~D0Oq57fnZ9lDDOjLUjG#xlJlNx5?P~cK0Rd z`J#v4<$X#$aAslqaV(g$rCoiEoD4Yd$e>jc+#*A(QMZ3vs;cL0hl;2T==zC-@KZ<( z7kvKw{Iog9XLNoZ5DAwk{|*1055GU&a){#rg8Y&|+2`Ze{*Pfmv(gj@Qi?kG?#_zx zJgZd(BC$f`qXi(x0Or8ZkfwtF#7}Eu>mWGpa{im3bq_TyNF3*fU}a3E1Scx&PtV*Y z?n4QOiv_XTqn?y`Yk8(smo;E^6VZi?gnCJwYP*3B8%Yw`BT!yVz9w;f7FU9E`@|@A zS_Fr;=&2S48X?GBP(0^7kMpK^u#bhyk2)I?^k^|-lj|G7o6&nQd8LK8b66V$EfE&Z zdLnecYTXI)7x_O5)-V(`p2p1_^w#gBUyb&s@Art}Hed&dF!?_DoH5hNy3xBeJ>2Ja}*w0f$WtLPOr;BII;4C9Xekc`T(F89(gK|8$6H-Xw8b z9L@H%HWoRiV7oF%#OXr!IBA&0F`lPab<||uzg0D^z&@?a;i;4Qmsg0d#W4;t!KSYC11`Q9&k7|Ip3Z4+mlo`l)gvCkQ1$}1d~GzYRz@Y zQo*lp(xQJSM|UPg{TyIPtT`y>#g z`}?4LNVA)fCCuW1_Ez@8`Gn6yGUiRsET~q+wf~C#XszF$Ni&Gt`wLY zMwQP`MM{iz9J2y?Fb7VzCr)1Lc@dv1`x8Ib(-9{P|HB=Vg1m07yb(+!Pd3R0be=zt z2BLR8*V&T3`lBZl(F!Tb$|3M0R*LACOmGTH%E7oaZt`H|6$b2&6^7!}WZ1bx5tiyk zYo%a~cX3J`nnxK0MSxfq40-e2y60!>{%Q?h9yKAA!AA;yA0?-IuquNX>%M3X!5SD9 zoQQ&mfFKZ?s6DSQksXY0YB9}yw^(O=uAkA0Pog$*Ga{$8hUFT+6Emip9PmHLKwu3# zNQ-)wOh&LeCXNZC3L+_|ga!#z{Su_||FuP|l9@~E|CNAni2`R^og4$#>jAmSiqgZ8 zUACC$(Q#ry)85^xZ&*M*jwC%nIZ7SY+qZo1c3dX}AYnG|ys?2Ef7iuvMu}fq*(+9s zJSi+NHNx`vOt<)2q-+N&+YZuzfbWUD#X_IQcbQ&yV%q9TRSe@es`idHaa9{$eG z4odMyTZyX(ZQ`Jc3=95Uqhmo?Di0zyBWG$O0uqYN?{oql+HCN+>x{QyF3n$Vx(UKD zErzTw{{Fn|JFTniwyzJZFe?NBJ~DPPHT5+GS>CKUIqaF zQxUgy?VmG7&2B0}7^6EL764C*y4={_MsTo5E^_Mv6Pf?&sv9?V_m^Xpx_^w*p@{rX zBXfL|RDw(@GUQ)#G-6&QzaRwCCE&+M8}$taz2?JOh9pITunK*^`4^=e3~x6VmWM$} zVNcrmSpHb;%(h}R0L9f0$HS7>Ve1`0q&tkgAiqu?5VZ%A%5kL#W z)>MZnEA+{mwbI^R#UB5+LCP?T(D`}LhXC7I0G!d(Nl-*5005SX(Cgi#5PlVLD19~~ z0Tg$C-RiC^Rd9MpG)5Oc`5R>zcIcRe4Nez-GQP3`(?NGvKSSoi19cdobab5gS>w zLoi^moCM^qteG38#yQB{t5vQl6n2|q#=So9lDOmC%1>HlK-hMBy;lX)Vv={j5Wjb- zOuhN%U8Euq<4`2YFb7kKk@4|@V1>;DHGd@mKz-*jkb{NIdr54nkvKLy|2xG;5zU#& zQQmC>2CUl17lku5IdELspxt|A`iJdS7$k&UM~4!XGs(|GSLnB`TtNXo{DAbN6%sAq6>EVp=CbD}pK@g;W>dpr%>lIiY5`U5Q(1P=w3EsW@v zxB3TTX-OU@Z%frq*;6l6x?smsY4rh-SC?tcm;SO3BKwxtx3~2sB7WE@I5?E6QjkFN z*q`B|fR&L;)7VFds(&vu;en542!+=>ao^&_vk_kki2lcC53*lM_=l`{Z*&THx7)L^ z^X2hXHC9LCiO%D78oUikrz2M>m(nd8B#G)BnVZLuqVKq(e){_hF_G!dv_IxQ<5S`E z(ab+7pcaBC7hFh)GEOoXzQRn5&jU>bE@QTa9Ir1gXml|+9%t;Eu|!=jQn5WrQE_`4 z6!%K*0h8b(;aJSU>VMxR9piyE9ayRg&jq#|iE*p;W42u7H6@P^*M^5*B9)btBCvmc zkXKWSHaBYkie?q=PyxjeIT;>K&IC}`dim>b3bCQ=1)jT+!^qyHFA{kCox^3{Z*lZA z5PtQiX&XPWWcZzF0Yi$CN6ZzV}J-Bm?Fkzt@VIN$20D=#lBYj*!3> z{2#O1U>Q1&ccm@-WQ2fD-EN#U8t2vF)B;=gM4QJr$w3%tMrgqk+`Invcc~N^w<-o?oFOAR|NbkOl+gN!z-At&vTfiJZu`n9lRyHA z6MIU4o_aM^hD5lR|JYxbpJ8MNR3~pNg5HWP0nZjOcC?i=vX zjsONmgl)qQF-O;RmNT@UK8?uF&;Qu4wY&SXoyMwr*%>_goVyWFL{8dYGW_|e^`W`n``Y)sU^)OE1;Gps8fG<)#Ap63 z3EiOs?dKS;{dI7$qs72E*VEA294YyFc1;ro5GV$Jmf@8Z90Ey4K4JWfM>ih!j66g} zMrQ?(!X@bAmu!@oguv*(%@inGK}hQ`gv@vlfKLt-;%nxC_n8uwTJq@VXrAgb!=`m6 z5I4~vZZs}ZvMk>p8NaJIMYNI}sgXx@2u36V-8Wg7o39`RRML|`mc_ceXSr#ZBM%n= zS`0lb0bgZ%om{Cv*b`y#i-jFT<0IUp8VGY3)#xkE1g-3Oz0z1cx5W|RC99=?q~3Z$ zVIOa}j!;2egUL@fv0}VOfSPxQq+bq`Np^)eO5&UJOua+beW#Y-;^N|%>G*p#dx@-S z)$_e5OmK3_d#B(N0?#K(AcO)lzuz*kJeW%N^>_VEJ~q^gks55KK4*GJmvpA(uwBgB z`Ay67hqy&)Oh<|^r~)yyKEV$ICfovkKvo!QvclQnbND1u{ySd+v+u%;vq5DN=OKPq zgGI=?q+&76y(Au}YLU3cym4tN6U($pEXMoU?jNP78FV78lux0uG%1a1PR81Xyo_Cg*#5X;&_6!U9dho*aMnm;| zNvSGKo`V#|3GOZ7n;!E#+-{z{4;l`*J*1dV*IGS3DSGY`OH)SbwOBf97x#0R3Czv% zI|sV3;KfHC6U7y`hAcMh0vxgLi$hy#Gu~Z zP=5z-bMLadlrk?}{PO*hlABuWPKmh>zjZ^q5=x z#Yxgd^X#UU&^)ht zUT7X;2%HL;%(y~LMKv-5{Q*oIvF+=>`CE_Ll1t@YNg`Vh&izVpn_bX&cp)4-&z?Vj zwDI@{3sw;c3YwtxuVFnNAAr8wlTU20`Bl?w{=-g+BAR}*hYO;gb(gn9w{j5=69RjZ z+&LjvmkKm+-+H~31mc%W1`qQqn#ui?gHF8|c<$-T1GTG%Dm=UW5AOTqw&WyJrSpiX zmaDNDYSYeIbNFvWIMX|3-K`QS;$y94rHMse%ZE^{z4bCk50hj3qM@AvnD*8`fGLli zrOL?%R*L^sPjPWX8W-iIrHL=-qZRMrp;Y~Ppa}#(G1R)IqP2;t5ZdkU>mdMpKSPII zl*t?ulo%lwZuZqs1%@4rY+4QfVOR93O3}^d8WOZCxnug>nhGhKEXPC2mh@6Df8qp< zSycEFFLXog0h|3HJ8g)*?xrnwGaH$mHtvQR#t4gW$O!Jcwb8k`a+T6Ya?dX=FZ(7= zfv@7Fgl>H!gwT7r!xIu;!KqR=a7_(Uq4z)#E65ar zhe(?tZdqA^$CN1n7qFL(h2_Q6*BjU(;BDXPy+ex)fw`=m@6OY=ZhWrJNjg-%c zXK)>rll0(EnPgI;)lI5mCeb8Q(prm}0~Ayil& zQpOC_y}g^ZEp0(pjDI&tr7iM01ilZM#vok4C4OE5ZdR~a`b~#ob2}1WSI#ECYBqZF zA6*O{1C=zjj_98df$BQUa?AVoS&EPq^59i8_{|c*+ zME~hj0`M0!}%OpOsDU>kT5tK%y)cu`U;xX1ta-@CiKsD3Pj4-u^h|DV>u ze>ZGmh=a3Hl0Kg6TKfVC(y}cpTwh;*phDM2O7GwIZ$CQD*LUc*y`2%>#jRhS8Yd$$ z?sf67&$(HFF>yR`B#T1Cxz_IPi%I zY6rQ|AY)$e$rQ(W&8YV%U~@dKvPB`P*l9z@U*h!j4|^6YNasAeb3Er|U0rLyi4}EpNPwvPhX!iuf}eX)OfbCs z{g;l8;R}0{g?m65`)h?R7o6+(9vPy3of{q!@imE=0_JTDa~pKk*4Hnd9D!oMb*LT} zzZc;JA9I+%zl+^XYig)p?+D2w>aZo`p(5OVY)ms=OM>c;Eo35DwPPKKj9uEX>J_+) zA2)o=);;+;llr~e1Gb5F4)lUxaD^u{k1%&Q;^rpc-&t3HDLGD`vrkqY4KRyPp6TT{ zJ+i|?X_n}w1OS9B-gRy0-ZwTXD-ne0JXT*4 z$0vi#?UsJjSDPLaf#$ISzILXArcN!?j1W9#qI$0FmV!D^bNY1sCvhk~>;-KaU1sJA z_jJ{xr049YoBqf|^E~HI8cmTsAQ}4RJL{#T!IS@pX<#ztVS^mpeFk_?5Gj+*=4Qkq z8BxT+N)oU~3bz9aNp!#o*y=vBrP7j!<|F5Kpt9uftBu0;6w3k58)-(BE3HyAv2jh$ zn!^r8g$l+@p-Z?}-Iz>+F~+Hn4Suqi+=j#dA`l5dwxO}KY0x}zp20*|Di(QD27}x| zH(~GYbq@d3xA4-?^irZlTxYH9p@-*{ZzuFCD3}s|s^P_VuBPcH;XTJ0PwSOKGu%*x zgNIc6jhu>!UEQ<0WL9#pH;SN&#|#ddw}yEy0sCYTkL`327rg){(5-mfDfwk`>&cE! zrY5LwJJ0^zy{AtH=ZTe=ND!Ti*_ZlD%>PQa8A%pgKUh0TZlEB*2opNDGq0%cF%&`AzgdyZT1Gw-&c%ehcLA2e%CplcLA5~+Usr~Xa8OyHanqy*S=xq$yPL2`xqY`4F-sY#zh6l$wnm)%TP!LudGtJkaxm!jbe)=$u3iU_^8vdA)myP||JKyhfSCTMU&e^62D_o+v9Yn4 z$3`Y5e4lwqb%YI3yOg++{LhaLZF-x|ydlh(gi3g*MeTL%8+97Iq6Nm7ps{_o<|=S( zMht<+wr#8NH`+|BHhVXk>D#@^76XvK9?B1F6e}pPdl0gv8ZKhvdOETBG$`R3ysT?k zhz$C{7j3yoQ@OkN03006h6}QjMgk=KK5gHIgK7s*`1L^(CTl|%h&?! zny1`>Ymav=A`{HApIiWgUAHgHD9jR2Zq~GxsAn*J)>OGb1_9RRg=xdq+9WEh%NHZ2 z(U4+c$GHWb{XJKOSzw&-Sto=eUWR3jRdzjg%ASpp2M65ABAfv-$ySIx#K+T;S_1k#->V!lLKO293t*{mH0V!Lrz^ywWac{g=9Fqt$i zs5F4^BG7aRr53VoUv=4VAToo8bijRleBij)=~cSF0dX4WR{vM>r)} z(%^l7A3j%7o3H>9_KE0As&H9=DBav8T|6#L`uz=eG#M((A5t@`(c0mwaVs7Q0@bMKQR(;3DV~IA`#FR7 zg62uH!2e+5@t<4CJrT`p_Fa^ok57D62HU{ha2T`dzIjr`!J*7U#>^-<;KXmxu!R)y z+|7i+GifB8mI(Z&+I^A9^O|153kJs1JLw|v z#z2h!SEKVX$_hZq;pyb-hehwMQaB%~WC5Bcu$DwqB=CTFHP`C7=F2b3av287F?0s0 zbOIYHIG9U!3QAA{F~V)@g#7J9Ot_%PKnVo(n1cXS`tVNw1{XorX)ugKpT5l|UnuZ} z_JPQm+>0%3URE?Ya>=YzAZe2cAM(+f%md1d!VO{#T@W$~1Wg+YJ4Q|=8KC;n0s*^y z+yj_0;{KfXTF%2N)9mq?8MURnC}7@gsPtg48hoD|+}uK8UaX4SuP%Ov61!C+jDY!d zln%)xux%GJbj|RRsK^Wwp$Ib$p&I_j+o@?SD=X8jC;_{OBc{}ILSiuk$I=5#*xGF0 zxx>KV+==Pmt0peWk0(tD@DmzS?+4eVcT{iOfw=IJ*u8g4b&<-mpf_l6q^oGV@tHc-FS`fS z*Su>{{P+i6v_?iocaF1op#Z}cw6p0JOIqrGb9uV=xG<;bliS7^$zJU1c>*YAsp$Mm zCR|x^;b+#NFfBM484>s3-+~Dxb(mqnA*xFK0w)<0K5^sUlyC z#O&@mc8?dfvQ-x}Hi|4qS}V?;F8R)a=>||pUAK&F2CIE;-D_o)m6M~H&<<1Wy4Dz~ zQB@ei8a$ofHyJS7!Ll;4f|wg66N4zYladogb$^|Xume({=gAo@0uT;0eW$vZJsh)6 zD#X1PaC_nVbH7Q$hO||;XBkP@h7Cwd4NotP_{G0nln7WUeo=-~T(V>q?((4-4t#Y= zbuohG>^o0nsGK1bt{3-hO9PcZ$TEuJ_I~y{8<8h2a;Lg$Rx4&7R)2OKaCCAa2Rmwg zANK&ryv{m$DmsY930Yd^Cd)g5hf&NRU&^|M8n`H9LiF_X-sk7b*+jp$`y$lb$BgP+ zoj~hm7GYRXv8{%IPbCZ$q7GH{>w+e53)AHuio`|pldj%Xnv=}|$ZXV_=-iU4hPBHX z>4p4Db-esfzyzjwc$!mBS>_vG&UNH8zyD`(*j7}~5Aj&^uZ7HPJG}u)ZUDaSa*N85 zP|-PaFsc&m1XEsqfk1SzOSu$oL7%9MCh9vBXal+~zzmji`6Tac^~4jz;>hGAPUU1- z1GNQFxLGx6VGIX-raD`H{~IhUEHLN%*}-&dSY>_(VhZM-V$T!bS5|7(wc5%-WXXB| zm#2)4rAo2w1sC5|`}(SysIJTEgp<|R21WPz4nKTHpWzwg)RVGcHOck;5Jdgfc_%n7PeXto; zq)aO=r_(s68D_CD{yx@5;Ei^?T$BuLW#83K!@@h~6~?zHsiSj0nr8^A;5?rQ7K&H$ z-rnB&B&KiPwm!@_T?mwpPqmF0TvX_aW zn^m~LLpk#XkhFiuq({#GFp!`SFaM%4);RZ92nUzRgyV~{Hok7i2ywU>_%cZT{hq)Q z&TDpOSP$tp!;TRd6f=}aR<+@B#EGFGFM^d*Qndp*Upnp{+kgN;7^ zzM!3A)Pc{pN`orQe~7nTmJIy89UX6{7c^8Bppn$bS{j1Jx!sTKJX8mtmEE0u7d!79 zot~}@Q{8R4-2Lp_bMNW812)9HppEklrz|-ecrn1X&)COXAe~bDf&rgfoES`SR_=#m zWNVf>&*WEBM#RCFZBk*zGex5o0H6X>=Jn~C}zVd0QN6lyZ2X1Z4VM< zAmlUepfpQ{QD8$e?zW+vw4kOy!3IEZWd-blO}aSSE|@lEcoU2hn7qcqYIEZU`{GFm$r%UN9=fML^Dg*yy1J zs+Z~|)BDV%#~lCtCw*~rUk{@ z$jPUuVp{i1_YZ&({oYGpCS+%T0mw!+G)zL#MIwgXu1vM#5_Efa+w*N`bgKdtH@_r* z<%p9=exA!Ervn)n7$5EGhrgK2Ru+ z(O5bV0Ru+Bw>c8FQr88n@^OzUgNuIYbGErJI}r>42K+kfZ$dK3T=6$(G+^CUwdyAL z5Ri^JC%G$wmDlK*Za;ktxDmlX$#pI>KkCU@^ww+;cTTnH5F|gBSywYa2iX+-&Az;HF}cd4THI30wLqht?}W=9~Q${PUOVb5GcV8-6c{ zI!_ICF8Q$*hXM?WD0m~(<<&xW2tqz^DB*ww9w!-&Or_B&q)`LTa%)GQm%ZoT%Drf| z2?Y(4Zi(hiCq(8ikQy`^O0gKEB4a6qvcR#mi*En1LY(?+z{p0 zD_==8D)B%P<(wo43HsFe?BjnklT0931mbG@T=C+S$bO&&4yLW8XFvI!%fC^3%n_pH&!1yLk zhDj1cKad9(b#g*rjM@v^ti0U^7Sev`0Mh%5D!V#J_=W;S#>a_p+O#kdZJN?u zDkUQN5Plkp=s1N40$R{RO`7H45*Kg(A5m`smDRd^55JUjr*w%Z-635f(x8IU2nZsf zfRuEnNVkB5AgKb}Dw@8V!H2l{-_xFu&jCY*DJ>wqFVZYB_&s=lPHP;`BpIGrj zZw_w>m~YEk4=bn^vQieZB$m8LnO33C;WWBf`jk>3O%d<_bu&V*Fz;#rz#hWks5d{; z;2_OH)JViBY`9sn%Z^rVFyRA9HFC;9pF=i4601U{dE&L6rW=QwK;>#wC9v;G36isfa)c3-X};9cqg7C-#+it zMUHMZzx*$lNcrMm`9g{boy4Hh&ea;7)ena{_T|&3Nm73ytrXmNl5{hFnSu1&_p>sL zkkj`Yu^YMdtgW`ou9|s}TzT~aagyDwmX+%SIz~xO9k(jylg~V#C|0H}QsfI7V}zg4 z+~c5Xa;KjPVBzPEe8T-|lB;CI&W{#NDMwHBeRx--84NdsTJQv?&se$LEw=^jC$P=7f((i5wkS;S?GocZ*qJOGg)2U zzJ>e^bzB9e|CnSvSh-*}ai-ElntbCqJ7z#xDNhB}lv$~(90_LM5DYS9UHzh9clN8O z?N{HM^HfFCXgIkza+#mBi&G)=$P<`Km^tOX>Kx~k}l?%y1oArY~7(iApw z7oU?(3Q)MN9(W#zS{XqCyMFjlbf-nQ7gbI)Z(k$hCcu68&) ztg+rQ+3T;!FmnhCH8Tf4UBX_PPtPa{`LChHeH9}xt6qJesY(*W&kn$J7j|9Y1UPum z+25a9omj_=vuQ&JQarNwZ%U*tc+6-zrcyGpYV>X{jZ^+hrgNd%dZ@CsPX1&A;aC+A zn8{fZ)Aaw!XmE4J&@!W8zfG}%1eqM;`JMbE%`;;gCT?yFn~*kUII6nPbaHn8aj&gu zfbEak4<8oWW!vQ|T>BK9OLX9GPSfd19LjI8&(d2ZAx*t{4`1iZ*oi(=_IypNZaf#0 zhknbmAgS;Af6X4j<=(M3zy#Whv8gGpQ$7kj7TRc{OEw&7@fW|Neg|9vJ{qdlVe~f; z@5kvFZ?zxgqfsC^;(y#A@%*K36iU9PB>LNj>`9Qcg4po%QerT!6U)=Y88Kifp_7>% z*eH15UU}HQDm^d1g+^Q~D@Yo@m5tW@iB)MbaK4S6W)vk<`fe~eqK{0OaTjHe&fjV$ zZ!o{(Xxw-t|MJpl&(>AsiT$SPEn#I^1hNW6mfqh;$)47M6~l>K4~l2`^7%zX!TbSm z;@6+iaCk9Ce(Ra&LZ>@_S^fSq!7Jq=n&w2h@K z4a~w1{~+PA`ueveERnzUjII+sR{<#n0e8Arq~%G@UWdyiP?E67iM`LX0tROPI(>{B zNl?ZHmjrz{U4=s0geHk4T9Q?FL;StFNaLoQiAyL+__zL0#z2Cq-_f1a*zuFaWZnxM zuWojn`^+Hr^gH)`3;Atm)E@ww{HpWn~g z6gbgCqY(*|9Qf7=vg_f`Lib0V`CL{Qh_e$EYXI7qT#{g9GE_8La~xcAX>+K7!1)&V zz|YIibBc;^;CTXggi+G`JFhx$G_$1M+g@rG3O(~Y0k^9*=b?TN$hnxTIrvdAX*B(N zjE`?H@5ZSfeR!1MD{ab8fKf9=m>nCzPJTifu0%o<`oe9zf*U_{MiUXSuR^Vjfm%Bi zXB#h@BeyQ+Pmg|&HD`@ytOyFm z=bizh@y_d0rO$sY0FW$c`>>7=IqGF)yc#FhtAK|CcG)c9WBOMn(R6Tbr=Ir}Q=3IaMX#f(r>d;*?d3#M94~&L?d{{fr*MTGBQ#}S2qA0mkEi9 zIk~w39i7fy`FE3r%PpmB2j6}2XJiRh@DZoyEn2~}u-7)yC-@j+DAB&~^AyGI`1_aC zhYTna*SV9dTnQ)G!&nsXFqN1EVA?U`*ZOswJUR4SL4=JSK`!nu@fJs@;k9815=8qJE;+zh8Q~Z=A7il;ti=z z$HaW7e1bsMdMp6)7snP{KAT!nVXu};Oxqtc?{k(J@Dtn6{#aZq%tA+DvaZ>v2@xog z!quNUP{cus{*XVx&HjU~scGy;$%ChoT|v0ys&c|8ss8qjg92Ao@<|K9RDG?@r~0=` zbayPkkKqpM=I>Q;2yv*VFsGO8_4{53HSH#r(_Eyzy(etv<#o&YM@H)2Kk#n@;$vW7 z0G4`nZB1TFtG~kRi4rM2jWOMjYEZj5e7;$ZI@ACoLIcwspa928j^+3NtI+O4Zfe4%wY**yv`Wlq4UQSKQtkesndx zM-udwUe)6AG^AuCiIy&f9quj56&OvZtXKaGy;r>EFxu0$8=H^myibI(yJXLfn6{6$ zvN}RT4|CSp$OV=!Qk{NqD%7&!$fS6^Qi2>VQrp3lm=x4a_P^qr1lm@gnLBolY#$Ie z&1I&jzc`gXoX0l3-;^@7*_H6iNMF$H^>82ecr0l5eRx7_NFE?!qXFq`y)ocbH?5HuPKX8xvw>R?Vsun2yHBkdYc)_s4Ge zW7WIOH+RnH@aQGBw~uTL!(Az((b3U);6K#t`>m3i5^}-V0@9>s`fGuQvs%1{RhY<@ zJP`TB?Pg#HRmHO@(Y`K5i~cNW@LhxySUyQ)OjOkprVSq35PAHnVMi7ET8={xxK4Sf zB5x{;7HFhzkCgj}IQCORqlnecPl9=eiSgmXhZV4~ypOFW@$E?CBrFtlUWyirc{n>a z7aK{@?mLUyRZv-A!&VM3@6f9im6sQ` zyg^?&JKh74IxPkamI6;lKYZE@z}wnOJPE*MrH+U=xN!}PhRjX`?O%UX+;Lr@S@2-7 z5R|7ztNieRAo<}w*Bf;bzugK~K+w=?b3YAAy@f@H8+Ou;kFNH|O*q3=>4hFShgSL( zbN;&i4%7qQdfN2aS^qIpkE?T+Cx^}_HPN+4D=Od5*DVr^P4Q*ASSCr8Mh{5ya|!a- z8PM5uQ}9q6DH>)-ZeP&$CjRC)c8jDr`o-R@xz29J3mR_GTi|7Hah5Vj3LaW+3oh6j zZ*b+x;0`nk`O#fzf*J!+zfwCZ9t`r<2QD=o=wIDW}I+PJFz#Kkx+@n6e9C$VR_T8KFOCdBprS!+fFY zp_2e@XKebToltGiqrFcb&2=R=AK`GQr$vEg%tApxpn@Yrg88`i(% zOrexDTfx-TBX$ZsRon1ks_!sqH(F+#UTGlayr|^88=u`F)Gw7+%uqA^96us5at9Kh z&`@rFr{4p2Q)!?Lfpp+d>FZ+VRa{exMjW|!!bQt64Y&)|*aMApUMMU8Em!emfOU9m ztYp;YruFxfI9)kRzhqONtEQ)uV+0b;y3f)fzyP-FqEK2=J3%@9Jb)*;dvoEI0O9~j zCqX-4A#~M0bd@C5l?EzdtUK=B!|x1YmO_G0o(SW`ECHw?jqD^LxI!A+-95~n3b5$+ zZ);&OF$`6l2t^BvSFak)JNI_J?<{qTFtH778QYdFD|p_Aisxz4kL4fB8hn>C5gRD| zRks6ybRK4`xSw<)cFd9tM4bzJ(A5&*67&ef z`)uBtYrTGDgY9Ch+&4IHZZb~ybdQZj5ha#dXsu-VN z5kFJ(61!;XhrFnj*3j+qa$knXWbXF-q`Trie{j?}gw#3qmWh~K96p-&j`E=VoI+x5 zr==(&96i>s)Nh;bDgILq_0Pt`Q*XdJkfYVxvJr%IqMX$^@X*9&T!x%Z-UITdd{pD0 z%uLd<&>mX(_#0WL2C#N3~(b!KCHwXXviBukL| zh9vpwRWFDWl{fyQ{o8zb(J-DsXjd?!PDPCNOIb=dRULMXBT*CJr+^)^@S!Kdh7afv z@be$HTcG{H|Kz6Xtsr?Kn7W(xT$U=5g)tV^mBZ9I8!Z0@1&#tQ`iL3_lLQBopPye_ z`~9?k&|7z)dyQ(H(Bu|G>1&!N!<8Unz>f^z?*4A^YGoZsZmA)+1F%B;XbMiSnp zs3ptMzat;zA{Nb@Zv`pBZps4bH#~!WW@~ds0Z+F2yMKWlh=pBT+_0Xj#aAsmCVnm9 znviHeu373>)2nsK!HqA_jJNM5EV#;3@}Z57@si1Vr`NP2w)v2)q0W`fv)avU(8k)L zEi>Lc-TF2-Mp-ye&#k;WPAqmG^RnoK4tz(Et6R5Vp81%eOdU7{zJdW ztON^NMoqS~muOkTu9`OhFp0y;=gVpz3@R-;L_7y_m7hF)+76jS+kfk~7JInL_4BP$ zDabk0TXGabh1a|q+MVg4rC+>y86*m-%#(lh=utPA?c#LWSN4`m|CvD`4ZO??2cCM> z^-c@u&@x6qpq8zJo@kNC@iiKPT!;loYzje&>W2^Xv)#~tv@7IHZH5f31@$fm46Sje zd=OP!%x_OENV_G6J#%QDkFBzzdl} z!$gr;gt5jURpdWn*9rNTgVp#~5=YF{!?u8sKMpoWrN`K&No4JzUYFj8Uyr%@W6#Jm z;vmhUQrqFFg0FklZBF|89L&0(Fy((y#(&f2C-zdY`f4kkG&oOjQ(08V+k8G4>ZW;D4dzr;E<;b0$B(VzDCAy=98s9L*X4#m#zLJp>rlw&%bWdCH(OEZhdJhPd z&s7_lieDHwilTuMdlGQu_5wQw#hE5Z*?iGTT;X$mj%r`rf3G+1K?Fk^acv9pT=H@n z&v-Y`O{; zN?%>UOoPW>1$?m+4>fCM-00HM(*^kX{g4Z6xhFB=S)xKO&WD|-xvkLtmApH*ujGUO zcIZ2qN@fD!1rbt>!_BEsEPSe8*CuU2_P?s(IbP?=1vNIuZa7<4ocH{dv1CG6D3GrJ zwwZRy0W}~$^YY$bK6&^xrSG@-j(&tHJ382pz|ipjH%aZ~(W;Lg(ZQ9ueQ~-4+c#W- zQp9JQ9ZSPi@}Ah+4|`{Pi@$CoET9y95~`vZuO6jA!(TDEzvtSqv?KKOo*Y4_0(OSx zgTH$BD4~beeyAJJbb%%vay`r(D!m%zaHJEY9FcgyhCn?$O)N;t$nXRY`uQ4BP>Ude z&*|{i&e+@~n!&rTT>f#k8jg*7Y_$hJV&}szFC5QSAIT~#X~iylzgsA9Il!e;^$A_T z5mQHtJwH$b)uJdT@-(2&PDPPDfGN|l>#hJ=#pHJTmJhb++4PEz;k`)EoS*=;KelMC zQd~5zQuJ7DM1}T+JiFz_PW3TW;%GM&FM_6?Lbr!EKmI3&Mp{t)-@3c^x+i8{&PCf~ zzY@)>h8qcXVlrqxNQ>~=YNT$4Ee914vk8K(e*8CdpoJ?8xWhUhXGe!~11tsj;!eu9(opurC+l-!D9dl6@(RT4$Ngeo{jsEdlpuTN<2$)}mw89} z!T+%0$jC@hSsAh;6PnyBTgu@^6%+RGL0-(yKQ<0>VK@w^9i-_3R^8FDJg2Nw(P9N^ zgBd`|S0^rrDGPwCvW`yN?C)raS>Ma^1|w|P+?%CyD}RCnZ_Uu3<`#$~*Al(I$pUY{ z@GGS)VF~Nv(+P(akwgRz+go9mOfbr^HiOGRV@Nm}sye>1Gi{JThGO_gKuFgWqdF(j z_yX&sH`fhS&j!buLbQBN^o|OfFK?f1_+DVg_->)pE{f5GWMrtzQai)k73LMDi{=$g zP!Tj&Iz_ppcEo*#2mP~&*%`meT&!s=O~t+<+@s>|==^P+A?4xCfAXNmP)JwRMbfx- z*qfA2%+Vi9&XoCMs4xhxMgF90R`0;~5K(3Y_KZ#qv6*+d%D6yT@jo5qhSI`eRS!uf z)9_VYmF>TG|NdfeNm(0I$?aLMEnAEFZ;xS<@eNS9?rnKVkw&X5>>cC%t`RnYJ%^k+ z{J5feQE9)m@1j*gYs=(w#DbLLzAls>P;k&(K^WNiyOYt;`(UJ?1(Y>1T%fMAOCP5u z^`W%16B=uN=f#eNghZ8y26|!wWnK;~BD`RQC(oV*cQ469p8%~I0r`8H*zSSx@h})k z<0l9-{AeAQQX~kQb-(qBr)JG1;D;qNL0lnBf6j&Tq0>HqIVL(!E-q%U+@u}4yv+1> z2`Fg*ax^052d{JpN0@oS4;g34{{W`|h4gJs#gb22N)9RCIhbkNxyl=&9KBDcc5T(K z(Gc6tmk(kGiu_*e=ls9=o=y-%(C}@|Aty z7+Ij6X*|0BKo&J0;##wGd+vnlepww=R@Q8*WT>KTU}#X=<5vD-aWZBcsELHL?wj}A z8_zjkN(|6_{lgOLGZm!E8mHR&j=e|3F3igC!=oA^AQ zO^u`HWriQGKn`CEHj}p>!d1M{cne#Dz;6i?VDMfE3pJyFO82-s@l>D1aKoP6vFVrt z%r1C+TN+f{2Cto;RhB-gLHuSRDVQ`wE5H4iiaW)Wpz(&o9|LAjv&m1kZ%CbkF2K3` zJwt*V7Npagj808O!Z+&T;(|0KnVFe&x4G~G_!ZP)3in^dTh;!nUlw-Uf5I@zu{fB) zt`;sK))^9K>MsYPIbtI{34^~Ugb1-EVuqfnrOs$xcT(_8Fp&Z*G-A&hCiUiyi8reV zJ2P$Mg?5|7;jj2hZ05ecbP5FpRSJ}Pnk0jk^drx@Px~s8 z##;>xQ&6>~9QOZC1kQh9d6$$h=~3}?Fh}A>}y&(b_Y-CRjH98fU7gCy+lO8=D zgS|VA5{Dpry~IFO+fTfC!SueUv~=X%TqQxbGxSJuaB?L^@PfR=qzteZVY59=FO6}q}G@rW}c`PS})KY<(84_~Ee!7+v8Usv(&W7r}@$7!<4xpaj zRvF-Odpyib8_i5Zz)2hV*A++l=TPjoJ?{+ji3E?LAw%jFj~_OIsV+LZAE=(*|M=f% zoQV_+v1Sm3vM`n5Sa2&G5GO(k8|*t{vF0Pkb%&e0lCE1TQ>nKzvMBqFA??t>Ir~K# z&3xL^^7iztt+vSiOI+Eru0!YFvYPYXhpw9urY~Ud9}WXSC1*wHa{^gn@!3c0^t@s} zVC2+Y>PnIbOAbB9_2Sp{=JoV(t1e%DP7en~r;Ftc+J;_FNqwsbvu7gwcJHE6jB<$| zd@%4w4!T*iFmMW8U}gU~JS=SC0S!# z<SVYSD0w|FuM#6wWiJIJ+Yi8-Y%dg1bi>NQQ?xoz%V_rwUvMRlncfz zTtD)Vh0m`J%yOZ~xdwjq1QW-l!#OmZ6~_pvXgyXk^3!*j)0 z>fcCt`_NQq$WUR+o{=v5Tcf1Y$2P1&XAe-YojNcO`_QswMLDcjDv=%0nHG0yEkYHV zzW#2i1nL2)Jtm#)EU@O}w@&Y{Q}qlC(xLnwn7+E_Y-$0Tf0P`vA8^%2-ZF}KN^T?UnDqxKlW(~O(FeqTlT(dvB&304Z}JiPqZT{}D)fh#hC@*B(cqPpBOZT5pj z5IdH)NpVA!NC_==_`m#S35?ST4|hf917CtgclxcWs(4llAoLR^I_{TNdcHAir`>MGAHXfS5n55Nm&=1U-DUFqQivQVt%)v)apF9{VM?;X@ zii8e$2BzfP02!F`7ns#w6>*>5p-_}fA;n2dZ42cwTX zuG$Q~yK_|wg|DWr^7Tr7lWD+LT$MRNA0w$*BIacc<107RJ!Xo(Kl*SVOdvkF`9E1L-W?qaA_H@4|{EJetlW$n*rG4m2`;z&ct2{L+HC5kRwY5F$a=aI#+F z{-?5=;vg{!#`1fY-+X!{MUEFde|Sn7na}O3Ktqwt!$!hO{+X>cG zbDK0EbbMMg!VxrFUYuU7k$wIP=l%zSoK)%e;!g8&Dx2USeyqGI@#1&UKkhbX`ZFI{ z5DNjz!v}_#;Ab%8T2#{H4m?r0W&?KECe26ONeg#m|ECFpP)HPNdDPgx@b(Uugtn1U z6aW#j2PPiZ;2#455h+hV2{J!%Ha9{c3VjAf@u6F9L8KG;zd|_v>D|Gr^m_+71)T zpl?Bz8rU@3R`zn5o0kDy?_hY->I=3$t$)$*;a!q1(CN7xG31_-yFmD$Q3*GRtmkemcc2BVhnO zVc$uUgjNwfSMsNiFo#BKvB?LgmzUejHt+hcv{op-R}CF}ZBk|Zajkaw^dcT z$(7NbCL>&|MKB8h!?A7m9vJ7}xdde!4qpcxJs~?L984&|Sn8RQ_sG3|jW>F|>^T7S zY-#6Rw23j4n<6XF8G-f*1dy+#MGPZ;2w=%39M&Hg4l=an^ zipPdjyvg`r$43Y?_+5aS(E&gYdNcGG+Rskp!8QV!osp0(Omv$gOWKPH;$Qo{CO2Wk z2@G#cTg{g;i0dDi0JD?*HIL8oT7&1KBe~G->lLVfD|!YVX!;yAkN_E1&+Xfsr`JH+ zDa=UA8e~I8-dcxdTs28BW6Wuc3%(>JCgqftD#jwVqql8R<3Pc}QDq#&Rj}MweI!i9 zGSHRMA;FkWB@~k-?mwDDr9PbVcfv|HUx0y(jxSVIl0j40v@T5SVwZZjmVTAsv72%J zs-gm6)cPtF8?}Fh(}Ds5UTQX`PPdx*B!;}#hu_x%>w{i(Wo5tgI;Pb53sHkH?wI0zvE1R8rZvn$1S zLzoC&5F}m~QGemdAzud7sK7lqa%Q5B(YlT5nb!-#}_PT(K(} zk2NXdC?Y#yQ-mNH$|I{=PfI$#z%~R*kIgH>H{{e@H*bPo9}V9pqKEiMq%o3mb2o__y!QC>ZX4GLo^--e#XZscqHA{( zRhU%rbYSAbMP6$zy=8CbBS_#6?%yl4PYw^J?|&g9#{}j>0bAXrQ06Lxh^E22K}M3P z83AslQb-4IWkwsQb;s88y_nN$Zhrtkvf?Lm^cqR~p~*Kfi_`+`x@nVn4{>AOhP{7} zP^ehGkD<3f>c6Y362>aSF{&j2@;%<68SP6^J19ugZd1>S%94D(BDdjy<$+wq(>~_W(V=o|9EfZ>EI<|(Ob#( zmC36HD!OEsqW=n@$&Rk*&Kt13er_hT^%ie zafBs$8E=jFBlPqF=^Sd&5Sb1B3!FiVYhZi;eFIY5L3>ATf5=k9fphOcXL=XzbU5F; zf=N@GUBFQaI+W|n5rim2u+e}rxxa6|E5&r>^*_wi@R!;o?($-|v-TXf`OOL7A5+8D z6J8D&$heLvK$SE3Y8{*p&f#54Ma~jVt6xb!)qKuzXv4gB$|PVKNy?{j@6<{4F}?Ig z?_ZaQ;(7FQbX3%C z28wxw=fQfy)EJ0$0HDX~UqWnaC$(uuq3pS>hJ7DpBUXqvq6~q|(7Ww@mx2gla1MnV zRHD~KBebh*hd7XRB;;{505*VWL-s}#y=ubj0HNUyFLAH}l<^^N?;9}r0GbATK;M8? z9_sNQx6`l<-q)OSug_o@KU(}p9)f_zx94E?10X;A)r>!7fIS+vd%DWL#bk`dW{kBt zY6O8yLxT{4?4n>-#qj88Ov&j+j%PR!=H0PO-N332OiiWN>@4kw!$`0n1~w5A|6RLY zT%xblo8>s`bGq3OE%Ng3^oL1o^d7q$*b${XMXtolALVn9j^?-I!RPm>$0LL^?9A_Z z{PRHilpr1LH2f)Lu=+e9!VO!Ok2CGMMxv!o;aVG5ND_XR`DRAoLsaX}pKiFPqhn0KXMazI2YXM6C zCySnZ0hgW=jDovMF@llb91{9$gS)*2sqCKIVZlL%lYvm1w3bTdi%#M$_)zg-YZ;7lwc8s|ExDsg-@d5mH zDtFRs7nH83lBDIjh(>^h(r$j6^YQltK6pi7T0e-7(u}4{Ta(6uJ+5{5=H=nAp8FrV zxu9?~@xHSKMV;VpTlu4r${jh&QV~{5eVj>2r|%zYWm3G3l?bG zqgLL{bFr|m9a1oChwI>aT1tB4@U5;NENjFFk%B_JyC9C^A$f}9_eHeR7JHs-OUcqZ ztF|qSL)af&f9j4x1au?Mf=)uefsVR_ELa@b>PY}GHy8X1z>3*US<}8R3W|w|(diC0 znrX5(r$Gh^!IC8hGl)=cfcjK|+cggiY#i}-c4*W#A&Cum+8b;Hia8|UqXt|A!41)f zJL}&+3!qZVZ;->e2cyN$!9jH9g}mbO@^0WebWBYh!(K#<{vSi91oOK@Ofpf(W>FEI z7nYW6aO()bVh$si+`FpvLl7M(!>^ALvZgkFte;)Q!%8gV&xeRX?4DjV^8q1r0Y=#? zpIJ%T7q%H|>Q{-Dt*x}${2yn~$y=P|?pw4~aT{q;LljjG3%g_y25w~+N0+lxs=B!M zKFz~Nyyh0Kni!>)gJ_OV!iefIN|SlbyAgesAHIp*Fr5vTYac<(nFj8xF7t&JTwm}t zL_IgF``_)GBJsjn^BjWvmI~4x+JGQJLzOq|;{9i)TAb9y=~m`|=`T!lG|a%(0Fs{Y z=}H4`k2}68xGIz+(c(MLHbzTRglu9sRvJP4C4^msE|YFR{o{nTr;UEMx3{O?@i8-# zt7L128+l`_{I;v>K?=#|5T!1-i;MugxA%f-iahqo$q1NF1N(DcVc~Vhm3=dQaqcH* z;kX)be7b&piwBvwqhb6lHGHAS!q@xdCeeAfV;6z$F&tUfSJTrY2m3QWJaaJPRWbiN ztbR7ND|&x-i=F)J!f$ca{Xe$HfTvC~BwVS@vDDzRr0gR{IUotLbtVOxpsFT-czyD8#* zTw*%p#QudMUw1=b-SwUZ;p}7+CH3U3D%wOJ$cCUX1O$Dv4H(9cn*Hyn0L#E^K?_vX z+okEZUh+CL9^CKL+yVf%2%0jOKW=kVwS!qd3K?b5$+nw6l(*y}8JdR*1^)`b&JK7JA;ZZ3@87>scHG6l|BpEh+X37M`&>BO$d{cT(Z?|W8ogJ;d;|g|+ z7kphFb@dK0e<);|JV5DZo^n^JzuO>bJ>n< z0j8m%edS=hcK*8IHDiU-=?T-Jv3zqe4Rnh|tg z;a8Zfy;UJDm}J4haT_jh#tGoKjctm{`d&x@!jV$*t9n>!01fZ&{_OHe17MPwE>=JZ zLcyCI0Gou7N?Ux8%@e2k&J3#q?n*gkZ4y^$Tvs!iE6CXGm+L~i?+Ef{#SkX|IMRD0 z(>TZ->NiEtPR5!wr!;$ubYM&&yB{`(A$fOcKSii=iC%PWy0t^TVOP{u6j^iqzkhD9 z6fp;a?HL#*Gv|LBTk4kk*5Ijq1hE;$sRzoRKvmpV$6h@DXhTOh5~YqFcxk}>lq46e@hyUysP0? zGY?<_P^NKzol-u@>TW`65*=It1Q;|fRdfO|IG6!oznTC zYm%q-td-(+kw)WQ+st*hZfW1k>r^Z-dd$N1uq$lz+B(xDgQ!dOXJopWAMI**C`uW| zzRfy>y@*0FkU_sBZo}N(BdLB%2v`&MKH4sFMP||JTsP)*J*v{%7m(j$`*(V{WDyYa zj7Yl(c>Z4Zw*;UY+wppJaRT`1pV9R4V+jkm0csRhSHY1dA@DH4BGXAzp%NB#m<|KJ zy(p{a6I67Bod$26ZuQXM4IkJx0ls@Awx)YvgVtOLU=n!fLTrZ$&{T1}sCkWOs3`Vy z#>7Z)2nvts$;it=qG=x%y`K)c9N2;&^_LE5%;9bkW_q#e>AO8IPyfGxY#y*8m3+M{ zq5}8id~2Wwo#W0TOwr}JJU3vLGi1Pd_48u`Mz`~TP;_BB*Ugf_>b`y6$Q20Ym7_+B zvtuSxk+)T?2fsq6g$lQd&?Csp1ms3z?ZP0+dMm_^S&+bTT>l=xr*Z3-#w@9y0kN_VKkMOs;jR=HlAJgC9B5RrVa zrw>|g@p<$$APOqMTZO>(|M^QnoJV$XgPrE>@zFO63#cxzNhTC%i#*6<*{j?`0s{V1 zSiCkri^J#uI6sP0nYRv4Z)aG(+?tI>oCkerBDK)nxk~pp9?p7sG*ZKQ$fp2yB0KfN z2dPs~ zw792KxE97X4v?!MZQmGY?ma2+gefpkQJ|TLhXT>I^Z#p`!otDb0zGtl)2maYt%4_x zsEkha2c>KIqEI1_OB0rA(jtAIxX)Q_vFi;i`PWfzm&A#Xz&P+$RXWT_8o_r^9Gyz2 zXvn_XiipKvH~dhIdvqQ#RIg`js{k{!)tQ|6&}P(R5glYp;Dkb_~oWxi;1M(-D8$Nu=F zqbpc32jffnyQmI(mxv(d{p$j328L?fjTx$#0*nw+4VP0$$2fYrJbg%ohX{sn0c_{< zy~1TW{(77L)yaN?)YOhtEXb-2`-69nHXVH<;g!ErpvCtX`dTEBL2CCaTPd zD*e9VpQTP~=xU~-;dPT?_JhYcQGyXklHCM%47=z1p!**aab3Usj3dFmIQqkchT_m5 z@>SUvOZ`>U(c$S&jfezdFaN5KCzwkbAr3Dc%pm81Td&qYklbl!x**|tP&RCJ2A7W1 z;q;4f=p2h&dy{zD5iJ|ok2N#HfXCMlfh~tY|KyrVI-oK{@81Nu0)f9HBUsIIjwvqn zK}{6Y)O7zO22|VXQxqcg>C~)>k@pvg6S+2KDPV*sj4lQi4QUMTG|BD^-7pqUE zq${56DJ+6nFDbW^Yz4-69)6v)13qhDv?MfgaXBeSFj`SFk)(Cny1Ka=N0kPD8iA^{ zaoM&JF16__9%(47FNs_6h_Ny>mWueBTbZbs&S`}1&wP_|8bA%N8onwCt-Q{Qbr}0I z6HIM!zN(?h>cUDEYpJGjZPxQ8wUlvY(T6gfLQDBGm9u)XF@=WdA9gi4AM+R-9pE zp&i&56ua)pD=-Ux|I!RJU52oQDROlDK)lIzhz+?F2$rCv%t80LU0)Q^3`nB}{;n5Kh4K!I10C$0~ z(b(pbvFJdkZUc10@Lxm%yhT}tu5W=Q=caelQAzVj$%h)9I%5Bz*ktBiLX6e4XYugN z%?-5*HidrRJN;8{zW}}xgZn8@f1j|GIK3M`fm|AXj+lI~5Pzm7He_U&?1hncxcjq` zjF=Z)v0%v$qV1=cAQQ_fZ`{4vw7r@)IBCKgwXO)ogK>3tZhhVEkH_J&j7E3TL7m7! z2v#ieXGC8_2$#$A!#w@Ms2e~KrHeTxWlS^!O*ien6de+A)3nx!1vome2tXT7L@()r z1DNC9=sEI5>EktmM4bT#4$Rb0YT&Iyx{$Rsoo^?9a6-v#E2A>d-~6PmnTm$T)7baA z^Q-NQI)`3sL7n&J=dtY;4C12MEoh{6N=(n~3`mO0%I?1+K!Ms{#Boj}e|C!ymrBGaRitK`3Tk~Y;__(B>|asTHct}Imx0<% z`3g&k*S%n2_zSd>LNJzX!{5{S<;V1Q-Iz{=8>Kjw^AF73BBtK1+2Z8>yrF+RfE1EM zLY|A0?`AyPx`H~pNVP$s)S5)BhtqS0-{t8gsl7 z4M$=(vuXIT;6f`lQwMB1R-Wl-M_S=;*R$!bG1eLJA_V~uL@7)EGSm6$?a(~OSf%0(Sc0Dt7Tl)1+~H@81s84(7|Ni`von%a)f(|a8QOTJq87!? zO!a(!5E{jy2>dTl>{Z@HjH;y!JcJM!*0g_GMg`#S20gGFDJx)1d|G?I65)aAC7xqK zVm5_|&#@J}5zAK7-r6Q6F^Ih&8!nm0A7zV3C6d*lZ}$NRx(NKJ{&ExBoNF-z57cE; z@0})MTNf=XT?_jF&RdP~U}UJhnjIVo6MUw?&Z zk9@DqbQgF;ietfoyAr(Q;86+!ov`>q0{OQ>X`Tl%v*^9fjnA*hfL>1<>wJgPan{aH zfOJUE8oq@F5;6XPwJJ5avj2a|XkK+S)&J=byMkq-aN#U~PxdxEUq}lu2J(}zT#xNU zI|3YI^FW=|?)|v+pQHO^-hR_ypV_QLJvZ z+evB+n|Y}YZ$gO~Ppbc=jpG|huypZr=jXHSUkB^_TYe>zNJ&ggd2q+10Tv`9!N)0V z$3-3WZqN;{Y40Z8RXq_KR;8(wzvn7K#31GOyLy!SO)@$RjowzoT@*Z4HSOUi`1@sr z(HoA#sD_l3>pBI@Zhg~P%;~gfWq3L54@akwnSO(Zho`-~(S$F{_u@EV6Z!26vwbGD z7tP^lx3r)nZ`~Rg8@s*85=W|8IJCXUf>OM7?`p`6Rh$kMh|?0$I57rr4b{K++xZBf zXV@til@@2H^bdi1FQ=Wco3?}b=HWK{F~vRuH4JH>v}BIi5$@YvDl6Ifvo%ziqy0kJ zXxEKVP>*26fW}?gV{aL$%d@>B*a;o|_wS#XBd^21eH%@t5C#0hhraWGI1nwZLT)u+ z#A0B?_uC6^F25+>)d_~B)1LX;ma^yBxof3CRIw^V(|v2h_& z$^kzZZrDwW&kt>VsYqH|v9k-aJ+5RQ{aI-dM3wiv8)b>p=BA3cMGY3mJIx*ga#2P(ZqtKuV62&bltdrXJr$yaRHZ3 zQUc}pNh ze`JTYm4&>iDHF&E&*;USP)IiqGPejvRU!iY!N}SPomOZxotT}^+~m)ne%Y{-w05(4 z3gQ1BH_X6=FZ{_)*!SRpZ{m=fR6m!dIqlp1{2rhcwj?^6bM>?_(C zd+f>VaoVard@oO58mfPKSi0@<((<%A$S)<_9Y-4~2hqdZOtTP!2F+GrACFV4IQMA`nmm!z*AQU0q%M$=>%sR67E&I-ar= zW)#CKoG1n~Qq^~YnIcbmPE(_*gUpd&gUXiVnk zCkM!wTF*ZS|LJ{-xeW^S3(e1e4o@jeOQL*A*}8ZsDVI-Zndd1!75UeKSno5JW&B93 zwKT}5u0a;f+_lE{b zlD92vZ_D=3D{$t#?oedbu^B0fN(3zlC%_M;mCWFG_e_67^}eqD;cH^&h_8$vC!*l$ zvjmO@QaNdmB9O(n87KuNA>?ObnWO(sDnJOmZ3PRk&>@S8U?K(`Zj|A(ni1d@|Jxb` z+=VmJ4^?}?gr@LkMRn1*IEyoxWrgct_G9FaYLX#|i446OV*3!HNVL+ zakuQAVTG!6{&#j~+>b<~8ZRX1Q>0%~No6wfa|l6+B-uWF6B8asx7XlTHK+^d3vNyTdv2AstrF#Y2-j;1C-N?9w;N89G`syzOV6Aqq{R?ArF5P)>>0B3(n zo&1Bgv<>R_e{1_d>t`FyguA&gE&Pk1c^f8-^wl@a>!md5BMV?~XDST#@qHj9*w}_v zOH5zi+9ZkX5t;yfWVhy|*_g5%yvk1X)7v`oRth!&tt4kY&AI86HNB;|%J8i5^bT^) z4Gn^F1@y%?-C^JsrmAYEcgIp$cD7^r8vL>^E^H|R+uOy;l@Grt4fmJuH3#`8`w`Z= zEwp}qy7TSyucF2#w~@Fn5$X!VOGTY9^bew3o>DX8wE_Z9KXbM3=kro)6tE=Zx$Q52 zc@V+5Z=0G-MtnY+18;f+iHRya<)9D3FB}1|oZ&-H*5*`A;Rj;~OpCttw-y7iG-zBc zAl~fR7{NjodjsL9ZlRml3M5x`o-DHXH58Qh23MwiFGAod6RI+5266iFh!IS5)VSc))&sEORo zb3CEC<8vR(z{w;zW}F+K1%9A9@4<4W9}6bfU?Peu{p=jG^yBfDXgdga2w`|6)ECy) z$%Mm6PBOy_079|gb6JPqdGJV00 zCM;yZk)jFdd>v+R&p0sf^xxa}U#^Ox;-c)WZrG)0V~JpOfIz8Ssi=qxy&=pgmAu1n z00e{#1iMz;^a3fi0#uEJm=0+CmcW<-hGv&FU86b|T(E$wIKNO81`rIP*&bKpX-sR4 z$^y9B!HUQlr(U*rB5;3;!9A&M1gWQs@;EMm>o4GS?epcH z0IEy?_kU}bh>Ttxj6l>U8|-2!m@o)no)4xrX+b0aaHqFF7R>qb#qi@!2k6WeNPF(s z@0_uSqa+KoJF>X@yX46vuyJxKoesS5pQmqZdq1t7DhdxDG$Osyy7j=V(izmwdSkH5 zXC_53hy5|93DIRK#!+^m;+S=6TRZ$dq_uPrDtm<-!|6^<2nXtVj87O=Nf`z@8hwUt zWd6PUBSSB-rm@Mu-Kl~+Z-=YA&+3DgHMvClQ_&rngGQolcIIK%k*Vy3xXi_l*21rE zUKtZD9D0AUa=nWwPE`p?FE~OF(~hg_{U*Sqg_M+DMU<`boVA2FC#iBBW z!;%D3J7tl@?95Z!Qu^Tdy z^i$!6YO%O}PS<(N#SDR=Qoed*?4T;IZZQ2E!h~qUAMJ@#n;bCjsUKivSUge43e&@o z=2MCuM;GT#PpOG5`fMh|j2UG!$ZbT9;qs|^K5e6{{f``q@WGFkU~LMam~7>2=J}g7 z3@bifWSOEuRCOQ3Tk$z1e29G045HcY+AR4K)9tJ#H%Fxo*_i#F_SklDMK?36eE4%} zsdXb=6b*GEsD51$Ny@fUVwwfug^cGG2Z($@vPckFzNF;oa2+B-f(kqcbse^Cw1Z#* zjuwt7YZ&cB0L`C+U@JpJM|KC8uKy8uC}d!ko+$o_>Mty4+F_WYvF|HxX@}Qmnv%7< z@gC;~V>^I{jU9zl;%+j0rg~SGMA8NGSkvH$0nST=Nr*NYK_5u+AToYIe0!AgCRjcZ zTSvvKQ#YtV%8oDe^FTTVCo3#h>Mxv*wcE!P>KIqv@=`)m5E9lj$KzM$>))flmB7Z; zUppO47o!=)b9RAp&w3z?QB@SS4q=K9q0o>u=!g8XF}Dy*Z()n;ayeHd#z2J#p33a4 zbKxAJKQR!eq{BWtQq{Ze!1;W>G!0MP%|PIM+(Q^mT;`=Seyw}%^>0dV1uk$+@864YD3){Y zmXNYG)7W#*d+qZNn9;{q`HbQ18+&~P01yGXe!M4r95M|x39~lvf_;_lVbQ7y!)T2O z9XK!b=kLy-st8i}zl0)7s6E~SCXNB|_tOah5gM2yWjP+*3sXNY3R=0_%p5tb$q`rg z?_nUb5nv`%NX|W1UQJwiFG&bK=jPg`QVCb*lxK(x9ZjTGEJqy(g281+r9edvdIBW` zFDFR|N$~O=6(5~J8Z+V225PgbACS&#EwamjpU2gdD*~DqiK^#D8O8tsQu|G@SYR{D%8!8o%@BXw*kYZ0lbz zALHu~5lY=3(PXoF`pT{|Ju{x=WwfWoqi9G%wCMsj{ftka&8aTjA()%%IoIbwO7d^$ za-0FV;KXrQ#?5*G=~P-Afv>Iv`5P_NQ3O?n^DY)~-C2aC9;6fmXh*-x5P}1! zrthErvasVwZvaM*3mhdp)b-9u)&k7g>?0urG_reX`O_RyoKWJy@Nz3 zM92&+w3WrpUuR2lupUPDPbSe?XD2h1x3#q5`TMRt)AWqGPWsNRFSCtm8aFn4jP^gM z;dy$7HsjhH_GU}^kZk7V@3l-fkF9ZFVK{x~fdXs8t7GefkBhUH{;d>`zu#t3<|Mi~ zYQGifEE2IJI5v0F%G;i#L2`sID4;#VoNHs>zI`qOzAM(icU)O)w*AZ=)o#>s1P=RZ{gx*Y(JHuNBfu3k^U3EiECfAR>?1%Hl;ZM0D_ByBSiq~=Gn zW5I14;>g1)vr9uly+T&zN-s4@>LFjs*82+Ke;#umw|u?hbmsj~@*3*?>BaiV;^Bf5 zoU0}t2RJ2)g8J;>qx|}FH z(jG`I>-&glr|vDg&fP+X`#AzaWT=DU-Pb;!E;utprL-D&b=Vr3aNsFkItzqCeRX3@ z$&zu{TAr&3cR(=&iQnf4Un24AMGkko;M9MH%a`c`rXXa8A$*d^_kp_2KtvteTJ}MK zw{1Tc*}FJJJ0jlPkN$`PHDz#j#dZ7sCIy#a3cr6-mLq51tR+7i=8b1$j4VM$M`|N7X`b3gj-p$oUf{;c^Z zHcA&_(pKvg~MaJ=~pER*9an!Q+l9hfMwrbvT zYh5-dTja)UHyn>HcaP4~_OjkD=M~T%UQRwI7oh zp+R>eJ_3{sD=Zl8Hl!q$cG^4HO2aDLoZ@;|>=a%dE2cR8r^Wtrf1>b%ZKSo{dvBf-Bz z$#y@*CGFll0>y{o*A~hcLU#V4-0?6PGWoUf975B2-v6JwhI`#&9XW%1madZS6gS!A zswaP77HywR`(b#DWJ~ zvzZi1S?3ung!7A(n$EAidn3R~O}4py>=_&y-DeCj-snA^B|-CoJB`X9673GtV6JyGdBHwG)GuGNOc z?5!i4zZhTh1qMF5ec9XZer+`c`a~d(eSBwOAB1?6UP?N~?@ZcZdwPI1rz9V&0dgd+ z-sWeSvMziu-(7?>JYQ}WKXHKn-xPntvXemu&?#a1V%xc*t9w~zG6x% zbOx|Zi$GuqM5e$0Sqqyk4DpTr5FXh8%S~1EmBat2tt8mS|DUT0ndSAkppnWNpMp&y zvVq`BZN8UYFagh9m(h0inRz4}6@wUowY@SQ2@^v%SbF1$v$nkap^N%Hrd^W z2i)b-JqH7+iV;91Zz_F{80j(EvhR|%mq{zRF=M7Np|Gd}j-4>qBFN{v4Avm*KT~Ly z+p>yDmq_WyUG-FF3kx+7$x~YDs@LoBTR!uY!grr~#2IOMi4hJyJa)rnj;RIDVvo7= zKoo1|$y|X-BF%!hZm}oInjnin1j5BquokjQ)e@~gfze>b+CvB_0Q*RDpJLqf|Fd~a z;{8(ZR;^NJ_yl=Gw=!dHu$0EM)ts)2#fPucS7pBc+^BgYV1MMhK-%l`!YwUFMc;hV zDHW=^7?o^e@h!}PWtSnv!(bCq(Ze5Wm+lU5i|!fBPlws*;KW_@e0 zle9_D4(Y8rrpzS_-!1@&{i7Xn1Zn1agzqWOBFe%9uD8 z-AWUG0@6yce)ix;kn82O;1BDfQ}VpR0l0GY$MXc%tPuS0n-yPnK=k*_fEHHFhv@Xc!nU1_cEXrVoT? zWLH=BOBV&N+u zR1d0dZZf~#&Ax;2)GGbsZ&P+VmdlQu>iktD6likpR99-MR6+WuA-&>J@0$xle@U|H z!a_s?2c22AuU}JC%?=P?q@g$lKOEP-W5drF8PwY}vp?6Se0aCz`baHgyMdJkF4&E;vU1wIjH)Wg(Pwlk3a6 zzGu%KZ9Tn*JYrJ`Eq1cdXGC;u!SG7B?JQV3FBesZ5yA_Jb8*U^Opp=!`}-ID9$pNg z;PdhuAAyw7b2Ry^Q{^83AJ|#)EyP=dvm zI2~WC7ey;)R+QY{a!CYQ(eh1_GH`K}cE4@&- z?zd}upd@?jmimPCGb;Q_z zqvS8spm10b0|QJ$Z@;+Ily5z~{>4PTaV%!ApN)>vp)9z{!q&!y=&!VMjkZ6S>4 zAZvd`H6)s8eH>ntKt#jKMKj?@JBNi>q`6h@x|tq)WJck zjrnk;w`d#^GBX)=Zad@$9ohA9pT6xCeb?jZ)yYmv-lfwO{Jtz_agZct|F<764yWFe zu{|x%EfzS(oQf((1!^yDsU%1I?&Xcav;=$kJ8?5F=^K^z!!pm`sJ4w;_X~tDm-3giR_P1xW@C*T?(9AO21o6v;>_x)l+jeDR{t#=n1} zks3K2#C3q5lilqqG7h2A5PcWNeUdo-&@ZK8p+k&ZT(iT?lxiB=6s)KD z7^&soJ^#XPESB8k!A&L*D9b`vWbq8CINx~8aXquB`gNNuYSSa6Lq4*PwD3$6k&}~> zGJ-Pl>)G4X)YNOqS=1RJ#$v<>!nkv1Fmd43Gfv^Z2T7*o_*bAqm@?c1%**7D$;D!G z`mL4Z{O=D3j=AY4>t1*jlCPT2@jP@F#bkEno>nU<#TSiRjK%zc+BqF^F_gh~TCEKD z#9J>ukD%qNyJ8@gH2+HNb6BH|stC(%3cf%qs<&hH3(&$q*?C)e$(c@w-TS7u^P=~` znziA5)MUa|EB)kFq8WTcF|uD;t`41SydrYVCnVQgW?U*uHLod9U(m$Q>7i4ks@mB8 z`(95qex18E)TXq~SQZmgZsfKt@t@DaW80q;e8DP(##D7T+ozU)rEG%hD*xg?r-8gn zINck0|1}V1UX?MHJusMGbso13+tnw8!9{lqj`Hxzep?Dz+5 z9@wBwrV~ot?+nuPg=746lS`kJ?A?yv0VMEkVl>CQ4Jd!{%_*p|wp&Sp^Wbu=;5b`!z7cX)CRWxkusex%W#QQWYiDOqsD&vJ zZUchUdF>u**G2!gP*ZuUCv=0~v>4|6%Xi?-Mrp&qR%O-b4dJb%w_EYbygrJ#D|>eC zC^jYU{zYM9apLqTqu);3((AI`QU^2)1=%su%m(qB4Th?c{&*K~gfwta99SWmAxVg` z^@Of#n<@s4@eI0T8!inpY^_sGw|&4Lu)adQlV(1L!9TL#yD$k!+P`h>Qzur_RB2du zP}`Ku2h$i$Uz)1#N;yeNV)TG7ex*gf-J!P0fAjjl&qp0qyI;F6CJ%Z80A*rlzcoGW zgd5I?IrvOLBh>3*Pdyo^scS*PNM8CZ@QvysIYPYa0b#d)|4tKJXQkgh=_ZF9eSD#I z7cTIMibhTvboBN{AE;R+!`2ymwQT&jOx`E{YE>;f!!YGCsUJTU9@sqUdcEU4cmyo0 zGU|Qp)j6TDONxDmsHmv6t}go*uU&ihMs;_aICU43La#=c(I9;S`1|Wis#B1z6`pRYg{kZEQtUAs=G6i88Vs^}l(AgvKYXUw3Xi2q zDUuv3J^$|7)|!3lkL2dKd$;I=X(&?}Yafivcgk$^lh_rush^uV^+K^aZt{tvUaBP1 z!2R*#@`}kZn|xX_Bs8%$_#CuPp3HOl2b&~;3vtlf8`QmrL0n`e;>8{O^h7@HuZKfX zEg`F`oyi?-Jm63tB?cEjTuYP`hYOMG1 z@(CX;LMY+3Z-QZvFg(4ApAjO4>{nn$CH7|XX zi<9m1=exaxWr}9b5I|-3_r0;@9tp%vt^L-1#+nJU{SCD0UsD+MlwgCxi6is@o0@pJdij%o^6}UChzT52dXAQ+Qw`Gjo%6 zrtOEz;+k~vQS+qU*Rk&>#a3NR#@nOC`JqSEwwJ8Cik$C&r6o6LbP{eaOSA7F+;*rk z=q4Ff)47gZ<-oNddEq^auFdm1xKtlxWm$E{?n2~0x|^y-O_SrtX$cD@=+h@^ywOZ( zzlhhf_Fb!>tMbGldx41icHE9-?D&KvmJdWlN2}v;GBYzf`GwKa(`!0AOMdR`%r+2l z-rDpf-bsFbi4pP(tgLuF@YQ`6EmpoFD!3)B&bJovvdadHy$ z2+Xx|zMtSO{Q2wG16Wo-qH8%hJ?;GVA_UI4B=_S+W0idjwFDoHtfXrakHe@f5Q61 zRRg|z4VDJG=H7&Vd*!5|Zo)P>xz|c^oGCLYsCFT+yKM0qNdW!Kcz-HcVC^M;;redE zqLg~%8rOxXvqcc+Zo66z<3X z#_3141lj6W#i5>%a&^8sbSesu_6`9xX#Vg)&BCHDe(bKE5PtfTmma*#Bpwvq}39z!XY{;6?H0^vMCpprN#FR;aEy4|=@`S!z=;kS|6`uduV zj!!P9=UnH48|~prDK1qOGZ^iFex-m@*)N)`YnSSzZqMLb0K9 z^e1yIZ(%JD3nIZTG8k%Qf1B!9S2ZelbJLw*6f52GKSc2YmvsL9Qzzva&C*}WYu`&7 zFD-f;%UTV+6{|-^O5#A`srZFebI;P+-uz38SMD4x_BtypeWfNp=bvfr`Jy?DI7z8J zkWJwpq3zNap zz6{SFZEle&7tSO$Ub}Re9NJK!L?$=y0Ub*vC1c}Wjh6I75#{D?aiw)?uYGA=-oAgI zPy(HL>F4e){d;i{w#huVdMnAnsVUm5w!M=4{0+7;uZk?H!h(Xx*yz+e=y2dTA&}sG+I%X|H% zfWfU6dOjvDu2@*!5>|wc2p&AhbnxIoBF#ldC$iyJa*JI<29dK%jCh#g_~8Jwz8tHL zNnLSk<9f=|Wj>(N&rXe{92?x!kYl7tQX%i=nEbO3aVs z;f*1xg>{?c>m{Dw54DGj*H5m~?b#7Vnkk&vLgBCEKMj!p3CTZ^u5)yh0=uE+K#H<=+ z@WG3TlC5{dcSSW`y!*MfRynWGmH{6T0UyFCOG83@S%41>vCs+CrrK=oIgPT^IApbWqGt7U@$TmRqFJ#>_A9zEXz9~%{98{EeAEe!^{*z}7+&-n6M zUYYdi6U4WY(Qw{EwD5dh)edfhU(6q}+5>JYdvc}gBS6CXELj4y>mn?%CN1hbjA3DJ zJaSyODSk`**rhNi>Cl~$7M`9tL&jM!9yb=>zaHOL0~{rfj%i{tW6oZb8PIbL-u zEBbB7Zl|R!tQ5j{fFEdY(&~RgfetP19qTJXjBD8)4k+fFr`lvQhJBmIPVrsU5Ty(z z#ofXl^GU&in8r-V9@*s#`Y{Nup*u()#SEI^S(&0o=@;=OYwI<LSO;9bo{#lZCz{-ZEX!uk(c=*LjQ9VhT<0|8$^iHIu7 z?wl~G_FgWwNQ8#H;7p;apI=Q*y?`e#J~gzOwv!bdr(QDzmZT^f7Z3>~rB9x>GQYJs zI6OQYpOh2=@F%?W#4e+J7DAW{Bm>sbDDb!0|6An|{QA@5&1gvba;mF2(fb3ek`dn7 z^keSTv7MNC+S?5fA~lFM_slMCQI_p#c464ON5o4(A8R%7IhS5k?=q~P`b7D&N-B!HFZsx}g;bZJ^Lqn4Hq6mP6r3%W z)uqHYWF#TxnM^w)%nw})Ers2R)9Xl+ zht^P6ryx>eF(#klWF0zpJ28<7a~!-gm;f$+SAU$5F*?m`Y)l|ZzeGV+j} z=D*gNshMo#PKkbXV7-6Ey!1}5{$C@^WMvdVg}||NzkPe$b%eD0^aZP}o!er*Uc#`5 z@t!#m@@I-4@mz`&K~p%+?GsB@B~Duok?N|b>fvX3nW_8fVl>GUTR2Xo(Lc-D8q=NU z`dKYjOv1t;UaRCWLpBoXZ~24KA2~GRhBro57p{?zlx8ICla2HdwU+Xf=OWM@CMFeA zIymg>QTnJjk=EG!@uNB(`ZmMw?_g((L2F2V(+|f4q*yX7Kl?q{oPUmv5)i}iW$|Ul zqz|LbZEac_8llzJ%&%Fv;5=x1Z;&YZirHfqVy839bbKt1d2<#N-$_+5V0Q(FNif5fjsh zUedr)$tN>9=Sw{_CJAY2QAi-Lg|h6-I=_sJ%^9$LU??-{G z;88Y#qN7U3E-JM%XIMkH9#BHcuZ9t37&`>iGBUA@q_niOSGDFDDyie84m=&4_}IxV z&xy~197=vZ%G(r0-|@@GX$!C)Zpq)hz;c<6KK!sy1~-sUj$tj)WL+k}ZXqEQAt52M zJcs52>a2Kx6%646XODS|`;!P%VQ0@W%70AX77fuTx=g6|30&y;+x&?76Bo%O!4wgr zIOI3w-pgXZyeaR0b1cj8zGikDb#HSa&Y!@p3F=&fW)$uNpUuBx^f3+WNZeM?&V4!O zWfp8M^t|e(LAF78*I1_HOGs>zepHRSSKe8xyhn>0RdiXIf+ShLsOtD>vV;cfs$_Z6 z!1gQlWK82XTLfv;0ia^&H(|NQd~+W@6@iP@j9w=PXuoXwu1oq4skVnZ_Wt{`@EOsM zZ3EnAB`nEE^yXL8)TSWv{gd>Twr&~u>2`K@29v_F_uYijKD~qbaQb$Ft2Dm!MjU&E z>A$#DVH*4z%CsZKC|~{RRS95cg_T#AC%a5a?OGyixfFdO(0rmoFvw=079lvU;G2La zH$GleYIBK{Ndpm;T%$TGNdwL>4bSz(;1;_eJ)!59cc!)2@uAlQo=mhfhUfQelS{v< zFXUKeM!*dK=2qqg^3;F3$Z{!ohiJud4WZ=YLM5Vbh?pB>&++~{^c(;;W&j!gtB4}G z|MC}bLIUT;55=RP;M*P208Y;ZK?-?|2idQ^UI;r*+sR?*+;QUPaT=ETEYFiC3Of7A ztUPF+@o!R^rR$%iu&N;cRZ5es9dYOD%ML1LYKdAVuAO`(jBMs?C(*V93RK=FkJ04s zzkOaiytM6_{Z`<=)hS_rsvQm2ln=7eJ@)pV|Mbczj^W3#aLx}lCCwM9thH6u)Jo7G zzL$yMR`QD`o|d%q4!PZ6_ntl#UtL=>V!XSIu8{Y@fompSg%~Aq@$7`#;JS-lFx=y6 z=g()H=CTAmqluRBk>1@y!{xwA2Z`+o&f>DNYzL~Bn90b=ahW-u`baT{-SqX}zIo^= zaeLod;Z1B=njAZU0(n>O;`KvE@Y_*x2>i!H{D!leExAlu46XomEiJWNBO)vfSe%;T zZi7$+!ei(_g9)PMQ_EX4Jx|p3J{J%c=EqCJ{YrGe$G0D9%}|H}%0Mutw3Y_9u<4Ky zn?ipsv4z>fy(4jeBI(108*M|PE2=>r^+QHIOOL)y+%oF?)ng%TyVB|A_`}Ec=KAwv ze_CxBobIeBIx)+mStL-$6bj5#WWjawskaQt0v%1n@0`6RZ?Fx3&jF^LO*v~i`))~C zyzAXYOUaN$DoJW&`M&|G@Z8|x@$o%FHR^UL)N07?BZH_ht#mnj>Wl56y9AMsES8fh z#xGr#Cr`7mu+%zmm}z3!N+_g1!Iy*C@h1ilp{pn>Po{7)6kq&wkEw~U*CKc$*zQ~k zWQ*vOQ@1wI(-eFa^4tv++9=;m&%z4X~V5 zlV_|>$+PfHPQ@(0S1!f~Qttup7c55crX3;ucF@zLbHj)NHqG-DSq@q2~{TU!uwQ z?4pv_S#4xNBb8#?tB=wY^2o0Jfw3s51w zrr#O-05QRiPQ4#>6-oZH&TWukOV7?8^gz)Jvyr{$phJKncNtVm|IB*JaIkKfpYfEK$Fqzj}Q><;~^} zwg<=YW|jMTf=>y@2J4gCIrbGVCY+F{Uwn(X9wbtd`xcQA1g-5JxBGQggr|tB%iVMF z*NLBFV+>U^)%XyAwAbyID~#niWG4+vcsuZxj>+UWo7QQ3qx|OSo!(% zR^T9KwELTeF+&j+utdh;)=d4W6lgn2DlZEO2v87`X;5eBJ6WuaQG1y1ya_7}Zf7F; zOieBL+^&bcZ~VDY#Hla^12$&dwJQ{)!figq-ORgphnJVjg2)^KW+~&&cJ70T9vpnH z)P5e1+~N(CbC6P2AG#h3v;~tH{iQnhB;J6pR+7z+kMpcWU%EzqQb0zA6+ESJ_>dHb z_2+%eUIQOkK%_)`e6+~3a&}J8#+65mOTIDY^4Wv?uFPgF8UbJFtq8s>_^LL$Gi#6L z_885az_zht$IOGM@J35OQKYQrEOqwx$3lBW*W;d=m`JXqq_myyIairk%$t*bYn zE(o8Vo;IxdV_t`93^i?yO6dcBG-!wq`DIuo6vugt;LLZ(vf^<(efreemn(mXiqC)? z0RqNif^Fg?SO{=j<^^ZqD+MK>2hDbe9(Sn~NYfEHd_;Klt8pITjWqP2#QsOLjRe|) zE)WQT($kRg0vsaZSI{Y zx;&G7U>nEtBgc8VZ@tOn?q*^29C!P%j;TE+|I(k`ZE}+|=j_|3=7JmUPG|jnswu#% zI?H>A(>4Lf58=tdyH*A^jVt}a?K97^s;Y`6J2M=eOSIK1j6q+Cf=GNdUNf&r2n?j| zH5r%g6wmu>x|@XOfYR0g&D(2R>6hF~ZC~HqFIj(v~E8idg#t zRfX=?H?E`G;dhrEuezm~V-1$pYWPgAZ~=(9pDbpeZze3x$Ku#RSO`+ z@1Hj@m;+RnhKg9tU7LOc%!Y=KkNkzHsb%lxnQ3M01$#)IpbTqL_~!@oL|;+MtFui@ zka1b;^qeSHrc#^AqG^me-@68_SzB-UuNaNHUtHRG22#5(UyMV-!x?Vx#`nw%r@Xdd zNGmWU)&9O6k(_A`n9yuWs5v>)>7%2S=k>v_=vvLJq-%KpIS zSe!o@N&B1XvwK0_xl`U(x=Bfr^_6aJXyim6ImHydD*{G0I(16a^bI`tDDhhVsX$Pf z)zD@Dvk-~+=nV=EuOx!t+1l3E*7%Mc>)9`J|CpRyd|KMEpKZRfsA#C~TFK+Rxq`dObAIYIjIQBIVr1^-M`? zGFS*SAL=SF1}X;-2{%weB4-Fq#uPhtoa!_bhvT_}*-1apUIh_f=IohI;~y9vX?}PF;g6c@>&QCP(+d3%r{ypPP?rZuyzst>y&z>In5wkab z&AC07y>dOiZLCUTH%lNpE}4Xk4E^sP3^7$~-@ZM}_%e_YX@qsCqBH4$)A--|3UCbH z=EX~wF5zS(o?9jI5(y6P$+{{;GEgJRKd^NC|KXKH(k8@%#NWMp)G@mqh`vW;{&!iNV{qv zHdA20)7^w*e4=fNdIud!_qCR^@jLrSj?GmWw*)XzXHZTkyK();mhUv1ndfw%Xd88@ zq9Y+f<~L*%Yb@(nNJq$Bc#iCr%b_vKw(6#MaHJ)UNu1bFohp5q6^~!k)Do2Fkt4hD z+3$6e5D}q1dh{rlV4t*clZDdk7x%};Vo(^xVQBjgw<6F0GqWENBmcWR>q(pNTn`;S z4314TuxN+GxLGZ65{J1c9kU z`1fvgX(>Vsb?H*}$IR|D;&X&Dm#FE;@*%>YpFDYAD4-vxSTu~_vq8vksA*_aAYUU= zxVX8wpQtVB-oAaC0LFk#JSZ-17qc{e60e)P+P_jWCUbu1(6Q0uf!9{-Xee&su?{-p z>YQ9&n+1AqrnKckf440`V#Kjf|6Hrh^W8_C^`r1#tqa&%Nwu(rVO zA5Y>Dk%@y;CDy26!vw#fmb^0~wXv!kV>%TAN?J@0JX-9jF8~ZW^y`YL0J&DT%90wx{ zO9+-iDT}k-)CjG>&<}oKw!iw=crQM2V(+P!@i)|8UVI9QKab`c-@*{9uAxyO`=m}J zSr;SKAU@eM7O$Y3#26ke`wJ}|qW^vd*uwaG_wL;@e}gTmy?3E8d?ltBWRJ$3H(9su z;`Pox=+rr-vq$wk9apjiEy5vAAbd;1jZuBS`g^uszr^Pab(?qS%EPLijEn)%(RBC& zunLQwxVvp_bI$qdmznJ+l+1vIRd^UdXD~xEQj4A_pZ-$;Je1Av-`68F-5JG>H`6v> z07xsb*t5%;PFW)Hd!OMzUtz#!eFhD(I<62^N80{qP1|E6;S-L>qyinJ*uo_;-66bS zi{nz-lAvKt}v$Zh#?KS9-jc@Jf3xJ3=!RgGq>ptw7FzTEgqx>YdCOQJ2F_*}b zql;QlpHnM5LtA04`1tsi7Y+v@*TO@8bsS~J2;xJGVT3T2*tOWj8zY*LB3p>n!>3Po zWj(w31cGluSAMnsH4W6dz!z*W(~-L;X;hdlzqNbt@hH)k!(`zA2$^!zCmj4y#D9P z$4sSx2Mdr4ySl1>`P_Hq&99fKZk~+PIrRWx-rY{**}UC{ z_TTt7b(lnXIWb$o{IMU*QUV|>apc^h9wzb|<{J~n6ok!Drl-M);p*zj$ibnfVn-kc zUDk;faQ>Q_ni4#zi*fM8_&Bk0)WFpAQkVN3?PmHe_vVp>VwVxkw1>+Cxmi%e>q)O( z>gEQR*7|q+4#ty9iX4Sg@tQfj($c%|JqN4vxmZ}8skM?MuFfxCzGNXP3i*D#Z7wXe zC_SmE5jYg`H~)MTcbUApjRcoRIad0hLyW-J$^%da6xGA)T`CZK(2F+AIf5^+Tc{~4 zaEaK;CjSGzCN0~r=&M~&KG*DzKILwVdwDGEcg{jQc zhaX)@J@iM;Bky(yYiaEGJ$n@juqv4)7~MitQIlNB1sKB`uu{B_hR<3~hE4cq&ZF!i z{#!IzxdnSwn0dLHDF<$1O8J}a%#YmU8CIi|*hf&SpwHxX9r@Z>Nk8g(6c_<^?;ia5 z7ey7)vWigo5zyT(OXG$Zj-rZ61n#Z_Wtkp$<8ScI+T5H2o#qu?W>gRNZhieA`vxmX zaDTnShlg5mK`nX4tEUOObDMp3Peq*uG!7K(TWG>}O(!RDC^<-$bR6t2UNqw9=)MSc z0(vVglzKq!hNh;Gn1Ektiz~F@10jHBe6u0o{LpD4-B?geK*kj!tNYL(erCgfUbC1! zhp8dxvuqfMIeOC+U(N{c>WuC*CJ_xj)>D)I(Bt2zJL!x-Ee!>z=Ho!|?PpEW>u zjnSTdVstqAnHn&J&UgL6R1D65L;=~Jb59p+=_P!MM7)MG_9gLy^13L^%x5uKjUYX! z`hJ_+lUm%kT3X3`a*{Z(2)4gVT*jFBE!dKM2}A|hY$%k3h{-9oZlJtP;kpwI7IcQ& zF*yJDVTNXAs4lqf52^8kZ&QXaK0pu!^#n0_p*~~rUY49xoHZ=jNpm-K1(=DIR9FAa z2_?2n&pt`{P}Qf(_cZ}S8xf#RfW6}4ZvolJPwugLTDLr8=LC@sD0E`0=`VwEM? z!Z~B_^i3fjWgRjm63A$v@3y(xR~h=~kr0r66DdEeDAA9NF#Fl}N02d4F~2-KPNa-Y zkg=Ej^NvxXVbrAN6#&oy)AtfLO*?D?%j=X$?mr}$nA2ASD&>#gX|swufQ~UzKHv` zkFhZe0kz??FPA;Ejz$WE-8<+hvb!8zu#g9rq5-(MqoDsmoigs;O@#n&VjBi5DusnH zlkJoUiw-7w_OFHKsHv%y@$ZAwIl^*S(xJ?Zkn2H=nJX0wwC%r_G4TBWUPea4-YN#z zTW%4Xi}6F4yzx``FU*?Qec(31jBi==r2bAy)#Wk0ysivVtBT0#ZL;1?r}H{59U$@S zt6MaqOKIRVP&kDWnPNJ%J$0)xLgJftz|wbl7jmnvc9eZxyHSW}M8I48 zu}3{-IS_>*Gsu?qNfYFgk&)3;vpEeyvjV)f>K9M>Zj2tdEak761oF$6T5N-~J+3K7 zF4`LS%=qjq*BN>lP)VriY7P#Mqxi3jV|Z%9`ypNGJIs3Eyq-^MA4{Y^ji}hO}Bv+6?Z*-?m?5F^F`sk zOf>387I(Q*z?jE1Z!eJ&h564GllUqKsA!yfLWo90G{NI%#ipqfF~}amvhFeER(TwQ z@cxyYViH`e1nnpHBU2iMmor^I@8<*-hXvR%=8pkEVjalBn2#qFix{(`N5ve+?|7gy z=n*X1H@Jw7vt4CFfhL5Pm-$g^uzudo$ee?!YL}_>#*go%++OZrNT1{fACd8-5*Rkq|$mGB1|8$6Y#|{n1`5^$4ohDKTh5#l9GyC9L!B_TD&h#%IupL}F zuP)OE-2|1P<8mt*@O<14ju$J}=k$!lcHu$}-|(UYECkOf2&O#5zwuM~A!goo!{zg;EJX#eyv;T9u>yU4hzpom%^AXffJpYf}@kh2Xx1AX1RH6+6#| zfyBr$^QIoasS`Bw1Tpt#`<#h$!C-ksTKeK0Q5pWKN3Swy|$#h`!p z&^C}8Ijv;~IoN<>oBKBhOfJZA!l+x%G)B}1=m+I%tHSj2`1kFj#R=XcO?iBEIO@Rk zpLe|FRBm#d*cvmuqM?fQMIAGh@tO!L|Nf6_nhprmPuHWyVqIC+@!+xdJyc^LJ>wmG z6CX7s01;{H=q!j>4wcZQ>mL!O`Qj*zl?-UZB609RSOsY299$Q?)o4Rp=jf40Nt2wI zPN`nKIvan!|Jg6#cFT|F4&Eh~lOFwj)uC6s;_88~&6{XAG6fh!!x}CI9v^xRLDQ)( zU1z?n{f)am{<>8%<}*9p+L?fR6ntEeasNXUy=pwv+h*G@L;d#8tOAIG>q^V~m zAzoYif<&Ms3#8+2%}1F&2g<&T_q{ATP{=NFx6STQBu7FTn!AHYk9yKj9EAXw5zw2! zc)8uKB5VgWwpweK1Tj;+Pu{1Nkp}Pri2Zo`4mZ$Ly}jm98~Q|ZNvs11GZ5i$xsL^5 zIH{<`R2*@!vF~s#4ULT*nJ$A=5*rL_dHgd08Kc#T@hp_a;k@2FuqSA&ZqyYRw*2Jv zSqX#vq4xV{yM4QHLtsIJN+Zk#MAD{*NnP+UzGPiYz)pY0{$VnnpR(M#H~g6TYyGGz zVN^t^0-O!M7M8~`BiYC}T!y5={OX_MNWq2Oj_}(Jm7RY@2w_p`IzE3^y~Kfm5HXN4 z*uSE8iR0^M!RzXf%ltfkw$SXtf{BN=d7QhCudk?uWnQN=8CzxL7yA1N%3r3I*UU&t z^izBI*2I2tpDL3dItPHt$;Czzv;p^x+J12X;;#Wn9;KX|D=r+F(>q4;0he1Ji|u2AYvD}I9f+u0D}379;v0qtMUqLm z^H8eiFSNU5M*|-lh|K>T%OsHITp5v|PY}!q2nxcCL8M6i&(@OMBWRQ%?-fMgMfh2W z$aca+%F6mnI#fW-OR4G}sAVgp+H>U_KQI>K=nNbWs6Ok_aPPsL>?8~7XBw&tHIe#x z`zW(KmR`4d${li$n*5-eEz(JI{T$e0iWo{p_q~n;!|S({!wnz;vkUNGK%N^ z`7$||0C5T9@wY^+c@4;C>E3PzkB3Ss$JwglXVq5z8)t(~AY5S(r~H>)&ti+($!R(H z|D*YS9<_JlB&$VEn4yV@!?HUT?Gn0*&!0bQa;_s*gGXGP4)2#=$O|Q#kh(y}OWM>> zUr%VD02=K}TO3WXtasoLFVvgoK)Wo!Oyl*anEbP^!!f`)24cyO=g31iexTbYi zGQRw0R387>?$CiLpj?uhcFzFIB#oHe~8!EgOx(nNQ@C?Xf!D1`J?g{c9 z1mY^jF9Kp<;F4!^Yc;h9hrYNGD(rCcP9wBj@$vCi9dm6C>A?h8*Ve}Ug0})AFTyix zf3bz<0F^s^`ZRrJ%Ag#U`BbEI>tLUimS9JyYW6vnP>`L?qrX-5c0$YW7Uf*hZ^QEz zU(OvQoMxAocZ-jBV@QF}l1WMZfDOUU;yeSLhO!cXhjF+xNvLYzF^^dSZ6bhcID$}y zCJwF;as*;;hFp5=qyY(mj;wYS`CV9chtYVWX3OVLLcfhebt2(?-_$wJM{I2`_B|{&mNu%yL{H(z&D)?S_7z0jN50zmr zWaq@vMf;C4Nu1x-eoPLphCKAfuBXW8iKs3Xib+U>!y0Mcf{q4PUi7aXs;AULUbii- zl(0QHpQv9t$d12T@uIW|HG-6(m)18`k>*sy zj}n;OXp6kvxwqQXcWNJ)aGogWI`ieLvGk)yN6#D9njQ;cPe0?)+7vFwtuEm;?m|oG zQ6L~Nl{&-2XoZMDq=pm$CJnplb!5rA+G6hl?i`yE3arNXk3e&Z2+6@{HS`gef zIY@cWoUasCabJ0%QnYW|VA5{kylLu3k3JoFp>+8e)nIsQ>HzcV+tj}On0L815zA=$ zG`kwnuSNeppZc?;EHM|BnOS79h{#PsVw@2SW%q7iLN|!g(&BJn$e2IngA4d<-ccEx zEktnG=)OMfG>T&a%YAeF_C1iCf?#p;{5FI;(-{Gr7(>HbX_o|l5=2~76G&CGKw0JG zp0x{55by~LQvo(`c8jzT6Jrfxs+zxhA-a&T-H z2S+sO%6DVggRBHxx%oTgP3l%Jygfwt?97ic7EKN3Z2%^TaoEg^olvzw$wokFlRt7X zrEuYnAhw|rzXhUhOw595OBf9RpJI=Z``;h^vFbMdbx+LucU(9bNB+Qtn;0w?{=KNI z{ITChw&{=*iBW#YXW$DX#BFkzs5QA0q2 z#t0n9=^RXD%|BhMc19Rc^&+GBT2PDKZTh3aAYYm!jL)_+g}qDPmjM|<3@m~Sx-X&0 zMt)Rpj*K(FHG(pKxRQa6@Wu@p00A787a{n;uLi)39NxMvk8c2&u!g>V>tox?moMXV zZ>przw9d*=to<~4v+?_Q-ZK?vf)zo*aO0GthG3bX5!ucFueYedU4|$RHJ4H%mS zm@PQchiJUl3b_AA{V3h%q zlgD{JPq>Bt&zIw4UwDui=}-tI5@75LfCt$0zA_!0ad2sIh<*F1-)#41;0xM<5Y-_b z8c{Oqr!dnrYbNjH<&3c1i3(6tK623&FdX(YNZXAT2;blYT(tA=-@j@%NQ8uiZBcoV z&PZ?Z9M~+TLN}e!H-dYEwr$%+Bx(lOs;H;Vk$hpza z3hZ;BQO#~2eZr&Gl1x^M)zMKX>s3;$Cr5Kr&Z}x@GzQ%4hf8ce%5oz}`+M9$6LD6; zrVsIfGFmnSJHz>poBSZ8OMn_29355Ri|Q1FBV3RWPBgFI9hAjOQL`)JEcrHh72sUY za0x+8?&No&BLu(%@=-LC#4$FfHF3Qd5A7)^*gNPet_$dqW<6T#|96+Bg&|e%;=|`( z*>>a`4<}plWe^*##J_grbvSrV$qBDgp89c71`mCHe-pyTP}PHv+p&atsLx}d5n;FHtWkL|%@Jvj1laY< zmN40`_Y5Eql-q!9PoOTEmHz=};mDyS#HgjEp9{C|J)b0tHKwW{`6%d%UsQtJz)U;+ z^*wigfI8pHn+NjRB;Hs3**tvckhnzmW$cRq>5|To@E=C%kG(ew;Yu5%fDLh0wi5y5 z;4)8f-fM_A5Vw5N={QH~Y?k)ouyl)?S^6L5Z%yH)6c0j-k5_C%5?w=Q-pT!cv`ujv zCh|X^uRhOEp?CExRKQg&iax8&Du&?1cYutgQ5VJ!1~*@y?z^x-c^n@d_Nt?Vj#eJd zoqPjOh?A3(Dr5NR2o5@KQd4aI{>Gt(@Nn_=d;d$I8kv9A;CFvU`n{E8@r{`uhM6TW zgWn>`i!3XO=*N$G(4RKm<-G^7>nalK%}ZJ96t%x)Uw6qn;eFh>OQFR|5=LFRs{H>) z)OUbm-M4>VBq3P|3E7oOQcCuUP?Qu|g@&Ridy6uX(L^#LJF9JzoeIgy9%W{vLe~5F zc0d2)eGW&*J)WD(Z+y@5{Hzn>t>(`LTEyd^O_YdlO3%z(ciL-S#A&=u+59Yxb7@b{ zW&jM4__;*ki&SlW1A~GGPcM{Ij35}21t$q+O2EX1^7VkI5svpnKxCXgw7RFhe&WEO zWL|69NrDsg=eA~_cD4`>#W1o-spo|y4rl09rdo_`vB7&C{$(`)v0V4rD_C@Xlqc=S zRLrkft8H#YSzJC%V)c(7Djhx&ZEIue?Zi{s@yW)O^i#zvz+Yx_>nV@1S*5%51r<5UDhE4ZV1po3kXU@eU5_qXDdCvI5smOoTx0 z{>{u6_ZyHk&&%s|P!6GJ5;%`N>NlES(xdLb(#hqZvx5V$`+5u$I>vFZN&jv=U5!nQ z(lsS@tOO;;zr%GZ550KhiaG??P<~pOmmms+HxPBqaa9zH}CK+WD zE}S9@AG3*|bN11#@%myKi|tr*N%AL%&b4V^dLMRG`opwDrTGMIRv|Ej;Jy>YC47yE z#GS}XiRueuEfhG%jvwDsv+_s`s;C25coc0kIe17R1U20+Ac!r_DB>I2`KrD{x<_m;fE4rMHtA%n4tjk);~azx=V z+x*i-Nr^&QPV@r(vn4C?#H~61^W1o6UQ^<;kGM0{)d8QmUK;)Q_T}ZgPTf=47pqtq zWr`3~vn}#4hlu!H8z!7e6o&ojw>D;gv-#9dlK|ZX5?8|G;wA@EQ$NtME*bj-|5 zVYm|@8Ckp&P@|rA3*b7zF1NYwgIAXEeL%vlZ2wsrG-70;+|Pcjtse z9vDA@ATuO9yP=aZAloy~L>jVn(q4l#tgwfaCEoI*`vf=1|GW(7pUG+*qBZ{h{d~IW zs)kw9znJNu?Rk=u!vcL1(Zl%q`K<{l0`!4nGypZ3L6G+Y&PgJDR_48rE(Z{U%g;f2 zKB(96!HGTa{+10R4*BhMIV+0TE}Ev#0H_6DY5FpUq(;+LS+tI=3wMq37yra13OIf#I`ra3DU*?tv}(EDgskXv)aDh!7B7hfh(a0l-fx z&}O2coF)cA>HSFLLQfN)knnE8ktlQ?KYq+wzy$sVBDi3Ge}Ag#v|*X?q2OJ`@n=na z&jB2WaO(^?fx4H*R3`RRFRkf&%ZLME29B0iffWX22WE}bw{o)u06Klxby3`8F>?~? z3*sb&k;|=g8fl|6iYxQ=+ah$gyxoGa1=t6yLK;}0LvAUEG*qYe7H-Q0`k5yOP!9=M zLi8IP9JIJ07|rllA};9ubLrD(A)G9KZ*VQo1WX$9Azy4*2MPhvd1S#$Y)gkY5;YlL z4ILdw%cV)uJCMo(Kfv|!KE^{6x$QO}`(d`ipO|353j*VaTp5^lK`#VR1^$E(`((#^ z2gi2rl6!UMu81U!(cze<5^Z|!aOBjfsE#@>qlM+KpFc|u^9@cwXs$I|$LO~70%9Z? zh>>)R%hTx9DC&O7r|C)lM#BY*`Da~4iif*tgDc;W#k4RUlGqA>{jc(6w@OJhYc}Ss zk&Nn`Ag?yi$Nj^PR8tN0_Gzl}9Xa_II(PBaszr!!oh8%!>=W5GQUw9NeTx#s$ zO0!F^NJ+#AhJK9-Wa7TzPUx$0fm{SQ8vwN#?|4%`o`R``fK0gAR0D+jz}|&Y@sVdz z)-C)(LY5V~k*r>U3cu!=>IuBU=mvQ{d*4-(hiV1=a_43f9}{usO(SyJxI8)|>QdYx zN4K)CIvWF*E?LS2g6Gka6&|(QpikEw(D2^RKJw^AELiIV2wH$Ut_tbcuv}H5SNw(+oBmti(1p|T3Mhd%Q+DD6yf(9xrRf=xi z%f)!Va0n9=&bD)slcNeWKA_l*<^BLr*127=8_w>E^y%2%kvX}&zkbvo4=Ow3!dRMC zOEt8GC8SDyOZINTWiPMPY+HVXK%MgtW|E|Mf{ejBHKSUTiFzg^EPS>>HRDagH=pRo zN4MTk+o4<#Z4k{u_X$A8UCvWmRM`;I_!-?bs@d(fBj0V1tU=)m+ka*Ti-(C>O;t-d zZ#yD1s_@a)@NzQTBzij!kHYfS9slev-TdC=XyyfEWZZnzSm9Gb_`>DUifD-Ri7bPi zeeXCI=5YYx_JS`qixn_Y^#VnF>oG5RZfw23Kg7JkY^Me{9n9H`V~BmT{)N6BBcGSW z9}VqaL3b65_dvPJ7GjRMnYb0XaTC&|ERU5e*Y)iVUES?Aw$tNRqsFRyMGRHTlPk;2 zigRVmTW{a))%@jL_Yu02$6vBDGVDhmE%7?X-hdB+bU3wpq)trEVV+Y>e`F{h79qld z8;|pD2j3+9d(Rfp%KFC#2A&>z3{;i1l7Uz3ge@y2W>2e~6LsU$*0D|h=_HRmFQ^-u z5qNN@p%aATq-nxm}-Vi9mZ6;^c)tf23; z>tR440$?C;PH$npwPg7w3Ex{KLzY|yfj2%Sa_&)VtU`M09Fk71qA#P0E(6s~I5HI# zl^tev8(Bv5X3HTf5xf(~&YZ`hdr#c)<^3dJZHOK`nIW|~I4GzLQFH!3ZZk14Rgnc0 zbJGI?^|KHZL5Wa>55mJeW{4*1Ux0G;W^cJ(7i^Wn5#WdIF?#G9%hn?`jEGV38=;H& zU>XEp2a{>_SxMJU=MlUmxi~U*4=GQ=N{^r=c%Qr_uBe?qpIrI5mw=hm^5wj+a&Cak zc?Vzi$&9Y;h2{`kC)Pdh@#k%VCmI<8u*zL1ohHs^XqALk4w{r=?DD^V zPvj^tHy^YZf8F`a`GsnK|9C}xXF_?rSAVXa0I;$Kv#DMqjvlANvUO!@@#J(q0k8#|f zGe2484{(S0gB^LAbnN@w!EL5Yhkm_38!NJKnZAX+ki;+s-I4YONOMZ6_}Q}$0x@Y> zYW(a+jqFkoZV7!y&(q|O&Z7}=+qFJ!K)T|i%JcP(Wk#xkY^*Pwjd4R<=D$Udi4bZ{ zVxAB;RXlK@J!veDJL+)gw&UXqQP7qEqRRfVgwUFsl@`b#+EU(UH~uhL^zAMEte+cLkrQ(G_7qWS$u)R-@r@4V}?_dI|A+T8!V}G($fWjm1#*R3oH!dFV3}|U< zL!M=&pq|n+-8JdO={;Az*}n+NH&-;<<$-ZskP!pGVw~b2To{oJb8}z1dizrXboV_T zGwUGhDL%NB{i|u`p&UNldmS*UF>RO8+sY2g;`=&pIP_2!ERbKqQO^od0CX99_c2XA zeu1?xi`c2~e1GTeS_EY_BEJc}JhQYHVgSJp5${Jr4PAFB-Y=5u1&Q2d?0ouuHen~^ z%@~u{Xbkg^#7p=@GGty92BB~7_m*aC@koi4aePm12bhFYQeIm#=$)$r`V(X`Pr9%1 zX;Ng&I>evuX!PUY)ZBd$mU$11ODvn!)*_mr6x8*dhY$Uc>!sB(y!2n*0j?Dy10Dw* z7WFgAq>8XEm_{y!pT6Mq`%PP}pV_AN?#nz{Cd4Ww78l2k9;MUqaoL=&h@%sBSp5Jh z3Yl0=86~HrtbzHi3PD)gLND>(ym?dFYjG}q;M2H_&6O)vAm;q|I5~>UY!&vQWhH?IqNgkI4Hu#KoXr^`R!%St8J>}Jp5tw~t8o7KP1wSK zrHuInS5^JkSsL5x|GyK@IdlC~zk{@EKj&`l5Ml?vc0ZJ?m?nW1GK^XyqvJ0Nj_YT( zxWsr|guox1`ws35eK9h(Mz_oZbtgGrBxWmlY^MmAPW+N5P47iVk3F?|ylNdKPWSSY zqLYaSn3QBkm1M8}HCBPQ!4uvFZS}-yMbsXVZ$C`L*PxALxVf}*x?3GW8KO5Jx=RwY zit{&(=^_Q|WT8Y$K#mG5&u8L2747j(Cog)k$c#EAXvdSS7BW`-c;d*?C$!A&si$wbqqI3`YG_ScUoi4j0 ze`~c-CI<*dA5LqeWIONEcN|#^xeLgOD!w}+19V09&Qw}H?Yvvt7s-}=b`x^*vx^mMY$wo%xlVTb1z9J zFSW=ej{2EASPA-pfduG_B}u6G?w9-@9sx2(70E+Tp&T_fmOXPDc>2k)U*9(skn%$e zM2=inl%3yn3efk6?;2B}`OC0+XXVMXdM{lS6dptpk?`#{gug8Rc~gSz)ifl|uDi&+ z@ynO9O^fv}z)NIQx%;LJ1j7uQWB6s;{!z#LEAXUyt9MhIJUH-q*zvDhI$IzG*#`%; ztv8*hJFbPt@3l?4FP3@`CLV=YKj7?c$oaqut0Dfa`HA%EsKZP}-4xNLKUz8{vM_S7 z1>V>lT;Ss8x(B+R%-|z*uLanGYQE|5AKF&J{X1Uqp?eaIGwB%ioVF5I8-h(vZXkC1;g~A*`a-eeFXkWUa1q6=-zY~NU zAB>$4^Vc>m{`hs5B-l=sE{{4>mo;HLK9g%GOy5r}_gg`QiyNS~LY%H67tMCS+A4Z_ zY$B58P$;FQrELsXVq|3G$vNeYFbV`5mnZSkkm2c(_c5>q<;T~Z} z?Zi|bRqsHUVin$pRl(jQVR_@rr~=qhk%9VtV_*9bqA=+$(stysWI_P;lcR?QYr1ZP zGDWZl%dQSdu6Mq)H~Sq@{D`5e2CF0OuL*{Z3ZyCH=7Sqlb&q zQc$po=pRXWOk{yHZ3F&8;UBxEM14$G0s?}DfPdy1Eg4mUs*l* zE;@F76&nh3ne1fYz)#1-#6$p^el0C6R9@{+e45c0 zrv7x;%1UwAisD!yyL`mO`Rq&(Di1KE0=tq9K4Yd6CnkAf8Y6jwka?r$UjwxHe$`%B zfgv~aXCG(0u7_j->RfFy{Zv5{w3E*rGLh((oT_^{XtJ{=y3tu0NfkeRS~2iNQ`lm+ zheztp$i~#>9*SKp^Cyvl>yU_sR2uAxW7B@xwSz-@{Fc;d)FsSz?!~1D1;hBA15_Iu zrq+TdH!HXvd-tx2Bb`oC9aZKmiU$s9m?bTlpgEKoFrm3~>o*@*3D>mWNAc(rt{#4p zh%8yhQGJT%u4hJ!&fCTd zLj2&VQyU?XV}xyxG(sGvoB)$B9LB>nSj(#ChsOM{Xn>l<=__3ZVwI43@Um~X-n$Wq z-_L8Kf)G+cm(8E1o`RBEb*f2rw1Xva{3B(C{N{8Q3@F zZy}YciVCoq!3Hi|AR^E{d2-*sj*!@g4!_9WgGza$(?)r8HOQ@x~mrXu)sPO z`Sge56uQ!;+qEHxz=J{#K5CdNaquyCce3a{6z64#It(kt6&*f>dUUV3FhyxC(gM3V z=ka$WMJTi#f>`L^G?gFl;tXYg2n7lL%RU1DvxS2W#ozuv9XmuC7~rnLL!_^-FYWjd zi80LK^II5?1Q6lRHQ=NRepiJ^G&^u_&cL7TSvPJ zwb^pUO~35h-=q1(Mv28n2F9kC(Lafd#vW-Da7CnxISauHtOG8}r>hzd0{L_`Bd1U(!XTB+%(^M3lynKoosnIf zAVZT4g+9XkWJK=hn15ujsoUGn1P&-HjPLQ7 zbnmf0rr)gzJeIsJU=o<5b?yezIP(JnK|QhpWr{KG=;_mw4fBw~hM~RYmzHjOGUFzM zyEi=kvLrBBThy<1{r=w?B%7^27yMby#dX$l^w=Eq;pUUqPy$*u&w=BlddL{-duXp= zRo8>zmtV8VVvLFv7K(|}7TqJ!*{v5}-GsqpI30)C*ubhMK3~1h7^kJCP6ZA=(MziU z`#2Tdvq+2i0f=)YddnP)+V($LD1;0%HnyHF?7pJV+1z|?mgk>uu44HN9St)PXV4@B zLjqZ`rg1HQcR=@btt9Tof!dA0Jt?L9^@(0ET&#g61q3d{Yv^;o77?(Vs8K?3}%ek_L`qXHU&vE8-hWb7Y3 zDj>~-g=Il%)G*xLm2)@_-B0A!pSO_{wlGm67Y0i zxEH7{bk5j^hMEFOwx`ctR8+KIab-pk?5#?^jBLDX->L3oSDqYaC<>zY*Z1eXPIonI z60pvwwoq&_It2wsW!CRhCH~&y#n~1TToZ4v$wxe-Zfc5ub+!yYfI7niUA-*~{2APJk*aMX`eWp_)+z8-6!pKYM0`jti9HxWC2q@a1hG>3sb8&wc;H35G9(s5M{JH^}T1M%YWwwACAkncVX6`l}3 zzt5;0g~W#@IytQ({y=DlCl-AQALBlR3nQ5y!|+wB**?H+M2!$;_0x`%=jvwtt?a|2 zciT7L-h@~ctK2VdbW&cNY9v`R{keZ!is2&92$n??a*3QaLo?f6F(4|W2=d0H{JE?a zwgyCUE{L1iQ(_;T85tc_adkb=Y)+v-MNjy>)6hP_hfxN&knENl?=I>PJH=rwHq>sj z4^8kT?YDeDE$nJS8Vtm)hcUmB`9R~lU4UM#71_x_ad!g-E_T=6Xgq+4L;Kv##DoM2 zLa#%>)dEjm#C`%8*`FDyVvhlQ7;}p=^^HwUdwL&dzS(&I(-nv$GxL_c+C0JyUnU=BAi^~*yljt?&z);!xUp| z9NlbfIH1{vE$B#DFfLM8#M|@cz46=3%#YvFWkO5qBffUt)k(RWo|%?E`CiI2MhPT} zKP_kW0ZOhRjqXmi+&3X@C!woLPfsTY19E`ML2yG>JcrGrA@F;&%h`H)DG-GQ`ep7ZaQ6=vj6OKb(GaYX#cv{?A$EPq3D4|9HL^5Z<}v*^)5Svvsn` z5DArFcZMByXV2``9h32hg^)AlP(a8D=mUUuL)#jd9l55Vt4qGLsyrHm;{Lh^`7<*& zMf8$kDMcBuSKixw#G7q;UM0cn@4di@)bxW>UgO6qTw-yTEztBZMOp7?Y;32(9*SAH z?iNov3VwBtFf_i;kB}>CsHbOPaMuY6_LCu-KXI4GJZYo^ot^Uh^kCQ_Uyma0S?b_Q zeJt~sDXmh}KpG%`#l`V#zGPphSl`-YhK4eM|K!GLP%nY~FmRUlVe^<0vO>$ns$m8} zt=`F}2y;%rv#~6P+OvLQKQ5QGsutML(-@-^o?Z3vV0hfCq0d|Tbn^8JAHW6@aQXIa z+PHcRz}A#rG*zmh^b8E#IeB`gP8~>pR)nNW(14^uL5@r{ghb0}Al`(he!0tKjRdyO zMW=rP@-RKHd4)^+;f{@0JHZYkmT7S{S_#Tu;kj?pJFvD@YbVx@K@>^p9= z9p))1+pW^vz(*kvgxq31+Gn4V5=FA9l@LIxe>C=` zn~P_uVnn)_&C@)(&p$@;7+(dcPKg)Kf8P{wx#o8X7Xo;>;QZjb_5t%0?PB*2R06|| zb&yytPB@p8V+f(;;iRJ>TbxMZLdH|O#~+C#9C%Q0bvDp1V26DFdAx`Kq27CWk4~)I zMTLjJnh7tP5Mt}R1wLw(C*h+Ka%^aHZ*SVqgb$WVabZEFAA71j@1cO|8xXfRxaG<= z0~xmL!k-XX68Fpto4sXD&^Z&vI!H}&`0-)Uax6bPkZKsHWXBOYY{wQ{X?8hn@Gzny z8%BH<%nc$wjLAgq*|TToYYmrQ!*@xJq|{VlwoW|mzI&YSk}{;0zwP>#e@GJdr}C_pK? zgh>w50M+U5(YB#7qSDe_ihmo!)PKkn!oTH(hLVK9DxGfaL-Jq{knn6RE|@=$@%m~^ zd-R9TF}w4@W^}S>Ab$@gKe8qeDyHGwhk_>Jt%CIX0Tz|4EKQ0B)-3d0%OkfMivKy~ zA=IT}h)v;azwKK?XBh(hXPbOA4(xH}v$sFDxA%n$YG{l<$S1JWYnNx4K~p3KqmYv* zApB`NOoyJGI1DQ#Q@-3(&k3cgvrmjNWsVsi{|2yF%*nJFYC4|PV~<$rX!yqbtaN2_ zaZ9kuej2pq2I9*kqXVKU7D4Rpf_tX_Eq^9adZh14#W$7N%{@9YdiTkjH?0${Pm9?W z`~+C!D4#bBA)$<0v&D^HPw%MYc|cr2Cq7U8Av^3To|RUZ!c{|EkG+3cSjYqW0mTQB z?L{2XoAov8&PtL94fE;NG8e{L#Dp}-IZQuScmAPXWX_KDMHP2VKa#ip5Taf zz_Mal`0ZKgH(P7q2kWqDgMn(Xt=W1OXXC0M!`tFfL$#v+(leHNRxVEm|AE874q0_j zYcUZEjP|w%pc8^^Yw#PxD+T3@6C7PcpVBPy!r1qVf!OM}dR5)9rP@Q(Wib%%X2ExQ zFYZ-9*}!y7Rbd2h$oQsplM!B6{zk^gk!yEg$^_l5fi3JLj~YC`N6ppfeV0jdbhgLs zAyV>?m&<{}g>UaZ$d<9zM{;p7)pMJBECL~VYwidE` zA7i3 zk}C=MCA-ELd7xmjMUkHW^vCX{QD(LF8F*S*5&umTl5nM@GF3nE7?SPT_{ZzF-2XNf zAzZTGH??pR0PYAgH+sT8A;ina9*S17P7)`Irmuf5JI|eXBwxm?65JU5>(|!C#u2W0 zJ=?7xTw_yHw?e>yp%xp6iTC`-7|t;l5KYl7l)v{4&>TO@uUa4MsHP&|;hE-XkVN%S z|Cx5}CWe?YtL8CB2GM&5gErE_2AK^(iYSY*krAwy2cG%o8f8`i877`2h;G_ML(Uo; zho>u7m=aOw(v#e+h>h}ige>3(R}FOsdp=#VvQR?#DWICQ4MNBQ^v+FJ(Pd+oInbgtbXPZ;zR^t=Lmmn&(r_%%4Ah1Q8I06Yjeu zxCgSDzUqeBUcWM~FB^`eG@|>>XZzNCBjdE4kN4XF>I#^lJw+sq;22RIm|{IB;O3AF2^y>x&79Ur}*0gid~02v5Nx%{xu! zdWeP;R4wswLthCL4eHE|d#{kV0cgc>0PPu+gCyak=A86;1YQ8DLXy5!Lmu)h5tqYs zx72+o#`);6W7jdlhe|tx{(@2{0QL=vr)fZYd;9rQy6=?8+vzcX4NeIj03Xt@`va#t z>}be@xyPq|2ukrg3+bGArsxwJzunSvA{#BBcKQJJt)hR8EmRQe@ZWK?r!L|=sNUr@ zz4r6Qab#IYA}i1iU9a*Gb`3lM|8*#CJ>8$)!1K3&%P)=^lu!p(B3_n)5G?#f^ha9k znL_uAX9F}Dz9J7N&wH$_q%@6uFOtVz3qZkuw;ta7bKlqM-%2!SYiYnr<6A)04h#W* z;%|{YfS?Wh2*{XxXxB^gyfz(6*B5hed*X4ig!hIB6kJEaiYbEO$ZXVKkUXtYMvAseUaf zY$2RjNM>xP{=1=R%z9fxlrx$*s2h&w?mI`X_R7dni=QPc#mY0s(57I!Kx#iCy?K#z$AnAPg-RM*uq4)_# zbae2(2BZ<*hFtY*jXh{dLeTN>ex;!J1Q1{c{3MYAUA#Dwv#SDA?O)1fWres&j#^cy zKrr(e>eEB#F#V=vX&vcw5Atq9&jhPk+<~iN9Km;h=)KaQdlH6RNYrpDG*0$`*>^Ia zwu1E3GP&IP8DdYm%&1^LWk%`);s6A$c?>TcF8=v`JBO=Qb89Q%14xGATER`5kROH} zh*+vn`uOQ^3Y_XN>Z1)1?1`d@2GF^2->L6Rh`_LC`*i%4?z75PgG)NMzpAEizK@uI z#=}FQCm|PmaB$ck#DI@nnRCPTvbW(q%y>yX!}^;}vn?ONhCL>SPIwSTd)O+`yyV0ehYK_X_bK9JcJt?nRxDEX9)Pshy4RM$Q}!+Zn_JGHB#1W zcD#Mh_)HxZb< z!puKzR9cXPW|!G6=WP+J+(BNp)p&QxT3aJLcDZi@#t4o~KVY{o-U4{{<}ktqGb=8# zkPBH`K7=^;?-b+6JJ4S~uYRAIw;iRq3M+i~o#h4 z3H`n9dG*fI#U4t}@DgHVzv||(%K}XP(W5>%G>k+7@*qlE z?B^`uI;JoRoeH#J%V!=^W2PkdO%7y=RL}Kk76_52FxR^(SR~$LHR6K7dqYQ5VUeqv zK1n~Jjbe{(qS-tWpeL@csG0YYBl)JKm}!IRN9hckR^N?|wr=)XZSH`IYv%q#>W05R zlT6Bgu>nL`h2bjp15OOGjHTc^0k)wF<7a1(e;3!##S&aO_50OI%*z)UYcIW;b+iKI z(lKg{cO7kyKL##yl>XuI@e1e&r(VP@G2&hHt1=$YoGbk3yVG#&++-TPm&T$_ho5?) zf=BlA&f;DBW#h39Y{%)>72no!o-R5Z9C&-#n=Nf}CEsJ(7WDnwQ`gpZb*c3?@*-k^ zLPC4EJ0L#~QtM}zzvgVNa)#f+GVw=jN^vn&$dTC}%oxU1N$e4btME1MoM%ElY`)G7 zP5-z2MVb!c+jMiw|JWq}8DkqJx9}kZ0BbKs6KwtNT{ep6gH-K@j7wgP=+##KX0J%D zwBx|o>^1kKX<#e`s2S1sLF2fiSQK6uvnAmfp zj}?tzr+v^X=#(Q7?TOvm3_578;lf3qupS15LFWc7#9b-6dmgaZM{@W@CR zEx}=m%UopUu3ZT5J5}hi8$BkmJSz{82k6r$m|Ch?2G-RGfAj5y_YcfE0%>LXL)#rgr$^&xW&-8!ztt zYWbd;f?QZ?B~Q~MuD*vB@0a)8Hu*HBwz#x7-CHIU{)OQ;_<>EEy%!-2@Yum!f}<>3 z2NDf#2Pem`aZ2~K`k;l<&`9wU6k_RIBe?Fn41{p=t_8bWxFXh@5Rp1jYamgu5B`+$ z&;ocSvHf7&$QsPzTUfusM;Wmw?I84yqDLN`ZRHk%k$Vd0(<9jfP7|F$r*Xt#|obJ~;0~XJ=SJs@PqmQkbky`_}p!C}{2oB5Si70d2Vaa_1fMP4Ft#}d-eQqcN z&cO&Y$I8Zr$I%93`!Z0R0oX_#mCss|<+UV#8r$If*nW{;1Gfy~BBf$?`f`iQciMsr z(SqzVZJkuM4SH|`NnOytYbE&_W%}b!Sf_P$!}1cz679rB#zXtivg6v#c;o#_HjD|$ z&i*2>91vp~(_mGoTl~c+gTa{Vy|I(@_=yN3NJ&o&Xt-^5GC)GhWeW$R%hsls9sS}~ zq~BY_=RZ)&ZXFv{<$bS?0&KAGd2lsz%!cqS2{;|R5JId-? zBcRYQ)9}{dNuxNCjY|%OZ@0lgZIk?VBkb;2^AdExeE;RIFIi7V0;>a+JU(G)jE5f{ zR++&(^xFUYOQthnRm2kqVmX zhv8IwLLA&C7WgPcka2u%0$nVEZ#JEzZDm8IvcLW(yS=Ekheew#R+@+KT7h0eat{^* zK_HJ*75w%2yc6JYk*9d_EdDVGu9XNd%H+GYygc}QMuO|MdCwlO;yw#^G2jjFEj{~O zF|WOS#Iq{^R}_(<2#cd)Z2oC-*;s@Sw38NwhB|QTL-E$pmv5-7(r#b>Nt0ld zBvU=KmgD#a1ZB{+2CN0kZ%o{f!R!4{fdg;dBKzka^K5X$`b=W|`0)bjM8tajGK#`7 zN^q3xHIHzr2p{g^OyAy5w*o7SIgUEN4}%a{>_(&=tLH2{1?QcqcO$Wmc=Z2C+>fW} zi{D`|#mN01;T=o{a$9($!-ML)qUyaS^9c%%?#-~UZFlzS{}R^7zOc$xj3VYhOA?(_ zPM$nzv9i1b4LgOz*@7jzr&b(Ia2PTMf+c%p%?Aw~uzD2I@K8N!pJI!!C;5fEL54f3 z$lDAZ4xI1dJ@TAoeRf1L+PBMlKKS5(ZRcC6JBMx{P*3*2^V~JC5+cGNyf~1=j9_*o z<|KsZ-x3slD+D=3Zr=7Vw6pk3OrbT?m|^f`|M^o_Hx-teUg_TIZzBH2n(wAc-vjyz z^f`Gk2~C8hK}{kyFsznBl{9|FPxs4lirHXz^ixjcVY|#ZcbQcoMn$^-bY6eYMH{iI zARP4(Ml=VMWtrJ+9_))AJ8dULq$BWpgt(ZYh9ka`5Od)`?3!y;<0omy12?4{684Q- zOw`hk1g@r2?htPc^?7F?k z3#jM6LEy0*f~N5f$QRERO@>604c8>}R$=MaaSX*%^BzRmj#hU|t?GUu5s}r3U<)#r z$D6G7{+AAV8=MZ@Zo+nSl)twmP^=zHzJVGE$=A~munoYVa)3b1k&#?K3x+HZ3z`e> zV{kPm2M0-s(YbA9Lu9v@JkHlR7ZK?e^lfS|`e2ssyaV91&Ep4-@-Fe*fgoVu9Wf}I z+}j?TK2u!{tQ@05Ao{01Ao*lZ5s7gn9k&VB3wS6qTELU!?-bBuYVHbvuM~%Gd$-vS z{;fT$N#;R(^QFn-8~v0@*R*>%F=v?--GU7-YQ;t}3i6XMqCmzhcN5Yk;_(5)L_zXp zf`ndc-`0UMil>ot;=;MK!G)%^G47?vzw|n2YO#o(4QhGJyn;YCAPOX6V~-ez&4V-Z zhEN$1UOIvEoQX+iYTRax8gaNW$#32^gR{sfe-V2!tBLw^rsqw1`lUAEek6y+P(}N# zAW!eInL&1|5Y~zoIQ`(}Z{7PZ)*9f14}Sj;=`4hhlV|HgbR~R9b0fOmTEg00kx<6= zFU|I7XlcDqwLHMXgoJevz+`tU-Z{N^H3{f58@|OmKliGF*allZdLhs+2WJzA)=LQa zwsIGaf%D2g!DbJ4V+F45W6lPyEeLHzX7<Eh+T)+8;cE!T3ckJ(%LSxUky z?>GQ?8aGC-saaf_HP%n>zK0zpukO=Q`4A_r`K-ZdJ&w}E0A|KwujM;DO#7qKxgg#B zDk~G;tS7cbd+s4hGGdI##Q2XAkHfVi&oeCKoh@72qR=zV&1?P0vbm6JXyx6)#CvDA zhzmU=Jh*IJ`$J`f`f}B=x(E-Gxx~@*Sfx3R)2B}hZkJ^wx$qVi3G?;HDFjCR)^p*t zs<$`P5C7M4$UH1N6JJ!si#EMH6w%R<(pM9@?y5oZpo+FZMn;A<235`l`-TvOH;#}2 z^ixDC4Vr`E`CJMS4I0;emTGu$1mA>hbB6XAR@eeH`x=mpm0WQiKk1=q+QE%T1+rNK zC=;U8LZtuT+L2%-H+OgNfJD#&f$m-X40j4vwP0w)hY-YnM{6VTyxoQrmr4u#2?NLH zbGlr2ai$-5I%PpriExP%ZWO9$0g%!^goo*rfI1VVU0e+d$jD-GjRz&7Z9vSR>7$06 zk1V^3LF=iEm-PzrXJFvK%~VNj^r^HsC6cW%WwJb9@BQ_$k_U#|n%SIHM22W;y7QNl z6BE`Y?cKXC?}K&QgH9}r$FWVo|Ct&4u?so~GQycpHX0Eoj2UeK6C`Xv*ub;0B1T6m|(+8gMN z<7Mve26DBH%r%SpT|Ud4%n!MCh!@ z{Crr!k#j6$((JiTM{%yx>ZlHjn-cXa>pi}~uhvS=Sw}RfDXt@0cwGm zuZa>Bv&_`|{mYIlHt@(Yy>&i?1>5vs>p%|0aJ9Fc2eU<#_ecji*wY8eIYjGtR+azr zDw5P%IhQF4lvd-@I_#_EB1k&TK2BG{E(-K~WP+TI4?j8U0A3*OO^@QAPxmz4gKCrn z*WkI|z6d!SGiW#P4(k-+n6dAqrM`nL=xl@RA1nB-O4Iw9oqg0-Ay#7RPM+qAuVOZQ zJEs^YClaZ5yx~WO^IHw->BjOkQ=9jDi9~;7N*1HVsh9Oh+$!+)wz74{(wf7ygnOsQ z@AV?>0dtDrCQ+Jf@G?RQ3f+n6ujFD#Gy3PUR&X5Ma7OZXJ848f{~^B*@LNBbF8ovk zbX>XTAdijV1@_=75}%k4zW)lT2o>A2*Mc0uka#wbC<5e4s6Y*NBMoOaxE#qoDw=3e-dQ6&w{WRl|a z8G7KJIJLh&?ZZzYkD_4Qa33bjvg+zJnBF-;px8iq2rZsS^#@g=ZJ|p1WCa^GJgVQn zxtZx72cttS1X7~Tk2FC=qWa`$yWp+rRt@iW?Gd?bPMK%3n$olz7#z3;k|~R^HM&4iPd@FOH(*27G}kTfu$>M~ zGmMH<#Bgja4z~Tjpv6ZgHUUlpjfaTeHP}`6LQ%?<)_E7P63o1U!^ruJux0e03-vaC z;yq$Rk4+R<-h{C0eniBo;q8xl(3?U_=?}q}CFoUljSKQ5L;^!q8dLctkEB2Qr`v*c zGUQj4DqUph>EB1MmZ@&vXtmc1^x9oh@|C`wRPsB>{rcR zB{qodY-?*fcCHZ+>0~&KAO&f~=9tt~V`ZJjxsWel@_b$%QK3W;J%>~DqnF(;)+{!T#QBe!j-Ng6Du>+X6MDeyzd@!K^-3?7+ zng!#)BkROSLIQp+qU4P}I4F$lB69K)OD7y%!Rwo7CX>l_t_v|_St}%3@V+3PG~K{U zl+F)~NErc=#rLA;5z$oRBwK^<|LaA!c2qiNBQ_2tBqg2m@x>llKQ+PYhCBTA#co1p zN7R`d!9k3otFd4xN|+?8KqQ zznYGn=xrto)*%C(dE_@ITbgWXj&6jrlg=0t52zXZVHP-pAV=_m`Q%27y$*ehfD(e{fWt*?1&{i1EBmjvs(nEi2@V6(OR^d3DW>9U~W02 zrNzBxc6~auNdR+HFI*T(jVb?=a54jDF-nUsGEwoG4WOqc%P`SIkme2GFLV+J8+ySb zR(2H?{^grDWCNM0Y0H+!fd0B&hj_yd6}nK@$G&=UmED@Q?)$}RzcsNUS2b5-KB&ex zNA5R?tiy7=n~)Mgbkp%Zc?AMKGMuI2y-n6hYAG>F8ZA2EnBBksUJA|e?(4%kY{``P zhD)yuq$hr;ABj`o1zub9I(hujD)ua4LA#yXq%M8g>ap~@mH1$wDx`(J z73vVsDi%ndA!;8VYj6Kz1>r~gE^}YW`}UA(bDPl)4x6t0R|~5y!>cm!b|6&w#7;z& zvf^EP(c>Bq3*^YFb#~8?K3a~`i&S>lynSsVH=YH<0C6LPjV{=_;bWaNWkFvVZs3n?S@L5tla{6YBlwx>y{_Ny+Q z9xcJX`bA7+RTzmcP+Da^bpoW_Dkk<0>JA}`#N#koDa;S9&o7^f))%|3uVsuqh^1Fv zT&8N64R|SG=~862!$cx%LYhJ`3i-S5oJzleLzUf=m+WF2E}E*UiQ>hC{9J`=@DtmM zc3+%+WtUzYW8bKJ<1_>q6L~{?KhJDAj8BYg{v4?PCt7^f=8#rE11XzVWUY2W##(-#mPr4;0&+smB~4hg#;3&}4u1rs)LN7BkoBu8I)hq2VpjQMQ~ z?GX8`;<8s-y_Yz5GM^y6LJ-IVT?CQm(jT;iLLsYr?JBEHKf+n^7PhN9F)=@y+=yGu zdA~ng)<~C?p0eeCkJ?TIeb_GH$tQ%xu5g8*^a^-fKgfml2q`zcNZN1+P`SYcB^%N` zNK`Vbkb3xm3upET~x_ap}sH;E*Yb`T9~g3wF@Mv6O&K@|;UUUj?~5)8f?AYMd;^K-k9GxVyYh*27G}pa<2uT7 zRhM2R41Up-h?e!s53RgZ8MSA~SBr7|er{Q(9TWLu;)IF3CwgRbLVf)eU`)m44?SOU zDePF+o=CfVc%zn4h?~Epz%*B;@?yt?{DNRQH7gdgzaOz1mNpT;Z0!AjK}3_EjkOLx z#k7^l{F0rY{XszicCFQq9#M~N)MX(dhUhz4C)N{0g z5D`&_@*MDm+W0dso3a2?fFD9@$gXF3`567DEDD-PUs7e3|1xCK*B$xsJj4^;Wyf{p zrBc0m8qOgM$z}LSKn~z-Dp`5bx&U91_Fk3)ZSqcGs3_y>r-*4uytqJ}3xpUW>Q)Do zk1RXG(Tzb0mjfAkARiH_hkx>qg>+UucsDyPsq4z@x~>Z*;s&!TZwz+;dT{l(CkQO4yX;ruEHKVWsuJD_}8BkAP8yPJ{>f`W8pn~OOn+_Mob zT&{9_SU!DSPHo)_6w|vqQUXoHtA)bkJ`apJ6%@4&y5RUh&Q>Ph>3S@w!wcpYssRfT z2qW&Pw@8kNV>?^?_4Q@rxS%?~l>EDPg*|^oeRX-!RT#}&O}GHk395mkbc|ia`%bn~ zfg+?W{9d2I1f=mK%*ny;bA%q@;B7ta9fGQlCNEq-mDo$5`@N^8wHf{A)xnxOe9;Vn z!*}sU1O5=e?S9QWul9?qZh|ptwDkZ~?e%gqw{=Ti&|M-@WjuRhGmbd>FttzUFh6+k zfGj#eIA2YTKLxekX#I^P=+4Res###j5F_u-o&NfDe760QmyBX3)V^t17-9eGm69bV zq|pdLx^>pxsK{(r6*~A{_0U5IpbL-Q6Wda+$`L$oGcy0;;LU@TPG5cB>QtQIr?x9F z{WL?d(&qo^V)9?~w%|jZRwlnjx+s0_FOK&aR)eeq@R&+}oBtg)dugbho-Mmkd)9xP z_TF#|wo&6Hb#!nb(q{RuC;pr`wH;!s`}e;HnG^32jDEX@16Y7@aLG7qeH6VgNeBC` zKj^ym-)Fjk6Y9_WbNP|~@cp9!(=zNsPryd@A7L_kQ$FL^jYUqU9K4$+gl z9fpsRn%&CEcrs%HjzD$5Bm~ii+}-j^>M^`Bpmx;|t$+u>GqzkV5}}rXNBF2qf#)6i z8Lr~yDJwF=yiQ%nK}K>#;xRcFpje~4-ACQu?LJva=Ja##@AJjD`GS4e=vb>t>AfcX z(l*)QfN2Uv?Ta`^3p9&2bQQYQoOvid$yK!3JH*9f>p44-J8k7|^!-|1e2dkHQ7r%8 zZ__Sh)imc8=25bN#HoPy$Kd(MKs`7Fx#ZpUYFgcF#|!=BiIt&DqayZ1p7-!q0``h% z8mw;dkm(-#{UP*@X+h6dWUp1j)a| zwkMqbyV2Ew+`sN@rnG(gvf; z^@9qmeCJK|8;+K z)Zr@5=Ne&|Pox6JI^8Ed@0_@9XsACf@48siy{IX)OTx^Bn^(4nFa+0&uzDxCjM7E&y1* z(~6K{;_ct$Acuhn8HhYNQg#3aP&*{tehtUB()hqEVEOI_eb)n5O8$i=EF<`3l%|;i z**D^E7k>40+Uz3~S_K$Cib=HNTXZjsyZ}>!bDkSzw&91 zN=zXsIx#AzHf~(YLT|X^7B7e+&!?+P<{n)U z9!E8tuu)Zr@7WCRZ@*?-0h zl0<<(iI-frt#=+CIs2x46k&E7GL?S`vc*w9!pe?q;$hC4OsVh~1&UZi9=@}r9nMww z>o3!=!w>lXvIkuCnPO`UekqZ(=He3DKMvDc6+IvqP+G4Tvg-HIqg%WYfVS?&+j#Mz_M8`sY~qVCOr{XOxC&q*rAGF@TTeoTA+fxY&dsC ztXFS`tScq&7zr7|)REueD1PcW4aw1VbYUGp=Smu)f)a034~POS(Iq_nDnbJ^ITxcm zs?q@1b%hh_*FS;TIR~1G{BnNUCewey!a2=S!cR+Tx+d z5Up-98dzV}Wc5Yj=+sbF(<{|%=4BZ*E2JXyBBFuXE_2Uk1T&K0aI*WR+<)EJtO>Dx z6#o@tJof)+x(;}(+kS6ll+1{12?-4|WZp?qAsUjEWMpM!W=2IyN|Ef4Bq2qptd>w2 zkx?pSmp#w->Uq!kJm-AQIq&-x_x=B0*YEe8#`|QiH+SdO*_AryJ$Pzjd34=QKHm^V zC+pQz`(xG$=9<@WFowV5l~?Cg^yGQXPZ3Rb-^s5pXjZmMFsCI`K!iOIRnFUNY8d01 zRu}C{kiB-(S)|UUP%_DDkGWjHtlL-IIdDv{3Rtd=Dm%z9HOGE3bv+ z>6*3?@9Hy(=oi~Epiqu$;QQBS9ysE6+5JF=l0v%K?dkeKPeAaMFEIJAV#_TqmRDOG zuO>WMS6T#wObp;?!y$KKhj0QX4*7yl_;f{J9Kc`FEMQ{*Z5oMs0Sx=1ZvwE2t3BU7 zLkTeB=rD+={ucbkw(OfiX=jX4hOU<6x{vDwwjcfZ>sNYi?wbO|6*Lpz?8Vr|gCN?0 z(2XuQxA0=yN7a50QgX$RMB1}}j@cAG?eX`(yNR6yB41HeRX%vzc_5s}aSt?!8NnCu z2M}y^i(;9EuiD)xAt#Z9cM~8U;v79MwOCZFzWzpeJcJgvTlh^049eGD_H zjksGSqj<5>U74R~=8^89b>cLxUFk$D^YkJbqxDs&5Xj=9XrB5dUaM9X+& zc_tHIlvKGwU{7E^|L3jk?L^qWJHV?3`+p(MywMZm#F&E-#K6_i+7ly1!17!_)x!n` zSy|aSNZa?`P+yC;k#s14SSF|-c$<dA>l8? zxfRX7lLJ4qy6YeG`~Z7WdVj`SnV&3iJj??F1Hu0_4*|x*)ArTHr>W=2Q+R~WRb1OO zJ2;q~axd`au?IwQWdB*qvfi;stF8Nh7KKiL2ph2#Vf5HAL`DzT?#fi}qGBTD7vquy z_vNdaf0s~&JdDk8m#fQ0%}n)G#q9#q*UbgTyvt||CAqG?J2fz{t%-|9Yx3QhCz{zU z=pBBlrV0;=aW0AjM1Nz2_~RB&pZQ&`7z$$eQM#;a!m-*~K`?}T&3JQHK`y`d>dd%7N+x3!HJ1V|I&ueg7!_Hb`!% zaoL2n4b{T(?hdm6OQJqYdDoR#^?62Mv3SY~ zpEYLfNOF)u!c+&@X8Twn$Q2Akx^RIbp-ix8X};w2*0&Z)J3SjXv6h3e0)D|#N+=4429w3zg!il-gkWd{o=YQaH(1h*NDTU57E@LE)Gl3 z%@{3A+rg%i&tg{;5gNr%oqaTwVb z@_N5;*;m;%BdX#}Y{#UzzkmOMf;EbK^21#Nz{e%IR^!~LGf-VCI*kVhKW?06CiPz7 z3oMASFSp$cD2XIo0FN^E>w@WXGEq~_>-Rd$>5{%0WrO#UFlMV*4e0F*70k9Y|=wGbVgPpD5fhJTwa&ZpRu70E`CHPNT+(8XWY4 zEEfmDkoBvb_5!6ZNDD-2%4JNW7M#;H3K$;w-Mk$vo%KznOeM8N8B?YbDAAWM56N9a z7GF4d4iG~beQT~dtQIdZnKF@HH+4LQ(L9ew1`!T;xU!r-VrvN3woVZczjHw1!Qr8` zD(@A8TFa*a&_2lO1gRFK0*w?wTYo1m3zlA0eA&?}w}@04)4hr>tHIo?4T zr*!r?HooVWdaSvknx3>-Q{>bhOyia%V%w3d=Xk9Caxow|O2 z_5j%!hv&)B$uG2#`qkQDpUJD|%ju4G>P+~n*$rgF)=bMN20(ZV9@ zsUGlX8CT=P3tCpg$FgqD49ocDp$`2iSTKU!8ak5Hk{hH;g;2RirQ6H|_hYpJI*T@| z<{vK)PhQ441!)LwGOH3ZT!7JFPtkWXH~Cj69~+VG6@I3oFVQ3u)-U>S9zv4`i{3sO zQmH^vBf^@p&m54}qWcYHR&A$iRSY;&mci^ofVT0V#N7*KsPro`32vQphebC~> z9&>bA_MAKp^E2di)<9eUL0@`0BOsf=SCX<7(iwp!UuYG4zPdAz8dp=(mi{r`Ub8sk z>`!TBW%CybFvftBMtcI#V=bwQ=`*wQ1$)KfZgu8-pYpRVF)Q!)@GkkR@Q-xtb>Dea zFZAGJd#{ln$7tA%D54@Y>lV9ME>wTB&&_@K)$*tb|25UAjdNWezPqWg{9Q%U!4ZY> z5bcm)F}96I@ece8bA8h3Qf{rR;O4w%9>Kro|21%KE*poySx-ojng4*B#s~c@8sp7- zZ*ewX0Q z2sw{fW?S!B=BJGvyXOsh?WjVp6w)4X5kk{=%ct0K&pg z)oW;lhk?n8V&6z+XR0qApphq_d})` zT`tf{kNPa9AC(?;QSEHGSu(WpcW#l-?CDu$eu&iY>f%H4xbmd9crr6YiratP}Dxf2>C(6P}RvyF=#Tr+y92N?kG}7!xO$KZoQ?rRMGQbK+ zh3G_|Qn`GD_?;7UKYjZ2Ohs-%8AqfvcizGneNw~dL{S6$7T?_bDv;Gw{%ywYNQ(Fx%=i1DABtq9Q5M7v3~lGSf|6VCD_YP6^rov-!Ahy)VI@aM4(? zF4$*(`W<=zUYAhgkh;2i7C!v!6fx@^w*$LPuw;Y3xTg1dQD^nF)~uJv3|l?qN7V3m zg8dfxp{*y2!^t|sPiiL-fRyv#!Q>$I3!;0i7xa(Di%MRyrx>LmIQS-50Q0gB0I{|E zyc$7El7<_qHZyPN8H7MqvdopyvG1jbHm_~D2$T!rEQDF(AAAjnyo%S5W~Sh;*Nx^0 z!B=SwaC=Gc9r~FQ-Yqg2;E96E?$SH7NhUW)H5Z5IT+Is z`YN010s3s2I(9H|H(YSGR4cbjNZKi~l*sLn3~>+i9?K`XTCQkpz{@HonagXP`YGPQ9kpM0IjPpA^t{e#8Y9eFk{nQW#E@Vi$c=em z1e)^ihMVFALHz$hYVuG3Hkg8tjta!28cK12@6M3i5z4rh`!bh@97B2pMU)zI(O$~x ztF2j|;R*6Q+UZ|-R2mq@q?rI>9)sR;MByz(d;)>|cl8!x;YF}WnkW4a=hChVn0+le zl`4pW1bO{?zL;r15IjCo+T%U8y7B${8jw!VKxjV^*P_rMFF1`z_LRV}xl;o!qG);0% zz}*CPkD*fsN1O#`6mS~y_UXOz5=|!o{roHvsjVp5VuzWQkY7kNxD&%?B;l zT)wnRCErdc_{c!?#!Z`f9ZTqc9CMgOB1d0t_T5)VX@Uk?;ByITsZjs4I%B){yB`89 zNH;yvgiar_sH{Rt>HR16qDZ->-Fb<8W7s2BF9f7QJ%>*K$UHJO;&*)=y07x*l=nyI z=da$r{pCa!C4y`r1>aq4&kg{|hiE<2Ks zQy-oz?Ih_%^Ijh?G;Ir*9S?3jBy}TDT)N9e$wZ0^5Lrk6Tt(NK4b1ddS|Bj{<9{>r zPoSOnntU-_0;jwuMvv(muYC7-d41mmgg)B&hjs8j;ql5poKaH3W#>_IMLHuoF8#Mo z{^7QvdqSb9oTe=$A%9T)UEa04F*xcjXN@0eS$tEUG;k&3AWM1JOPiumgw|`9*;p0c z0*LTvx90I%M@um>JfH4xBD*69On%9AFIR+dT^`ME4R-yQ5m7&+g&4Lbk8iVT>MD~0 zKgLwqo3S!u)RRn_+dX?A`_ngQ(*i$8iw11uxTvSVwHqiesKLgB^jM2@H#$8Zqj@{n-4lk&t5= zcfWpCT(M%s2l#D+p{=9y92M~S%5FH7Rsi)4J_MxvZwI7Ebll{Shwu|c?ZJfe+qjVy zDpD-+kX>Pyz}aThQ?f_)y2utePU*vLjl3sh*FQARk7&@nE5~t72L-`$8^c;B^klP( zmOj?5Y2@PO+H>aiU-&52f8mOvGBgS*l#%fHevBn@--(0b8WXE%#%I-pZB`^Rj+>kF zFE3QB@L~8^{lz>9;KVlsF|oWU*|>X8B(+&S3uI(dF2CH`_4EwWPqLNT3yTUlSnH=e z^geAnW7P|k{^<1+VK4Ck1BH6@=pjZ-0}N+{^=-)qBmmc6gwDd~F-v6i%ly*r-yZw2 zv6}OPNzbx%?lmhp1%kmxwRva>ZJw`IAm}xG`~d=^@!Iv4RR5A25Li#1 zpvK!Yhr4EWyqdKT4=Zr7xbFjumQdXh?FsJ3TIA^lCU&9UWdZ{E@4&=~1s6te5MkOv zXXu>l?O#A$Por`KS{+Ou>-PNMlTGN{b*NAY#2+rp|G{a{7UEFGasS@V!{^6U>7A0+txn87VtcoQ&gISXyUu#zQdrBoYH&=N_rMox^%{{1|GG@xEaPi-67|H8e9Smm5r8-n+?awUwTNcJebU@B3lBaGO}(-!!c9nvy9`G>rq;uG zQx|sD9nLH9zfy?n6n7>TfzA<@K{-`et&eT0dJ^kfPp2hu+d$ig(XCyehkATPT=>1H zddRG+2ClF*Ne%b%V{#3|scAJm*Qb0sD0SmIxq|R=hrsq5=`})%qNX{c%mku!IWs@@ zcGGR**v`QbkD}ar7#~u(_X>ZEtp0X&?z+}f#mpozt6aO%PD0#HJ6=cA%~YZ$D#D3{ z@TTku{V!$&2sv@0YwgJV{8`98F@77iF3TZ<1RN1UQ*2|~NVpJTt)XT~b@H#Uz-p?t zviO(UGEA89H{BnPqee#ThImw-vbh=G_0k2{Z@d$_uhZQKP0*~^J4CvdGlMg)YazW$} zpM{S~a!|b(8)Mmus&}G+VXoOyWnCk0jJSPC*v1g@6WIXkRa*1~T?8V7DJ5{47cJ77 zCp~MXc$kH?zMPkcHuPv8$rmi>uLn`EK0jnuSc)Uclq+Ft%)2)WTB6sw4;*3UxVR3= z%L_vt>1>rrsy?!WswV>vLK<)K5ETl@4&29Pt*i_nHu4YidD5^`am14WLKc7~Yr?xt zDg0?Ir%>9!9uQGm>yK4k?rBO;}=2X#`(DGJNm%wRhZLlMMEgD}Xl9l;@) zj<2unSTxBMu{ifFBKYAu)QvcN%(SZB$QUXL@)^fHoFwWg(5iy(qrGneu6e9v_t^v# z1*mgIVQFv7+=r^PuP#c@PK$`%#TkdcDHiP4YMh1CCo;0KRtW`+Qv>$Uyg$3~1wQ?4 zz_3BN^McbD&lPPRn)(j10Jo?#S&pASR|9Z;LBwpH*wv^TX-3kGbH|ZXPfA*E;Z;J2 z6hrMoP}_y>q4MO}q;US%x8*j)oA1eM(e+F^EJdtQRmfBHU;3Jml(dG5I1GtCov>H% z=WReZ?JEIs_vG29%CGx=6xUf5bxxZextSn!>5@ZC^?IYiT^WF}PL+O9PnDw=zkV^C zZbx{R5E5OG{Jau|5$7bJ2BMU62y{aZ&jjMaKRpS0YF}Iy?7d;>j&W`{Wj>Vsxi(6s0U$FiC6nTWAb!~52PbE+r%S)`_o4Gl%Kqbx@^2HpUoD8yAr zGB2+tB&^@gI)CJ$`CcDJ5dfEx4y-`vuWA}qd4#5Jxc(-(jC)gI=wc~rw1IfW61~?p zhBg63WZ`UrUo>Q~3BI3Ll zLsO3kn=*%tW(wt;ay-vevuwAI+LlF>J&?R@aHPAv8uXVBvK#tH7J*mDl-PKd zY7$S7JMPF&0=ln_S}fH>w3yyd3B6|uWg#{2h4wH|ytLc1n_)5vCP`H746vLuM6HCV z%n&y>cXyNafFGh?SRJ42b6vdc0Xy{gM7_|V#}Ba&%uKPWr+AzUbZa4-+Rf>C*dDw<_&C8wsa6_ekcguD_?ACt<)dmWFq z5~!+6B>c|d?A;8j$^+n~i_i4h${wP(=Ft3q%EPkiD5*>@hgm>l9o}DO+RWtFjqDnO z05zqDVJq@aNRms%FHJ68csu?)$)|%X7^Oa%{i}>u1v#7Ot;ifQz27Zl`_}exkdoq6 z?t7Htw;%y&S=D;~+ND*J7Y}HL^@}2|i%o=nA-0uBK|e-t;!7^+Pwyho7NivE>LX@i zaCIVA;?2M@G5H-j4lxpdF={F>H|GG!kH6j+YlYD(@U90!6i8155$BPIJOeJG93Gow zv;2Fue@{lfq{^4|R{FDus;I0b$y31mY<%=l?-fL zpy>wmh08`*I;j!Au^>Og#yCwc%Z(36?eBXz$<3Qz0#qYGvyl9J;H1<^w z$o3IAe)>_mYH1(9zysMHN34z9KQ9JT8a}mQ+;H7*`jhoQWX6pT%3>T$nZ``XB29LX z(-6ZB?x9CPOMb|kxcwwD9RqOtb6>c6Z-qeqq&88*sb0Df7LHj&|BkWk(bGVpM|qdv zq}PwLyc~L5qU_dqp!dFQ3dgY8*pK7I1SAvflK`=twx*_FkUD0q7EjI`ODPCkS(*Wf z6aP>NdH~EcRXryS#1G9>jRDuirNeBWU)mGY+3zp&@ol_tdJm+hi|X~?+0M;jM;&ZImN@50sI);TfP@Nse#swhh5sWxhl;xkF*I-GU_*=fzc3RsF?eAQ%$iz8n~&j7TeD=gde; zd)a^M!Qm|ku1;ONI^?P1;CfMq%>*y=KWan`Y6T#}^IkCRz5*b(5O5-|1zEABZI0Ej zB~Bj;?1P#Tfngs@LZkd3l+qzvn)x%DSc&m_<~Yv*`aw@n1D0TKb{bMZC12$3Vry+u?#5-P}V$Q{bcd>i}Hsuxbi$-$)n2;aeuhLM z*bQjt?_YQDvf9FIq>I4%gvQNG)_pqo(pz~{_SdZ_o&9_(XRk2U(?FvHO;op@U1KSH zv;jKSg>~Q>nm)b@OFJ5ukPu0Z0R&JTm>Cr)yB~<(h{V9FO?^HzJK}ntM7F;A`TN*U z1Yr}~OUlDs6Djv^uU0_~WXSIvZcVj$sn~7&hMr`2vsHLRsQLh%Rs_7{V6hVe2C_oF zoT(%1w%;BRE)WKLMVs_MQGr=2UgWj4we7_{TG5?{0LSrj&x57>=ZSI*DV%)20)4Rw z_n*I!kf4Kp5S~4tPw|^n1pkU^X>G+F9=1P~>E0EW{cowH#tk;@Yr9UX14g)1*F5Auc2Lta>j5vak6{GSCSO*VG@ zG(#)MB7tF7q?Kz51BHZq4G;%{Mkz+&bT`nqM$mr9++h;ItB*6En*3#?Rc`n0RoFLx z(zYvgb(~QoifQyeXV~5pq=Ksb-B<(As?E1{oLY@b?%R}Kb8D+&?@nmfKoAi+os>4B zdp5`9{%E+(dFP^xWK?1A_p-`=eSY+9i&@HYrEUhN1k zQEl*yVB-K5b5L!9?q5hDvONevlwZaF?(N%gIB&78yEEW$SL=P4g*BrO9Os`oT5y4N zPzmQUD%c#$Km0oLV``o*Gz4fXEH+ya66T;tLeNK)a2V=F4e15)S}s8_7|gLc3}k=^ z6J4Tjg$2M-R3&_R9E37Hk|a6g1QwKlgg*rYbYnI|01yEH2redJy6r;lg9pq2!79|R zR>9UzdI0#<&OK_QO=3|i!4#bN>?k8J+U0-{=m zp^g1W0(mtSS%o7F=?a(@)KjW$cNhTz`jBF}3xDUWhBkE%9M^=PP%cFwOwY||5N)Xe zpXjxk(CSTmfQm`^Z7vMUSln^Q5N;2Gsc2LG``cmtcm1!7 zZXvd~Sl06|ExLHA_Yp;`V(9@aj1-6*6vxN{f?qYJQ&3cO+mgzQDg;z^4~%*lsj>#WGA(d?|Jy!QDpY=FGij zKcP%iU2xtszzVG^nd)(ut8Qw`2!n(VUlKmQCcO3i0sA5Jz~*#8Nja3U5VE;m;F&=w zJ~-N{Iu#_u#J-L{dv7n_Jsym7pPBnnA$1B@cScd969I)F*Muwt)j-9)@-c_vOHIS~ zgycqB3WbhHd;h1zz`G0-h_#)oZp8Z}mZ)}AoZ%QGO~<%E4$ZTj0IW|ihOh7Lqas2uP?Cc81qTRmOTbVAXC%n1RRXTc zyfL~trc(L{5piTNaNCoorzhzB2H+$4Aqkb{yd6On8@rQMSy@9YF zKg$9;)aZ1{&IUiv^1iU5GMc{!WNZSnckf;Q(U)LmL>=pylN##qoYLwGS5DON5tCj( z*&x^I2%?IbK>L>X)omGwE8Fe(+fXm`tI=ynvTvn|L8vGSRKBA_iq#u8V|vhON}}P| z@TP!%H)TU(<51|^njSCXS9Qm@V7z_mVB}}O$U{hVY)e9YM*gS?7~Zs~u)}=GLV6@hj4Vu}+vYuq>Wf6U_4MP? zCHufFCD*$L>kG`E?fAtRg)zk}Mv*8Q@ermy%UY#)+^w9SNfgH?5nPI~Ibf6DOH;@S zsU`bDn%g54xFs;$+WS^P`9)k`sN(%NGz2xLGWsj@IPMI!=2sJ|ExZRQS5}ZlxH~Xjo@6uY9BXUWh4w1 z3!^F?TF3^7a=D!IEx7)`Cq=GKPCDqyCQB4dhWMJ9d3Vs^@*vhwH)Sj)IMV;;=sUrS zRpyoA2OE@;1v%?ZBmkW_P?u;Rj%rCS30qp{z8-~w$AyIx7YZ;~;hP28Ns1W%v&=*S zN%C5Z06l$)5RbY;M|Pi<_k}H2^ep`^BrBsSl|fB*z0LNDS1F$u>wy%0Ex^?e}nGJ1H!0yoRZOl=8~OnCRrO?iIA`y-MiHXcLzSoc)q|6XGtjCK;su7Vp9tOwK)ww7mFcqQz+W_*zYYF&89`2~2Pp<`GARzi? zrmbZYa{+LhN}d_oE5-p;%>S%u#FdB#2-4SmdnIHsDu%sm>hqBTT=%bVvl@FK^oK;` zub1_4^t|@7kR$nyVF+xRSHTFkVRiR;(H49=iz=AvPXaY1O$Ed!hvk)sc?FMTn(o$> zib!8ssCC2o8R>X`%T`IwfD}%_&FKmu_8uzyJ+wzx2S4Fhx7(Z_4Ib~g*PIZcJA*%I zmK0n)@ivD31o$T@WeD(l0ZZCA3PRNd6$@K>n}b+D&OW;{x-Ck*=~x6K74BSJ@U`+A_7@bmc9n6(?waQL zStM5;7j+&rLL0w_G+}=t@cX0E9bV;Kh}Fb+yc_M_&@;K-%F|sHrzU1|ER~4@uL=?F zMp&(f@;=w3!}U)_sWPlqILxF21H{{grl7U^(H#-xi`b2GkSe=F>WG8Z@NC1wo&LB% z!DtEdDQ8eXw~}B;Y-<@%#~{N2-_DrF6_3m^U}_G>k4tlB;L1gOJ^nl*v%wdKD})Q` zRwI=@@YUe!@efd-zCUu;&{nU$gy}}fKi>D z_aZRP-D2YNcPF-m&v5{+diw_apLdu8hg~Aau$N8wx&+;$NdBiKCWTB0P}$b z_w(~3zMQH2b{feDaM?`V)-3*V2J9}JqSL$FLZfU*4Kv@yPVV*b>P znp8pq^V=L1$Cv<+6)PaIhneUqvh(2OrfReM)B5>y zDw6eJ+)y|5rOzlTDk?v&i&wv(9!nT*Wxy@a=Zs#`#h3s&ahJ>woUi>otV0##W8@3liGT81KV(ajL>Uq~FkD#w2xwmw$90O;j~%=}lf0Hr6`AGX z9i7>Ia!Q2ikp*Iz1O7~im-USwKXfuoPS)bu+y1}VpLiqNhC)>Id&IUvcLy<#(Xw#6 zU6FO;-Cabh6iFslWd5C>*;ac=+m%D8tw zsYj;8UgcpQ#^Q4?pC+Qd52EyR>|AYa&We1ANl7F=_UZ!-T($Cwiqpqd@ydc^7Qen( ztOrgQym_mL;CB(XF1!^N4rGUY8q5sHPuYi34m&%$*KKLXL3|^fkPytEAu=#tfg*t% z8blm$Hd}RfW{%YncuQIB4`nyoPv*tsR)2c|_F#S&U>iRDtUnhDkb3g4=WQa8)$0tN zHL0Qr??}ooq~g#y8K2z`nCACyN611DdU|b?&*%cuCvg)I$ttMPndsx!->kdozv(>8 z{bUPGSB+N3Nse1Mv%J<7ZV=2$kb!}nfnD)ccOlU7myRW`?B!7wod%Gc6qn%FB+DUY zu{3bAq__0bxsH%zhSIt&^qt&9VQ1St&@U1{m-IRhFT9t}bd+ADU5Vt{IwwhDm#`R+fQwD97sE zYMx~Scc}F#O2*WCwj!ngs3U#^hoPJHHK-%~60a40w{wJ;Yoef1ZsM-SU^<^1c@)X2 zh)9b#)B28}$q4M}g;I0%o2fvr#aVX}aJ6xd@h3`VQ4y!c(j+HP5_^9t?je~jqCf>w zFyni^XA{0ZVo3!ga!YjMt4#p#QfFAuj#FYb;_=4?&_1o;Cm0mqzv~(=3Gu$c$6WZu zI7WCL3eRoWAW3K!yaw^kqK?ka5W56~;6T99cI|h!WX;dB*MMJvn1$V6IBmo&GQZ1%6a`!kyB zhKs1r$3;>t3SKKgCm7B^Y6836J-_Vx@k_W3IPtTI8cA?ClvaOJW)^ll9kSbbl_*vG zU5&iG2Kr?Q4R-GaFNJ^w1&w7NT}cN^R6;+|GmXz-VkWHxFf>N(5%i@)=7fOT(?^h- zVE+j$3p#st2QjQ;atyZlJLP{FNku3`!s9wXzS3`Q!s_a>1CG47SWDln%~yQv5*qa~ z1hW%fIY@73wh0vzZ~!LrA|Z|dRI0u1c`2D;oC`&wj#I5YgpK%@t>icO2cF13Ts`7V zI-13XNXsK=g~sVU-_DX80aP{()Eq~ICdR@G0AS2c%Wb)#AI-Bp^vRS?7OrAg5*3g% z%J95O2uKY`Z+0P}gLVzIIoQ%yc?yQT9B^4sWJ4|}&Y@Q>r8BNN)ETODYugLL%uD*>=%^x1D&uei+XuNc435$?AGm3)%;?H?mz{Q`Ev4c@q-Qo(S z+K(H;s;yni0tzQVV z|M^1#8Q_Wm!O8Syo~U9l`e3j7bk)3PJ)}KEQvvJ1MDT|hzY0Re8(LT#aJLO%$}BmV zsfzerqyo^Z$>Pw)buCHg^(jL66 z>2%U^M-oSkl@S&V=wIM<6vBNSe_{s0MFPX2G9VlhG8DrZdpnCx61EycJg#+>VW-mo z3o)~UBHX?*BaVbNa3M5kr zXJ2Pmbh7f4<$27+|16tq)b{rFBytRWWcHVVRh%UKz^D|TSNjFNp{u1eZ5uXPOq<^U zISD;_ENw#YPIzZiIy-zEP{EELaN~Whbpqv6I)m`_jCfd_P5^ZP2%8p%iru>b0~B?26gI0Qvj?4V&(9UJ(h%< z0EACM2oR-ce2wQDaid|jL!yf887DYENNNsjF+3VUYCu$8J@FPpSq_%sT`I9SakUHD zd>VHQqcRTj16s0x4s4QH;N;{$u31>+l?J;=v;AYyQ-)?mb}^0hi4Ar{B`Xqr&j<3h zH4BN&+G6Xpb2EMVO529KREMVpsODV?*jJ^OMQo;OKXdp|`vWd%?xZIUw=g}yjKF>Q z#zVGHBLBkNRW&|jo%0_~O>0qv%M#Rh)Iru%@B!F=aMpgGQCSXfJ;8Jl*W4UNYZ#x| zR6K;|bBD-#T+>2Tr+zzx;PUg9{5b z%%%-tIO#AW6GxYN>@%R$*fCz)t$Aa+gMdb9X(2a#mGEOC<_bWz`jN?-$eaU>7TL1l z*vwaeThmpCOn4=Id4z;wA#bzBxbdUH?drriHCpkT3*S9e{NKwALv_#NrWEMsH@}t% z1Z3>LdsZ#B{_@2q=jgOSt5FJ zeLkUU==9;X90QaORgL5%RvUjotCi3DZr!DGK+tjQHaNCl?f6N)*7eO(XEF?N`<}wSYhz+b3Ej$`t6HfQJ z5D?PAfuUWp{0W9}?C@@*Uw4v(P0ZBsVq2nK!0SmSU&4C7^F#g@Nz+2LCEL`@o@OlpS8v8bSdS-$pIZNeugg7%NRlcM&KWF7CxK8G3T8N-vQ3G+J{vh$ShlMSxFQK zf}`8oQm*}GZlUa^ofk*htV%m8so17Q9Mdalwu5Xqx#PA$KxMBW&c)7Fah6Ct*-c|F zX7ucK++Os{z-bLQ4dPDM7fxslArfSDfu#8Oa6GA`oF=H?WQkd!-xQF-8}EMRmr$XX|m!HkL~cZcX6o$-{Mo<22}#d%0QVY26>6h^9&bX*Q4;Z*?!SQ zXc+pn!+FSY`f+Ht0uXlm60p9{bh40J!$gm(h_E?K@P5OAqHTa{?4+d{iW%?DWU(!tr`r>8ZDkYW3 zaaPnE!s3taGQch5--Tz4Ox&TnLw*G@c~zZc@W9kNyjq#EMp7GPV&uihcFqp_H)NvtAl71ED6A1$RB`+ z=;Ad+yT)eRvNc!0GR?Ns!4;~RS8+HQsas@;dYS!~xLjP1*Wwzv)$nUH@(fJ~l}#ZJ zHM5Ib;9RTs#_tbC=;kzd~XL5)f zZx)b-^^}C(YG|ai^7e(hnm8kYE_d*5_LcMn&-1&0JOl|GtmS_NH2xI#lavZd$btct#nP9s%jQOfja7vFZ)8ws)}RIDVTU>uk&nUi88 zeVKuQ10C#zM<3jJphA2bZ)^d#1fwY_SZRu>Dbz#2b(r8VVXXet85YGHvSWMa7ObUyZCq!<3v{*hd=TmFUi_aLMGaysSP zjUyJszo{LkY=Aa75N{K&)@<#CfC_a%2MoGD)k@vCzt-&1UF!P^iMIq!PPU(no%^c0 zF4c~Ou%r zv1@YW{UT|h6~gONU*KWacsFJeg}iOgAvHyK%eTK1A&1p|d#Y6FzfFKIvq_~H7ROii znZK&#k+S&>ZDb7l|413Hy{Gs%v+LOK-%?r~NkAlLUWk1MXiZFQ#@#l>2tY**Qx8el zyQ_4ED{tjWy+G+NY5O{lYAMTpBc59_9CqX zHWrf60`N}xZNZqEG6}CGvQok}c68cd> z^=Pz)q4vjLqj=*IqeFrA@`*N2=Gmx_zuDI|VPZn_v3ZBW%{M=Hbd=xxGV%n%@?#bV zOUqJVyHrD=ndo_cAiIyTON-)v;}s6~p|%O^mE;c&GxNY-sV)R(@=-#iqZ&2p0CoM;?$G&Zg zQa}vkIWV2$D72LklbPEC;R%#R>j~&X;?B(Cb$8;yle*NAa9?3V`xa5vk)g4@SBa;wN-BgJe!GU0^_y$Kmc5h!XV50~fuR6Qu}<>NkwG^(0w>j7tUihLVra z6-5-ewXlm_!SaZKPQOif0IH{sC07N9lcrQX)5+ zRTClqK4yNPzaPW@_D}svb{tVFE+_rkT}qcIr}-g;*~`>?BBI2(Q?cqwBYNc#{KfS- zaryn<+c1H>kl`d5pnnSiVemYPIVwFcEPv=o#I0LYn;cGSh4Y|I`Z}*%Rb{&I0|_>G z0B$oVGCFsa-H2mtHF*YOxXVBpU=2Stsu>KSP^J>cS5?7zSi{NoK*3_&R5&knvopaP zs|ItI2pi=!IzR3$^uTb4{R&XY!T$LU8`spsxl}GWuWsti_tZEQ9t|){5RMAL=xH_a zz4qUG4XWm9fFe+oR~T|G6Ad`Rmi{<|X+J>S6q(*F0;f#RbQE9wc&r7hGv@Yl7_7+Os&|j9n5GpY^^lOZ%!@xq&6O6BzbjbI1VBvzY{8E_v)nRX?fz}v={zrmp6D9 zm)%c~ZWWf~b~SF=x|EIPM zZuNz4HBhjr!LDfH^Pz*QiVqYU9n1WLS z)?zEhNkHV6wJ1F~SvEh|PgIRqd7m%-c}F0*tR8=eFo|Xth%!4Xj)%2;I#KQE#wEr( zdcI;l%fEMTR+wY%c%WV_zc%?4cic8vef#;!!b>*@1InqC2d{+bZ=a%j0!vQcgx|rB zU3Kw|{j5)Ecf>)2Gu&0)R^S0d@?NT6`VqwO;nz_YI*;*yq4)~${~`Z!gl9ACPDklM z*kisBwCv=htkS0_0^HM3OxnL-_}kD(>c;jin`;A>Q2$aIbm$&7oC-ov@l~}K(vkP? zOD&=_?00E$3)qYCY>lOhH;)B|W!-OcDLvF}94#!m7DN#MUuaBeRaS6O(+XDqJiDDB zcCpXYLtrdlsL+s4YKT|U+{BnJagh>=X||69!$6yc=z`6bnDA1OH9*7{{VC_Kz=j<4 zn_ml>8u9-Z;S+kVN@;c`;*G7ShK3N)50Z*H8*(;2T*bEmSawfr+C=}vhb+4>wtrXYdF zpJ&4!wl08^3RL%oi~eYtr-SAY1na8mLP>FPp%~P}QoYh+^z+kx=qTWKHs;9H7SoP= zubC+XQ(9zonkw_#H$VT}TC8MT;os%A4*EjRNOxMy#MyWKRzo~FG^32f91@+{gAH@7 zrP78N(uYpC+2%h~$@P7;!}r3v`BlB6N7)!fe}wW*^$rb#jQkvA*=DYE0baRDRh`#% zMF`ZMEtb_{3jxMVhH*leKs&;!{7&8wASj|dB}iWYB#Ue+$+BWY;hp$b$%|kOxjfM* zoSHdvqU8b+ce-Ptn*S`C7`4{fIX~W$&jWmWt=kl7s;O3wy!sFe^_f(cb>E;lk#fRZ zzMh-wI-O0p$Id%fdWWLIGEJm}Idon5KEd0Q_TYV$cLmrwR>uYs(*@v8D8MKckmLOWV^ zvgivz$EaiZkOWy((AL&g-8bR6va&3dTw&pAaO40RC6gEWIb`^=5Vayew>580lcF08 zm;c&e5u*wA0TEc6EhXY%CWo*$24bgPShzEWgYruqt6zF+D7FLFC^kA8$g}0*eD~~v z+5(8NHGT~kIlmV4<&vjR%w{`Mr3P7O4`lxp4!$*%B;;|>Y7Mdz4n&?zsP9WF(O`a1ddXhZa+zuAPx@gPx(1O0+Cfy2bLfV{)1kiDD1vMZM)$IgEp~i z0*|%f*%RPE;2rx8u1&1vLfD=A`CQ(Y)M;z}3|C`CTzjs{y`rn!r|(4wfV$f-x}x2C zHbBi(=FrJw=69l}r?Ze$&>Q`7E>e>jiicE8+~Hkzst0}eH*a2QynoTNplZ3S$Jt^O z-&bnuBHZkLI=&Tf*ASErml{!D;d?JVC?`k%r;g8c*8JEDTscJNQeh`==p?`Hu!uNw zqVFEcxwUl+&DSoxv8^-Ul0=e`HhY(I{lzAt(}ym3kR{^?k=P+*dMHOPV2@68TGQ9B z%q3>~eR%L8f@h#kISvzrRn}FCXozv{@XW0t&M4Zz=|@LxTy&JRC~Fb)3Q7KV5(`Em zMHd$ruc{4?B<@~>>;F5sTTuT4!LGpeH#ImFN$)1%RUkE5lYC&$-nPr6L58?L)@*&w z_IPJJWfGcStcCy1L>C%&NCg!ou{b!fdf7~)DW#<{7Rwo&gWs)eZRO9&E8rQ%LnN0 zfiWlH%3aozQc$Lm3c8Id)F1l)GEChgg_|GA67v~w_cmNB!52wIWag65g9k zmKY(a+7uP&t}MsezcB?R$>*bdk1 z)NfOewju*wOU}3FJDdtuRoF>i*Ax41<1OfN>0u78Y}F81cm3e|)t4_-FmIdgIP=6& zr4R5Q&knJO4{V{+0J7$%E`wnF4hD$Dv4LC`m^~n_G;KQdZOIomM8I-4-m%5eg97=V z9oH7Gn^HWeuODuL1z}z2z`h3!-IsNl={JhU(STYqmrcO5&UgfBUPJ)&o}CHK0K2a9h7$dO@$AN;Li4JC{<0Ruj|V zE49CMsG^p$&j;opFIdTOvc2lh++rz0W?{TYo4Q_vZQtFA+;$w`c)5R{_nlglKU za>mKYDQkEJ%WX*K$h{wC*X%*)sS7zNCT+g0GvNB}GcIDu0fm#dkBaJ=(-o7j**)wT zEjTYF*l_<;jHrxg#n$)P?6_SVn8MGp-u>(`6A44I%p9RXp-&o7DC1o`AF)l!5v4aR z{d6RWV>{xufr5zF7&RZvGTsQlJ&t1>WKePL=WVysXHEx4@k5hq61|%d)R6df-Wx)a zPt8YD3!+6AeNdEx&CKAA^0iUJG9cu5D|dYdpq8sXjEW>9)N&)m{FA_Ht?+P=X;=VJ zpjaFHfrOtUMCfb(5LBx`I|Dy3qK8_Ezf&kl#x7-ujbgwH^Ctb*0OYK=J+Ajm3Oc&nA? zIee!sMI$t9fvoib>xvL|lyhIY;7#(?^A?ip_TQ7c0%7N8CHZDvZ9}5GA;AzqYppGc z?DoSePJ)<81JIvAe`NcR$|*s=fwU$DT{#4c-q6?COJgMYTyYIV#!OQG@*#Odz~F-o z>$0AOC4Tqhdu7qbD9b`B-lzVCJ!!@MGcLnG5JdBW@r2)&nRkVVPwddeTmQ$_dxvw~ z_u>DNgk%#L*(*uQEPE#_Bx#^jMyZfwWN)%kNmgWpgoGp{sbmxql2J%Pk`;dEtLy%K zkMAGf`*2*xb>H`Kb=Bwde!pJNah{L!5OR`SD5oKkTgLs#zirz_%;vt&?upV~i=Gvs zBjB`iM0AXN69wWfbTt0PjbKo*A=_X@uTF%J@HD7*3Id?N4(5=))#IY^ek~&bEhCqG zn}ORtR}Mb;{GKBnslzrX9p*&c+uQu6%ppOP;&Ax3oM*P#>RV871Zl{Zew6&zkUuym zKH6^yMeZl4;e10o{$!~}{(DxB@-F__K5EGSvavx;kfZ)Xw;oP_l5QuG@!-;R^zwq& zJDhMb?ms?0EEC$8(CzeR;VR_vKv6Pkn8m7PSqLd8&|bVU#aJE3!kX@IP-~)vf>{Bd z+bus%0oXyHnPjKaGJAPIGa7J13JPbv7tqi-^*lyJy|MIx3KMm}juYIqwZaIrh}(FW zin$4(h7Ga0!(9Qtr6I6`9tbHlqcb<(zI_WM1Xfs>sbeS~3=op0;8@8XfFov=l>PYy zb^aUE?|{S;%@M(RKYO+k-0g3M5MbQfAUk&r4-gGCxI>UCt*aK@@#Lm~_G|ks?yj6^ z;R6bv{oV@f1s%0@{NF$=OtbEKbMtIS-?<(}{_K2vTOY@VJwpl@DV*usS^LdJT(7Qm zjPMGMEA@6e$r5g5u#Dh$64dJLa~{t>h5&Vt-tQ-JnVQ9pqB5m6m;ON**1Iw@VwrU|;j-h4Xb!gfbY1F^FZZMa>`zF<^?g4?%m7nGa$ z==9hpJ_NR9qVT-bvM*$hW9Ri@0p{zlU)*f|;PmNGe#i3T!6^5YcLKe|b~>$&r_EyjdyM7x)EQzE#o6FO;g0QNCO!U2HknU$wRYH9ovSku*PcevQX? zeF*Ean|r(GY~TGe*v~g?$1kJKd3cJbq%d#llNm9|?-<1Pr!jaVH^KI8&df~GFTg3n zB9cheq<4=lmWB@>lJm5nCQ!^@FDgvPC22YlOz;o)tHzAY-W`yhVJnRt`Ho@7bpZ{w z3$wKzG9>ead`=N?r<_1(ye8!;vTJ(Xx{i9kt1#5l8!NAyUR(%W_C6Q(H6)#C$4$K~ zQz8j(rbe?4(4(Jz*5YN;26|}Z_xD^*ZtgrSwiVP`k{j@AxQXfg-uj5pb6t6iN2rx? zf@CsFmIcQ-YGpt(Q}d09l0fys=jT1huwqToew{ZTEJfMqU;<&PtiRUm(C3>~`O8JB zeET|TwRME9_{P5MT$&O?g*C&egcj>XScjJtl|i_N*g-cmBfS$N4p`hHpwS;XRI|vA zH6N*?7{3n-xD+%~n`^`eshbArQpGgb#?n2aVLm{s2_jLtvF>F~O?t(P!!!&?R&3t` z)@u~00hv?xQhn)q`lHtW?>j;22yk#!DevLdmpggEnS7@w}0$^Yf{zsdBjW8 zpWjvo0s(k+ib--js0x@Hk6#K<7oSbs%OmT=`SaP*IYQg5hk^zXE;Lq$GVahxCMsqh z@lipk;FC%$%_@Hf7$G|Mz;B!cfpsmAvFj=9~G->urGOb5Omo006g>Os8UhL zCSPiDD6?jv2^<;?2jo>yM1%{7uD088KFGnD>giwMn4W&dC|*rGM(>m+196%D#iiPS zn~sR5D>cI8B@;J8rg2?Az}L>uP(M&V%fCqz34+gYytmiwR+qW;HYbOA;&zB8Q#zK# zFz!aeYjLZ6JkLxLoQzH6w#(|;$S$3#pXRmIB8-q1N0CPks|TB?pipN~p~Q|5(bwTLf{9o^6(zyN zT;|wii|RxkW-8Lcr?PmvmKsF4(dvuz2|TwcFMrg1$Fy>YCPXb(^?`WJ$DQ`p@8(=Z znfx599%b#6pr;;szFvnPwhF9m2QgopS-1mb2v+SV#5V{;N_l|fEzG!dqSz|kG+#oG zpDsvUSWG0AN|0GbHkp@QFTeI${eY$yu#8{h!o>xp-~pvatB)JZ)bxToM7g9A$%`|J zmA@p;0+q1o;i+A?<%owKb;NoeH&v_W+DT}%PJqU`rus5!7g&cNmHM-|2nhXuIb>DO zg3kJ~lf$1QA_&*B;A;gQ1`I2Z=7`M|vJ;WSg1^yuL6edy#)wE%B42~ZbaSSltvTc| zZXF>Gd!%+)dq446UR0jk^%qDIlBpqO{e&qiD+>+Fk<^I;kmwH`dh-ET58Ha`PuvpP zyZuxtg8WygGWyP`SOP0o_Auw>Ph<6S#^BC)q!^Ac$Mh_-#W&FT_WSz|%`9Bkxd40; z2(#C4rq2JRNNunkfNMPRwnet)Bz7Tj@hlR#gL;OB{`v*MZD%&mpYWf@NP&GCAEID8 zYbYcsxyDJqt7V? zTsl>jLtmIh>ey3G$bM`>!_(+6NyC4h+wl{67|i~&i=UuHs~wp^#-!&{ckgwBs;P%; zE4Fc~y#N7+3LJ)iZW)T|WBtpMv5N11FAfi2>9+%Wb*O0)AYZYBRlil=WH!C&q`!Vv z2FhXwY_<}P?}Dlb3>1%FO=8&nF_4`FeAM54meGR!8TafdKYw4o?xPR~EtK%13~Sv( zmft{vsn*8riw}~N%g8xXkhK{c-s0xN%F5*78qwKvI)%o+Yxm&MJ(Z5-@)208hnK7;Q$|5UK5ox;BtvrtY(CF%=uP8qUy1>S z9R6)*0{?OIPS35zh(bt=A7a`8uxw$kdZ6_Y#|@`yy38c^NZt6@cd`V!7+8*ie=HuI zH~`{O1R2@jTB#%AQitOXvdLr*9W3?IGB!@#H-rU8^^21-)LKiXC$0-Ktv3GvURy_< z(nLBwLnu6-sobf1@DSw=M0$}auS9M1Mai^d;0cW8H&1y$u7K&!W>`HKG+aLj73^Q?`uLINUsY>#S-fu?1*fh@X}{ zlICzwZKvS;mMwnQVutStqn7`xZO@MoxdLi)akk-sUChh`1^`hTID_|Eh6(i!J)oz? zQuP_KdiJ(`yNT!`Fs~nD2#`g{25uJY|1ioY5g-_npq)w=*ePg67TaW(nRW@GwEd?k zFTmvrAM)j*A};#ipYE?&!tS+DWz-MQh)er({=l{pSOAx4z=+z>S58X>JK zJg>)GH}{^KyN@kiKz7Gq+LbyBESMFL#+81jH%#ZF?X<0;ot}ZNYO;P*G{f2y8>+Vx z?n78M*8_AlI->xK7twdagvDC-D%98!BebBKckWP?X|Jt*CN%#%R4o86wo^yX3Dz)L z%?fKnIG30qMA=G2v}E~9zeV}!(m2{)93~``cXUHE<-NsLIlxRb5a;*A`jd9?dr6qC zA^9*~y?Xj8v{0mLeemEx=+ZuQV-lFMMvN&rIT@GiRp;fT#Kd*57&+ShQ?_#9UH7(7 zjiVA&v(A6v_Ak~EQ-eM|wW>ZJ4gXgA5;rmGZ5$-~3Dj$R;C!%fKJ@TYsg59Dv-d8G6-epWyOWw+;+a~rb+?Y z*UeI-AmPqqD0$vn{htwS^WL_=fme(j@Mt(d+TB#HN*%t#hwRiF3^TWENnn zjBKR!F0gA6?S641Up<1Y1T)y}H<^0NKa{VKVzIw>m6xIMP(bb?6X!|V7f^Q_RT&-` zbotox#G0>wRc>f#$ffKtM_c8UadZ{HJE_^&q_>O^Ss@MzD0T!QBWcQH|10@)b8^+q za`%wP1pb}2GNHp2R|5_RFCT{P4xbK^y+VCbkaG`LKJ>HT3fxz^ljd4RBkXk<>PpOH z14_L_sG}g^{oj!f4*#EHle-r6`8U(AcHhZIpa!b0V?_t-`B~b42DmIn1@#;V231Fb zz>CU&tQ7MPi~K}kDveNKhA`dq_h+#hP;V+T$gVZ<_Nc}Ja4*_(4@65BpX*a3&?e>P z0!9(kph%3jvJ0iA(`xz2Heg@gy%{~b(N~H6fS={Z%uiiup1(t@Q(^sCUvUUy z8xn|p_3CeB)kUn?mi75Xp)^mb`71(f3z#tpe!!#i$xKq8B^28hi6%V&9_J&WCSr7A z7BpoEMK`$fRwPzDbz*3)p%h9}icABP-LIQ)Ikz3rCet_$6w*WtcjQQN|A=SxF(~ag z@Lumb23Eq!qDxFik&{|8^7Sh`S@*ge5BBZD^7lD_q}UC$9DTadzoz&4$1w-qZq)gG z4{JLITz>0bw352P7bZ~N(>HRbG4*)Kb|5nPhj6|Nv*;OfZ_yMqiCO)&mv1t-X!-BT z-Nqree!EAO4}Sh>p{LGN0<#`bdKfab4c&H8U?5C~>WBR~T>K-e$v=xYW- zU;H|6tj8=MbMfJJkddCFNhOvhtDa=QTZlV?EMsuWBb7M#VI$KRRFi{4W2^KImp?L6 zjxJM61#f)W?{hA>uTn#pqX;gU(%EAeK7p@plA`K`ZSp@n6Oodqk_$ghHFAx!v!t+y zsJi6FXNzf$92we~S^PT%JGJ!N!=L=Q8u^p44Y+ba&o8WjMfB7fA5=ZybL} z>KN!)L+@0nGo_QiyLRN_L|;{T7nQAr1rj{FH?oIN7#}&(vkVaZ)0T0>6r^FB1U9S^ zZP#qgv7+)NHHSm(g3>)1xeff3TbTkrSbVKTAxd;>|m^lF=D@GK64_g|q z?&Tv1dZ_>CY|J#}>9^dC{t+uAUSZ+r$o*RS7^+!KCxS>N7+O5;h5Ia*u&_GgSOyg` ze7d^IqpT)asH^5j{cPTe{hfqF>1Sn~YUnwMB-b@WjmZXUV*>qJe`hzGCqD1T?K=)6 z%Mwz|zGrvi*SwQ&#yK8B<9=+DkZ)c$8vCm=&|w0;^)OE!>f2&Ao0 zcK$;vlHXwJP-gWr@{st|KkYF#RdYYM6QJHbff4vp#oo`G6$2o04UK=3i4up%5kcli zYhhO-C?VwqVIl=)($NmQt&b3S6VVMT^`|hE*}Zw&C$p1ttZg+koHq^r_O$e91hHaw zXPPVAq#>B6xzvjl0|HT%0&^~7je};+%6$*3<`aO(;h-Seqctft5aYs*Mk$#{2N61c zC@QyB`V^vL`(hd9m|TMVxCzElnz~I#!|DpBRqfj)r;{Z|2<)`%*=WUT-~T!e&ACj%G~e>@6~|{2xxGMy`oqWKV9~zHQUrA zP8G1qz5)ZiBbzd|W7=D~J&GUAbfUhR%v*YGYq5<9S--{WI$51d zp@QSZNEjszb`Nw7%*@ryG*s7{PBORgMefPdjvWavS<7wPO9M@6J;*pl=EIJ;8^^6cusXs2bmdPzIPx{8-Yomfaf&ojAIzF8z zdM|8olt3Z&!~IA=*LWXE-|5@(eeM5+yBB(3`o7)7bHHi8*VCObZ-%0>c5ytr#+cbg z5ig<08v4BK)|!=4HZ~e6FpAdrUKbV&0n)-iGD!6~18 z4KIsR6^g82omKZ)&>-FT`hugT*@db;<{fJ#Iq!W>vchQr#C(y$AQf`~_Ch$fJl{$Q z3+fzV-*hELtPZCG{!pyocaR7j99>Wl2Y}QCx5^3pEqGv(STT@f4OE3Z(EMYcFg!!C zBL_3|q3`AnvL8lgd7oS?ll?9y*G@d#1eb)e4==KeE!7^o6w>_@xj51M60d}-V&BF~ zX?9WS%po7rb6rE$M07u`$oShX2KVoWlhc{6u;&g@tEzqgq0qUKp3ju3OIy5P$IDo- zSjPV~Grs0gv%Q9c}|>+c~k#TFX9i{_MudIU7`7wPZRF13*|VSVRVh)*j9%#XBu1c4fdDjb>hP` z1s_CJLAVdjyiKp!thD`Lai5kn5+E? z+~o(@4ch(s$9!tW_~13Y-?+C|?%s{^8Jh$^ZXo`|YC|5n6RZVQgg7Fg!$0e&W27mE zYXeK1|5;2S!_h%~j}=uU1W5m?M!Z7npBjQ1mAdNyt^bqkvaEGh1(>}Op-Ms2TjhKD zha3;0J|}}tY_qdOqA}0<3$XAt{j56ZZ!mj2u%E|_HA2f+eAI~l)5PPv+uvW?p|vU9 zl-_pgVgEM89}G)|&s1fC-|^2=t{EKO$r&Z8SWokMyr?D`)3!hJ6fm|BzquDwe1uza zHawa}1S7OgS@yx9+$#r-^z{6-^F_7@hY~NF*a9*M^e|0(uRm0Aqz)(e0E-1BJ zLzvmn#^TQloaZW!B4 z#Z2c}efKAmzjntr{*3ee-gCULWg!1_j3J0$93zAa_)bVVXX#j!jCwi~YTD9!e1WiN z!oi6J^BihFb;P)aX||{AM&p#={D}wlXT-T{DPZFHB!R6$pP5sZ&rWtf3$P5iFKNKc5JF zh|$rRgSp~*U;x<*IFwr5GzjnvSUX5D1gBd3i{@Kh&%?Y(~+1%Rt+zwh?mZ*C~%3g<{lGS33#g- zxz|Zn=_I2dzE;5cbPEqKr4P?~WLJ{NpkJo-1Z_ zSC~;$hzT!-wY1n=D`5=%(WP-WU*}%NJdwxrLs8nQvV@FKv9)$6t8B4D&8xgH%-ZX_ zx@=R_DG;jrp|?HqouPyF(Xw2#dyCh#T}$O~iZ$SgP=979F2kvc9RkEZL(@;3WXEeL zEJve*&IKs{pXl-~!PqBe{7m24xb`DFZ1@q!s1m(vuo}~vY0qjD6}JrRTf6q_=>=Ql zYg|oG2^7fz&`@HbO3PTxj8+r3CQNDJ_Wm^Gkga)Sy2*X4L60_Y2yOlOXA9KjpFOws zr85N@5pn~R6JOxib`4Sgjk-IIt9>^#Xnjr3#PX5~oUHXjTb{l|-yVhoV=; z#2gECwlo;m#3OH2aO0;-s4~ViufG1u$u*3S1w0uc%jk;xoYj$6iW7L=Yh~kvmYssY z=yos-Fbm&k$qZU-@!9vH#8q%zSJ);znqLr@lwBC{h;%tPA5<&oG`_gae{)y4oHrIh z#So0>_ax_aeE*r(c;=p&xZq&P_4;%D4A*{tU9ZRQZYOh7Cxsy-xc+Oql~BH!Bx=R< zlJ^FuanC)({7+a^Tw>w*?YKMi1={P&f_r~3b>+1S4v6~C#~7RO1C1Dy*K!YX`6ay&hX>kXYympeLc08N!H$aHy4dY>C4RQ4T+4Y}+CJmjM;# z*JqwUA|-&P46CDwIr-$~U{Vv3Z*|_w=Vpdb=&LlCNMx6g0+3Nq5EbXhoIZ^_%ONP@ zUP62_Ma(9svd|Z(9leC(_rgGz6&C(<#>~}r9!Rs`PYl-h!w&YEU_{bqVfgi1JR~>8e+LL7T5hH zLj@@nk$z*T93;#rL8>`u(&#;`5lVwNam~Z*9BP_t@uuJSX8)v5TEDRCQzvzbbfug; z0|zeE=OpASH8lpp!sE;DB6(jq7FBE8oE#8I)D_HF?6tXk2U(R;=}OVMYIob0k6=N2 zB;UkWI#zcwTj|EV7gRas4w{of;9pMtfT1WE535XUdAJC7Gy=VWmb{G_j2hVFd?~E@`D@G)zXPb^aJmP|OZulJ_1SCezqIRA zm!tE+*wke4IXuKdps0|!D;xvsdtKL1kkrJ{wHugYbwlSp7H0%x^Ji^=(e6Uga<0-Y zjBQx&hnwV9>Epcn?Efz9uL#oOy3VL3BU!brc12LlD9E%o;yDnDTB_SpGXB3%CU^BQ`^KB1$X9*Yp7TT?! z3-9luuUn7HodiGwnc(T|J@Kh*o=~Ns%-iG8|7vYp_gQVnBizDq%!n)3)!&JF!64gE zzfeb$_)7TVG;f~R%G6-HMmnM4RKT*R=uMPL7^HjfrmD?Nf89I`vwskt9@q)_AcYn&j z;C^K9u@+@hZx5k3)xWn8h{2xO7-38HX`a1&n?PdHGE{LtLo{IT zw}Bv7cmMuOr3AGsD1IR3#t1*+L` zvZ{ve{se*JLA(zA;k_K6&ku}oyRE#mDWAX@Sd$|znXQx%s?HLs0(HiZvt4H|SM>c< zc?8E`NG)Q}K@>jmU6}n)>`9m)h(4I|b`ZhRQK*{L1Hk#3Y!OyV|*@^7O;=dPBtoL5P7NdJ1}uvGjy@y9;N(iUPaeX zVW#!Dsbcg;tgJFB6L+?$n7VOVp)i3!LIXBh%P!|LXRdXPi%br69Y!P*c74#j4!)mO zS(z6?6=mO&JzLDHMpaNz5%wrB)hbhM>n(3xO|DyJlzLQNvTh$I4#9H5h#WSZN$CM5 zEHjU>aj+}RPE>9mBU!Dcwt}~hSTQwl_hx>sbQ_<75CO3Eq(_b`FsE*T**F5P((6L5 zTxo3l+&llX-Ei7uD9ykF!8@B)@uQRs~lxoB0;cy?hw8#yEe!yqfaU11t~RdoVg9$pLo)=;`Oc{n0J*z z>1C?tdxXxP=Ekw2nD3ogbU}h&y0bJ-DnJIN$N!Q)zUjkJn~xtp1On039`1Bqz&s>f zBvzL|CamHw14?V0-$5oM2!+r(!V`N23sKNmVKbaUrv%>)JDz@l=xF{N48>b})sK$1 zgVF-d!|TFLW0m%+%YUn%Le_4)H~bYa^m4 zLHO-3XW!Hq)zT+D@akvgE(VMx5{88#q%;lU6eVy)8`(6qHBs+J8axwbIxNLO!UC+AOj>Mk{uZ%Q>MnL~Y}v1{^n{>;0Tj%m@$1Dlf2&$^GQ!(KST=M26wV1;3*^|L4%v zevUck6>;7Gq6aYCxqV+AluM+LC)p?~e@9e?7=7p0l8YT=6a-Mj3Nx;kK&yhO_b+8$ zL45o~F^(Oskl+=Xw5yu0alfC57T#H4UBSY|#ih(UjxG&R@`SNLFf|uWQcbUx%#BQ6 z=seXwwR+3DKfdYN{rK$tpR%)pRgFzcrCw*9+3{IUvfaOHT$)k2ZW+Iy8>ySv%X(`v zT-tQ}eh)654N{#ojnIE%n%Hh7anD&d*}Grt*2%}0{(PO&Nh!`cBB~%ZqOhxRY4-Jo z+iw^4G3v(OTHxy+lILg{bA8lV$@aw9TV5%-Qi$VQJ`Qhm63K_|6Q3T*mpyp!AgC~t zESfqjSzY64a-$UtYtv7(jxka(7|#xLw4M9B=eO(SXOpus>z_o!3NIkmNT1iEdl!}! zTL%X^JbXvn<(#p*<(k!$Ro+3H6p?a3y38u-?^A1wPQhHi?dShAWfht?BVZ5wQLU!q zaU1|RR4~}oBCZB(jV_z(!V8#}x46*^Z-#{WUqk|_n+_W7`&XqAktO-YBeBSE-GB0t z2gXT=i`CAIJ+@s$4bckE;GZ8lzVh`rV0;w}BP@t7@ED(|9yOH@!Gijd?ZU~m+_%~m@O!mGTX#QiuM9QP-ZKBF*vMxZ{ue%Hs2S-*)`M5(N@ax|ugG2=3?!1X7}nn8khfD4Hri%Dt+$-B-k z3efu=Va|)Lu24e{fV4HKOT8mg{i{p9WOCazU>$2FsfFkdiZ7RImUzo+r#`}X<=t_m z2I9K+@82hhY#@JH=%^bxxwsC8Gtuh3`dym%^?Q9->7+J#$f?1I?b3N)2&=SZ-y9F> zqDZXKI5LHh5-on+?%g*%T-;cif0=h*UrNCqM@JPiNptRsNG#Us z&+L9a;Chiu`_mcZ7#sQgiudSYlD^e!Pds06TMa2Di0s&*un_yt4AF-c7JgGq zh^&{Pr(VClt)nBz&usGESojdq)dhSSY3b=U5_Q7Em30F$FST_J zE8RSkoYL@Om~E@$bT^~V)LPVxC679x?;v4qBrVZs-z-~YRn_6cNy6GiUFx~R&z!6J zC%1f`81u|8eCB86Z@qTn<+0=9U*>9FyP;}(`_0Mn{{31RK76@{ySN{}NzBg9j=VDX zYiao=XX;52B)C>6DBMg=sed)fxpkb`2Q$Qk$iZAo%4u7uqA{Jw45hIFP;*Eza2@hV zf0x`;BON`GF;Ad0wGN5v1dRe(+6z!;(=#yGIyp(5+M3YRjs)pehcefP0jDs}Nu7To zhSlDu1kV;@h^SWQ;G3+oEe0Ojg_GHL&+gr-xn_f-ZJ8+FX727^KE678d~|ZM@zAqh z?4AcS<>h2$!^6TZbap0lrUv#;o_5}+{0R9O zL5W21Wu0}(U6ekn$rK;Q#O}Nl_w(SzEoYMK{H+M5mBbBQ`3Zr%_hTn^bBg;tp}>F+ zBn|M2-p9R_FSRP5Ez>lI+!^`~0+kWlA-TetdJ_y5O}_oR=%G=SQIgY9;XZ31%wn=m z(8&8~P%gNc*3u&~g6bb}qno-1;{nNd?7=k(CIcc=pNlC^)8cF3_Nmz-BqW6G{EOCB zCeYBo%z9QZMBL*9Ho5v38iSW^;%Bu$)r3eJ*M_scXb4U{h;7^2+SX8zf`ZTE%bMuS z!6GDaFx`J$rws+VnC+51m;PZq9R zdGJ7MUQe8@onG^9<$OXpggWll!p`%{J~H(6Zk!tgEBHUiLPm8I?$l58O+u~WU!*~yj7 zeTiqQBjl)&Mh1@_ail_dkyO^1)y0w=;{o+{BW!fv|$^B`N!Z;w{G!O)_F z@311UbD_z|#~)H-VIj@W*skO0(mYG6q%kq`OZu&P=}|idO1-1%>DMKhuILNKzBs*L zT*j)m2~_9Xm)z#@)M4UsftPyVr35+%7Qr4aAvLG;z%=p=GqL2q+)uW*R z)i<#CPw0I0@IP4=Sm30xfrt_pInoj&uDV>CioxM%cz^%cFh@Uj{v=fH)K-R~7f!M` zdtV;EjO!yKCnr?$YhgMvZ&t^Bm+=Rw+rYWS=mGCAwnUJveBpgVpVn9qxQlYv(O`{VWy? z;M0w1@E$9tPUbm#s?6MKxz|xEixE*_Vc~pl9hTY&e-*@X)iT?rGWH#+1S0JvS}{_8 zmwH8yPfRobCe^cFc@CSqR=>1y{7L6KihP1l5xb~$o&Quyo4Wkt^x^36>-)7bO-fVt z1x#OXr&A;Q3<=hgsB8nV%R`#d`u3Dt_Wai&#+@st5&8&IrXwk+mS)fMmFylME+%k%Q( zM{fNC^J-EY2mQnEqjLb+*>PJK?SR#T&0E=T8Dy9CT8jLbT3W`>jL%<^h=F88PWoVB z?L=5}H{eWxZcX+0@h!Mvy98o)Z*mkkkh1F|F#^Ez4w`THxN%$_DD@6yi*bR^3H=MP zrpZZ>8~BrOXFWlsgxyty%F1*M?eSGSUjz(E!0#p&7B>QEXxHG5vfR%{xhaqF{k|*6 zw0L#)7Zb(nH*XMS63Kn;$r^HT+%LYjAde!o0%SF?Y0W$wb4 zq?#{^(Fv{Y*>3G;UOzLJOuXU36@n-r8MeUY8@CI}KH3*sK7^S6@9+C6S|I7SPj>b9 z6MXjoaj@e*d$uUa$XtWB!WO;Y%rO~0Rnk;3<5{A_d;3}Rog`Lh9h;|Vk}aLqQj$?u1` zJ>&j;v6T^6^YBdJ-+QAf%~TU9fq)Ua!2cb{7>-5wUliUU{gW6oqnOe)O%P^9oAmpS zYyF7bX`f$jBR6_`FP~k#{S8CRr#Yta`dLq~Ge&eV0ghedHGKW1c?USAN#inKX09Aj zdRMM;_)x#hYJ4KskNo4yn@1C!ZPnM*OztTRpt#n1hv&=(hr;?V)-VTyKAbdsGQ7i~ zfiN2|%M6sHs+p^v6xqA~>$4^K$%Lwt{5>)D&mDGNie$ z+5Z?%u30z%T)@!Rh-)e;j>WLWd3y!1d5Xp#{iT3lH2|%;c(f9%a8DBx1)}++Mi&XC zYrZYUClITl8$v?2oLpV;&Hi{=1E~<_mQ+=lo1b|%mE($7T=XogfAWGLEb(NzaY`J> zGX3@K%05n-r?l5n9{2>O(Y>Hz<4Am7FC$QF`3pfz_Xc-zKqY~bsX{?1$;QPVa{}lC zYO@a{$9?X+Zo~QaS5nOjXbB#r<*8zn0Zl5Xx$l-XBjpx?3Le;k2bQt~7^-v9uU)K%BW)99xj6uxGN@?KUCf-<*h5;vtTGpUze$YYk zHcM(!VAe-|ETwp~5*48yBds+4XtlMqfkmJ{5jYDTV+@_7_m8r~h2FY#77tv>ALT2q zPCNkt8V?>coW>%Tw!8)TK=nmFvs=lQ0^2np%^tiIPShs~-M{G5PrLOQm|9+s>9uyR z*}h?5ZYdb~p^T?bI|~JA{nb75i`SfATGi8k#bW!A0>6u9sC9BGrxet}^y01l=G zm?G_yZpcf)hiQw(Bf{!5{)#)4_UQW$9}-N?v)}=IF2iTh8TaPYtClyJa=*@MinEz! zaT_7$X7R9)M9avGNbk05jHtW*>tyMlH`3j_b&Knt0gn{@1R?=_jCF|SPFxIX;Gc?c za*#3cJpKeR=e>rwEo*%CnYRzAvkxY+WRTvFL`K(-SfCyO~y(5f}RA>!bZ5?N zykMdAPv^Hky=$oXBBs5ceU_Yw##^tZ3z~Zu$Wn%K@89(YW&2b!aszrjhN5PCo}$Ub zqz697SFe{B-c8PFNO9D^XpdBi(%x9p&v^fR!)wpLBRDK^D}C4;P7JWnYQKM$NT+uk zbu$`K>yTI(ybze{7uNH03CeCM{dZ@`?A;qla4sGQjNc(IuggAlQm^UjMZ{g|yKlP= z8z8XX=c*=Tadz^d4IIDj(RgwvMp{FUT8Vx;QRv9qrbxt~Z}NHR|i(jIc$Ef)P6*QnG&E+11(U-mq^FbhrVs zsV}wK2F;vhz7u1RI@f!N=mVnh%_3&8$2X#Q!%Uq$bi;?9zAJU( zv%dy8&qXUJ3E2z4W->rBP<@Mg0l@}tfm5!}l@)jN>+hd%g;~~#oj_j{XCh_|5%~$b z3oB+AcW9SC*Av4fU|W0>(*SmCFld5)U-Z9MXm;nSI7=92EDdg)!u2496Oiehz8Z}5 zh~5m1HtW;Xm8DSau`e=*74a)zK0t;j@zSd3<9;Hpn&cmYo}RW=rV9vrhLUcthN3cz z8X!j2F)=ft#(-4i>Ei4CK=l~Bq6vuf|Wujhx9sAzl5 zq6=nCv=jY1=mSWR)aCV-7@)yrg)&G*q^kMe+6wFFzfboT)>BY;?EAbrI`(}&bX?w) zd18K>>QQfv*2%eQjBVt%Jj^!BOKZD#nX>r5;f&q^Dhw`3&I@_qfoDxBT_Pnc?eP*! z?SwV!jF9<5UJhrPF;^?L;hCYZaH(j}%s8_5iXa00s)p%}_hXufdR2@Jq@kibdFqtO z;9ZwNGF+aLxteU-#mex{xJs`71_Ju{^XHF9m7Ks1)SmVwxAGWR@3oyV2Fjtxd%|(P zJ?U8>=(@(g-0mu)7dbZTh!^=j-AyX*#rLT%S7&{fj~_bl_FW@v9MecAXCkuDh}c-y z-HM8JpZ0#k8$CTuJMWb%cYhx<{D!0>Q||)7`W>pn8LC}z^3hFbd-I|XONzHTk zaPMVqnsov1jKw|f6+RPq>n4>OYIRfExTm{Q@1Vt>1E#s9apRT%FaL1Y`Sf`53fkVo zTdr|q5JJrHgEx+xI~=$2hgk3ctBP;+H9|B7rf+b4=L&1T+yc!$T?G%se2KGgOL7ML zHP*lL(yH5tc`E5t1!G-!=@vL^`eOnrj!?DS4dy$Mv%x0J|Y*41bSJj3x32P-tbp>L?%=ZMU zJm{3bts=x@FQx-Lrr(O6nnmYe34x~MiC7zzg;Vd79qAUi zJK(3wUduzvL__iBk^Zr#3{xKa&bzta=|L=&ddX!L&20vo#D2_r`T$HPWW64f@Qp$0 z@7y@`im$J!oGJ5N_4(g*qIY=Jq41EcuLvOkvIq_o6;IQ8Sn6v-+r>6K^4{JtoE2U< z+gtZhx|{RIC9p(V=KrRmIQBkkygi86cjeh!qX80tL7p6Ji9EfZ=qAgZe`a6qhg=0h z^S{qFFolYWXYJaxQrfzvhh>^rdc z*!Gt%-`BW};jM#>DYbPEhPA4fFVFe^EC+-GPp#Cbm166SoBsY@pG&0}=a*~Ne;HDY zHWT?jJ)n?C%H9iaAD&y@Sg`Zf(}ZzLQ8BT$zW3`>w^#dcL~l{KJH^^Gi?{?TG9eq^ z#lT9$gn)x7q&osveSvU3^q8lOu3X`g-1>1pAO77ZT+WPHonv<2cKjI+K5nLzhhJf3 ziRy>x1}FHiBAfa*XM20muU1LlXFVZ@{dcW!(hD-tAc*++AFYU*Ca_AAy(f=5LM)K6dF{0JMovKans|Jl%!$di(LV*Zh2|0o2!a zuYnB!i(6*ovPQ*!uz10tEVew zW#zY#aVk7K=znK?yZ{dYPPSxpsj}~9pw200z$)KY51R=xQE+#5iI&+ld0p9eS2iYO zVKV!H)9s*#6gr>1xXs=b%Y$UUs&mWWS<1L7mf+AN+;XSYl#LGoMS)bVrC;JjojiwQ zby`1ty4@PzLAq%Z+85AGaQ^lLeZ!*j&GuJ~cly-Cf=v_5B(tJ;?q+;9j&rbHNVVfB+NTt(rkQxJvPb;$QEFUpg{6T6%1+ zmU^KUj1~DErVRsbcmc?c5&a+5$h%|Yn#d9nI0ZW|ufKUQ(BFA1d`+6Z)#4SLcwp85 zVw;nkCZhlxyB@FD>sADCk_^Z4bGBYzD6r3(;J~lI= zd=&F7x%6QH3UV>%g@5~m<*W!JtFfi=^9cN}9@TeO%kNi}yiaI|ad>5>spJ#EN=LnR z`+CZi?fO}dtP2Aqq@=FBX}))qyRLN^jL47mN*+jnRFLZW&3&C~cUcwCf`(n1!n~ zGfk)h)G$B8F-;Xvn{UDOt`Xb^7mWYNopky%689PzlkopSV)b$2Ps0As@xR4b!U&(h zSo{e?P&tN)D5Q-6S3*yqA1zf(p1+w-Z-~s^rp#&@XQ?M`hW?hV77wlg6^+Th4%!&s z!&8bVwEi8(XoH4u8PuY?psd)tPiJH7o2cl>=M(lL`?Pm&ZkT^T7*SitrxWpy!xop+ zx(8z!n^Wh@b8{sIzSqOQ?cFxl%tpD!ax3*=DaQIc6fUKO&uo0|3pKHuYQqFpqrg|U_TzhTHI^vtO^}e6M-tor7@|B^|4P2BnBT73nV!SH52}Jf+Vv!3kb%p;4nNZTz?_Ldjg zQl>MG9g*6Ts9%=DwJ*?GijA&;H5faN0hgQO*J%b4v@`v*GY1suk73#X{hki$A1RLg zb=(DkM`zBS+H42;GH^QrTeog)GRaEC%7E1Kc3FzY3M@$0L_Nv`gBjKLy~sHHq~c&V zvG3*RDCfJ&u4LG_M@~-6%&b<1o`5(k@+eq&wcsej zPbNO60WpzXy%^_EC(=uqqT-QZqvykSZ&7HshT;-K;?Pd|faRq*L^j?ihg|_p0=A7T zmD*XRHmI!h!b4MEzHG$5YpWx+B5Z8K?{mA^G`H=?n(@=&us?KJ{;JH|_NtFYo{y)dg#f6MdC# z344eAP~L!X_SxK#(oi~Pa+KuqhJ;SPH2)ZyU*ARAc=q~@fOyn5TNNOu) z6BytQwvkcXS@-EGJ^tp#nu7h@+}sF?PiWnPHt&HjBmOI^KHtlq2b$^^-Za1Y+Q1jv zKf)c?bn>+Ll_wqvswdUZ#3i?k?|bFOLvcMRc|)0^_pvYAhqWfj%?9y7){E_PL|tX! zXj?IYxh3NGL?r}QF38_`U_p=bo{eL;M<>^BwrL?FfeL)`1ly&{odN=bsk{H>GVx!ilxttyveK zCPNXU_3YJOi>H`!rEY$7Ig{X-AJc0sQfRYuo2S7aQLg3h{FL&CROvvy<$u> zPQu(sHS@~Ws?ckkAIv|Jof#QgoP%epV9d|LElU#b7}h8rS5+;||Ou8#7UD^mns z=@T*@IjDx+teB>6jxP1DDl`23waL0M_SdI(kF5?I?v~r1)lOGvXYz{OrSi_%9WGt4 z#uH|ydY74n#UM%2+!Zs9PmN?{Bj;_`q$9$i$l4I)KPiiGYT^gFz{K};g1~=7Tq?Qb zDyXs!U6>R~50tIeA?k%0So{9#V%1)qsvD58xBsYgEzSuRh{OYuaXuMs;*@@>dj)>F zD#B8Rxdk)KBVop;`P2)cq`-vU-b-!+hEzDwNh6!O^80=k<|ETrUtJm)IVXo z?0#qItc?k6wVu^IOlBO-{9Xyxbd6uxgBa+~TlVLg@o(S0X>4lqFsf2{BvICNE#rdL zQ{UY*leuMCe8BP9OvwEquIyc0%i=B6&Fv{b-|NFu&e~<#gd_a9_2Dwjz7eF4-h5)#64o7qAr*P z{l!A`1$gyvAwPdzdGc&zG=058imh`ss&~tRF<*YjcB`R}(Hp%D-_`Ast2L-D@If8K z={sXPDZM#L+w0imYHt4dFMD<3rE@4_MS`?M+8&n_1Y|$>aYTgWEOXcNt5ZAWkD_nN z?VmiBZu|ukZiCU=u+`y@D3!BL5d02l`Cjk-tE>x>&S&yM68* zn^gfdJNv1py8M-Wg@-B?-z_VdZ+SFCM$1(AC6iSyad#Ep3yK$u4wEwPINmY7v1Nmn z;Jei6kl^69jy~)pAAoJ-R41mjxU^(qQhP<56$oaW7`ChOtJ12gb0BJhgmb4GyYRk_d-LWEA!CqA&Fsa(Vf#m#_~?Dm3~!eV zGsg_U$ZL=_;h|NUT)!9V`RZAY{7WHVtC8@@Lx&Lm{OVI>An$++&6ct<8(aVC!$BkO zE}wkyqaN1=fR%gF9ig%h#1=mLcl9ol>8;3W`bJ7UVOvsMDtP;DLk!=5q-H=Z1teYg-R#mcDRw+@ zf&%Iu;80TL_DCj5X032{BNYic(ezWfv(cEk$#5Fniuz_Cob-lRGr-BY$V*od-qfTQ z85!A1FI~3*7w^9r=#K3PdkuX5+qS_n{vQ_re}#k=j39<%OpkQ&T4FFr9Ux$r_XCa- zEGtNgFmCh=Jdn6}(V$v~Xy3Swo)tS#7euD zy0B?u!FNEjyu1w86(>?$Ft5YUR>$}T?#-KDd{I?#9FK}JN~`gmF4?nCh~W|(8Yk65 z*a=4yVbP*llPTCoue)Jx0X6sqUOG<3OZQ5KdW~`xukXXaluFEqht*6vfAL;h!t7&X z@!_ZE%B!l@2WZq=ht!6HxtEDmPP(IMfjX3TKyW1HF%@nMp8h}1IG4_R{QY}3v^}|$u`W1VL`7I+chAU_1=ZVN ztb$<)jv|j!0`)S8wccHR{kkxasu(#z!+thp?^}T7!`ZjCwzgh7a=x0KI0!MIN2qyM zIx}C}ncW0DkL;OEWzjto+87343Y%t;pPR8q4RRWw`~$n4f;$`zcqo4@!!&sid>yj% z#6J(bzvYqSw?+tjJAYozY1gg?1qw3qflW;kot;DZ5QYuK>hR$PA-=_;r@!>|`;`vn zBJs^3P?-pwMZl}9*L%WLUOaz(jzJ{~QB$pgMQj%G+K}ZOFvCc;u8P2K1 zBCmCCZd~X$O0n)H!8%~(XKB50imUwLzLfEeVjC8`)X2AV<2=bH7_0jtX6Ql$e zevg_!9kTcdy2+fPA_A7gM|k*ns`a@uXP8D>%1R#J?NE%mG}0o(X|URraJuEL)`0`f zPq*}A+lswlLe1rD@om!nS>anc+MpR;?YZzXbMixn+`U!CPL>S17s9`myqMEfJ(4V? zzWp_?F-^bL_w!o+MfcrN}h5l@xdG ze~z_I9mTgL&jJ`+pydn0@)H#X3`uViIaIceX(AH~bZq!t$z6cGZF+gRoQPzNuBR<$ za7X;-CiNx_pKuXesn1WD2l2&-9W%$!I;Z_M69c@fu-TwIfupFf-X;;TW$;qKWbzOm zD{^_GVlx(J!;xkhS$pC{7RwIgnGO)L7&djdkzuaeI&L2h_YqmGkWC{ux83Y4h*4^X z4sAlL(wg#~jfwhN?3sEe%X`{-dZH-yFKMo*QYHePo|31!ju5+LJ zy05%H@6YS?d_LyN$5RDFBu)k*TFWBG9*G1v_Q{!Mq$QA@eeb~bfdg|XpH#+Yy;q*4 zWydA@KjFWP*X`?Yh;7xEuAM8+6|bI0Pnc4iJn6!`Z=WwY)c$wt3{3p*))C};Fs$+O z;pR-l4#SR$ z;-U66d#Xy2Gz!S^aol6LoM17p6;fH$jJxxk0$DQr z=GqTCad30mJ5?+%ulf0F4%^`gXr#BIqA%t9Su{|-L@DQ83?Te__SolU4b)F1l$7)) zT5^vjrH`xq;`W+#dgw64#FLrheEoGx-}2Yl#bslO=<^>hO4cV_YYY*2Zt&TCd5*{| z7T%94N55fNLqR~xQ=6_MGYcx{bE-WU?Ugm#r~BW%Qve0)ILk~=_hZ0CQCd;4uF2bO z2AGe!m~m{x@ck*K0Z1SrXdhC%Iq_h4pyRp#t;$DlxqHG7#}B9)Tr(041e~EGIHbsm z&{%uqdZ46!6Viar^k0pdR>Pi07OjEe9;@T-j`Mi7B_(@sE<$9SiozHmaL*BvOD^tv z+jaeL_mUNE6+0$e2so*R-}?yO_2C1se^zJb?5?wBm3rx%oILjOUZ;y%Z2l9IrF)1V zfjiSLzQGh=u>3I=*)pk_;k?0re65`IIpP&LsDY zR=-RN?F357&mlkOd%YP9OhEU3z*p|l7-AoJ$+Ylf+v^|-xT3T!mx zxGLUM{o&Po6&iW1poUL?mR8de-QxgtvF%Rivk91-GDSsY5d*Cdsx?TW>kxTlF3}|1 z7>8H$$nvkbxfE=6_{uK4%}@@6lm&Gqk2hZELw^9#thh9bKl@Cc8tQ#bE0N7nO;QSo z*c}%ovCEioUgD0I34wgDp@G?P0(aESTVd4`vjtBDPar|^0rub&M@$}VTJ6-)c>5F+ z@9n0x^Hu(oUs|U48$14UMgb>)YWziQEt^H}-az9gLC-C8h5D2gsqOD%yjj5NDLL@a z>>q?2`S3a$nQ0(}d?kBZL5#+kLYh zl2V-IE8guH3ACCuIEAn?^jKT42r!LK4Gy0a+sKi_f74gum!7JIw`OpSHS~gXbaYUH zhMqWIUZT{jtuj`=Fc$=!VPod;KD5hO4|PbwRw7-0A_TQvLp120+X zQCx9nt&H{nvDM6|o(atTZ&njT_OZ8B?zHX~o`f0ao6Z&L2(EmxsDIFY7B#&cg8n2T zVhH5F_SZO|{gdbqgZ5q5z$gS&;8_2u@!#Gz$a>Bwly>X(Em-*qcO8EC_%VfUbf|gk zk1GJh>C}^uP{-+e#b0b6w&$hc6!W~1+IUfkgQ@MFHq(P)VM4UFQ2{>rf&u}LcSf-U z7l>Bl_`ZAZUWb@kl{TsiM zuSBZc$XIgm;%;!Ri4O&&4jno)4GL`#yfHC35!=|H%`e6i8L4*$_)H>$A%{%m>?nOg z;Mu|J=o(6js$9XTGdlS(mS0jbdiT_MNTJ$4COwih>kTQ+6$nY8s}Ycrb;|49a&rne zhCojNT)Iz^C$4nvSz!y|q-R8t0EEq>>2Jb$k=~G+(5QR&9>Bu%;_$K0F7Mix+Yh@aa_8ovdfcsv zNFX+|l-ztPOmBZi7qpk*QFC%!ErD7!jOB_x{kKV-6@)j(cP?Y#R|4(ADYlK_k?ew&i z)#b%g!mM-zb;5~d6s5of9W`6%Da}nG*REaT*t#`9HRXPGO(=Man+!}v_mn8F6co(d z)Z{@A-_C*UOrKS|Y_zqTAAGL>ND?sh7vD9>@uXN`q59XWjEnEbYTtd9&PRVpEuMbn ze1;Or+cvxbhp5s{=3L=K!e>Kk>`weGt z(F=P~F77SYOmYHs>vi||9yp+!Ai<9Bg_&6xzb-_JmvqQi^zMFsO?=`K{nLXvE()(b zXabn4wm|QR6;^;T02^%zdbx4^VaRvLE28D|AtqfS$RXUx5OsKkl_WyV4H)UXDy&FB zq$h?O;!`L3LPWW%V^f%z*Ami>)%c0zMr@Zva7tR023e9xl8fxqvaW_{=0k_xIa-dp zC`c>b+hgm>b9rGPAYVjMvYx1`NY5@(#T%}!y!ZsED($}Inh+LTe4nm66CB_$?O;QUJ^R{ zTn?fxN#8MT+C;l3tu)Z==)cq7w4wU9lkG@68YhHxKh5@bd^ zo6R*A-3+9IVB^FH_YQygLS3q1VB(^^E%SXxz6m`K^scr4;sSvXx$f6RlUfcTI zIkt*@`)DZt!kKLo-RjjwS! z(YCFJ;2t6p@b?m2aB-*AK`0-E(Ph5Wl%s{qCBP_)U2NnrDHG-r{BE!z+6N$~Wj7 z@pLh#L{q;6v3nHXUXtKXQbr(A1m?Dm7!6Jbh{fVd4LcwsSRXJv<{g*XT3ZJZK;?-) zMmrWN7X@-Qq#2YvbbUw%pbxv6E!3;i-W4;u78^G)221bS6-1;>u)~3c!qKfc_OOz-SXd0E57aGO=$)qxRv2}tzWsKn(`7sb@6vEO(BjE z*1Xp?sx1mwx9*+VT<)32%0R`foIJl`Wn!H8{zMSv%RtHp+qiDo%sQMKQoMK5d73m8pb>MQ=26Q}DAk1ipz`y?($bP^ zJ@-YIjvG-^Ps}%%7)d&ahtN=b_^^*-t4)65dNlOyzfxMN_#Ut>xr+F@dB6$lrhFj0oQ5)A#uJcstQ1M#wF&xCwPf zEi7(A?|&cd+UOf|zw%QQ95Jb+BgQlBzQok*Y&z2R2YkVEvFx%m71i(dUe~1JIsEIu z6jqH5|8h8+1$m&tK)b;#Dm;UD|9(B(lMoj3wStpSpW@$A1v4`rQ*?DD>^7#PP~g6u zoUGFGOUjs6;?@r57e_W<*UoyJ$v^0}hua|QKYHG5B;Rd@8~e{0mj|Cvpl2sD05nJE zYbl%r?j9Z~6&3q5?^yN|XuIrtDblg|1{}liI5CkKd>Jra_`3$s<%J7uj*ck5c+N>> zC0Q(EDT)^rq{ga?iq(y~y1H8XvUlu5m9ToXJXc!2fDG&@&uG3Ei5Yd`v(F?R1(M)!*shhPLJEdOAt&74OQeP%h&crDS3Gt$a*$8NhsZ`zX})X?BfqO>+Q~2VOsi4 zEwwL^tEiuycpUd${I1i~2TF5Qn*~YbMzo17pIS<$FPUEztyy^mwn%j*ndenCZSE@f zOk{_e=Unvp;8Tk?UJFlsS(Ckg_+=wY{oS0N+`SJCvUa<2)4Nz#KP$=!o{%z?m6wNE zCE<-clob%59f{ap`hpOTyLY#hc}G}tKzK(@=1MoaG3$eKZrI5lKmGXj?q=>p%ePw2 zApiqViSilp8l|3;a7RqcQ1D`xR|YZ%aAV_c1CaJWYcLe!H@UhLynYNv@Jh9z zIFy{J2&@n)XRoIQEIZn#QZ+nG>F9X-_U!?m!$LSaEe#D>l6-z>k|T3YnW6eVoN7cI z>-QbM6^M`6c`k^O@MIflB=d|-?xvQP-<*)5pkNqM#v9&wv8!vh{;B#+DRk0j6A)%#wwk{>6#(nZ>`LM8b>SW$I57XuC=wvd$ zZFe;88;R~&Nvzon`6>v!_ioMN=xg-{p82^%6 zkpdly!l(9FX>pO~{A{5lEJ)WODq?Z*^EIYvAUsi`%#9D=bkR9-r2UhCD$T$eFs6a3 zYtjrFL%WSZ7m*}Id_*`7>f`A&R6CAJanz8OV;H96=kuHKxN*l3ln2ibuZEqwfE(5y zOjmV{&w0R$5_Sr3T#iZJ;K9KGtz1K}Hs5zF_)N0O;9r|C^|c0=%FcVyB_p&Q6R;*-wn*$L8wTk&!Zb z>ph4N<^T3Y?yB}B!hWE&5(5)Smw%rjHIO|%I+Kl$v1WaAyKBvn*)_ht_O~knbPoIe zRhezVSA=ByLnBw;^gA}!+iNq_^=8N0fbRJmX2(wL=orzAnj4}w!v{jHB~s5rnnS9r z<7|(xIb@AICpVHJZX`Uq#rM*<#E`L1lv7A3N@ZCa;BpGbHIb462YlrrOe-C$19K8_ z@Bui*sEXiF8cyvGAqKB%YAAJ+ltLnf^xO7=KOjLePOtrFec+NX#R6((;g4v$!)|94d9r-;2$cpcW-l_$VpWiz7P;6GY|QqyMizo!^e}Eo2w2k zPLAvQ?ng9y>=8$i%~eay`|$fRe09N%b~pS$wC{kK$Gbu~&#&kChjYYi4W$XJAtBO8 z$bm+W{OO^v6q2ri%KGH}%CO=&T)c{krJvo(%#O=)qh^Jh*uFbPcUZOk!$r&AUDgvh z7`Q(3krlL}6cibqGtIN#oIb5ioEZX#Xw?~^iPX_A$sK3$zBa>MVETG7oGKYLLk|6) z-O}nKEs6Rb5I{hFf2H4wz&bB~dOc5+m@ddus}?QVy+!d7*w!3DnZ_!d|2DXFy3J1q zR9hqSzy==9sJVtOIPr)&xv)bphW{A8Qp=E`Y-dH9C7tF`zy>^FxY}s=_=hn3gPg)& zTWzp22=Clk4XO=GWP{h29el&%IO>S!?>-XCCiG2rYzi5awc0>Mf_=tmQ0EB;AdBL>n}o zPHYYh-`P3##I)k<=DS+oPlN#|Tba!LR)pn|K>z9`w}m?O*WR%u}6kJU&)p(Ur$oa5G)S zw~`2T5^ga8xFm-o9E`yT#w*yx^Yv^3S$iCVKPcDt#er1>-Dd4n;qH-kM_+qDD-gMz zloTepnTN0g_oPrzaMbxurWR#5=VOoQtlJ7@5Yua&epd2@v-r?Wk5+62s$48j5PW<%?ZVsv*6{{eH4uwm z!`5(~eBWNZIzZa!(r{{v;!G3^Qna0&nl-&6(QwWMylKI?8o1Ln}L3G8?%K$ zAor3lH(g*vM2vfh#c3y}S{PAKOk#Gz?**||XJ-#Ksss8M{|%0mj5p9%IXbqswvzG2 zhI%KJF#VtOm&oU;yz-UR+Gh?@1YugVp1=?W> zT!Q=U+^`}W1qUy0eaS4hMzm6cYBn?bI9$`|v4JAnh3apPe=*K|vF+RVc-@<68n7Pp z_~1!8g>6^1F*)LGq0y*>a~4&un+E5X_QY4?go=gltTxAna_y^#Pbbn0kkES{BQ&_% zgqr;{n##e|{^SioR`**on~jK0^~v9UPX}?0pu!iDS7!YL=RRUBgWQG^vXMydq;Geu}^Rg-n(EB`g_?g_ShrSur56&1^*R zh#OGEUIE$e0@}h_%$Bx9ctfZ1e^XjVg!=Z7V_V!@uUbIy2-no=i*)0LY5W0Qnt@6n z^Qepdj7I}(YFIJh$xNE0@0rG53Haw-QCCFlF314Uc5BONpP0iEQwNC(yOJWlICCCnQaU-92X8pkX`W?dQtP1vu?s>)vmipPmLD!Pf>O7pjb`n$04%LUM;8 z@Va_t4rR#;7X^6ZRcWkIYYgvtfNloCzjOqTcd(^^9wTwZ5Pp$ijD%Ezs_eVFDS}Yo zD2gMEqvPXef%xEiub&aIUM5!OIUWs+bfp4i4wK9p$oc_gjqHLw6I_F{i&Bb;H;8Np zMqZfN{2?jO&4}-ryPV7fs3o^`UqVvSffFkf-~K*cr8~gbW9mI>Tzf9#acGv2D4{Be zfNtBS5E+{b6RJjcqg$37cJ?AqL9eV#(F(TZ`@C|DzH>PzQt8xR#Kb=B9@|j&tj5OG zO^B*ZO^QR^ae`AJLHCiGbqj#gNGmob3X-x;Y(C`iA&4;;V!~H9R zMif$38wNNS;)x#Vefw?^V-loN6Z$l5=mdpPUTYVNDh)mP3O!FV={C0tR0# z-!FdQq6e6l=;9?(#xeEvfi#2Wm%yiFgJ)ik3r$ zCPF<0c8b_E??4`gYrjB4Fw*(6A{z$g6n%<}=EPk>HQ0c@173dkDcG6=p`21<^L&%Q zYmjy#6?-!`FRMLsV0LNXg5jleyKrd}=oTrg$&w!sg+Rd1-N zuM|1-OPxBB{L5x_M)&nKm;xeJ`8jDafLN-#x|;7K*MGcnvaH&_wH1Wo`{X8V5Ac4( zi)C;^VbcY0jDMErE9*gm^rSHJ#3v=C?}-gyF5C|m5kmpAzm1U|`1PBkB}qI3noS=+ zoEHpun2+}cLm0-T4S-K9f~&JgdOFx>gp&;@-u2qT%X`?-aVNI_+ITw`JX3@pfKG!+ z$NHU_j@xZLod>C@k&J2*8{@*ByKCK`#}{qUPM%^v|5iqDYu&Mhg?i_?=}YweHE7j& z_F(+>!T7zRQheyVBxWK6E5oO;mjlC{z9|gJ*VTd<1?J=+ZcbA_OxH2yo@r&Z9qQ>aa&d6%$16ox#S`)WpU=ALcOU;E)Upq*Z{NE!w76RjLc|mojthG$o?9?L8b>&Q zRob}01K&>uMn-#|2`0BwMMXt-mG}d~y%6PuAqp2XVskLmXe+N|mzHt??GQp!1lF?W z!$q5E`C<`SK}ZPV(}mz50Pi@CHjpc*W_(m_d*nZzdSbAaygU<%tp(bf5yjkt(DnjQ zc-2?zSOA3m>m2a3>fYR%hzOgzQTL$hmg72j!cQeV!@=};9uZznjUYP zn1#PK)XGjm72joaJoBBFn=}rN7zVt&nrM&n0Oz%m?X!N_LCQUR0b)Vu0n!n?rkZla zsOf`Q2RMIHAN(+&;?^;Y;JHvQ0ERhb3ayD`3z;TYTrzvJ#A>6!> zJy%1#K$G0|jDP-hYireyFUI>JE+J*aoSlWcqZg$?3r4V zot>~}euf*m3bH4&8#i5!WEtJ}hI&@#P5Y9MbT6V2svJlS6aj7m2A#lsve0~DnPd)xa?A6briGey*OZSQ2s$C2-m9A-o2q?V`p&1dsZ~|x8YO+t9KYc2&S4rUYi1iGxIv9 zP+5isGIG{J<6vreY0-`TM(Dc<(J%8$?d`qmb3EdTu~cyE1m6 z3|1hx>2Y#lhz7Z~{Z4~GPu=B<^~zX8@Pkzp9&Y^LddF;dc*P?tFDHkdv@AP0S-OXI z4n9ydGBz_!?CtOD5BB#5Ai1NFu>B*iBXL*Pbr4UUvP%er=;QuXvbV6X zMX2OgO0WG}{XKNix&uTUb!m4f(h1YHo^)RTX0^`b~9( zpFLVOp2koAM>w;pM0rq%0K?)vIZBDwL#1#45LnSeIDk3AXw?PN3q)*0k@bf(4hXUo zSzi1AFUN%^$io4GN}F#h!wDv*X8a>CGX6tfnLV{|g4K~@_y2@PeLgj&dpq636Hh_( z2)3|h(dT0&Q3EtK>7LUzFO<5we>e;KVrI*(S#x35-+0|jTUL2k0fE}-rFAEj#$=oG z{^#OGM$((NZz&_kl5K@Pfqs3$b65M31S_4jogFJUR7~1YaIFd42)%)7?#Mo6fkd2> zijA>0xMq6zm~Trns9_7xsJkJs0SfVarYvWAEUN0~dHp!+? zaNXaQynD$BvW}toMXR-+M-|!JPQ9(VTTft8GvqhW7DsC0IF&al?kxocNJ7Z3xw=A*=(WEc!O02a)GWz&?O%l8Vb>V7|)Oo3{CKXd7T%% zVZkflEz2&zgezPf*hFf3&GErAa$Fx*>yAl-%j&DC(FAMZYQ)Tx@6;vCkvoxu;;DIj z`oRNLR(AFR@3w(~jaoeEA^-Ao+2E@*`)N*c73nw5s2y12XCD3g@3L!U+dS-XKeiN0 zeJO!zXFliHqss>}I#*OI>eo^L@rT!xhpG4^e=J{jlN`>$s5wmjH$v$KQoOGB2;k2g z*_c^jLbnmRIJ!WZU`(K@_rh0Qe|-FTwT$w$q8kjqy?l+bl^JB1MUYP;AbdTs5EY-@ zOmfyh=x%|*`S8VK>~=D=IZNw1J7wkOrCJ_K^A=#JB|Mj^ySC)c=7t=~?L!xQ^8ui+ zwkQwp#`$OgOQTEou328I{83rDK(`G&GZg!eTJybUP}8hoAWf05+(45`2Zm`#ajUMU zuQEf}O(Y1arrBgj^{N!hCp(n=`*mm(t z^{hgpXkrmenQ z+@t9f8XLAioJ}Ej#JO*o-|C3igx77>GsaN$&Q}*p-*rygX10ENoqpx}quY;~P8qKp zmpE1~0V-_ji$jylD+QMPn>v9E|{OLbrWNI7z?ytDC8~s`PrWUW`4L$(<&!&UX z77)&YFvG*J}%J&60~^B=Aa1jndxH4yhfy zoBL*4Na`>jAHSsre}p#P>O|m`h){YA3)3UD0d;)#&0p45OP%BxiSP^at%(Tq`5puF z=NbzC{U;Cf)JF`k3$fu;MU#zEW2V0Fpx=Wthz@&$YqLt;Iz#5yJ$7^%205Rz5Qa!MdLKg)1QN8a0zm3zwC9hou{U%EicKAhi9%V+V}JVQ!B;mYZ|6^R=0PHgz2Zb3-OEs-`pSdD z6<_jCWr}S~pn&mbi4Feg_3ZA*^3lMBV}S;X4pCYaArqby+ja|4cXpq7-OG)W$P}IO z65ujtpWqjytB-b3Eii#1}q%j)J{!e^5Vv>n#ZK`6qqKkb!{0Q z$D9Mwh0My}5UrC2ilJSU+qEnG%K??L54W)06J8cHfuL={QCSxi zk7%lgy*@G&5@3>CRkNc)kU!ut@`S8iPHs!Nwy|eu&RbeZ2C=04b2TG7&Jj{aWmy3X z2a25gCVkJ!b784+;Xag5U;Sk5RTcc!VwTRHg~Cr{n}=}du79&IpuUs% z?NNUBv%Fdj4lDeCIX>ol6N2$o^zfDthdkF2rGZR?EJ$9zdhFn{vw|-zh>H4TQ9*yn z8BaU8q0$4ev#aHF4T8q`qR9HO7ZnYF;eufTKY6;@M3vGgn6a&+|f|i{3KT^#jur8QA(X=Kyua5 z&85d-uNqp5RH3(BU9Q}9S3N7NO!K-I>K7Ii1n4_a0Fmv#521e9+p`Z+3@#LQ1kVeh! zZk=&<7j8&BkY#$k&jUF5U%x;`_G~6{EJ9NAl!KzoGY0Llpdy7YE zvAbc~A||}BFp|9kh#ih$i{OI_Xy_W4^UnY6fv1Pi)e0*=%}}E#Esw^8y1?>efq;j% zXK zLl1M`>Y?Z0ck$R^_F{=6`*0K=0AkSIYu4}l=km&KIBPHMV`T@(!>k)k&q!@7JZ(ng zHC`i}uxfO7H-GiIE-S0gu=88Q-@Wb*Ht>Z(+2lord*ZgvjJx}xVZ-k#jfgbxa#p%Dq{Wo(Vi(QD* z){lvX?+^YlDTQ}!-j^mYw(7LmeSBXHv3$;DUr4jxcF47S^)Mg)@&(7Cg%ooPBh@uO zO6Czowg?3rdYRu_XGf3aTKqkMNoymCwg7qhK4Gf@x2~P;x+`xx@Z6_7TG?>zK@zKC zi>lMW7mHefP}UvH&5Mn+4eA+%1fI#!F@1ZAevEWpLr0*#@WYa*Gf;QXUKj#F|e-If&Vn{a-w6gkK%cVK(dmH4aWzz-RnloqW#!Dic_G z*V&=2o9>x+!qax+s%#9QHR;*P!}F@4K{&_p$A{YUO!~4?B5f}aInfUstX-p#|0KsXr48}2h?+S5r^XPe$Og}d84>mNvYIvfx#z#4yw zLwjq-`Ns8_`bgsw5^SF{eu3hXz`9>2Ce-{?%Fbs!Iw%ocAE~66D3LS_|0CW5+(@*> zjDp7}^^L_e&&ajrK$euZeQGU9bbhf{xM)!*Z8&>yq}z$6mWV6p@W%(E{8$X zz!zL$L_f-Z*Ig?ecC?Qltw5aIFDu)dHIFb+U>q=vk{|p{tPXxSXD{Lj)a(>IlJ3|h ziRgdCT|yIzFf#mgrq>@%4u`P!ednT@rj_!w7S8>&l^)iz&Z~888 zfygQ>u4{{mo}w|#p-45w0*C{JeoQjc#9O&ZMy>5`;+*2zYskA#1go;8PGeC3L2Uqj zb~Wdi=ENBavkHqy1htKh&N0N=VfcS5A-o>p3qTwC9%>zce%R<0$mh6s2^P>Fg{Z4i z>pmJ_NnW5lSMr68r1c@z=>d?V#Kc6+EM3U#$&=x_g$zZ)nE`c+aHEj1guW@JWhAGy zB;%;o*=YLiWrR>I} zYbu6F_RkNjge_X&!9e9Jx8N?RJfMgdkj$t%Z{g3SXc-*&9w zPIU9f(;dinMBU-fU%y~;`-GUHv(|ABpw!48VY=f;A6yNZFC{>dFJN;)fOT$DcoNfy zGs*~_V=CTrgQ3d4NWAwDCm;V`jF4DqJ)`)X zP7CP@vp#^O4>ExvF|<|PKyDfykJHf!Vb&X-#>9>X@t>#swP1dUdkv)qgS!#G|8EPz z!@)r{({vEFW|_nd01c)@#j6LTFd2g__pQx$l#6RNPaStJ^}Ko~+gmf6lZU4Y2?;rl zecu={7~2hB4?><@8Oe4!3W~2U4$2;EY;{2Q_SddgLQXR(Kn4_VKF6OIu58phwP~g@ z94hlU^Wa(8Y|Xg*#7E<-x6go+yI5Z^J9myzfH|7Tame0la)P6VbWRfY>BL0(-r(wx zlmTmDRyLpxIMC@xkU>z}RQ*r6GVy&2H?Rl_7MSXUd}76gov)Z5%&hw85Hv!fQFS{v zjJ;_XByR7bsN>39XF8u_huT^z(SZ=B7m?G5g}_9z9}mfF236 zfadk^hl*f)@q_3)h^-bzcif@D=m}Q?5NDY61{?8yt*`u4$v;!DZz5a|=o=wuWM$9S zQl?d>|W zHT*cubCdaRoBH5Mhm=N$Bu0}3B19t#J{drYtUt-3Aw<)yNt@f;} z>IhQT5Vwt=2al&a<~6WiVHAL}5)Ou$?#zO-Wq`u97_!Vg8rZPE;i5;cSn~@(L=a;I zM|TN2^pFYZ9LBZuBCG3c_DTL+Xsy3aetjv{Y<>3gzsTfl?u+wL&yzAV%w2nDIt&uOE+1Z1 z8Wjtr>hQi`p<|FMkjN-uR_#wVO;htj2=QU@zBD@jTYC3yc2HfQTuKN3>{Wdy7^O8d z%cinywYz(h{5=bIg{?S_z+qxynmy~w!5EA_+RwA?3h6nRt7ihfp+Ml&33eJv{VXFy zj)O^;if_Sy5zWsI+zf;vw=!R}Yl#KIJ)!pI06oCB|L$CN79cVF8i-CUEIpT>YYb~H@c2Uy1@uus8 zcKkgta`5nVX~}CuTP@Impb_|xbibqHbq37m?^5wW98icDBZ6#8W!*p{FZVcsad-r)xN^c$y=c3FS@2Vp^o>WKMC+KY3zA5B{1IPT)D6J0- zm^X=GvZQwp1Eb+u*A#5?R^DR**yD>{{DLHN8eYn4x^x2VlapJ6f)42$7vC)IzK!i8 zElpsWdM(M-K6OMH`_)@2*@KAKi3_gT0o@bQy)ajS{^i?xM}t55wba86{b^~PV=gFu zvFd*0nuUpJ06yXu<2~qiL0V1_akHdV)ABW@8;L^DBpLsV=Fj=>MO|lW!HuJ7OnUEL z`mzsL2wTmM8~xCGby8}1<)YniQ?MoOTWn9DMIp?^$8htIZTVH{dna%DzWHOhOcz`| zW0nrYjIitt4Kz5!9>p~@x3nBMbA~o2IPlu5ZTPi7JVTf}b_2^@SVF>oCiI)xnkVKG z*16O)Qpyw^_T(btf#Tvab!4&Qu_+T#<7Dh6s`$EDbqLP?OfLkq@}~?y{c9R8NS5$l*8FQo0E<=?C-3N4yr@nSZ$q2;=g*(!7j;q$II%&V z6Y+qoEK73PSA74VNWHEg3y9cLV5k_Y09w4YBSK(3^sZQrXsczEYO<4oAi=6-t+odQ zj(9&MqIW7szQu@&h9B~x#>ba^pP#Xzy2b+_BiApC9OstmBT$r86b(Deqa{ypPuKwd38A2c0?6o`AsX2T=54UC z?wzeIwKISq_3cN^g|>lr!Ho!l9u^Q#QvU+kAf5&?zv>a9ApFE?z}vhB%*tsb@#=}# zpXfiG==7or4l=WpWvMZbgW;MU7B{=%v@>WeBhF)I--+W-regT_*stRK)-_&AuL&5x zaup>hECS4($6ij%D5Zw)Jh%CVdimFReIwKB*bK5&6Q}`6gKc<#1wmv2ed%Jy>&{hr zx%uMTsHRpO-fRa7-NxwyJa-H0F1ufxPd~DS$AAC+E%!yV(2)!joqy9&*o<&gA(xNP zhnm}Q*lVg`Yup^9lnSYDNt-Vt4&j8l8B{M=%1pKVx62kZHE|V6iK-f?{WoF*wIEV} zT^oDwXrTDQARz@u;Mmxhr@+1H0gW8B#4N$pA|!EzS39G$pd?2M;$Vn6{*WaWJbqzd zMF3(CIvH=KJNQQ`$U>rWc;A1MUcb$4dRj+)4HdS&7_R&_r~>52vn#iHU_aLK&M`s> z^-LTTX1$7-De!{Zm`#89u7h(6OQFg90g98}-c)!5KVO{R2!`txyvIYe>?iQhvwHtq zt;ZnA!-~lTVmq6!tFqCvud_aV(tMZ!TgF}T&s0$eSpXhdU(he%bg0*N>j%yHJUFkS@+zs z?bk1N?h7*hU*~v_7;MD57ZXXlfOI51M48;e{mA~s9-*Q!u?5y}rcCI2ig4<6A4@gJ zBK3k8u_|JH>@M4njz}rUF~F-~C&m~cDJ~B2|I6tHVMj-|KurI;&Za#3i4_J1{LmKO zfbh4dWtWUUp;4)4xUNTB+m<6JgqK-NOpF*7BD=pW&H$es~g`OQdh*O9yc-e zUFkUB1W5Ll68CTWTpJ#Gs#z41we>{>L^JOOXkg~dF2(zANlL%4b}Kp`1E6d>W%gx` zS4j^jw7|csFs`uhsRTP7ywim=slI6|bDXWfO8#;6G@4*!OLMFAw=uhLvuUEUjzIjc zyqY^=5G@D6Iw5>f(`^x~MzctbJqG6)lA}-T(j6Wg9$Z*h5Rhf(W~6?9Zk+D0fuZhg zPW(%A+un0?an(_77UW-FEcZq7`~^0;P!tIbZDOcaYWFV9i=I%>a67tIx&@>4L+oyP zghSgf@zhsWIyyE954)N4aC7mzdhV!IPa(uYL;YttS>5Q4IQrPwE6)Ir z6U@lvOx*v(RBYiD)8)r@;@bJA(1YnYk@xIt0%Xx?NeV^xFE_7FpWfXC^-a=Ao)P(&0t)FUrI-?^VHB`z}V$l()aWeVq&he*oO+SXQ{0pxC-@y<{4>sbMc%BR83pE zxX`o<-!eZ=hjmEB?Y!H`R%w6{7IIv-5M}NFVSNxGU3kB>+Fwul-YUEESiTo{#N~^R zY(qpuBmz3eUN`XD{4@79K71nfZE8x-)AIkA<~aG>dbLL_Q}ec`7gPlvyt)q$>13`L z<+=kv$I^#&~M$t`VeRc zCt3Uf6tFhPdQg_l0fQJM`QW2);Gogru1~VYf}Uv9gWM;Sy=G>)kM{0%AR9A||D1^k zM~v?84RehD@od_j93%ONXUJEKr8qS!OCi848xTnw@JIR6dAh*Ca|Nak1|Y?JGxigt z1!wgB_hlC)Nj+WR$3hr0$>dHlH9x|X5Rm*1jm@Wdwjah~j>{DN;g}e~w5X^s`JZG) zU_fqOi4kF0nGHEw9_u6_*b~KZ$Y_T+lRvdKn_g0vtz*{2n>Y_)aL_kx$nTW}1t)+n zGk`&^mZ)cbN<4Z>cTPX+$J`l;?l{jX6s*A{C+7N=pBwPsHkITLbiSbGUZwCUY}GaC z5tvmIKT;B9OS<{o2z$cej?Ytw!mc~$G8GOQsd5xg8P^M*;k&JTmHKwnZxxTY)nqiJ_JF) zE?E9iwoU08w1$d{)&A`T(i*1>j7%Q)_d&Qoi4Po#cYu{T`0#KPpiF1G{@NHzGRFud zJ{REcwUPCdOtOSMnva?0IpZytuW&{`AOaIxkY;c&e049~d3hfoT0}TOf;r}1$8wV- zZ{WKw#F2GXx(JcLFzW}*c~A!jNh|KE`(0{hO$G^KOrd7tQAdEK<3zTRX!(z(okY<& zO=9q$o)hgnD+dGraMwq=YAHXK(3(ozr3A)KQ=_e6I6q$9xenWe-(iX96*K-#vo`yU z4;)xlvFA%4rN4^7X}!RYNA+imtf8(9qi$2Nv*KPks_H(|D9oSQwGi2?A*i1`rq=@dG^in2*jjW{mGM z!w*1=fgXeQ{`G4erAEM98ySP67b>s34mQXl=yOwZ(|w~RGru+&`BSxTJ~JB^{vhp{ zE)Z*iSP$;Hmkvp1-9UA)tYS!J&zU>X_20$XYi-_tuhdHGxIi967{qT4jg;F{PEPNK z<}}?@%zkS3pY7NfVVy{`Tsw2=(-IGSL%Q8b8b}j?D65?15@hiU-OpYG9<%Zi7`Ozv zO*W)T@hk~8IjVyE4TGxTo zANly`S(g5ucRiS5DwaOVT6hvMI2OVCY52|@2FxfLWmU8f7*A0B&>FJP2qqc1D<;My zCL&Nj%Z*d%o*d;$%!P~o(SID76>8Jif>O6=7LkiWbCwLXfczwI>X{*z&n z(ccPfCqAQ?xI&v<>$6iwa`4_=`Zf8AMNg^VYcY`^f0(+wdm!MW>L?$+kV=cgk#bCT zb}(kJs9mcL*G$XB2HPaV#|*bw2FT##VvkZ{T8!)5lTWN`3?Dnu)??zE0zJhZglC6B5@&iWhgA*9$y0F&p%Q2BXw5#qc--hzjz z*aWKwt_y8J_!PE7{CF%bP-DlzCy-}CkB_3L7nSy`&W1VYevE9CC~KXXwT1zGZWs}_ z99&z2u8mY?+_Wo}`vBb+l0V~JWjD6;n*Hw{mAbj4k61GxU-wyBIj`f(g!Kf)BQKXv zZga_37i}5Acvp4k{L!O)<;s5ME#7_5_CfGak!g|+Z67IPE&Qzhk-Vza8+P;iaAhL@ z2+(q^!P7B^9Y6o}&g#LtvAsShK0+v*(#`kcE6V#*pAGlX>|^Lm?vK;_HWI zs_f$-Ff-YQ5-OyWy(vHO5Ptok|7owxO8k&laN+y=kkt$h$BXzoY~w|2^qQ|fzmeiM z5NXotbxJWdF-Igt0M=ELo#VuRE9`-u{MvB-I!&570t0bNtkNb$cK{54O zzY?!K@R=aRQ2Tj8>pfsspZ3O5R5n8$+1_dubZNzC0(FsnkVSbJ{t$|8K5Ar2Q5;uM z;_TysRAjshe{Sq!;!(PeWRPx_3pm@VF~P9B&;>h0U~NqPO& z^8H9g0~UVFsYNSq%z)RIX;f%eWMH^E=5XBT07d>;J8_DV1Pzc{sI~*U|Bt9Q0q3$^ zyN88D3MrH+WXhZ*Nkj-~AakY+B`GqLMCOpB2uTu>%n_MF8ImL+B$<;bWr)oF>+0F> z_Z^34AJ5*q@VoEpI)`Mt#*nPa9 zJ%XvJm8kDR3Txa#_`_iw>({+JFiT(%j?qfNwp3upE7#-`t@eA+Ea^u=LX*e*u8OW< z<}y!l9xC+M*jTlSSiS%(xAS!KiOTLDve&HqV#*b(tzOZtsbvf!2&_)v1Hak@Pmz`K z?jv6@YR_)H>H9{R+W%g%#$i1ALlE48j7sh^H#B8OHcdu0Jqy|yYOxx|%{X08+9@=U zMThBBDJhuNt9j2{E#tyR&4uxZoeVr}ExZ2tR8yNncNM#YF*a=w!%-}Hd~^(350>rO zW}3mn&V;lAJK5);0g(KH@zfD#3q|b3G|?Mnrt{=tqO2>16EpfC)oTfHwzU zvu>a^ca`?7URM~A4_RGGis7Gj+d*tkExJ8mWnVy3d}eq1>F3!DXe+vQf1he-$o&-%sD)t z?F;^6<^ZO=ZMf-y_S3mH;YNNZh!CVz#4L7AU;j%dw2}aF!RM^(d;X#%yL0?44jJ0O zjIpOT;p&`NTpT+l75y2xZDMX9Typp;DKiG`=8`c$g7`FPPA->vYqtjR-{@Z6OyL7u zFOaXvV(Z)Gv)R_gMwc{qedsWTK6VKi_U7mNAlNTWRFSeSqV_p_@yPCW-GQ!G}Q&4Wnz3=$N=J$u%u|9R?V*^oqr?NhbQ(QvGgaMJ-*tq3ZEP#76J%; zv?>Ce#wNp<`}FCJnMhr*MpUqc2MTcZ!u|ODSHNeu+q(EPeKJH7ggvP9;r(qj~tgiEVc{1Cvl*_$j2aKAmmMEW~Tf3CL`xhHqy#D z?ZkNl6ETUHlg@YUTqQHeA8WRz^9W%pj1B<9!lDNvLER`e4z^NJ9om{;d8JEl3fSXY z#*6KrKZA0=#r5`-dz%p}^c6x|-Q!kfW__OaLS_c{0dt@B^81aw}~$^6>*9)-#3 z&Fxv9up=PGvc|<{<-z@Z)7#55Huhs^F!5EUt4^ym`U~u~+Rs$}xUV~C;sHIEUQiPN zED)VI;Q%4DDgi2e0#SZ!LTd|5E_inL*0A`a0wG?u(6LA1V~`Oh1pTO;1*`%A0`2l2 zSf?>}WQS#z@1HTJJJHj0&4&Z zbQZOs`FPwk++1kH`#Ny+(98Wk;?bRhUt3#RFGY{Z(N=ttpeiQVjDXdoW7kEtoZDBx z2~G4lOJ&3GDRWOWMSXf~8*aSAoZIEOxy!orWm&%`P^`7zS!j=>? z-r*$~t9=8My|sqBnm1Jc0aUSDeiJ7MXS;V(L4Vmzm|xSXA_HI=N#w1*P_c*8gmq1qxT=MykXV-!-R2MwUFim_vU>yPXp|*AjQE|1aSB+KLvET%HoSNh1 zmNQpJQQ&13R36=v8=dkmHOL78v0x5~e#Nd2mZFkX>-Ah!i_B3;gLy0g_G>Dkmk3jL z(VS|ulzMF^Q)we@7D0_pO6}M&hW|P+$ux$~Bd(KeiCQUBc_PZ`9|ZyupzrX*ZBC%= z^l1P*Sk-jStKvhA9<6QR$cX!7Y;gtlWq5bnI%5T7|4w)`=cbH6`HD^N+}Q$?mb`@% zDSAmo&+j-cn(O4$PDf^cbn!P`r!ptxa)j#Lo*7J<&5P52DD5%n@(03&nbBR~VS~;t zTv{f?u#zamVmuy@ospAsnCu5#=#skbBQS zdcpRpMzz)bhK|f^GjoHRPN)m}&KGV)t&461eP?L75Qc@}+S)ww@yCj~{wS=afQ$o% zogluhtT9zo`e{F1t++BDF4UDhGh{S1VIM9Ka7Q%l*|VZw)|Gt|0{XaIEHEufAhT(~ z-7=)48lhQ7^Qp75YN5nnOa`_XyBB;03Hw*5t=SbudehzK2QmQBTrCKyh!A?@&L{qN z2^^Bgdx!sl?*l96u{e8P&r2gaz%cD%<@RHOObpbNN)YRW@cFRJE6}b=r|PVa zM*i%!!ZECxbFxKhJP{TZ_f0lZ{SMTg+YdFXjqG7RO2R|90_KXa!;MKw&PQ`*yy|IbMa3IPr__|!4cgsStivnc zOmVA;7;7_coI87@1tmr9R{bgQGrvv~TeY&k=Hz1B%E@%Ew zKo1sx;g|GPC?k4cNuzi! z?>5JBjX}HZR+?oh|NFMZM|8<29=H16as)|itVt&9^zqlACQ!cE^;?ja?-vW}k3-3= z&RlN=zFllj2;ght#SjLPC4G`wJQ3%?jtH`bk<7I>2Q43r8A%wNIN<||LPjF({&E0# zV!~?*P%#rP*A-&!2$PNt7t4El~K0|7)v5N8Va5FE2X>2b&8G zHbx)5RY9{*QT*?G-V5z__4TAR#DflR9P3(MNo%8nq{dS8qf(CmeUuF@-Gk1*dgX72 zg7F0TjT53R{3F;s#}pWMV{gU$QE1npEZqi!p!FYCpBY)x|Nm{&(?KcQm$!~Z;;{YB+!R>M%Su9vC?|+lkg0?{{m$GZ*Z=H*u7W|k7?zo#CF0)M z?7B<*6j3%p0=qRBTtrsOjf`HGdP#%_?fV4up11uH(@HWmUo2aq#vitX#?Cri+?J6) z@7_yelKS;45jg)rU^a4J(`y%7|De-{Z1&q|TtB=?rMbPgxAztIm9i>k zVtowi=SLOt8EF@P&h7&d+4AD;<=G@s`fb~0>(!OV#4z-^q#aXQ% zv+k%I&uuSMW!t( zY_6Ha-fsfjZ;i!4HG+ul+dPJ0i{oWcGFkb*q1-AhxaH;JdWZBGX$eD(>a+y8@ixZu zWlTxC?oiwn)(p^M+iLlWJN)Ef`?BcJ$$8IVx3B2|TdUV5EPWTM9}UuAyP5RQ&Fb3U zUs)aO?D6&EzE>O`&Rzj{7V}K*P zWqpD9v95FY#HxI09ZN*Yx$q(vaqT6#^+pxf51=~z1l4rR*`ZZIMX1TYiUt_$3cfzb zisT7?i^04Uh|^uQQ66^vQHJJkzI-uCspq4`GcdvPljFKPx4b()e4L9TsD3=r>syo+ z;q1aXroigRgNX7VL;H&t{hA)HtN17~P;J%ZzoY8VYS1@Del0ah)g+s?rs+rS3M=E< zf`=S^|Eza&bv>A7moX!4AQsnPaGB0eizHs6Fpf1!9+2|OtjCv7B3S4RzkQ>Y#)2m z=fo-=i+quLX+RyGMI30>{LFJKR@QE&ZjypXm0MRW)U56)bi@Bs6uc;dJbrv$zh_1Y z+(9j;!OvbUqw^}KE9&C@K7I9Tt+}Rwz2?d0zfPC1&IMcTw)!Gf`KSk4g3R6L=8KX?rqZVarZqleKj=%ohvS z?Usr8KtYkFx}o@0SajzZU|3?Tp*Qq5%{*?Rtagya^cMTuobO86eGfkW*~c4H<%<%6 zic!IbTxu*s;x7Piz~ELf;rC7E7hpq9PfyETUy=hizs5=u>I%Wx*%Cx1gh;zT7|ndL zL7Az*P>aziP(^3T9p_4Eb-qz^yBW@cRYyw8PB~6l?YUvc^U?!U%6v%`hw^>Ddl#)-lTft;meZ>IhtaqddmjUUG3-Ddn)I z(>`_TRFmL&avt)D8kYWe&>ZnC$2`{LZb9Ri+O4GC%hxb9I=8)4U&Pn6+u+jNVGo{c zPHn-+mvL$JzDdFWznwj1p$D#9S5`3$9xVjP$g<&fa=wqHl2#G~H}%7ZC*yjSXfT|u z2AamQ#tJ|RzGUNSutMDJ_1BD)ADE8Ugxg}-l!z!2TLsilwu?o$1db3BF8gH-;guMf zGZ>3Xde0wmei4uRVI&Kzj-ixmK!3QFgO<7vzivi9caxUkc*N6n44g1$PjvekiawhW zW=+C4DFwfIo%&|`bl-PLVo@$+oZrpEwz z2s@;a>$3Q(G)H7WcS|5H%K#QvOz)I~tyb?R*{?01bQZ{a~Dg62t68CT*pd}A78Da3T_#Xn4 zg!M;LiNawywxF9hD@4Qp-=ibiF0id3DyB_#q%-O#`WS85W}(rnQ}TX12Bq!_*Sp?x zs3%{l8=&!j!%}Lj&P1*JImSU2%Rn^vB#U2M5}8adGV*QGElAO2i;+oLe7yo^F=BgU z1zt}6ZF&l{;JjXpY`n~Lr)AqMGH%JScsHFcELYcxVIJhc(}|{y`e^&2!~3{kWNXg3 zVtCkZHwn9OZ%1-0&OJOZ$!eEaTF;T4nAl-Vc0?;$;swfznEI1ZuT=%lFCPjvG9P)b zE_zkdlq<9b>;{~@?48`HQ7~r{p||E1gFYI+P8kt%EN;_ zh=Hq;jN1Wz^0J4S|9xtgc%rC(SBC>DASW2fR(r1udH2JO5VI_>n!sBrf^^Zu-EdE8 zEN5bdk@+J?i%B*98WL;H{0jC~^32%~SMD<1C9yW$RAOCF6+?LE(Zw%#_D;nLNNM@u zWe>!EhBkG{zq6CE>M8ef|Cw8B$I$|U2r=KT_sH(~ZISE6c*=xYYS_)~3eTQc?GoLz z?@DUVWIF!vyjMZeaqun*ob&fov@mpY*GoSp{5{V^(z@mg>8!8)K7i{VI-5%-7WlA{ zNAI!6VuDvco~D&k_)>P;cjv3dr+JFKikzjk-YO~cz27*5UYm&_C`Z^!(^N~0)o?i+ zgedHrhhO_uOzaWh{%xWG(&&;i@t(^p_7d>N2GE`Bt zN+LyS6+>aY=Hi#8;qB?$mJB*nv;9A)$!n#;!k~8S6 zp1cMu;;q^p9;uj3aSmrAe?|%45)9ZXSy}47j8;W<`FTW49 zp6^w?m&(0pEXYiUn8nW=Vj`LH3yYLr9UocTYB)nY`^eVaVa2IU=(Bwrhd`z4o9L?| zIWl`2r-YGMueH=xfwkUS)J_w%Vf0`VD1f=aOvCYmP%ugKlOe}FDS;dW>WK)foFXOUu@eE&Up9-&+h*|gI#hS0Rf-9lm zHxM=G+U?%2B#t~VK#s>QuIMbKuS%MaNvrXgttl^S*pfFx=}h4!kuvv2Mn7TYalNQElw?Tl_eI{-W1@7cus~| z5Z7kA?Qz15w|W=_L+M`BXY}NbSH@F0Me3u#cryVKw?w zM+e=%dFO4E3q)&h$BrG4r+as1ES-W%nMuFbRen==EzG`N4KKns1nZ3*w$BeAK8&C4 zgwjDTPn(=L3JN*S%cugs)*=8q6(6`?{IS8)PZ7%S!f5DyD;7&DL^FO*wTj)7>4F?c z#3BYo(J^ zkFhP!e25WYjisjzTfB#ujp2{}L3 zz()KvM$XU=KHA}zb@a3iDK8!BKWDaUeZe*fJOrDf*A@b89m2X)Z|#jmVCUT3rZSPVU2vHb9( zrk$TYoyh(9ti$2y1yhhSiFW7SZ%$OVw=3PYlydJH!hSuO%iHRwPA)E!h;rmX>ZUZk z_)pJT3(VgNsH=-W{N(A^YU1t`@@B+ zDB1QEn5<3H(;c&wx#hJu+ZQ7A=y91TmzvHTl+wf2ZTGy>c8Sj8=&@sO1~2dUS0V;- zD5ON~P7!^b8FR`pV;jjfr#er%(-(flWS`DM>$O!bI>B?RudwcfU07?7=H`->7Irvv zzTAkZHmTFR7G%t?4zj$$qo<{QFB;-nU|AFqk&KECcUiK0j*kH`yRYvwni53H-Wwbj zp;4yb19J?FN$$qAQ0MxguwP&Ntu;e2%c7#Ze;;v+KvPiIe~H9^*1D1BRXTxjL8$X2 z3OV4Dj^}#ssks*EVnQPe>mIk-p;Z;-XP#u^x;z%QN#v-ka`4T&%ulJs5f~$nr99G1 zi735_#J}_%19%jD8mY|!J=aabE>7V_vv|oC`ta|T3q`xFV3@mN6dt!b7b#x zRjd$5$7Vh$_f6@abRYitQx#THs9`Whqd?+*J$~8R)s={Zur#_9G6jB7f?53 zC=6|Y*W)=K0(AphjreBR{z-SH_2&uxT8FdC&HWY|HLPCV|4G+k*Uhj=q4qWxRYD_y zHbvQkNX2LNkYWGN%N*n0F1FIfMWz?$JU8dxK5{QLTHvT=PgPAwfXdb|nhEzA{Suid zZ4ceL@5k5N33Kve{Z7ND%n{V(A-(DN5`RKtyS}vn-egpIa$EhgQ#}i9g%dErGZawx zR^hFLpLV#iie|U$FaP>M71<-d3#DP}rP6)5AubrjZ*<&oeuYd%dS9t{U%j1B7e}S~ zE~`oay)lrme6MWiAz}IHV(GXnF~=hPFCG!bjJaDH;VrFx#JxzWXONZBK^{qutml%# z7$ZVN6=0`ip`Emdd%IjW=bKz;aO`HLR?fkefcf~c7C;DEZ;g_Cq* zP-q_*)ZxH@Y-By4Xi_U6GK~?_>A%0auz1gtH2^UM_~Gq<`yZ_sYrVkl9VqgI>@MCg z$RM!9jIIQ5YhAsE9v@Kbu_ZP?;b&8(Z>Gw9(|U-pdTpAv#P)c`M^P`|w_Pe$sGmv5 z^#rF#I#%Y#jwWQ$Y;w!z-W!&yEUKqsKX-5W_;nmBRvc$LwFgFy5se-DM6%&G>EKanqF~vY^`}%`Q;^D*bpFdwA-K%UHfN*K` zxoj0wN(8Lmy&K#mDm))J-Q2znu)zdG9VmEJ4@}xFenkxQKuCm+D{qt*o0m8E2Dqxl z!-*`=I3cYOb_@>6cq~__p|Ay|1w~oSm>_xZ5+pWO9lPd^x~$K&xNoM}TjNNScd(Ou!6-{%I9xHPLs%>x8<#)@Ah8x z@?4ot5GrIaqzJFYXk!ghxl1rD4EB89`1B}Ut6RLUeMYUU8tDaubL7^PdI!6i&#QN# zqfynTSC(lFZ4q#{M55A16-2`@zXS{47Bp5${O*vIP6EU+Hw&gYrh8R=PWSS!n%~aw zD!X#|G8y9mw0Z*xZ?rP!;&#W>zZse)6D`cqu}cXN3#c`dTY!ETOU(eS&^YY8pvAQD z7l`^@HF5uEWDId?m>q<_F~3cOCa@5D9gfO-Z$de29=GVzL{!K<NQF41y4u;^p9HPHF&9w0oM$3jv=JdDVVcszBmd@V~Am(IAZk)Dv6W_~RN@ zj-W4YPNB|vx3QYW@c3S)H9S#uzBg|O2BD%nqtT(r?@^_u@O``uL2=SOX--x)E({HRet}uphmisx zH&0qd^eq&hKYCxNo~(oOo=$TOtPH>a-{ejCz!(O|d9!u|ffY48mVx{>a>#C3;_B z;0kKkImo;pAM+Spn^5a-kg6P~Z7`N%%9qeMlyrB#@u7m(FYT=Mysggvclv$443CN* zr1n8^@HmM#PL)r8YHlg3z`U^r<9WC@^68hX(P>0EbA7(vq94?%Y^}Ox7%OFeVWZ7} z05lEN!SiGNwxuGuOnidOm$s~DqpW`P=uuw%&L7VEuqCZqo==F&;5w!U2m(dGOPHOy zC(4CD4{Q({s%isp0VCxAV$Na6ts~9j?hqqq{ILEiMx}sOdo{khMJtv^s-bQN(M_;7 zE%Av%qghP9Scum-w(ilT|a z?5d0YEyiDe-$`*U{^r!$$Gzi{m*lGn%Bgt;$Ud4(SAB+4pQ7T*WO%#l##a8jH=A0z z%t$lA9;R@Ci)%$kB(gN`(RD7KHC6+BYx>up2w%hJ#H*?&^7W~ac3ZrIY+U(UEg2@- z2fNtT^Tt1Qta{!(4m&=j<&opLw)L!EYZZ}cxIHJ7iD@tDn9t!Sgf~cSwJX#5ouEbg zVAW~!uDcWn+ZGlU9bwOKLFgFAptXeNKvi1Pk!}SVBJko^s2AT9*PsqyO3m9y7FKBh zCW}U%#zE2)0>1&Cis5hu8Mt zA2AZa0Rk2(m~Z2CV@(g|A73~`2!j`t&%zQyO$YJ)HNqF}2r0c$8e$O=`ct}TcN)%+ zI%MzQ4LZLfxP{!ph?vY*7Ov+Sy|UYOk^%`IUo{D*%pK1S_TiO)B4}5<>lj{(%+r71 z3qwr3anxkI#FegJlFTVrfjwLTPm%D$497c6FNl`?PCW6&4+OdgLHRL9Qd@knsUPzw zx2_Hiuf2xPmm&?HBFfLxlI|kx>oxeBDJ#;>vH6swrPlU2y|LQ0DdeqzT5%~Uihr;C z`fcaEMp!J4Aj`+5n!!OxMca~8)__J`05 z-}I{;NEFxBf~pV}zz*Co-6+A3_a5<~sl7cY&ar$OCUH2%X!F2cCw9F~@PNT`qv49A;)KKwF zAwq!c09E-z^6@lkI{ASf2!~J<$4|l_0e=QC4*nRB97MNwL(>qWtIOU%IoR(Op?6UiVpmjrK$N5;spmM9i+pnVEe;=K-5usz^V54I) z^zmR|IvH!KD6h1aFY0}pOYygClbj(dv=eErzzU)SZWu)DfL1*q)Ko81>~{jn&maWN za|n%&iB1R}RH%ezbK~OT0Hi0jp3_XrUeB^Vu!Qd9$+Rt)=qIs6-~Ko>4b+Kr#Y1Cx zB8Sa3(^5k^&eqF}9P+|KHUbob0Rd9#-G(#RlXim7FcE*oJW_w>$xb*p5GWoHuFCP_ zjHuJ_!jWuASB47G3j5?3$l!4rdU`@W!>LsAl>u5s)ItzL07srkI{MJ(&|y9ebtsJU zArH;K8XD*-f3&{#9`1sYQaBXxL2E*xI(4!RiYk;&Du84t7(P+giWabaD*7Iev^($ctqU?BY&8uIae2w?34Y47JG z3fCQriPNh#I&H7h>`D>`wkrz6Tw47MlEF34CK!Kg!s@22x0WTsbF#0w-KF@iV0x21 z!xzjV8Ld&hdb{ED-zj%buPio~T`%gWMbuBrK6iF(#0b<94MqO#`AT}pUa+8_xM?RL zHLR73myn{^y20aXEn7&y{Ra;NwA;{{A77lyP%8@vqCi9dwk^WGgF75;5GCK;XPM1c z5Pr_QC^iyt?F&DS#0NJiJl-UGuO)eTdBiK=yudTju#@+My|w?m1b{sCw^v(POv5&# zNs9_Yk}Ya)>hq+viuAZkzEQ!gj=JgUEUMRY1?CL8sCKPV#2_3Z{wWf6IOo$}#Z_x0Es1 z`)c2nU!1^qPqpr|*AzS-Xr6-sTK1jb+QvcW;tHipQ-Acb+Ep?gzSCIwXAE&bcF;Un zPex(qmYc6UxmVZFL>ilS<%^(F!CX{DZi{(t>aqnq(!T-lg*qZjxSGzEm08DCR`2;3 zZ_TRr>{Sq@o0xC(=Ejb+Nmh*RmCC;P^e)v~wL1~cX#En!FT4_q0mT69>3_0bbq8(CKkEmKlCb1GfuM0uMZ^UX$T zD(7O_Ag~|tG{*Ca3AM4i&%$&_vw#MW0*e^H z^oxaW_9~i3O?G|%(U<<5Q{d>%o0YI8DYiPrA%0JSC0}giL5{)Hyr+cp_LV<%EoU2n zx2EvyMU>llx`gucH6L2BfMDKI4Y3~+^GEl#dmLaJn4Z^2ZJ`aU!ho|CjPk9--%Nk6 zoE9XVCPt2Xvy-D_XKL(4*kWXvi1=tjOFSSr1{x#g6GN_#}c#3aD2{qX~%2UsSV zoSYO`R@M>TLKY<$f;26Pq;oqQu)ZihvKRzFHX|crE9c9C0*FCcqLT<>-2N8qXY7G! zjwN!SyFq3BzX39awV-6KOK8N3ROP2nOvD!gG+^vPnHF5R1h-o}-TT@<1RVb^F4r(W zZD$Ts$G4%wt|)E|2A+tum=_@3AXGv)3IASg#pWSwSkea(OT=Cbqc>u)0~@QT8u9+{ zg;0)q4Fw!rWtjPyRpTM8Z`gGUDrIwU+mtNchl_wo?_0I)J;Wulk%J32Wr;rCWa zbQ+;2J^Lu;m;O~3tG)+dvLqQ0^rWPIRHq^0X~N>Sp$T*?pXARR(8-Wb%&uxqX|nr1 z)YjA|q#J8`$a6;|;@w?}OKa@{C^i*+V$6MUXx~Q)Yqq$ma~U%p5`wIuBucCD8IPst z!3$Rv;9}X|?o(~ke}DIcL&oIAlZ{`Z`e6woy)vJ$TD-NS8-**ss;O%0p=!G=BYNv8 zmFZCkjSp^ivYL?MZFW)^=I#{^dOYaln)=?7GY$d*N%q z%a`;OPoc#@UO`n5qqV*LXnLR7K0H`_Lv#d}IxiHS9{*Z^AP3$Ad5~yN#&Rl%$7s|R z{tUfzQOfE-j^IZEe{N~wz|oLN4ra43@Ip{TDGV$i5DZ*=!Bty2R#iU!sqM5t{4t{C z2T~61F#Zt!DDDxuYg~T(7=%33F5mOzlt25<&(CMvaQ`=!?TcuBf`0)a)YvsMkcu<) zc!I>$6{wpMWxRp{w~^3)Z%LOZOl(@Cx%G|)e zEWa&-duP;oBQZ09RkJcv=@HjENzV?K4V-LEb2MGcf6&1cypT2Q0%&QBY$W)ZLk}Ho zXkesx7Dr=-U!&pZ(csM9mSxy*`=}=ukERXPoY)cwx{Qt5US;zS*5L(f{Z zl!TvIQ!^Y<8sJ?u^i7`Q!5{IfBHr|*Qf?ed-Xmx8q5~8R)N{4O)dS@nE(lsz{ACc9 zUd?_zPk>RryBc*C^z?gYjWSo$@0CBlYN6$rTQB}claqtPA9Vpg^BU|f$fm9$9Iy zJ1D}o@H~~?SIx&8q$kpe9`~}s+??eLBaQ0KqOz)<^Mf&y#Bot{}y}D`saBI|Mqk+^eP@*yz;vn_HJq_)%AM&Ri6m24{@i2oui$JmE_)}S=NibN42$0 zXLdnf89iv*WBWZ3S}6ii89$ulfHDw+i;Ly+XK*U1ikz&M;bu&DK?uBd;`;CVoB(3y zqD?1bI}{B>f((xsMFKJYBFHruc>*(QN=-o%zokAP5TwLfIp$1R9V(s)`?M{%Fi69| zE$!^>;eV(KWEO`SiAOs21IzNZdg5O|OO4|OXcDDN)92568<-o;>;}MzAA^)j$4r-` z4s_w3)?iX01@?_1>TD({jw0h7Ki;^<`&ej=6>4@U6GXH_8jl2yj*j9#j6NvIpV7O# z;Q^9M>D!Th>v&~V4e2K>mPZXIbHlwhY+w9R>jVp8p16kWx%H;R#s;uFihfkSF-uF} z;r64@&Z&Gq>i;}t?U_hAtK6ctBgK&7TlSKTocF!vkSDJsmL5PI95&V$q!d~cuEeZ5 z!@oIXuE$C4;fyJFPI6mlu@Sm*-4Pip*>wh^vfluaYr-{S^Z^GO(QpItE9R2^OrJ*| zF9lfbKfxlPAk=;F+B|l3z>ifUDrpaU-u0()ki$HE}qJFWusgGE`*8$#F|+7RBj zirs2UvsL4I2oLeZYVolq+n3!-M=k*_W|6-=3H>SF?Bw!q?+O~xj4a*Cs zQ21ZfVsAg!W#||xgXbL%khVa3(~l*23^gRie)P1Wd&35eb=8fH#BL8t#TdfD6#!5u znOTz7%){eBG=(wLc&u`_9Mb8nd~*Y~$J)o5dkzV*hrv(G(!pT^D1hh~&;tu2hhQ!g|l(rI27tjNmTJ;SB&B>hV{QcNRH@Z$&dCHkaO@ey(P-5?V z+!*7(8572DHML4Bljmv90GT437Lw+%$$|Z6ThqZQ4-z5CZVX~Pntj9NE2MWQUuezA z9)1)=!Q&YD#zEF>`uCU#W~F-k(iQEeISz0pHgEj9@#sY!Sqa@r*R^)}6q_he`tY*S zg#}kLD<(Ad7{gEQR*jW!;{cy@McyJWmRgf5Dk|n)5`R_vqeMC&_UugAXl8B+)Bt#A zwe^w}rYZV+UVhrXGIuUZCHTHp3TjVWN}eq@N!q-P3Xe3l35^gs_zybO^pW%41ysm(XGp&u!>Kz3{x4!uozQ>`j43;qIc`!J7gT5Gy3m`UdjM2f?#g zZ37t#q&|cPz~|tiqoqVBrUo{T4iNA>mg8(*7^4!cmY(t`BbysZ&=D?v(0PkRc0w%A9QLN7V3OHe
gV#-u($fH@6QOtTqukF@k8+0=lIasg6snKhw@PkHrH7( z>9bg?vzh-Ozx|K7kdu$X#@d&}W9q#gHS~RM)#rl{@4UvA-Mdp_HrmTrEcLTt4cefF z{&5Y-gcfs^Z1!chSQ-(wy(E55|DNZZX_I{zGKNf1;WG)YRmQ1`!t;OSyQ@ z`mR(mG4(9<`7cr4Lt-7R7=U=t!bsu-_J)0px3#sJ;i`Vml7JinYCqR>U5m_MQDKI= z%71zu1N|L^=?}ZzF|2~ptk!jI!dms>CYpUzBd)dwUbEp7 z-`vX>LO(1g2Zt&H{oo?@x=x!ytf2% zXoV>_ySM6WlIk5Wl~a*3_2_u4?mYY{(L^%w3{XoSY{RsAY|E%rsoN6SL?IZdIre45 zb-lqDt#h%M_L=72sgE$G`Kq*CId!BPjd-chv^ zh!Wr;MpMc!@M9i=BmWPH^7?l{9`2*6=wZxhFMSf{i#I^RH(5y)$QgllSpe!S5ZYdR z9|Dbm=?~JplRTHxJ}!NBrFAi#8^dc)MNM+(>@jHr=mfXt*60P(bE+!5uI%FO3g%fc z&TDVpVULhqPCGb(qcKpuhb3<3~J6**vl8jTvW-5RG^#@B# zjFrf`WErq63IbaP=5tfgo8ASEb-%dcyt#WIRGi5~84!nVM zdXAjji-`prPft!5vW&IoSTq;mE|M{0ZS&rQ+5Wq zSyHXMe?1R-bo<1}`y+#&QD0@wFb7Nj<2_*VYoOwD|NZxaYE|6Ip`Yr9_8uVY!}O2w zK(obIsaS;8DY9?t+RLcvQ{*~5z3IElzF^g)^l$2M35;NW9s1O)B3nDE&CmP>uT!n8 z+aMVmZh(Q0s9fR>4|?>7`(L+=ffaCCptX1ifW`a))8SzP@-k3By9k-UO5(2x?l`$^ zkP`+=3vC)9Vq?k&bivjUNUNd-aBLbCcO`I?M(~&3EmN|tZn0z8T@Xuo*BEpt;qsTP z-&p|@Oc*HdxHi|<7=gOaEBM67!z$T@xJTW-5+QmEg=Cx$bZ`R=*E4s{EkH=rRo_Rq zh38({KIJWZ_We+c1)r5wWsrjeePkLvB#ve$L#FWg(ZQQYCMTMj=iS50gY0d?gFUbt zLcxU@A!dhUtpp*jUxv#SKnePw;qmc6_2ix1AAv`}8<4P7PzeLS5T7|B)LYOY8}UE{C#btLjY)jqsRoBtKGSC$|(OZ*261Ac(pTg zQB1IC7T3O+bWmptstF>etDA;d5b*iLR(lMlbHS>{Fch~#`}pw~w^L4ivOl2eEhQrp z@bTj@EbKw8P$j3G(2>z^0^>&#q*T*6@(3KcRcEN!I&_tQc)J==xO?jcGA|)HmzaGL zmGkg2EFB>*JXG}ZsB1i$qC3~%c->e0t)}AYLx%O($ zTyNLeC`4*hE5V!kRW|bCeIqen4Cp#{8_aAx>1PgtoRVS>HRuQ0>QyYZ+eV~z9|&_0 zq>rrIu&tqwLWf&0(l|!)!x+Z>SQOjYon#9yG$S!Af*ypZ<>WYqzz}c==p2U*yKw2* z?ixHZJn53sQqW*;a`e#e)wm!F?C5pG;tyhoqb=xE{4K(<2#Z;O${Z84024=5dTL7Yps@sm=KA{( z;ybEK#AkdTh_I;$Mq+?NW;hVqgclHutXy28qVyYWq#p~fM^lX;K-gwT$>3|@XrbML z56TS(*;7k}v5y|1yh#}xyTxPRj{(w^9xpchgSvlgWaJGw3pjEFJI5^W2=^)m0n}T_riAKy#2Jos=^_JrlLi?W+3qmqPUh!h zQpkSu!og8Z`S{thyJNkBu@%LB;~9s|-tcFlhr<&dekr=%uy=0hX;1s9ohQ*s+K8+z zjFU;ZNDap3>YwAQdIb~Dxh?E~_0?gNvv%voh4fdi8EL4H$E9o=PP{B^QB=%@UwGWN zgJQ&E6fKtz{puO$Yb-A>*D!6Qz}8A=;qT$~3}8+JYb0Y!IAS7_;yPJM(Z)3pyA@2k zFlEboYY4y-_=p_m$A~sSEo>Y6&;5v9uJ(ahaY~i(X>Mv829Lj5>JG z(_F&5a}d29q9`Wgb|Z#GQf~)W%YktKAQ6cgjVMewaE+BaJhlHSozH-D+`}Y6d2+^KJ=II)xHH8}+?lysx8GUfU7gY?Khat%eqXO-5zxosj*} z=eSmY4oO`xCa4L;j7yg8^z>p@fl8_AjeE>CnX28(a7HE~z8TjH+9a|lR~ zRjySGmO>6(o4vPZB~@`|Cuxx|92Fm%2m2qAFY<5SzI6hKZK2}~!hoLMmgjy^m{bbrifu9GAhNz9h$v)};15&a5 zk4vS!&ii6MGhW*XY_1PyZvUzHyk}v<(Dlp_R=`jJK2~_8`QJ3ILD>VH!UVLk3=~+E zl};b27ic{3l|9g?etgl{fX1Hr`N9asvzm^)U{OTO}f!MGkLHz@y@@1BOolKXIC5CQkG1c-%B*xdD_ zQK%+=5>M^xac#+O2l?3z0kP|e)DZb&0)JpoN2cW?pp6Q+FVD2+ER-uPBr8!;kR2w; zYn~VgHv(m5arDHRUeC&GA^Ah+c1CHVWHkZP7uz;QS;_kJj6+EAToTOO=GC}qFdG)x z|Bv$x7x7>yKfvp~zq4mWR@{4?*HmOeb-CA~2zSt9Hjoy7x%{xA9@cfEi~nQC}2m_tRA2P`Uh@Vi{f>H^_entn6mOE20M62zWB!@)481R zGz#*kFd(V4l(L-u(NHuPeF`|o8o|gAa1Btu_Tx7CB4r9jrrAk=?*P~fAF1zU=SBYx z2egQwAq2IL)j%$70>cxGXVdL58j=8YT(Iy2haMg{I&X;f62RmE*EmX7U9He9U zeW{d9QP|#SvNO#$U95bX+Br^G4klR==Na%Dpr^4$2XR-!);j^k4cP<$0x8nUOK8#& zdeU^IRWyb5#syR^z6W93$&o0+Rdhi$>es3Q2B?HT?q?}w2R_KDKjZ@o3cLt z2N)}7{rY43!WiE#qx6OgbM97v6dL@Ih|1}Pp>aX{2cN(>lbR*IpO{){e!aU&V4_~IVREE_84J1V!AiwmvaK|KU z)KMVJV+aF$1bsY!3oJ>Ye8%PmAVe_W@N$q7M&&iWV>-6f$3ypTqD|%h=GoYu&0*rP z+UCuyU0ASzY#>dxtw}muOVsyEX!PwX9AV@UAaz}W;Gwk1a|gG70vo7*bS3o4fAxl zDB*rtphuA!ywG=q7n=EpVv;dMTS$O84P*13cQ`u*<}Ec64hokJ)(mK*Y6cg58(zU-Ll+8^{f+yK><~# zJrtkUllr>Vo~&_@U=E5qDmGjNBs6G!k4;qz={x`+h|vlKTY18vM5h0S9ihres(i{Q zqw!Yo7m!7|XhLur$hKKYNeM8vn}bHFPtyzOG$1{0jj8FWKNHMg5hGg=A_^j)zN!2L zOk07;OuD~HxNkQ`8XvfEyriQRzw+7RKn!4EkXoL9{b^*o*uSUXzlJ*J=Zy{u zw2lxn--zE|<%xWxwqT!A$({P4#1{K>>BIj3D%$2)85#Bq`agIi^v|9>n0_qFz#7Q_ zofC-bR21M?B50BDi`~NhgZhwYOKu|2D;7J7Miln!S&O0rUllzTleNx!fO26_1@srw zxtg#^Fq}ah!HNe)Ph@w3{{WNWeP9q|7OAcM7=0;9QYm)HCExPXRWxv0#wA6=tbO#T zzG-yKF?=^Ei#95OSZ!=@WR@IasGeFFck~X0vDRRdZ%F=3kaq3pQbH=4XD8N%P zn@pS`ThBd<-GAR-SJY8VQPC;PlCf$U&Qbr!c%6}ABvkG50o2@KR*H8uJi}{j+@|6l zc$_c0U!SHY0`iu&_OW)4of(v7eSMe-gHB6fX}l=JoC5OE^G>dJwlAdEHzGW7r&@Ax zDWgVjvPpl>SsmDW2eZdI8>EGLti@~wWL68}dFb9a>)fq4{3zhi^_>#ANpoOC&9xpvB3NLM>S+O$-3McSS#94 zpy-Wybo1uTs5a5bie5JZHSRRX@z}0Fg25aGDqC*3+oJ1iz=M$(2|UF(#%EBDJpR8{ zGPHaZf-`C|>?yVqiV5MRze?z#kMP)5fdblGZ^^C_*>oV4>4gE{v@(=2EeLnM+JYy` z_L*KR`t~UOkFcW+778l!@brgiH(mMpMW<~#`29N!GYm$gJW_;3X3gc}7ZiQ$uvXI& zs@k<<4PO(}e+nervRB+zd&F4BhBze(vv1!)qd)9wqH4W`ZsRx}k! zC$VEGH83u?SOJ*O7l#G!3uw)avOr*G4^ww4el?~PV#G}2pDUte1lKHwFVEM2%t@Xi z1(_e=&;udGGfJ0}yH{s}AA{$EoKs_2i#&ej#c2nJOnY0c4hP~?I{C7%CdCpl23g=g z=BPj%X6p&m!5bwK8ZG{wG5>GHth$;SrwtQ6LOzMCgYFvz0CK{D#^j>U>2rSm&SG1Q z&&}9ErN9u8g#E>lpL>eVG_Z5Zy9U4X0ri|OR=Xc=iQ*(xtmAg45Ok&p1zS@h9t*3^ zZ^qNjmHwi}E9|8IyIt$;=G8%Ph=4j@FmCLs@b>QL>+=g_nnW>OI{N$9Sgw&+P1Ts{ z3|*kORNPTF<26E&$JTA0oJ+<^xB?wxh`KW7NT)Gj{fIvE^vgeU-)MgOh^ZNIf~%=!QT{y_qgURQ4&+ z7|4Smy5I{eiNh|_fi!)zK*Aj;w@d2k9>rBHVBT&K! z!bQWB_5U_T4v&!rRNnvoCc)J8~ZBn zW}Avqiz?rxI^O#TYD5~8RLoA$)QI%wqgKw;0HQ7tvw3s*`Bly=Rgow^sCmp4|kl0>ictta;=A1^SWVV<=YU;wt7j$oH{5V3B1INpUHb_LPaG?6z|U?x>|gT!t&C zYk`-%f;{OfQ^73%kEiQ^#`&6go>`wgFt^3eI0YeBW3 z8n3l0PUZDr^f77GM@B6vac^WPEFMd9)kz%vEh`*-tKv!8(C9Yi`kS?ta|$V`nIQN29|ab!RWFgI45dyxJ=d6d2{o1*NRKi+5PcU;AaAa_G}!VAGByFZHBbh08@dQ=E;ix%=jrv z1$%t%wMPh`_*5eeqW&wr5fFqc-RRNLZ2{2RCoO#!SUUBVtl83e+&Lr}fMfpMsk*Y= zCqSo${J43%piA|=PWEF-d3F2Z(uXmRQa`f=r8bX`Lmv?DbObqt=ACQ$NRojORkkFI z90ysnyZ;<{W|l3%O#MTdTbi4tq3&}nmyQntOe_yXt%`&z{qCEXTOf0pTP#hKBa2<5 zUPfe&S?gIBh1L(>TeT*56BM{n>|c7xG^bEW(0(~AmAb#irphc^M`cqB5FYYAz)L_> z9#;yhzg)Na5QFW2a`LRps1`_WB!(E(B!Rd%bmRnbMmK~VQrd6Ufr5Yo6#_649u9SB z#kpO`0)WgGr3(`vL-s2E1DG@}13!`Y0PH8NhMEinAeb9oHpyHX;*Ys`Q+@Cdk7 zTHSW63qm%YZ)Rp@>TIv@z|7Q}hF;VOVqA7X&Wvc@?S`MA{G<^uM6`%U7n(xClxWfn zAuL4>6xbMfb(961n}6gL{sTv)ec2UgDAA~3G6WlmXNUM#AYdn2Pv~>;+Uz6nLyT8l z=6TX{KpXpHI5IzDdRzzl2a+e+eq7L+VPvOds=F6~mbj^euFvLsfOvA-2%=NehqY|@ zL;bwlP4iX3oUhB)0u;m&)*xl}D`#4|ZeTLbN|f1YwjCida?+u%-&4Ep*4sium06cU_%rNgr#g_43O&7;8?v-%HTLr~SHlTF$syN6X+t86h;!`m? zBfNL1fFLB8yik{nvqT~`2SLT~mr%gT=No7AN~L)&B?6KuXjssu^D@ZL+QaG>F(#s~MZrr;%m zx`%&9$GI@Cm;w0jwFN>?`-1&35V?_j6G69|Ojaf%vo_`qSD70ZkIG_) z%!+r3##d&gUnb&UJH$w&W`ubDJP$dOJ5N3Dh#}&buyzoy|6hLqQ#+{q$X_#XG!U{1 zKQBa#f#pfiDd9h$0RJ?eCF4JU&8^?A9ZGYXl980ykpCqRxxJ|kP01tsq}N@~@?IXb zI5LLKV+pQ2Rb~c>bVIpC{U=>$HLHNZ%nTLs|zk!C&XZGo0dIO%mwR+g<*TaKH8hA0&3v0kb>5Xm*Ys}59DCBiBuu}#sq6-nWiv}k00*?#tsNC-e8{&8;!2h)a}3T zJ!!ttDg!AeG9_?&e?!s(d7PQ-(y&L)cy1^K;sUS*J~c#thA?d2;@9)pK_Do7+CwpThT zP6Y=Co1w=gNkvHR${aeZ)G7hxMM%xstagH$VX>!yNQxk;C|*yWKCRA&dKk$reH9F` zs;4OB`%Z|Qh}_=a-*!pmAR?gYmyO}8j1jylg4dzc;tkc9B=jQbG$z9CQ=xhxK zkwL#U$E^ks$o?qerY1--S~=tiAes--V4g@_LoDjK4fY(WEzoKxj`%kKYDC4ve9-1V z>kq8KK-pVpn%01iwG-edu3OM-aHINGstal=sncJYq7y)X#F|?bd|n)2^vuw1z{Bz{ zp#<(od^Pl*B+UT1bznuX86Lq~$SlhnDizXx zczu42GQYcEUv>?9B~#hBPfpzEmBLgO_OgYMG!RnCUYYd+Z!qenz2G-n13=iyHz(Eo zcsLO4%3+lszI)EZUV5)7xo%^?0mf|%U?^_To}ht&9?-(q78f1lwMUK|0jj}gM`yKv2O3x=<@jb#mME;5 z6=Wne6MtRp`m$3Hh!iGnJYAGGj&y{-7#s;~RR8!i5wb6eCroDe$YHcIswQ@G(zL?eALe&e~I$AzB{-BYn=1&hO z(2GuIfKL^mxz^E0<(j=C-kq18-a_W>ajgJkgjOPU1lC*6;(YIhGgW4_-dXUF)u51e zU&5w`%8TC?N^j^KK=U*JpRj#V7i2V8r3kuAJId-P^iuCcHEQXn*UM`E&`Z%1)X}!n z`H1v1yp?Oo-V01Bcs>IvdVx{{=d7dogA4>T4}dr^N2_)D5!X2gG*VTeqwmfIeMZ7^ z@x%h4bar;0aL3kTQ*=_eW6>XLmtHEcA64hQAIhE}peGdz$I>la;whR*0j0Dg&a$)9 zA3_R(^Hx??Vv>RU8alT2oh`lg^zPik>-^CiAPVv|8Ug#hDxAn0Mcwy!{SqIc>q3Cx zg>w1bblP5JlR*++iQJmqYtGbTMDsCO^*v7V{vgCrW*M9wZXv`VQ8*E);j?t>Ae@ z->)70G_;A9UFZB*QuDYyl5vSmdm)TTdF{B~Vd1Lg|Lq`0TTN&y}K=Lc{PHqB4>SfpG@yvx=(f8w@LuGJ1KH{me%EG+xG1O%9qfd!jtkUOykdTs;}V0;^mkTBv)!GQ3w zy?sNh>ITRq&t5KN02E*-?7Tzf#LeVPkdVwlC(*!te*0|Hc?_ouI?IVcq)QTz6;YSa z65hq|BxoIjgGyrK2*Y#qPj(2#vFi~tw24@rRMB!qCMYT@Ez$-OLgHJ5=@sFg_!Gnq zVhgZJO^&m0q+%B)B+|J@mOy$Nxfjb% zgukk2!K4hK1VHy@QJ#7KwBl_eh2I>CQ{A@hMVd?hgxQq_?`?DEJxO0UNDe1y*O7R2A?VGh2t#Y%F0gpSK%(zx znI<=*Oy$7jXWP=aYGA-`hOg+(+&;^d>N`G;3I>?!S6G~^>go0@q*YS89eJjqs69CR zQ>)_KK}@&0PI2J?&AtIe!9i4OxJ>=OyftE_z?L@9EV!1)))5Fnl3KuHs(tE!IWBUY zFBNM(sv$@tJjNKY9K9rQxQMg{Q}z05uYL9>;_Ab2MZnK_kK7OL+1OeL3LFI-@DUg^ zN_*3OB;tfUj@t4Q@i{J24TAkxS-)coX9bCK{Gh7AUiKMsy|Ss;F++_Rj2?t3K}IlsVjz_8W2W=D zc&*G2P9T=Ra0Wr;i7wG4h7&Gq;1r<+Bl9CZ{`dqv!M7wf94T}6WN&Zbr;GCaGVtcR zxznP@ofD=7N7&aXFr>=2*}80`P)&OIb9{WFhNA|WE~Tjezxt@V>mRBNcm}6}yefh) zh2!wgPv;RUr3GTwOQTc3@em{P~X)lsPdJ6C^hIkiJe$l^N}{+s+3T2c=B{bfT!&--3udCw1yz z5zGL{Oz)j(H_0*xi5*3;Ck|AA=ES^+=b3`Z?Z6fUOZ~bQ+5J=b9Q#YpIn*n(GrygmH>0xnkao{SiT>l}rX+C7HmIgrZJ9HfjeSjIN@Cw+eHev-c+D~|`&>vt3 z;t5J>vw{8{k+eDdcDutU9GuYp%(ciYYZ|<*8@Mv}!MW^eTUZ;EH5{vRHCV>%+3<1D z3>^(IOo$90M*OM>@zx5v$L9BVVX;C#4LJVDBkLV5$zU%w)LvTV0Nl} zWwhLQ_VNJ$niyryFE7l1hGb||RHw(6MY#l6jV#$Vr93L16J78*72w`U+YgtT*DAH4 zYE4+Zh)5gKJVR;%=jSIE8#B#k*w}S)WVGwY$BFBk*zO*^FYWpqz8QS)bJ7?HM=JaL zxH*f{(5~R(vKRi>%v)Kd$CVz^2_PiP>e8psL3g*sa60SJ^XTo(ii+NYMu&h3aR3c% z$}W1DKI5i^M@SCb6w!Elh??mh3EAiX!a+&R9q?ky5Q4 zp0}+Y@gg4vmvOjG8ZwvragYyNaGF~KR0e0q=VUk+yRKFnva%z?!#+qGz;oQvB zeWXW-b=L9v7>Qm5xTlx`6mqChF5?v&z;7caCuKA^N;PTX`~5S0oga>XZYlq3lcj2tZ@w~1yLovt zz3Od&l#7&3(~*2i;wgfr2C0fBomWAJlgY&PlVOLRDo8AY479Y>xA+~wn39cHBrMP4 zI~T`sII=ID-`)nBu(gV+%9GFk?Sl~j-Q>2A$ZNZ7@}OwiO6pnoOjp}Bb`r5AymA?P z9~JY0uzQbw)fwS^6PFDrkT3Wxb>p`1&4-GLhXtlo^Yso+7NDJsz3p42Bugo0R_(7g zOwD}P>U{Q4hLF&kkpFcTL;Iu8<#p=L_#c#dQ%MY=_pyE;byKr&W_39n2<% z#f#SttE^w|IrHX7K!T{${=3M7zx9>k1AoDmms)t_aASA6_kzkp0PQ(ECl@Z4t947! zZze<#L<|Vhu?P|fRS2kvhf3v7WfagbED^5kkwMXyn!y7Ig22E)yLDjAIx@xEL3+yvn87v-DntT~NW9!KDrE znZyJlap53~kZn2?a)gSt%O|}skagTQB`V=JA@?u_QrCMIBJO-8YNlT zc#pjL+)S2t5V1i*Paq-0aoAx^NKK{5%7BURXpHxauD1`z^3W+9igph}gohAcB4oux zmxWvg(%w{@OTOSG9OIJhJ}C&iLkegDjt2Lnm>p9!0Lz4d6eUp8$luJl)kVzm#t8$52GSE68G@5+Uv>xcE=;kW&G zaM=)Q_gTxwQ77%i%A)`mhF@?+DIB{jihf1gBJSi{%a@TETa5vFk=YNrCZ-2FQzlnoZW{y?XTqd%iA;%O+|VH8(c=#rK*F_U8iR#L z8z-&eT-TFsgN#k(P0(%z>Lf+uVUz9Tw0yM`3KE_pTYkIs(EnUG`o) z3yM?NwG=?1%a154B7XvLoc7aLtIAtnawxa!Dvs3(Pn_$I9Wh7TUp*Uy)EboMM&z`E zWjF!S4(txlGX53Up08hn|NOZ|j2Cz+i6i#k$j6@9{yc4XG=Mf> z;6PipantRS5|MJz-2(dsdk7P|Na?T5I$=tcmGDaHWO%CZENarr_kuOT78`-l^J%R% zolM&yUEjZ>sjFmZ^=;xi%LD2G0iIt>^QCM`8E+=9ha5m4qFdbUc~btWFI(`m_de#k z1ErH1l={)swOX6;O|-)6-nVhVIov()SJ5jRRC8FT#9yz0X?FYeqj*M#wybYvn%ED* zU?h4O!Yne}!vK!in*zqI4{=8V0qQ^i3GhnjkTk5IFg@}|7#ZSnAYi|^__gk^KxKG_ z36>1UBc8IKOu)s6;}M$(_w7>;|9TW75ojcIv+ysVAXI-lf)&;7R0xZ}bZICd%_&jE z@)%+Q+-+!JFixO{L1q+OFVoYG`@TWLuFQV;aU)ZGv_Xar5G%|}uodA+kI%^10&Eh+ ziqGqp$h0DIqrZ;^UQob0j4?7rYotg<_OZvLB6(obFO>PP_Urb~E+PsdK%3I8aDWj5 zHDQBzg1iv~hxY56vdMym1L0pqJcpGf9s1T8d(96h+dYr8K^;c)9UE ze`e+T86tQ>@U6XKV>FWYz_1&8FFOGoB8WKvq4l?Vi%eR`p4Jyc{e>+t=(iz=uf(DF zX8)jk_An5CEPA8dDm_jy9Hh4vNI2>}7I|zH-M^m_@#Rt(j2RitsUMWp>AToPc=sfw zN}b_K;|3)GB>aqsq1CKq+fSFaV_z-!T)~rxBTx_?bJeL)%p*c6WGbXzxQjSm zB)KGaQkB~l8n_f(zwM`d;Lsr-6{)qc#(|&s%P6+2Ukl6)4d%z;Y3=BwCiH~5zt)vt zPYMYVz>=6DN2ao50IGSny3sG9kNwk_p)^6VjCwivA#pzTm^Z zlfRsn>l?uy0Cseg1Z}aHxey0r2O2`M>ku>?I?4aJY%+8rwYAM|sPR>ykMm=_TtW-Y z8i{Wr$tiQoD>-l7(J#SQMfOKL`zc172+uItqyVeHEwe1kjFVepRnPw1ZY+eo8YOZ2 z-bXlGx5-OBh$DvC>>J|J<^T$w8I9Yp)Ax&Q^}vL^2QV4kTopRZs0=JQBH@Kr0Jrv67;s-YmK5E zyKpc$R*Sx@nr@{uN)|KxY&HE3cc~u(LAq{yneXeavkh>+Ul7?1RxulDEz&50WCBnM zEfGE&0$O04Kxd6T!piLT;WWlbipmiAV9ROvy`*A^j|xW7OZlt7o)ESJ+=h5irv|PZ z0t${e5o~u$i`bX}K%PXMq59yw$Z@JWY#08USwS4Eu+-7{-+N&hZZKE&C^nYtgMruj zFU-RL*&s5P1M~kYE-Dg5XchDuW)BNmUmr#hetcL`a$~76*#!c+9G@p39{{+(0$+_p z-&&`h3CTc-wTr8Db0Q*J=%GY_vl5ad<-Ipp{N*xTVz6_dz3h(|$^I#_lxhAC*96B( zFUQ}!GUyNYmcgdmAMeZl=K1O9aV)ejyK?193I`vgk-t(u!2d^w{_plnqF8}e1q%y0kL2SmLWdTFrXIi-35>#> zXFNHU4T;rujB#krob^X{Wj5k30pySBtYGQR0Z=Dt9g&!F)l4Bbu5086APsX)oc1krN)5| z_lT`Em&WeKlINdni`Wo37uk7N#m!N>WX_Q9NOtSC(A&Q4Cr?x*Mum_q$e~I}@oidT z2hSo``O5&FcwghohBJG9fUmtIu?_xdybENv6$wfMH-6<1+}41^z!&Jaoq{daEU-hl}h6q4%w z576l{+Y^lOuNV#rY)&vK;Yv+XGEEPesZZ{sP~@gV@g&w2nAQoPEXoW6J_IOacd-^f zp#d@Q|2)r(_{>^!rMLt4Yf;s>kXV6lhHJHYOP`Oi&a>Nl)kPpU<4IH$_?2?4kjdC( z4R)M#v^x{3J8SV_T6k{++N6c{a+0*2`rYf!>dM$E4cIJLImg2CqZ=$ee%YE-lE72+ zmwD;3d+}^tE}Q3tCfqRHF6V*l3AsyvnMpQx&2UT7M4dnu{pGvbkh3wm8?I$CHrWBR z$;s(>h7K;ur|D}ig1jX`PJ)b;L_9nBT@jeugQX>Wb-?&h)8o(7(ddBLkBck&?n&p* zES2#pb%Pw!-Jr#9GcKVDylF>up9(myTJ3ZEkJ0jiHTn)zu&aO3)f5)HhEJVqq2ojj#K1`IE>fIM#I|X~m1T zhrVl8_7Z!PSmwvwYiiACtQM{EoIm5Dg(CO;7o9(u?6^j98N!bi#SN$I<=(z&Xc{)= z)Ku{^r3mL>SUr5T(2&Sxu=5z{Y(VHvKw;NlS&7-k5At^ks0@^Aml<)&{w=D2E#HA_ zKcp_u$l2sI>xetXtE8aI!R4mKFJx!a0I+7*k+J?k^NucLGh=x*$^;y;Fg4*my;W-t z1GOodXW}LNmxGO7?N|Oz|8Q*IAlw`pFa(%ja}YAh5QguAKhZ~_m}#U`fgvEN@&AOc z4;-V1`&{9O#tZNZ{bqRw%~ubiwb!W&G4+V1Pe+*U1+1dDG-I+l6XqQmaYa*vjmBig z6IID%p*eD#Y`;Q;p|JG_tomDv!#>wFc+|PtZ47V_(Lmha`iURvA(~vh4lrR6*3ySz=>v^VGmaX5muw^W_;~Kw}3n+0EWzb0o8qBHMZ8) z6_@h6?|iW<-hx}WCWNB~a0(|6+lnWwY!jtpo>@Obd?}yZkuU2Na#8C2QXyB>*#2@@P+!BW;<#x&1eWgNlBZOeCkZ> z4#9E<;o}Flp}9_b!*QbOX+&JvYJQ&fpMHZZt9=<6`nK2N$+ux@D(B3L`5PP;W<$VT1YSj zG;weo8rX%RBfxn9n+in;D%1yX9cM8*_@O(?VUMWH`~jx+{6LrelGxJ ze(SIC@$qIRa)pLowTl1?kiZ&9pcCv!JpSZ8yBVPFb^cods?B=2IOd5d`y4Y&(E>wDT8d^ZUxLL_>c*D9Kh|HV8c&YU;c z^3M|OFgI?BcSdLd{uO;eeI@7U+x13#Sx49R(AmY)ttPUckfUQ4zZ1c@hI)a@`*5oO zKcgp>N<>^s2-u}VK@P{s+e(8`DnA4eX=xX)HhqfViQvwfhpA7VJeAGDe+6jy)eh|K z(Ke|%LZTI?n@&Z#Y9|ULvbAb_Y&yqwtaDGH?tz}FbsEF;(^5M@H?;jAa&7%np?)>- zEv$fR(!_O-n7!;&{{3Gqh)hhaB$?r&IFoD{0GtwpRN*c@xjzbB3*UUmUC7h^VXwf9 zOAAb~>M9TcFhogkVz+@RBj87z54=!baOHtKzyOHW2ct1M20Fayuc8I8vaKUpl`sa3 zM7>jSj($;6DpnPxn|`gb#`>^=h{S1H1ihmj#xVma31E(hFtZeqkpk2L>=XJN5JS+Z z;yXiw#;q*40cvhh35iomKk2md)FK>rA2d|j^wq{eD%NEJM8v7JT_4w8 zbi*Z^Fj?s9$+WJtSq({?E3>OBJ%8b96kd~w6{rc#V3v28Y15s+9=iw2i$jyUCa}6j z&nfFAOE_eM$lA3Z&B*Wj7%z)aPELD}XwpE@g54%2SqdhlG~uPVW_ap{h6*f4Nf0aK zrU2leV#GyF)D%EEP~!ZmS4NMGgH(l2WgXNrWH2OQXINC%R+E>Tdn~E#SfYWO{$S!} zpEu(!r4M6;#-6NosJPmAWCJc(a^Lnfmnmft`^VJ$WBKHR zhg_A@SxCbi-oHon^rg=QzrA_x*XCg@RobUfeHAOK4Sf9T$2vy%o|bOgX1rpS`L$A( z0#9ackUTu0>hxaN+|a&Uezx>c>=w8XWs}+xN{#f}3h{Jr3#o~hV1A;e<(%n;P43Dx z+tB}@l#uKWK=o*L2(5YMOh0KA(Iewl0Q7+f0HsG~cWomoXx!qYlWAzhi6aX$2CfJV z^R~7@k&YukLU`cw=e^G`h*E?agcrU*Zr2>>Z?sY9SgP+&pp2nApZ6%68$%T2w;4CZ zp%a4og(gWDb}_005gNzhWOjCPW#R5ZLK!$H{0wM<$eBlhb1D7WxBjAVWU=K#h=rAf zwNTP^2LPI^8tw$Idv%N?KH~^F zch?L~xsuo?veFIy7tiWN^eu${CaaoBAQ;$vC1Y6bZ&r~Tju4on09{coBzda+1lu7i zU#W-RNy944Cs5(2Us83`bPIt1MuYA4>az&imdyf5b#s0zjpUj^}xQ4;qz1P7of zm8I^!{EVbCs4;tijq~m04z2(4q{Zff%*Wz~!^1mVYTk;mhh#ZNhzgm4!RxI?j>D|8}w=p)B~q!2lGn z@6ACtS;#yfN;jY~=vL852bP}tk8%yBG$O5lQP2#`!#_9yp-x>7GO~SM0GvfkP2^Hx z!JO6UQm+*_w7`UO&3MDSAX7GzaXCEq23F5Db#-|(P&AWAf&r!C+(!0F z#wPxHT8i$5d|$jTB^NkO6&ePMc=S>c-Sn8(>|s1@kq3X9!KL@rrGE=S8HtR8jP8H_ z{K=`|ia3MQe{{a~j2X5b5g^EZX>KA%xl0Erb->HMK|?_yyd-_UegJS9ig>kGKxE_x zWZj~Sk*O6cpYkt`9)Zk)0RL)y5tlwFp}!>9i{!PRdWuJQ)nv6s%uiDQYF z4ZMI;1Nla41(pt^3-AoQ09!(ai(VH+5h!ByJPXf|K8gNAGY}Xp1zYM|`3~xn6EajX zR+-lnc88LMh>)w{Bob{&O+SPC8{?%8NEuonAbNe+^OoT|zn2$? z&4kdsn$734bk~qCK<6(w{E8j)if-8?!xDzXx1n68l-xc*Qw-c{iGpP0WwHzjJ-8zc zjt>y$OqepO2rm>pBtFVxP88ad>(IdIl$f3tBr!i-PVGhoqnX9zvnp9#SrqG5z^s8X zkC&wDB=>cy#4~vYLg;9*U7)E`fBDLzNaaKgmp`3WBy$r=h^1dWE0@|9*XWEa%})Wv z7z(pvm5>m_a)Dz{)peJ}t@vZ_KqZ*voNl+Z{GgPStQ_<&SRS(GHIF+dl)Kh*;7oo_ zDDap$o_()u=bU4h(}^`Lfh(&q*GBh229`#s1!#U8-EzS;t;cOO9M5ufP@hlG zst>C#0nnip3$Tz#LJAqQ>4SYs~?n3e3Aw4ZNw#8=ntX zN+cI8`-ysW-@o1s1=7t?Hr7riyF?vR+ zFm8=ATv_oM1Wbft1X2e*1)0`$--qKN-b6hbAF|sBv=C`h`hl-EJ8_(?+nt!W-j9kz zEFd`HTQ!r3;P3>{U7{lxFKqOr0c%q}(ob?(i2$yAv3tyZdZ>vfYxD{UKtnwzvRcG0 zoI?l55TYm;0&6TW5fWW9+-uh{ObDg?w97;CIL2`xI}{Wcdq}W5NHCL^zMMu-VT`{& z&`7`a`d?e#r=q3LG(bh6g$rgsQuLiQalgI*l)vA3a)pw$u-&KT@ST*D$;-#KC#G2X z6})KIAO!)FZCb*N)(DEXo|wC|S@uRFO9+8R@-I6GvMigZ7S9NggT_D(+USYOvv0Ft z===m>cm_0q z0g$0;3ivgTCu*4D_a-$F9~nLzC^N}s4Uf5AUtBvBe{+Zmf4{YY-5y2FR6H6Y#ek{X zmAz&U2Pa(kSD4Y_VN$_JPu7`Wd%ERQqyV)Hmwe~tFk=0kXfQNepfwQl!t!M&DX^C= zk!(mu#MunRO5xuAgQ?;V|I31Tq_ za?>|H(}-ohGr^|8&jZ-1X0*BFx(rahL`a)L9w)orh?e6?8? z(`FwgPAxaV$;iO(ifHOVxuGyCT3Q5^=U zk@5TE_Ve$3PC)mF*T-aS?byJ8YEfwq_EwIYRnHmpnhCj!`vx}<5ab(%UcGNE;FrPD z36k>%89sDLp$d-OTaMtd%rhXn-w?st7gT&~7X>n9Awz^hrRfpwK;YlNxX@byq8dJL>s1ef!Zb4kaI8CH&=~JH0 zH1E9lO7GP#sKoz;PYK-dN234j8Op>Wb|>R4tiaD7 z-=vklLHzhu-uwPg1f0W{#|f?^dv8F*04@3CW=%RbssD|SWW*&B2J2s=PEalomIu!A z2O1yR7&rTni_-)08{C%`LBxIrmL@~zrJ(P}x1QS(Q^@~2P*ree_inR7cOh)H@lx_h z(5p>iPYhGM%t^aiR%s`c(Rtu_x*8cP^EQSHcU*dECD>i+U2pah;Kt%^N+zZFD!$D} zO+1&5=hDR<^>ow!u^Xg)0Bn;6mlSyJe;m%${xztBEINncZApAX(+dpR&ADoP$FPAN zPc4>>6}+fLF5qpFHi&x-e}nv-#KeI|(O8(W5oZfh5gaZaxpaNBxZHHtiSow;bayeg`juifEc=Kvc_sv`}R842(*63bu`-)}u-x zAPt{}8AdXgOR{;ibZ{S{>%t2s4fPZ{1e_u0tI=)+a2#3lWOrTle&)Lj6E6!4SFz4# zJ*JCrn~6%*M7F*sPr0#tqmt|jU7Cz67c3Nfh2>MT=F|EKe}K~mmeP41l>#1P23T!WyFF#j?&uwD^(Zhs@(Nc%ZZnGJ3YcUwuj`k}hqhtGr6O8yfmN{ZnzH zzgR{6d73X%CKt01AHzwYfDEVj=rd=o`0WoJe~}HPPeB(u_x-&?j*n9R$giU)_g+uW za7*>_b-Vw<4;l?^H~?}RihvmG4n|9hcMYCNkWht|%<#CQtHHg5M+?>^Q1ZBG{)q~N z_i`8n`+QNQs=xra-rn?<1HdW#-|g~?g;iZz_C^-x@&jHcE+ad{8W_3Zq$RkPk{f=gsxw}b+y8dMKR!3qU@goD!u`S9xC+dft>TK?_zvaE* zsqe?zJMyU4lthZKVf_jCx455j2Z*Om$iMLjFc zzkg!8?>)-hn>x>1Wea_oVogo#yqHKOlV;NTq%KsUyw*wjKrOw$nx?kTpAV`XzYcEQ*ZCq;`kAJKzp0D) zI=c{7i^S~5f$v1AKZ_W}sBlMw%L=Ogo|i^p!O4Mu;Wgx8Nncd_tNTWIX{e~E)QydU zA3b6L5`%sNRRz~U0))1p_YS<;y5*Fy@mEK8?QkWrZkjf;Y_i`1WODmO%}1MYUx8i4 zaHwu*csC(|^WDH?+UIvghU9u2UU%;=rxPbOFZ*)q{T{WAp7A5f+hnbtK)PWqPRc{0z@aE4s}-z|ZuQS?-N0Pp{iq`blMF z=Mt8*`*W;}`#xSMEzA`ai&9B{dld)iX+Z%q!sr%aRx_bZDJBI2>$~l{*8zvEBCBs0 z1a$r;n1P;pcd`Td+MHwyRd1!Qy0*3t*(0VLDV$iCrfAL|HAl9Sp(}tTsla7|6TaR< z?jr47U3ZaPy~rmdv}N%#Oa)87oy&`V4>kh&QqCP7E@)_ciP9eG$PN}v5In6_o@ zk1fv-+E_@*vu#u1`?oGT%6nE1+;Mo|U)}k*Un(x@-4%=E)a2`#SzE=UV@K`Zv8hjr z&Zww7gwm+@O0jyXPW7}g9@}M4&vR_|g-#DlR>jhaGNFONhvwwuq?c{>UrtVrWriw{ za0O-MTT7E3w*@%(AOHYN{e55nm)b7;-U&+iYJBT3O}=?^0-5K-V$f%zJpe0DjVK}cj^)tDlWr?=-aW5WJe4v=TRPv=_ zZDdl__|!Bsa3kGmZq|4Z5n(pbR}J*Mg&_leAkcczGh;?4Pp;R_f2+Q~B$$?j2b3@W zx;z00$arQVMRwoI9r#BphZ-V2e>NaufH%;3>>K2N0ad}$Pb-;9Vv0_9_3BU2W06pW zaU7N%X*wBiAP)CM^D4*sNBemy9WbT9g#|akv#+RGg6_1r-|OHP6qGYH-K~?Zw+1P_ z_;87I2{F-M(k%3K6N9C%1mJ~+nx9o*&P(UOTfcf1vql~=PcvUOPg$H^@cR>?8`wA_2!AJHEhX#b>WwXbrW zsI6?p;-`kq4?grl` zT44(d3*=It(#}Sj6eNvgtiOAg8tSp{gM+deIr0>dP zOHw7;FicKP7UH8VG0v)}mGt`Da(Zje#zHzg%Ja8{FV*-L{Wr537ZLHNF3N2k-F1)#z1BtqeB?x~aVdAQd#DXG7p7pm(i|QnBV)jQ}EZU!)oP43E&Dz!V z5c8cI2&U`k=$I}!jRgSZJ!cfFB(cX~Qx7M?M>OarHe+5u`0X)S*|ij?9iFP~`Wc@d zHZXK!sT$m0dI!3`dd?alZ@mvoz#m?%#%ii6qJ<}e1=(ni$&G8v{3Dz;601j$GNP`& zaN%_rkFuG;vb-4=ekd_9vE-DL3V1JqQJ5eA29=Kohs0BrFDvQ z?%4{Q8k6@}h_Cw+k2Y4vJ1VM z!lJKmhh4Vc*_el31*=D?hkXlaeBNIVk|@N-$$tL)dfa{wB2v}U)vA`fWMyyJi_$y@ zk9aDVa(90DM<9Nimz}8MYG4nLxl>ZYHZU;ouC_KR^AFAj$i+=PHWR?R3+#I-8y;{y z4vUJ~grsl0{&~gkm;yZ{H2Bk|jcIM0fzmz}DN*134_}2j7MHfdnKQl+W~-~yqEjRf ziJBS(JhZsETie=HK zJg%?5gHgypuC|I>yzMxm$xUVkA+rXWe~$PXNeLar=FKITaav+%EYOb-dg-chF+S+@ zPsxvoDhvB?QN_PCCo0osT|H7=y%`eEcYTh`SIiyh*RBN(d#QcZJk0)6rcoexU`R1S z!)LDj`Yc~tDXB?ctFEqI;l%v%O2@A(r(BZ`)AJ>Endf(NH>pvE-ita^YTQV3$050@ z@8_378cSYWm*L?I_J!S|QM?5-zJ@o#e5dZW*&th-sY_U*u1@KEoM6tw1}xjLm;A{m zAaLp=+vk;MQjofRl8wyGJxEVauhM8Qz|VhEfg3>OE#!8fqC!C(8WC}a=o9tz_4nO9 z>V`fv%-8%RE*e7q849EAVkh~bX8X|Cr>3Q0bw`CLHJV-&Q`pzJQgv`~<5Zw!1B=!& zCBF6sg_5!|`Kl<#=H}+dc<%#l=aF~1ydUGlOPx>aC~v&DUumc?&Ao@o*keMTEZ2y= zs;!Z}-S4$|U^NGfPJg4t;dDD>)PJpbVqr9kgkn}k0+@O6n<-0# zm`GeLUmi*j`@zY@wHDQ~)ka&(|3l&C^|xAtl!uSlUHOu0y**vWwsmJ51zEk0#(?Z% z)c3n7XJNK17?ioX* zg9J3%O7(SWYRC3;_aEmBeUgx1RwNG}bez{lz}s+``hpur07LyR%X+%98IJ1(((iWH zTBAq73<~Y(?Z1xDSXEv|dU|ph0s_E&h)+s=kHhoS?&ov?((ISt%I>&&srKP!Gb5ut z+csKyD#TJV_(`*e7(Dy{fo1b9u&i*6|A(zXkEfhC zJjT}$tR`f2E=28i=S**%T;JkYdC1gYqc7_!tt^73MD ztC+qGBDpP5BU{khH8Pe1d!XIl^>C#~}|<;#1faqq{Wq52=3R1VNuS;=Z@ZpnB> zWm(_#nIg2K135OWm&9Nv9Xfq+^T$zNbhqj{sV7ZMkG~(25EtKE?3qKCon9inH%z;h z_sEf*z`9_c0Eq;^!rIyzPX;bFr~}Al56@SdO{tBrA>Oh#`64{#;`kT;SQwJ^!^$d) z^a&s$Xp1qCqc&a-3!{4w8QF4cf*DGE2s^IY%`<04h1r4lI{Nr>(Ut=Za;J@f%FNAr zug)Iw%xqxnVf2PKl$1Cx$n2p`dO!RKTrXe>s<{!}@&N5L9Usp|R1Ga19b!8npP=gF zqdWhw^gepD2x3PaL>Ip2(^sz;(WSSJ9J~QoF-F>z4kychZYKZ5i)~~b8wx1>Cns#J zxTg1b70s=y>f?5(1MqP5_f-et*D>wpqLXGHyV4fVqOYIuuxBg9-M{mPnb}P#u|yW} z`+mg3y0W}DJg3-l*|*)`Hp&zaiO?42}e$yvicBP{?1A8Hurv|U3B{cQ@G8X zPXDsJp)#&x;8t{d^r0mz{OU$V|7E;l{UmvLq4pUpZKsxbBf@-BEPzQtxP@0@;>g3E z#$of1U%e1RzB4h=;$D^YbA{ALHdgTFhmbcyOX~@KDP)|$gpWsrR6o@uVyF^itWV#1 zG==jHcd>v#@$=NC|KDswbf~abg6BA%5xi{s)k9NVoortr-diRS+0%WoU5S3r-q@nT6+Ed z19wbCk^2akn8bl4wa70SoW+3L==uAq9`@39v=?>%enIyIL!z9%ey5ms&qeWm(zyaq zMUu>$;5{0c5Adixs0%CTMgrKj<+ZmQhj@I{>Gn+wm|HzfNTBRvb~X>V(=%qp?7KYt zJM+VR!A88p!xJvJJlWkWyLpI z+iNSs?(f;tV}*psAae8I(~A8pEGe>w_GO>_f}OoR@fRdoSg7%9?<+Uqk5URY)ZYQj zI@Hy*>>1qqNKb+l2m>#E<{ySa$KQDzoANQ+!%PhYj48^!Uhah^$4MwWPqu!Yt{XW4 zFK2m=clRwC$8Ba_P}KRfj|RE(WJ8-oylzMc-LPRRd(4y*bPuQSh09iEvYsL)Bf%Zk zDWaaM7->r*K1a4gSJqKi%H`^CgSH~LG&%urz45qn5T^kd04`x!J3G5BGeswiyVRAh z{|2s5^4_<0^UA_Z(|Iv?#7f`G>*&bnXw%1!*Hcqd{o3a-SpHZl1V#c}aW(1a@7YB{ zBN4O?0+w`ksi?p(v;Q#6KXZ_39day0VfCx1*uCH?wpER8p94IGCsG8DA3uJyJ>C#0 zu$!fJ)T9}G4n89OmUZ#I>}~Etur7EYX1@p8~fUB_Ljs zQU4L|0=AdJMFBSv#Q!_8wyvYp)n@d{DH4s5q}y>s)RIJqBfaYQ@tRrbUkh;B`ROp`(kytxq51K^L3^0O;KyfC*(|%RWnr{OL;OjoX7ZslW4n!x;jl# zy?1Pb=(h2vy6q50+{tOa@-8sI z%&SpL&CrngT#irpzbP8mao^|Pd)q$Bs-8%w9Gt?t;DE3aXzp9v+n=VVQ{&DepN5)= z$<_=VD(vY4Tr5g`Rr_$W0zbV~*wCh;lxIWXzpg2o!#!%XNsfZtxFOz4=a&!*#)Ro< z(4+elhvz!{KeIf4*lGG7bIl27M#K7jGPwQF&W5`@mYrynMY@E(wtr zN{PhZ=j!U(m0A);vgZ-dEH6*ea-`WCr=@$2?GlYuaV+jWzSr=q1k`n00h_M zg*?dUXw+qvwxi<)_+@`cU!I6KYj^zo`Tl8dva5ptIQk*hnV3A(Qgu#qR0aCt5u&E1 zsm`-`$Q?{@T;R2L7YeD5Dawf_Kj2Bu$QY2itG|z?W(__TO$r^>{zQqpx8MJ5_MX;H zZ9AjW-fA~6HNP4awKuh2>Uk8(ykK>SIxFj)yl!?KM8blATZ#hn{_FrRdO5tLh#) zd4~(uQg#R5nC4en=Evve3jP+V4GZeLcoNCgp#1Tv=pRb?JvATJXZj~EHL^obVn>xh2A8{2jcN?z>tc48+WJv z3}9}<3l)fhch(#87akK(K)}>78Mg>^401txwzRZVz?;*7Jwg+QJdN>#lud?b8O~(e z|KQD0#FDT?jT0Ff=(M?nXC1NZiJ9%q>({$VR~oM(rjpP1UhEi#8((bsPVD>B_z}EUDS#d+wM|%Ck6bHmO8j-Z+fvqA zf5+rhVH&>zxQLC&%fSBOjkdPnEx5pu*$KrYKp~>%Jp?UtGK=3fMlEe^WSgJXWx=XP z(wXw@-CIFcd7upH-E?H#omr&Y2fnxbuIG^I(NLUMBQYl7Rp zpo=Ce-0%yNE9Pahjs}F&SPucSX%!GX;?2O6bE;IB^=8F4$1g1@>%zd_V<2;In3&F* zkJD0N)b#J|L@DY6+5S7}=m+`w=8_V_WNm(WhT8sXXYN~5uDx|jlqJPtZ&cMaItS#i z>E+w)x>>XTV!{@F}I>^V%pl{ZY83p?Y#pYE_DNydcHWbCk;|z;@dpOyncRu9+>2w z_T4-?pE|Hn_sdzQuq5KNZ>D(ql!b&3fHp%Ic3q2=F}g%9(uV;%cuSFR&+@{oxH za71*`-Zdn{34*a~xU!v1EHku4&w?MtlbWS;B|wgoo{kVb~wa#%X+tUK7X;XU1n=RALe@7-HxfzHbA zQq9-@W&*u;hu6KLRCveL8O2G9>HM4R*zE?pK`FMIt%~g85)x}4diYHuBP1R`+;F+D zFsuiT*KB&tW01PHE%1E#ye0GcoxdW_z0_AXFu2pz)uDTgmkQ7F^hSxJ=tD`f#>aO| zQE`)!lG44%$jI@nU0Dakl>N7b>EW;c30c&^kph*+8(>x&#zVsGaD4I9`IO^a6F@L& zkdr@LsmrB52p0v}SVg28adB~e+x`9H9w>j;9IJ)t!hYwQB(&at!wDgD8^;dRed)Hd zzrK(>TaTGE6N^L^hk(DrC=#?uu$PvkGka9D`&95b{F^aFm-iul{N_zc{4hXt&aCq9 z-5YNsPh)ub#~@Nd1IX&(_N8SPo*aDO zDRhGFZqUTSXOXzo;l4Yp5q>XUwmSfc11t^1?c>wYz)^p>N$Zq*(ybQ`y1+_$bjH#H zGb_qy2hhn=p*#pWzI~(OxTxy-L>sZqRQ)Z+j(Sh-ncEFKk$F z9d9ksUBks8d;UCEgrNRS&>({PIqNX=!Bzf-e3DH~wAXA~)b4o&dfAJsnQVBMCg zP0AR=5>ODwA2MnG@}=HQtdAbU&{?~}|A;;t-vDZHdx$JL?th~|AlB`_2J+X{flNs< zaZyqJOG_TWq@Fx^LV)La zPK6_)dxE`bFht_Meq*lG)&5-W8P*Y1Z9ju8io=?VvjBo9UXxZHKHj~Fbp8+I?rsfL zICv;5aaXoggB07Je9xm}suWtUR1|KL%f#`gUH+(k*>w|6It!s*sfV_E_wI%6>dpB0 z#xB9!L9Sk9pYOXxU2hhHk$Bs47H0D;Y#}#m53bqMzphf0Pe{8aF$`>3Z(lVPg!ZUy zkWE!D#rgks+iHvv9=+FH%o$?Ws$f} zo1Z4XfPlKbzCU*5uto|Sk@P%=-(82$uzwn3P`1l=cgySxZ*FczJ@5sf4Z6i-X6#B~ zj6uXHYkT|g)Kw^D3ZRj201MhUJa%4icB_W}I{t7vB@4y(zb6!NOo5Gp>_H%U@E6bj zW9mD=x!%L}RT?C#LXnkKsZb=5vUkWzMn)77qG%}DD=XQAva)3>**i%>QdtQ}kp|&^ zf9kyN|2s+V7?>nB)^W4upPS*UG9{2`4$@Gv1UsT(-@7*T|d4z;GXk9n?u|F83>PI03l!&OIp%x3W&xyT+e&W`~nP^?k);ub1@df;#VxBua99QwVl zjy@m%X4=u*p8Y{0%{DVPSBCRLQ?wbI{nfc0`kCP*nrX%5{q^o=-#(SSwLe!`Q6rw9 z`A8>JX?QOGGDc6mM=llH9iJjqJ?Sb%$M_snqF@l?1j5f@adFprvYCN*AKXr|II&g& z-W}H=_Cyb>yW-b7z2wdg)p|F#wZT)Y4$plT06X})eSoi-!2bP;c;PVorw!2U!}|tQ zoOHk>dKjo#YHlv=9=+^iE-s?@Eo7j2s2VklKZo`2aCVP2Ktdovj(-B`6!VHcLjVe7 zk}B?4{49c^7<6@Y`<`68V$kD$vga?l0v{|3#yG59FNRFh?*pw6f~zoA6B$163~<*PZl! z>Q|0Ns!$cHZ0q&p5sTa5DJu(rY~*sM4#eDFp#nNH)*5MMT9nhZJ10&03`qqovRM;6AcVH4?MD3kZY^*vS06&ZbBvXCHjbgWGOw4h9Y2>QxEs$^a{9X=~rc0b*%wZ931{gHs$3 z_CgeVJnMuG=&`)06OmCmh@%gIYya)H-r`CS&<<@o(J_Fb2oHrVTeq4`ynINS5R5I` zw{O=xdD0U;pQK{}r2+qt`Wdiw4?%3;o&l_LC@s#OB--F$6B{{x0KI5ZXH$*7^p#h& zca5O{q?Z5lF;3p5D@8sdJG&kzxgzA5V%fH*4GkS8Uh-a_P&Ex$7@EC+;ef;mzXjhC z++Sjsh!?nPaBxS_H77ViL(*z)X*qhbx@qJa7QbmX$3{nw{pEUc^YgFA=!dxrE(>!% zW<>Dy!J5V}#i|u&5Y^Ujb-)N>vdBWp-CGxXDvGvk+t%>m1HGW0tC--2S?O2#m;@1}0q+VNdwmUb!e3^VO%Ecx4!CQtayL?I`cZ8Ec;_H`d zM!v`PMfiDNSD(JUXj%BS_xI}KGCwmboilgHI)~4k?6bcSxx1x~xRv3kG&5}yqA9T- z3;?ygku&Qz7n**XV(N!Bx<;pEkky&da~4IoaXQhTq-SD}h@~!oZvcA~d?((9!0^V^ z)wM!26IM+F(@($H`YNQ>U^)wh8&1f65Bk>$Xz*Z!Q1KY2d|(+KO}AT}7N z+dylyv_<-lB5$1_It~u>D3UU$$QXvfLLoPrtW$7+b|=}2#bFSTCrU@a34nv~Qa?jE z$97~Lb}-oM6FMQutRD|3`H71U=Gn0uH>CJYSB%h|6Fxy~L2SI&43V;c41jf!+2PBd zS+L=fme=uiL4_UJX!=XWh;B)ZcXRsk^7AX$6QMfjFEIu-;5Oq*8Z_=XG}T>ZqK3E0ID0#H!}m2l{pEeLwtM9J%~nhkhdQ1|LiyABOuq8+8u~ z=HV9leI+L&!_PY-JS0Wwj(p(c=7n1qgjl|x+WV2i<+9P$u141hZ=U0C=YJn5qxF!> z7<+a+>llyMUQ7_LE|<)h7*xBK%k92)cgocYA&Q&eeBSL9Go{H$T_>bP*Pm!;-JPbs z%W-!O2=T+gerUE;_doFhn0Z&}ffL99simcKG<9g2xqvwB`&n$5lW#b1roiyNUK9|% zhOwvq_a8rYUNF1cJprehq+Ag;4h~=3+}^1%aTS^7>jwbMkxrB-A^@=g)d)fPn$Yto zE-ofXF_V+z=KUKL2npn^bGJHqZ>g!N9SE7Ypn%{&;JwzFt}N&idPNzuja?WvCMRu3 zM}^J{hb>u$0wsEDf2FqihZeVo@oS#!KjrYw)4~G*pN7;&kM?BS0@J%;ROQM*WZU@; zL$xgOuEm-6>cCmwgFlQ}5FQu~7#+P<7MV7l%(*l^YrP-4DLlWxPr9qYCPPbsN0lmB z(+|a(K-J#06S8Kw<;~5_$3UvU!HgB=@YhIri0WVnkN3S6f*1Hl;b$n_AymeHz!^Th zyTD00Q)hLg$kQTPj~2JDDBMCUL5@!@?(V~>7+<-zL;mbpUc$@GHY^S(7A{JvTD%ud%=4utTF3lfrSV8Fg$Q7|!NHPdMrF(RPoT7?d<%9%FTVH%r&?nv%pp zaf+!io)kml*spPG#n8K;IU);U$ewZga4ZSO?UGdzxnEE7lV}2o&ClOlc^thPp}@$< z%~b#v0j|jgXudF~9265HmJr~RV%Gl!*OVamo0+4mk{${pD7mv_jQnSTgLOv@{9W=d z^ox)O1Em*Y{zi-jq~>Bi=kMsGU=LB;>L-YA#>kgG3}?snnQQOsKvw=5RsDxI+csEX zr^$_ZT|v{QY{a!OFZK$XEn41gJB=N*>#?UK(i8OIEWvj*fAfSiUDAzo7RSr~vb!6~ z5VA+b_I87J#3pR>y1v^EMy}ARJ$H?t9#4i(`PHinL3a1^wrrrxU0|zzFTGT3^m_(1 z4}h~t-p{O%CThe4YoA&jN!rSwQ{F#OM;s}q!$r#O}==wbLU z!1f3ig=Q82B-OAu)}-A^x$)wTt1*bcaoJ*e)xlyR-j*-FzKsw)XWpV44x2J8oInv| zU%dY@8PUFA8^CoJ&?NEQMgSSM1Sp_ew{8Ut7N7fo)>{VrX5jk`Xq{fXdk1OATEM2T z(%6O!^!)RMUE*E9_-Nk;|E+N-A*ManX5uk@lf!% zva+MmjBQcBu=qhrsbGDo(~sw9$8VcO`+aoet58aGdGN9*(E%`YN?OJ4Av&J}K_fRx z+ve-`*)^Syy%z0?OFwIK*ddhBujLM-pT9CU6LprY%}jes*dJ>JE337=-`X4DP@JC5 zEOu{wE`RDdM!(D-K85M&{F9@}*kEBODt*)mx4W56^hw4`#nbZLam%m)7hIW+4r1!2{J z+C#azMwhCV?3)lZZYhFk=M3ILj4<9t`;zRt#=#GRa|$R-DHu?I`ES~^iOiyfMMXrA zS2}<$B^W9pRHqbFUDbPn<@RIh-1y>%*)5sEsnSxI^=|!}Cq`~D%0(9N~pFJHEJu0eTUzT<$y znN&KmA%}H_mX3}WNQN*9_-{80)EDnL*hZ*jq&dN`PG&MtXhE!k^Qbv4KDoa5^5{$n zef@Ds37{u(q@l|z8}ebz$2frH;0IWaBO0U*4Jo?XdoSi{GwgO%f@=rQdzlsKq(@{H z+{h&OjBso6A2A#Ou!bNgvXF$W*4Up#;O>O!1`;Dh#9}C*IbxZ4?p)!f2W|3poGtTX z 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%0DxI0528@svV34y$>|1pfxuwK7QEuGE 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 I`SsZU1IpPKIRF3v literal 0 HcmV?d00001 diff --git a/frontend/public/assets/vendor/lodash/lodash.js b/frontend/public/assets/vendor/lodash/lodash.js new file mode 100644 index 0000000..4131e93 --- /dev/null +++ b/frontend/public/assets/vendor/lodash/lodash.js @@ -0,0 +1,17209 @@ +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.21'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function', + INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** + * Used to validate the `validate` option in `_.template` variable. + * + * Forbids characters which could potentially change the meaning of the function argument definition: + * - "()," (modification of function parameters) + * - "=" (default value) + * - "[]{}" (destructuring of function parameters) + * - "/" (beginning of a comment) + * - whitespace + */ + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee) { + if (isArray(iteratee)) { + return function(value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [identity]; + } + + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + var low = 0, + high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + + value = iteratee(value); + var valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': '