├── .dockerignore ├── .gitignore ├── .gitlab-ci.yml ├── Dockerfile ├── LICENSE ├── README.md ├── index.html ├── package.json ├── packages.dhall ├── screenshot.png ├── spago.dhall ├── src ├── Dashboard │ ├── Component.purs │ ├── Model.purs │ ├── View.purs │ └── View │ │ └── Icon.purs ├── Gitlab.purs ├── Main.purs ├── Moment.js ├── Moment.purs ├── URLSearchParams.js └── URLSearchParams.purs └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | output 3 | .git 4 | .gitignore 5 | .gitlab-ci.yml 6 | Dockerfile 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | output 3 | index.js 4 | .psci_modules 5 | yarn-error.log 6 | .spago 7 | .psc-ide-port 8 | package-lock.json 9 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: node:10 2 | 3 | cache: 4 | key: "gitlab-dashboard-yarn" 5 | paths: 6 | - node_modules 7 | - .yarn-cache 8 | 9 | stages: 10 | - build 11 | - publish 12 | 13 | # "Build" 14 | # The goal here is to just check for compile errors 15 | build: 16 | stage: build 17 | script: 18 | - yarn install --pure-lockfile --cache-folder .yarn-cache 19 | 20 | # "Publish" 21 | # We push the new version to the gh-pages branch 22 | publish: 23 | stage: publish 24 | only: 25 | - master 26 | script: 27 | # Build 28 | ## TODO: parametrize the js filename with the commit hash 29 | - yarn install --pure-lockfile --cache-folder .yarn-cache 30 | - echo "" > .nojekyll # Hack so we can include node_modules 31 | 32 | # Configure git and ssh 33 | - mkdir -p ~/.ssh 34 | ## Paste the PRIVATE key into a gitlab variable. Pay attention to the linebreak at the end when pasting 35 | - echo "$GITHUB_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa 36 | - chmod 600 ~/.ssh/id_rsa 37 | - eval "$(ssh-agent -s)" 38 | - ssh-add ~/.ssh/id_rsa 39 | - ssh-keyscan -H 'github.com' >> ~/.ssh/known_hosts 40 | - git config --global user.email "gitlab-ci@ksfmedia.fi" 41 | - git config --global user.name "Gitlab CI" 42 | 43 | # Deploy 44 | - git checkout -b gh-pages 45 | - git add -f node_modules app.js .nojekyll 46 | - git commit -m "Generate gh-pages" 47 | - git remote set-url origin git@github.com:KSF-Media/gitlab-dashboard.git 48 | - git push -f --set-upstream origin gh-pages 49 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Stage 1 2 | FROM node:16 as yarnbuild 3 | 4 | WORKDIR /data 5 | COPY . /data/ 6 | 7 | RUN npm install -g spago 8 | RUN yarn install --pure-lockfile --cache-folder .yarn-cache 9 | RUN yarn build 10 | 11 | # Stage 2 12 | FROM nginx:1.14-alpine 13 | 14 | COPY --from=yarnbuild /data/index.html /data/index.js /usr/share/nginx/html/ 15 | COPY --from=yarnbuild /data/node_modules /usr/share/nginx/html/node_modules/ 16 | 17 | EXPOSE 80 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 KSF Media 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gitlab Pipelines TV Dashboard 2 | 3 | ## Problem 4 | 5 | Our internal Gitlab was missing a nice, global, TV-friendly view for CI Pipelines. 6 | There is an [open issue](https://gitlab.com/gitlab-org/gitlab-ce/issues/3235) about it, 7 | and a very nice mockup already: 8 | 9 | ![Mockup](https://gitlab.com/gitlab-org/gitlab-ce/uploads/2bf850dee70767bc4dac47f7d605dfd0/Artboard_1_Copy_3.png) 10 | 11 | But the feature is tagged as a "moonshot", so not sure we'll get it baked in Gitlab soon. 12 | 13 | ## Solution 14 | 15 | We made a simple dashboard that lists all CI builds, together with their status, completion time, etc: 16 | 17 | ![Screenshot](/screenshot.png) 18 | 19 | We currently list _all_ the Pipelines on _all_ branches (polling the APIs and updating every 30s), 20 | but we'd like to implement also a simpler view that tracks the status of the `master` branch. 21 | This effort is tracked [here](https://github.com/KSF-Media/gitlab-dashboard/issues/13). 22 | 23 | We very much welcome PRs, if you'd like to contribute take a look at the [issue list](https://github.com/KSF-Media/gitlab-dashboard/issues) 24 | for Issues tagged with "Good first issue"! 25 | 26 | ## Demo 27 | 28 | [Github-pages hosted version](https://ksf-media.github.io/gitlab-dashboard/) 29 | 30 | You need to give to the page some parameters: 31 | - `private_token`: your Gitlab auth token 32 | - `gitlab_url`: the URL to your Gitlab instance 33 | 34 | Example: `https://ksf-media.github.io/gitlab-dashboard/index.html?private_token=YOUR-TOKEN-HERE&gitlab_url=https://YOUR-GITLAB-URL` 35 | 36 | ## Developing 37 | 38 | Quickstart: 39 | - Install [yarn](https://yarnpkg.com/lang/en/docs/install/) 40 | - Install [spago](https://github.com/purescript/spago.git) 41 | - `yarn install -E` 42 | - `yarn build` 43 | - Open `file://path/to/gitlab-dashboard/index.html?private_token=&gitlab_url=https://gitlab.domain.tld` in a browser 44 | 45 | ## Docker 46 | 47 | Build image 48 | docker build -t gitlab-dashboard:latest . 49 | Run the server 50 | docker run -t -p 80:80 --rm gitlab-dashboard 51 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Gitlab Pipelines TV Dashboard 11 | 12 | 13 | 14 | 15 | 16 | 17 | 37 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitlab-dashboard", 3 | "version": "0.2.0", 4 | "description": "TV dashboard for a global view on Gitlab Pipelines", 5 | "main": "index.js", 6 | "scripts": { 7 | "install": "spago install", 8 | "build": "spago bundle-app", 9 | "start": "yarn run build && xdg-open index.html", 10 | "clean": "rm -rf .spago output index.js" 11 | }, 12 | "license": "MIT", 13 | "repository": "https://github.com/KSF-Media/gitlab-dashboard", 14 | "dependencies": { 15 | "bootstrap": "4.0.0-beta.2", 16 | "esbuild": "0.17.17", 17 | "font-awesome": "^4.7.0", 18 | "jquery": "^3.2.1", 19 | "moment": "^2.19.2", 20 | "popper.js": "^1.13.0" 21 | }, 22 | "devDependencies": { 23 | "purescript": "^0.15.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages.dhall: -------------------------------------------------------------------------------- 1 | let upstream = 2 | https://github.com/purescript/package-sets/releases/download/psc-0.15.7-20230408/packages.dhall 3 | sha256:eafb4e5bcbc2de6172e9457f321764567b33bc7279bd6952468d0d422aa33948 4 | 5 | let additions = 6 | { foreign-generic = 7 | { repo = "https://github.com/jsparkes/purescript-foreign-generic" 8 | , version = "844f2ababa2c7a0482bf871e1e6bf970b7e51313" 9 | , dependencies = 10 | [ "arrays" 11 | , "assert" 12 | , "bifunctors" 13 | , "console" 14 | , "control" 15 | , "effect" 16 | , "either" 17 | , "exceptions" 18 | , "foldable-traversable" 19 | , "foreign" 20 | , "foreign-object" 21 | , "identity" 22 | , "lists" 23 | , "maybe" 24 | , "newtype" 25 | , "partial" 26 | , "prelude" 27 | , "record" 28 | , "strings" 29 | , "transformers" 30 | , "tuples" 31 | , "typelevel-prelude" 32 | , "unsafe-coerce" 33 | ] 34 | } 35 | , simple-json = 36 | { repo = "https://github.com/justinwoo/purescript-simple-json" 37 | , version = "b85e112131240ff95b5c26e9abb8e2fa6db3c656" 38 | , dependencies = 39 | [ "prelude" 40 | , "typelevel-prelude" 41 | , "record" 42 | , "variant" 43 | , "nullable" 44 | , "foreign-object" 45 | , "foreign" 46 | , "exceptions" 47 | , "arrays" 48 | ] 49 | } 50 | } 51 | 52 | in upstream // additions 53 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KSF-Media/gitlab-dashboard/0999f281df9c9781d1f3b73e28e02bae51862897/screenshot.png -------------------------------------------------------------------------------- /spago.dhall: -------------------------------------------------------------------------------- 1 | { name = "gitlab-dashboard" 2 | , dependencies = 3 | [ "aff" 4 | , "affjax" 5 | , "affjax-web" 6 | , "argonaut-core" 7 | , "arrays" 8 | , "console" 9 | , "css" 10 | , "datetime" 11 | , "effect" 12 | , "either" 13 | , "foldable-traversable" 14 | , "foreign-generic" 15 | , "halogen" 16 | , "halogen-css" 17 | , "js-date" 18 | , "maybe" 19 | , "newtype" 20 | , "partial" 21 | , "prelude" 22 | , "simple-json" 23 | , "strings" 24 | , "tailrec" 25 | ] 26 | , packages = ./packages.dhall 27 | , sources = [ "src/**/*.purs", "test/**/*.purs" ] 28 | } 29 | -------------------------------------------------------------------------------- /src/Dashboard/Component.purs: -------------------------------------------------------------------------------- 1 | module Dashboard.Component where 2 | 3 | import Prelude 4 | 5 | import Dashboard.Model (PipelineRow, createdDateTime, makeProjectRows) 6 | import Dashboard.View (formatPipeline) 7 | import Data.Array as Array 8 | import Data.Foldable (for_) 9 | import Data.Maybe (Maybe(..)) 10 | import Data.Time.Duration (Milliseconds(..)) 11 | import Effect.Aff (Aff, delay) 12 | import Effect.Aff.Class (liftAff, class MonadAff) 13 | import Effect.Class.Console (log) 14 | import Gitlab as Gitlab 15 | import Halogen as H 16 | import Halogen.HTML as HH 17 | import Halogen.HTML.Properties as HP 18 | 19 | type State = Array PipelineRow 20 | 21 | data Query a = FetchProjects a 22 | 23 | type Config = 24 | { baseUrl :: Gitlab.BaseUrl 25 | , token :: Gitlab.Token 26 | } 27 | 28 | ui :: forall input output m. MonadAff m => Config -> H.Component Query input output m 29 | ui { baseUrl, token } = 30 | H.mkComponent 31 | { initialState: const initialState 32 | , render 33 | , eval: H.mkEval H.defaultEval {handleQuery = handleQuery} 34 | --, receive: const Nothing 35 | } 36 | where 37 | 38 | initialState :: State 39 | initialState = [] 40 | 41 | render :: forall action. State -> H.ComponentHTML action () m 42 | render pipelines = 43 | HH.table 44 | [ HP.classes [ H.ClassName "table" 45 | , H.ClassName "table-dark" 46 | ] 47 | ] 48 | [ HH.thead_ 49 | [ HH.tr_ [ HH.th_ [ HH.text "Status" ] 50 | , HH.th_ [ HH.text "Repo" ] 51 | , HH.th_ [ HH.text "Commit" ] 52 | , HH.th_ [ HH.text "Stages" ] 53 | , HH.th_ [ HH.text "Time" ] 54 | ] 55 | ] 56 | , HH.tbody_ $ map formatPipeline pipelines 57 | ] 58 | 59 | --eval :: forall a m. Query a -> H.HalogenM State Query Unit Void Aff 60 | handleQuery :: forall a action s o m0. MonadAff m0 => Query a -> H.HalogenM State action s o m0 (Maybe a) 61 | handleQuery (FetchProjects next) = Just next <$ do 62 | projects <- liftAff getProjects 63 | for_ projects \project -> do 64 | jobs <- liftAff do 65 | delay (Milliseconds 1000.0) 66 | getJobs project 67 | H.modify $ upsertProjectPipelines jobs 68 | 69 | getProjects :: Aff Gitlab.Projects 70 | getProjects = do 71 | log "Fetching list of projects..." 72 | Gitlab.getProjects baseUrl token 73 | 74 | getJobs :: Gitlab.Project -> Aff Gitlab.Jobs 75 | getJobs project@{ id: Gitlab.ProjectId pid } = do 76 | log $ "Fetching Jobs for Project with id: " <> show pid 77 | Gitlab.getJobs baseUrl token project 78 | 79 | upsertProjectPipelines :: Gitlab.Jobs -> State -> State 80 | upsertProjectPipelines jobs = 81 | Array.take 40 82 | <<< Array.reverse 83 | <<< Array.sortWith createdDateTime 84 | -- Always include the pipelines passed as new data. 85 | -- Filter out of the state the pipelines that we have in the new data, 86 | -- and merge the remaining ones to get the new state. 87 | <<< (pipelines <> _) 88 | <<< Array.filter (\pr -> not $ Array.elem pr.id (map _.id pipelines)) 89 | where 90 | pipelines = makeProjectRows jobs 91 | 92 | -------------------------------------------------------------------------------- /src/Dashboard/Model.purs: -------------------------------------------------------------------------------- 1 | module Dashboard.Model where 2 | 3 | import Prelude 4 | 5 | import Gitlab as Gitlab 6 | import Data.Array (groupBy, mapMaybe, sortWith) 7 | import Data.DateTime (DateTime, diff) 8 | import Data.Foldable (maximum, maximumBy, minimum) 9 | import Data.Function (on) 10 | import Data.JSDate (JSDate, toDateTime) 11 | import Data.Maybe (Maybe, fromJust, fromMaybe) 12 | import Data.Array.NonEmpty (NonEmptyArray) 13 | import Data.Array.NonEmpty as NE 14 | import Data.Time.Duration (Milliseconds(..)) 15 | import Partial.Unsafe (unsafePartial) 16 | 17 | type CommitRow = 18 | { branch :: Gitlab.BranchName 19 | , hash :: Gitlab.CommitShortHash 20 | , authorImg :: String 21 | , name :: String 22 | , username :: String 23 | , commitTitle :: String 24 | } 25 | 26 | type NameRow = 27 | { id :: Gitlab.ProjectId 28 | , name :: Gitlab.ProjectName 29 | , name_with_namespace :: Gitlab.ProjectNameWithNamespace 30 | } 31 | 32 | type PipelineRow = 33 | { commit :: CommitRow 34 | , created :: JSDate 35 | , status :: Gitlab.PipelineStatus 36 | , id :: Gitlab.PipelineId 37 | , project :: Gitlab.Project 38 | , stages :: Array Gitlab.JobStatus 39 | , duration :: Milliseconds 40 | } 41 | 42 | 43 | getUniqueStages :: Array Gitlab.Job -> Array Gitlab.JobStatus 44 | getUniqueStages jobs = map _.status 45 | $ sortWith _.id 46 | $ mapMaybe (maximumBy (comparing _.id)) 47 | $ groupBy ((==) `on` _.name) 48 | $ sortWith _.name jobs 49 | 50 | makePipelineRow :: NonEmptyArray Gitlab.Job -> PipelineRow 51 | makePipelineRow jobs = 52 | { status: job.pipeline.status 53 | , id: job.pipeline.id 54 | , project: fromMaybe defaultProject job.project_ 55 | , stages: getUniqueStages jobs' 56 | , created: createdTime 57 | , duration: fromMaybe (Milliseconds 0.0) $ runningTime jobs' 58 | , commit: { branch: job.ref 59 | , hash: job.commit.short_id 60 | , commitTitle: job.commit.title 61 | , authorImg: job.user.avatar_url 62 | , name: job.user.name 63 | , username: job.user.username 64 | } 65 | } 66 | where 67 | job = NE.head jobs 68 | jobs' = NE.toArray jobs 69 | defaultProject = { id: Gitlab.ProjectId 0 70 | , name: Gitlab.ProjectName "" 71 | , name_with_namespace: Gitlab.ProjectNameWithNamespace "" 72 | } 73 | createdTime = job.created_at 74 | 75 | -- | Returns the total running time of a set of Jobs 76 | -- (which should belong to the same Pipeline) 77 | runningTime :: Array Gitlab.Job -> Maybe Milliseconds 78 | runningTime pipelineJobs = do 79 | -- Parse all into DateTime, get the earliest starting time 80 | started <- minimum $ mapMaybe (toDateTime <=< _.started_at) pipelineJobs 81 | -- Parse all into DateTime, get the latest finishing time 82 | finished <- maximum $ mapMaybe (toDateTime <=< _.finished_at) pipelineJobs 83 | pure $ diff finished started 84 | 85 | -- | Given all the Jobs for a Project, makes a PipelineRow out of each Pipeline 86 | makeProjectRows :: Gitlab.Jobs -> Array PipelineRow 87 | makeProjectRows jobs = map makePipelineRow 88 | $ groupBy ((==) `on` _.pipeline.id) 89 | $ sortWith _.pipeline.id jobs 90 | 91 | createdDateTime :: PipelineRow -> DateTime 92 | createdDateTime job = unsafePartial $ fromJust $ toDateTime job.created 93 | 94 | -------------------------------------------------------------------------------- /src/Dashboard/View.purs: -------------------------------------------------------------------------------- 1 | module Dashboard.View where 2 | 3 | import Prelude 4 | 5 | import CSS (px, em) 6 | import CSS.TextAlign (leftTextAlign, rightTextAlign, textAlign) as CSS 7 | import CSS (borderRadius, marginLeft, paddingLeft, paddingRight, textWhitespace, whitespaceNoWrap) as CSS 8 | import Dashboard.Model as Model 9 | import Dashboard.View.Icon (Icon(..), IconName(..), Modifier(..), fontAwesome) 10 | import Data.Array (head) 11 | import Data.JSDate (JSDate) 12 | import Data.Maybe (fromMaybe) 13 | import Data.String (Pattern(..), split) 14 | import Data.Time.Duration (Milliseconds) 15 | import Gitlab as Gitlab 16 | import Halogen.HTML (HTML, ClassName(..)) 17 | import Halogen.HTML as H 18 | import Halogen.HTML.CSS (style) 19 | import Halogen.HTML.Properties as P 20 | import Moment (formatMillis, fromNow) 21 | 22 | authorImage :: ∀ p i. String -> HTML p i 23 | authorImage url = 24 | H.img 25 | [ P.src url 26 | , P.height 20 27 | , P.width 20 28 | , style do 29 | CSS.borderRadius (20.0 # px) (20.0 # px) (20.0 # px) (20.0 # px) 30 | ] 31 | 32 | statusIcon :: ∀ p i. Gitlab.JobStatus -> HTML p i 33 | statusIcon status = 34 | fontAwesome 35 | case status of 36 | Gitlab.JobRunning -> IconStack 37 | [ Icon [ Stack2x ] CircleO 38 | , Icon [ Stack1x, Inverse, Spin ] Refresh 39 | ] 40 | Gitlab.JobCreated -> Icon [ Size2x, AlignMiddle ] DotCircleO 41 | Gitlab.JobManual -> Icon [ Size2x, AlignMiddle ] UserCircleO 42 | Gitlab.JobPending -> Icon [ Size2x, AlignMiddle ] QuestionCircleO 43 | Gitlab.JobSuccess -> Icon [ Size2x, AlignMiddle ] CheckCircleO 44 | Gitlab.JobFailed -> Icon [ Size2x, AlignMiddle ] TimesCircleO 45 | Gitlab.JobCanceled -> Icon [ Size2x, AlignMiddle ] StopCircleO 46 | Gitlab.JobSkipped -> Icon [ Size2x, AlignMiddle ] ArrowCircleORight 47 | 48 | formatStatus :: ∀ p a. Model.PipelineRow -> HTML p a 49 | formatStatus { id: Gitlab.PipelineId id, status } = 50 | H.div 51 | [ style do 52 | CSS.paddingLeft (2.0 # em) 53 | ] 54 | [ H.text $ "#" <> show id 55 | , H.br [] 56 | , H.text $ show status 57 | ] 58 | 59 | formatName :: ∀ p a. Model.NameRow -> HTML p a 60 | formatName { name: Gitlab.ProjectName name 61 | , name_with_namespace: Gitlab.ProjectNameWithNamespace namespace 62 | } 63 | = 64 | H.div [] 65 | [ H.text $ fromMaybe "" $ head $ split (Pattern "/") namespace 66 | , H.br_ 67 | , H.b_ [ H.text name ] 68 | ] 69 | 70 | formatCommit :: ∀ p a. Model.CommitRow -> HTML p a 71 | formatCommit { authorImg 72 | , name 73 | , username 74 | , commitTitle 75 | , hash: Gitlab.CommitShortHash hash 76 | , branch: Gitlab.BranchName branch 77 | } 78 | = 79 | H.div 80 | [ ] 81 | [ authorImage authorImg 82 | , H.text (" " <> name <> " (" <> username <> ")") 83 | , divider 84 | , fontAwesome $ Icon [] CodeFork 85 | , H.b_ [ H.text (" " <> branch) ] 86 | , divider 87 | , fontAwesome $ Icon [] Code 88 | , H.text (" " <> hash) 89 | , H.br_ 90 | , H.div 91 | [ P.classes [ ClassName "truncate" ] ] 92 | [ H.text commitTitle ] 93 | ] 94 | where 95 | divider = 96 | H.span [ style (CSS.marginLeft (1.0 # em)) ] [ ] 97 | 98 | formatTimes 99 | :: ∀ p a. { when :: JSDate 100 | , duration :: Milliseconds 101 | } 102 | -> HTML p a 103 | formatTimes { when, duration } = 104 | H.div 105 | [ style do 106 | CSS.textAlign CSS.rightTextAlign 107 | CSS.paddingRight (2.0 # em) 108 | ] 109 | [ fontAwesome $ Icon [] ClockO 110 | , H.text (" " <> formatMillis duration) 111 | , H.br_ 112 | , fontAwesome $ Icon [] Calendar 113 | , H.text (" " <> fromNow when) 114 | ] 115 | 116 | formatPipeline :: ∀ p i. Model.PipelineRow -> HTML p i 117 | formatPipeline pipeline = 118 | row (cell <$> cells) 119 | where 120 | cells = 121 | [ [ formatStatus pipeline ] 122 | , [ formatName pipeline.project ] 123 | , [ formatCommit pipeline.commit ] 124 | , statusIcon <$> pipeline.stages 125 | , [ formatTimes { when: pipeline.created, duration: pipeline.duration } ] 126 | ] 127 | 128 | cell :: Array (HTML p i) -> HTML p i 129 | cell = 130 | H.td 131 | [ style do 132 | CSS.textAlign CSS.leftTextAlign 133 | CSS.textWhitespace CSS.whitespaceNoWrap 134 | ] 135 | 136 | row :: Array (HTML p i) -> HTML p i 137 | row = 138 | H.tr 139 | [ P.classes [ rowColor pipeline.status ] ] 140 | 141 | rowColor :: Gitlab.PipelineStatus -> ClassName 142 | rowColor status = 143 | case status of 144 | Gitlab.Running -> ClassName "bg-primary" 145 | Gitlab.Pending -> ClassName "bg-info" 146 | Gitlab.Success -> ClassName "bg-success" 147 | Gitlab.Failed -> ClassName "bg-danger" 148 | Gitlab.Canceled -> ClassName "bg-warning" 149 | Gitlab.Skipped -> ClassName "bg-none" 150 | Gitlab.Manual -> ClassName "bg-info" 151 | 152 | -------------------------------------------------------------------------------- /src/Dashboard/View/Icon.purs: -------------------------------------------------------------------------------- 1 | module Dashboard.View.Icon where 2 | 3 | import Prelude 4 | 5 | import CSS (px) 6 | import CSS as CSS 7 | import Halogen (ClassName(..)) 8 | import Halogen.HTML (HTML) 9 | import Halogen.HTML as H 10 | import Halogen.HTML.CSS (style) as P 11 | import Halogen.HTML.Properties (classes) as P 12 | 13 | -- | TODO: Generate `purescript-fontawesome` library. 14 | data IconName 15 | = Calendar 16 | | CircleO 17 | | ClockO 18 | | Code 19 | | CodeFork 20 | | Stack 21 | | DotCircleO 22 | | UserCircleO 23 | | Refresh 24 | | QuestionCircleO 25 | | CheckCircleO 26 | | TimesCircleO 27 | | StopCircleO 28 | | ArrowCircleORight 29 | 30 | iconName :: IconName -> String 31 | iconName icon = 32 | case icon of 33 | Calendar -> "calendar" 34 | CircleO -> "circle-o" 35 | ClockO -> "clock-o" 36 | Code -> "code" 37 | CodeFork -> "code-fork" 38 | Stack -> "stack" 39 | DotCircleO -> "dot-circle-o" 40 | UserCircleO -> "user-circle-o" 41 | Refresh -> "refresh" 42 | QuestionCircleO -> "question-circle-o" 43 | CheckCircleO -> "check-circle-o" 44 | TimesCircleO -> "times-circle-o" 45 | StopCircleO -> "stop-circle-o" 46 | ArrowCircleORight -> "arrow-circle-o-right" 47 | 48 | data Modifier 49 | = Stack2x 50 | | Stack1x 51 | | Inverse 52 | | AlignMiddle 53 | | Size2x 54 | | Spin 55 | 56 | modifierClass :: Modifier -> ClassName 57 | modifierClass modifier = 58 | ClassName 59 | case modifier of 60 | Stack2x -> "fa-stack-2x" 61 | Stack1x -> "fa-stack-1x" 62 | Inverse -> "fa-inverse" 63 | AlignMiddle -> "align-middle" 64 | Size2x -> "fa-2x" 65 | Spin -> "fa-spin" 66 | 67 | data Icon 68 | = Icon (Array Modifier) IconName 69 | | IconStack (Array Icon) 70 | 71 | fontAwesome :: ∀ p a. Icon -> HTML p a 72 | fontAwesome (Icon modifiers icon) = 73 | H.i 74 | [ P.classes (fontAwesomeClasses icon <> map modifierClass modifiers) 75 | , P.style do 76 | CSS.margin (0.0 # px) (3.0 # px) (0.0 # px) (3.0 # px) 77 | ] 78 | [ ] 79 | fontAwesome (IconStack icons) = 80 | H.span 81 | [ P.classes (fontAwesomeClasses Stack) ] 82 | (fontAwesome <$> icons) 83 | 84 | fontAwesomeClasses :: IconName -> Array ClassName 85 | fontAwesomeClasses icon = 86 | ClassName <$> [ "fa", "fa-" <> iconName icon ] 87 | -------------------------------------------------------------------------------- /src/Gitlab.purs: -------------------------------------------------------------------------------- 1 | module Gitlab where 2 | 3 | import Prelude 4 | 5 | import Affjax (get) 6 | import Affjax.ResponseFormat (json) 7 | import Affjax.Web (driver) 8 | import Data.Argonaut.Core as JSON 9 | import Data.Either (Either(..)) 10 | import Data.Generic.Rep (class Generic) 11 | import Data.JSDate (JSDate, parse) 12 | import Data.Maybe (Maybe(..)) 13 | import Data.Newtype (class Newtype) 14 | import Data.Show.Generic (genericShow) 15 | import Data.String (toLower, drop) 16 | import Effect.Aff (Aff, error, throwError) 17 | import Effect.Class.Console (log) 18 | import Effect.Unsafe (unsafePerformEffect) 19 | import Foreign.Generic.EnumEncoding (genericDecodeEnum, genericEncodeEnum) 20 | import Simple.JSON (class ReadForeign, class WriteForeign, readJSON) 21 | 22 | newtype BaseUrl = BaseUrl String 23 | newtype Token = Token String 24 | 25 | data PipelineStatus 26 | = Running 27 | | Pending 28 | | Success 29 | | Failed 30 | | Canceled 31 | | Skipped 32 | | Manual 33 | 34 | derive instance eqPipelineStatus :: Eq PipelineStatus 35 | derive instance genericPipelineStatus :: Generic PipelineStatus _ 36 | 37 | instance readForeignPipelineStatus :: ReadForeign PipelineStatus where 38 | readImpl = genericDecodeEnum {constructorTagTransform: toLower} 39 | instance writeForeignPipelineStatus :: WriteForeign PipelineStatus where 40 | writeImpl = genericEncodeEnum {constructorTagTransform: toLower} 41 | instance showPipelineStatus :: Show PipelineStatus where 42 | show = genericShow 43 | 44 | data JobStatus 45 | = JobCreated 46 | | JobManual 47 | | JobRunning 48 | | JobPending 49 | | JobSuccess 50 | | JobFailed 51 | | JobCanceled 52 | | JobSkipped 53 | 54 | derive instance eqJobStatus :: Eq JobStatus 55 | derive instance genericJobeStatus :: Generic JobStatus _ 56 | 57 | instance readForeignJobStatus :: ReadForeign JobStatus where 58 | readImpl = genericDecodeEnum {constructorTagTransform: (drop 3) <<< toLower} 59 | instance writeForeignJobStatus :: WriteForeign JobStatus where 60 | writeImpl = genericEncodeEnum {constructorTagTransform: (drop 3) <<< toLower} 61 | instance showJobStatus :: Show JobStatus where 62 | show = genericShow 63 | 64 | newtype ProjectId = ProjectId Int 65 | derive newtype instance showProjectId :: Show ProjectId 66 | derive newtype instance readforeignProjectId :: ReadForeign ProjectId 67 | derive newtype instance writeforeignProjectId :: WriteForeign ProjectId 68 | 69 | newtype ProjectName = ProjectName String 70 | derive instance newtypeProjectName :: Newtype ProjectName _ 71 | derive newtype instance eqProjectName :: Eq ProjectName 72 | derive newtype instance ordProjectName :: Ord ProjectName 73 | derive newtype instance readforeignProjectName :: ReadForeign ProjectName 74 | derive newtype instance writeforeignProjectName :: WriteForeign ProjectName 75 | 76 | newtype ProjectNameWithNamespace = ProjectNameWithNamespace String 77 | derive instance newtypeProjectNameWithNamespace :: Newtype ProjectNameWithNamespace _ 78 | derive newtype instance eqProjectNameWithNamespace :: Eq ProjectNameWithNamespace 79 | derive newtype instance ordProjectNameWithNamespace :: Ord ProjectNameWithNamespace 80 | derive newtype instance readforeignProjectNameWithNamespace :: ReadForeign ProjectNameWithNamespace 81 | derive newtype instance writeforeignProjectNameWithNamespace :: WriteForeign ProjectNameWithNamespace 82 | 83 | newtype CommitShortHash = CommitShortHash String 84 | derive newtype instance readforeignCommitShortHash :: ReadForeign CommitShortHash 85 | derive newtype instance writeforeignCommitShortHash :: WriteForeign CommitShortHash 86 | 87 | newtype PipelineId = PipelineId Int 88 | derive newtype instance eqPipelineId :: Eq PipelineId 89 | derive newtype instance ordPipelineId :: Ord PipelineId 90 | derive newtype instance readforeignPipelineId :: ReadForeign PipelineId 91 | derive newtype instance writeforeignPipelineId :: WriteForeign PipelineId 92 | 93 | newtype JobId = JobId Int 94 | derive newtype instance eqJobId :: Eq JobId 95 | derive newtype instance ordJobId :: Ord JobId 96 | derive newtype instance readforeignJobId :: ReadForeign JobId 97 | derive newtype instance writeforeignJobId :: WriteForeign JobId 98 | 99 | newtype JobName = JobName String 100 | derive newtype instance eqJobName :: Eq JobName 101 | derive newtype instance ordJobName :: Ord JobName 102 | derive newtype instance readforeignJobName :: ReadForeign JobName 103 | derive newtype instance writeforeignJobName :: WriteForeign JobName 104 | derive newtype instance showJobName :: Show JobName 105 | 106 | newtype BranchName = BranchName String 107 | derive newtype instance readforeignBranchName :: ReadForeign BranchName 108 | derive newtype instance writeforeignBranchName :: WriteForeign BranchName 109 | 110 | 111 | type Project = 112 | { id :: ProjectId 113 | , name :: ProjectName 114 | , name_with_namespace :: ProjectNameWithNamespace 115 | } 116 | 117 | type User = 118 | { avatar_url :: String 119 | , name :: String 120 | , username :: String 121 | } 122 | 123 | type Commit = 124 | { title :: String 125 | , short_id :: CommitShortHash 126 | } 127 | 128 | type Pipeline = 129 | { id :: PipelineId 130 | , status :: PipelineStatus 131 | } 132 | 133 | type Job = 134 | { project_ :: Maybe Project 135 | , user :: User 136 | , commit :: Commit 137 | , ref :: BranchName 138 | , pipeline :: Pipeline 139 | , status :: JobStatus 140 | , id :: JobId 141 | , name :: JobName 142 | , created_at :: JSDate 143 | , started_at :: Maybe JSDate 144 | , finished_at :: Maybe JSDate 145 | } 146 | 147 | type Projects = Array Project 148 | type Jobs = Array Job 149 | 150 | 151 | getProjects :: BaseUrl -> Token -> Aff Projects 152 | getProjects (BaseUrl baseUrl) (Token token) = do 153 | let url = baseUrl 154 | <> "/api/v4/projects?private_token=" 155 | <> token 156 | <> "&simple=true&per_page=20&order_by=last_activity_at" 157 | projectsRes <- get driver json url 158 | x <- case projectsRes of 159 | Right x -> case readJSON $ JSON.stringify x.body of 160 | Left err -> do 161 | throwError $ error ("Failed to parse projects: " <> show err) 162 | Right projects -> pure projects 163 | Left _ -> do 164 | throwError $ error ("Failed to fetch projects") 165 | pure x 166 | 167 | getJobs :: BaseUrl -> Token -> Project -> Aff Jobs 168 | getJobs (BaseUrl baseUrl) (Token token) project = do 169 | let url = baseUrl 170 | <> "/api/v4/projects/" 171 | <> show project.id 172 | <> "/jobs?private_token=" 173 | <> token 174 | <> "&per_page=100" 175 | jobsRes <- get driver json url 176 | x <- case jobsRes of 177 | Right res -> case readJSON $ JSON.stringify res.body of 178 | Left err -> do 179 | log $ "readJSON failed with: " <> show err 180 | throwError $ error ("Failed to parse jobs: " <> show err) 181 | Right jobs -> do 182 | pure $ map (setProject project) $ map castDates jobs 183 | Left _ -> do 184 | throwError $ error "Failed to fetch jobs" 185 | pure x 186 | 187 | where 188 | 189 | setProject :: Project -> Job -> Job 190 | setProject p j = j {project_ = Just p} 191 | 192 | -- I know, but it's just for accessing locale 193 | readJSDate :: String -> JSDate 194 | readJSDate date = unsafePerformEffect $ parse date 195 | 196 | castDates job = job 197 | { created_at = readJSDate job.created_at 198 | , started_at = (Just <<< readJSDate) =<< job.started_at 199 | , finished_at = (Just <<< readJSDate) =<< job.finished_at 200 | } 201 | -------------------------------------------------------------------------------- /src/Main.purs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import Prelude 4 | 5 | import Control.Monad.Rec.Class (forever) 6 | import Dashboard.Component as Dash 7 | import Data.Maybe (Maybe(..)) 8 | import Effect (Effect) 9 | import Effect.Aff (Aff, Milliseconds(..), delay) 10 | import Effect.Class.Console (log) 11 | import Gitlab as Gitlab 12 | import Halogen as H 13 | import Halogen.Aff as HA 14 | import Halogen.VDom.Driver (runUI) 15 | import URLSearchParams as URLParams 16 | 17 | -- | Takes the component IO handle and repeatedly tells it to fetch the projects. 18 | pollProjects 19 | :: forall o. H.HalogenIO Dash.Query o Aff 20 | -> Aff Unit 21 | pollProjects io = forever do 22 | query <- io.query (H.mkTell $ Dash.FetchProjects) 23 | case query of 24 | Just q -> pure q 25 | Nothing -> do 26 | log $ "Polling failed" 27 | delay (Milliseconds 5000.0) 28 | 29 | main :: Effect Unit 30 | main = do 31 | token <- Gitlab.Token <$> URLParams.get "private_token" 32 | baseUrl <- Gitlab.BaseUrl <$> URLParams.get "gitlab_url" 33 | let config = { baseUrl, token } 34 | -- TODO: display error if parameters are not provided 35 | HA.runHalogenAff do 36 | body <- HA.awaitBody 37 | io <- runUI (Dash.ui config) unit body 38 | pollProjects io 39 | -------------------------------------------------------------------------------- /src/Moment.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | export function formatTime_(milliseconds) { 4 | return moment("2015-01-01") 5 | .startOf('day') 6 | .milliseconds(milliseconds) 7 | .format('HH:mm:ss'); 8 | }; 9 | 10 | export function fromNow_(jsDate) { 11 | return moment(jsDate).fromNow(); 12 | }; 13 | -------------------------------------------------------------------------------- /src/Moment.purs: -------------------------------------------------------------------------------- 1 | module Moment where 2 | 3 | import Data.JSDate (JSDate, toUTCString) 4 | import Data.Time.Duration (Milliseconds(..)) 5 | import Prelude (($)) 6 | 7 | foreign import formatTime_ :: Number -> String 8 | foreign import fromNow_ :: String -> String 9 | 10 | -- | Formats time in hh:mm:ss format 11 | formatMillis :: Milliseconds -> String 12 | formatMillis (Milliseconds n) = formatTime_ n 13 | 14 | fromNow :: JSDate -> String 15 | fromNow date = fromNow_ $ toUTCString date 16 | 17 | -------------------------------------------------------------------------------- /src/URLSearchParams.js: -------------------------------------------------------------------------------- 1 | export function get(paramName) { 2 | return function() { 3 | var url = new URL(window.location.toString()); 4 | return url.searchParams.get(paramName); 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /src/URLSearchParams.purs: -------------------------------------------------------------------------------- 1 | module URLSearchParams where 2 | 3 | import Effect (Effect) 4 | 5 | foreign import get :: String -> Effect String 6 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@esbuild/android-arm64@0.17.17": 6 | version "0.17.17" 7 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz#164b054d58551f8856285f386e1a8f45d9ba3a31" 8 | integrity sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg== 9 | 10 | "@esbuild/android-arm@0.17.17": 11 | version "0.17.17" 12 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.17.tgz#1b3b5a702a69b88deef342a7a80df4c894e4f065" 13 | integrity sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg== 14 | 15 | "@esbuild/android-x64@0.17.17": 16 | version "0.17.17" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.17.tgz#6781527e3c4ea4de532b149d18a2167f06783e7f" 18 | integrity sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA== 19 | 20 | "@esbuild/darwin-arm64@0.17.17": 21 | version "0.17.17" 22 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz#c5961ef4d3c1cc80dafe905cc145b5a71d2ac196" 23 | integrity sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ== 24 | 25 | "@esbuild/darwin-x64@0.17.17": 26 | version "0.17.17" 27 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz#b81f3259cc349691f67ae30f7b333a53899b3c20" 28 | integrity sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg== 29 | 30 | "@esbuild/freebsd-arm64@0.17.17": 31 | version "0.17.17" 32 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz#db846ad16cf916fd3acdda79b85ea867cb100e87" 33 | integrity sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA== 34 | 35 | "@esbuild/freebsd-x64@0.17.17": 36 | version "0.17.17" 37 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz#4dd99acbaaba00949d509e7c144b1b6ef9e1815b" 38 | integrity sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw== 39 | 40 | "@esbuild/linux-arm64@0.17.17": 41 | version "0.17.17" 42 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz#7f9274140b2bb9f4230dbbfdf5dc2761215e30f6" 43 | integrity sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw== 44 | 45 | "@esbuild/linux-arm@0.17.17": 46 | version "0.17.17" 47 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz#5c8e44c2af056bb2147cf9ad13840220bcb8948b" 48 | integrity sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg== 49 | 50 | "@esbuild/linux-ia32@0.17.17": 51 | version "0.17.17" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz#18a6b3798658be7f46e9873fa0c8d4bec54c9212" 53 | integrity sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q== 54 | 55 | "@esbuild/linux-loong64@0.17.17": 56 | version "0.17.17" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz#a8d93514a47f7b4232716c9f02aeb630bae24c40" 58 | integrity sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw== 59 | 60 | "@esbuild/linux-mips64el@0.17.17": 61 | version "0.17.17" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz#4784efb1c3f0eac8133695fa89253d558149ee1b" 63 | integrity sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A== 64 | 65 | "@esbuild/linux-ppc64@0.17.17": 66 | version "0.17.17" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz#ef6558ec5e5dd9dc16886343e0ccdb0699d70d3c" 68 | integrity sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ== 69 | 70 | "@esbuild/linux-riscv64@0.17.17": 71 | version "0.17.17" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz#13a87fdbcb462c46809c9d16bcf79817ecf9ce6f" 73 | integrity sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA== 74 | 75 | "@esbuild/linux-s390x@0.17.17": 76 | version "0.17.17" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz#83cb16d1d3ac0dca803b3f031ba3dc13f1ec7ade" 78 | integrity sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ== 79 | 80 | "@esbuild/linux-x64@0.17.17": 81 | version "0.17.17" 82 | resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz" 83 | integrity sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg== 84 | 85 | "@esbuild/netbsd-x64@0.17.17": 86 | version "0.17.17" 87 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz#1b5dcfbc4bfba80e67a11e9148de836af5b58b6c" 88 | integrity sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA== 89 | 90 | "@esbuild/openbsd-x64@0.17.17": 91 | version "0.17.17" 92 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz#e275098902291149a5dcd012c9ea0796d6b7adff" 93 | integrity sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA== 94 | 95 | "@esbuild/sunos-x64@0.17.17": 96 | version "0.17.17" 97 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz#10603474866f64986c0370a2d4fe5a2bb7fee4f5" 98 | integrity sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q== 99 | 100 | "@esbuild/win32-arm64@0.17.17": 101 | version "0.17.17" 102 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz#521a6d97ee0f96b7c435930353cc4e93078f0b54" 103 | integrity sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q== 104 | 105 | "@esbuild/win32-ia32@0.17.17": 106 | version "0.17.17" 107 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz#56f88462ebe82dad829dc2303175c0e0ccd8e38e" 108 | integrity sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ== 109 | 110 | "@esbuild/win32-x64@0.17.17": 111 | version "0.17.17" 112 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz#2b577b976e6844106715bbe0cdc57cd1528063f9" 113 | integrity sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg== 114 | 115 | "@gar/promisify@^1.1.3": 116 | version "1.1.3" 117 | resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" 118 | integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== 119 | 120 | "@npmcli/fs@^2.1.0": 121 | version "2.1.2" 122 | resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz" 123 | integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== 124 | dependencies: 125 | "@gar/promisify" "^1.1.3" 126 | semver "^7.3.5" 127 | 128 | "@npmcli/move-file@^2.0.0": 129 | version "2.0.1" 130 | resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz" 131 | integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== 132 | dependencies: 133 | mkdirp "^1.0.4" 134 | rimraf "^3.0.2" 135 | 136 | "@tootallnate/once@2": 137 | version "2.0.0" 138 | resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" 139 | integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== 140 | 141 | agent-base@6, agent-base@^6.0.2: 142 | version "6.0.2" 143 | resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" 144 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 145 | dependencies: 146 | debug "4" 147 | 148 | agentkeepalive@^4.2.1: 149 | version "4.3.0" 150 | resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz" 151 | integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== 152 | dependencies: 153 | debug "^4.1.0" 154 | depd "^2.0.0" 155 | humanize-ms "^1.2.1" 156 | 157 | aggregate-error@^3.0.0: 158 | version "3.1.0" 159 | resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" 160 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 161 | dependencies: 162 | clean-stack "^2.0.0" 163 | indent-string "^4.0.0" 164 | 165 | ansi-escapes@^4.3.0: 166 | version "4.3.2" 167 | resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" 168 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 169 | dependencies: 170 | type-fest "^0.21.3" 171 | 172 | ansi-regex@^5.0.1: 173 | version "5.0.1" 174 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 175 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 176 | 177 | ansi-styles@^3.2.1: 178 | version "3.2.1" 179 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 180 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 181 | dependencies: 182 | color-convert "^1.9.0" 183 | 184 | ansi-styles@^4.0.0: 185 | version "4.3.0" 186 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 187 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 188 | dependencies: 189 | color-convert "^2.0.1" 190 | 191 | aproba@^1.1.1: 192 | version "1.2.0" 193 | resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" 194 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 195 | 196 | arch@^2.1.1: 197 | version "2.2.0" 198 | resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" 199 | integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== 200 | 201 | astral-regex@^2.0.0: 202 | version "2.0.0" 203 | resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" 204 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 205 | 206 | balanced-match@^1.0.0: 207 | version "1.0.2" 208 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 209 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 210 | 211 | bluebird@^3.5.5: 212 | version "3.7.2" 213 | resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" 214 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 215 | 216 | bootstrap@4.0.0-beta.2: 217 | version "4.0.0-beta.2" 218 | resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.2.tgz" 219 | integrity sha512-DzGtdTlKbrMoGMpz0LigKSqJ+MgtFKxA791PU/q062OlRG0HybNZcTLH7rpDAmLS66Y3esN9yzKHLLbqa5UR3w== 220 | 221 | brace-expansion@^1.1.7: 222 | version "1.1.11" 223 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 224 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 225 | dependencies: 226 | balanced-match "^1.0.0" 227 | concat-map "0.0.1" 228 | 229 | brace-expansion@^2.0.1: 230 | version "2.0.1" 231 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 232 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 233 | dependencies: 234 | balanced-match "^1.0.0" 235 | 236 | buffer-from@^1.0.0: 237 | version "1.1.2" 238 | resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" 239 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 240 | 241 | byline@^5.0.0: 242 | version "5.0.0" 243 | resolved "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz" 244 | integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== 245 | 246 | cacache@^11.3.2: 247 | version "11.3.3" 248 | resolved "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz" 249 | integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== 250 | dependencies: 251 | bluebird "^3.5.5" 252 | chownr "^1.1.1" 253 | figgy-pudding "^3.5.1" 254 | glob "^7.1.4" 255 | graceful-fs "^4.1.15" 256 | lru-cache "^5.1.1" 257 | mississippi "^3.0.0" 258 | mkdirp "^0.5.1" 259 | move-concurrently "^1.0.1" 260 | promise-inflight "^1.0.1" 261 | rimraf "^2.6.3" 262 | ssri "^6.0.1" 263 | unique-filename "^1.1.1" 264 | y18n "^4.0.0" 265 | 266 | cacache@^16.1.0: 267 | version "16.1.3" 268 | resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz" 269 | integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== 270 | dependencies: 271 | "@npmcli/fs" "^2.1.0" 272 | "@npmcli/move-file" "^2.0.0" 273 | chownr "^2.0.0" 274 | fs-minipass "^2.1.0" 275 | glob "^8.0.1" 276 | infer-owner "^1.0.4" 277 | lru-cache "^7.7.1" 278 | minipass "^3.1.6" 279 | minipass-collect "^1.0.2" 280 | minipass-flush "^1.0.5" 281 | minipass-pipeline "^1.2.4" 282 | mkdirp "^1.0.4" 283 | p-map "^4.0.0" 284 | promise-inflight "^1.0.1" 285 | rimraf "^3.0.2" 286 | ssri "^9.0.0" 287 | tar "^6.1.11" 288 | unique-filename "^2.0.0" 289 | 290 | chalk@^2.4.2: 291 | version "2.4.2" 292 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 293 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 294 | dependencies: 295 | ansi-styles "^3.2.1" 296 | escape-string-regexp "^1.0.5" 297 | supports-color "^5.3.0" 298 | 299 | chownr@^1.1.1: 300 | version "1.1.4" 301 | resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" 302 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 303 | 304 | chownr@^2.0.0: 305 | version "2.0.0" 306 | resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" 307 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 308 | 309 | clean-stack@^2.0.0: 310 | version "2.2.0" 311 | resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" 312 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 313 | 314 | cli-cursor@^3.1.0: 315 | version "3.1.0" 316 | resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" 317 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 318 | dependencies: 319 | restore-cursor "^3.1.0" 320 | 321 | color-convert@^1.9.0: 322 | version "1.9.3" 323 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 324 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 325 | dependencies: 326 | color-name "1.1.3" 327 | 328 | color-convert@^2.0.1: 329 | version "2.0.1" 330 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 331 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 332 | dependencies: 333 | color-name "~1.1.4" 334 | 335 | color-name@1.1.3: 336 | version "1.1.3" 337 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 338 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 339 | 340 | color-name@~1.1.4: 341 | version "1.1.4" 342 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 343 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 344 | 345 | concat-map@0.0.1: 346 | version "0.0.1" 347 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 348 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 349 | 350 | concat-stream@^1.5.0: 351 | version "1.6.2" 352 | resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" 353 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 354 | dependencies: 355 | buffer-from "^1.0.0" 356 | inherits "^2.0.3" 357 | readable-stream "^2.2.2" 358 | typedarray "^0.0.6" 359 | 360 | copy-concurrently@^1.0.0: 361 | version "1.0.5" 362 | resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" 363 | integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== 364 | dependencies: 365 | aproba "^1.1.1" 366 | fs-write-stream-atomic "^1.0.8" 367 | iferr "^0.1.5" 368 | mkdirp "^0.5.1" 369 | rimraf "^2.5.4" 370 | run-queue "^1.0.0" 371 | 372 | core-util-is@~1.0.0: 373 | version "1.0.3" 374 | resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" 375 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 376 | 377 | cross-spawn@^7.0.0: 378 | version "7.0.3" 379 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 380 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 381 | dependencies: 382 | path-key "^3.1.0" 383 | shebang-command "^2.0.0" 384 | which "^2.0.1" 385 | 386 | cyclist@^1.0.1: 387 | version "1.0.1" 388 | resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" 389 | integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== 390 | 391 | debug@4, debug@^4.1.0, debug@^4.3.3: 392 | version "4.3.4" 393 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" 394 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 395 | dependencies: 396 | ms "2.1.2" 397 | 398 | depd@^2.0.0: 399 | version "2.0.0" 400 | resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" 401 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 402 | 403 | duplexify@^3.4.2, duplexify@^3.6.0: 404 | version "3.7.1" 405 | resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" 406 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 407 | dependencies: 408 | end-of-stream "^1.0.0" 409 | inherits "^2.0.1" 410 | readable-stream "^2.0.0" 411 | stream-shift "^1.0.0" 412 | 413 | emoji-regex@^8.0.0: 414 | version "8.0.0" 415 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 416 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 417 | 418 | encoding@^0.1.13: 419 | version "0.1.13" 420 | resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" 421 | integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== 422 | dependencies: 423 | iconv-lite "^0.6.2" 424 | 425 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 426 | version "1.4.4" 427 | resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" 428 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 429 | dependencies: 430 | once "^1.4.0" 431 | 432 | env-paths@^2.2.0: 433 | version "2.2.1" 434 | resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" 435 | integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== 436 | 437 | err-code@^2.0.2: 438 | version "2.0.3" 439 | resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" 440 | integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== 441 | 442 | esbuild@0.17.17: 443 | version "0.17.17" 444 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.17.tgz" 445 | integrity sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA== 446 | optionalDependencies: 447 | "@esbuild/android-arm" "0.17.17" 448 | "@esbuild/android-arm64" "0.17.17" 449 | "@esbuild/android-x64" "0.17.17" 450 | "@esbuild/darwin-arm64" "0.17.17" 451 | "@esbuild/darwin-x64" "0.17.17" 452 | "@esbuild/freebsd-arm64" "0.17.17" 453 | "@esbuild/freebsd-x64" "0.17.17" 454 | "@esbuild/linux-arm" "0.17.17" 455 | "@esbuild/linux-arm64" "0.17.17" 456 | "@esbuild/linux-ia32" "0.17.17" 457 | "@esbuild/linux-loong64" "0.17.17" 458 | "@esbuild/linux-mips64el" "0.17.17" 459 | "@esbuild/linux-ppc64" "0.17.17" 460 | "@esbuild/linux-riscv64" "0.17.17" 461 | "@esbuild/linux-s390x" "0.17.17" 462 | "@esbuild/linux-x64" "0.17.17" 463 | "@esbuild/netbsd-x64" "0.17.17" 464 | "@esbuild/openbsd-x64" "0.17.17" 465 | "@esbuild/sunos-x64" "0.17.17" 466 | "@esbuild/win32-arm64" "0.17.17" 467 | "@esbuild/win32-ia32" "0.17.17" 468 | "@esbuild/win32-x64" "0.17.17" 469 | 470 | escape-string-regexp@^1.0.5: 471 | version "1.0.5" 472 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 473 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 474 | 475 | execa@^2.0.3: 476 | version "2.1.0" 477 | resolved "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz" 478 | integrity sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw== 479 | dependencies: 480 | cross-spawn "^7.0.0" 481 | get-stream "^5.0.0" 482 | is-stream "^2.0.0" 483 | merge-stream "^2.0.0" 484 | npm-run-path "^3.0.0" 485 | onetime "^5.1.0" 486 | p-finally "^2.0.0" 487 | signal-exit "^3.0.2" 488 | strip-final-newline "^2.0.0" 489 | 490 | figgy-pudding@^3.5.1: 491 | version "3.5.2" 492 | resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" 493 | integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== 494 | 495 | filesize@^4.1.2: 496 | version "4.2.1" 497 | resolved "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz" 498 | integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== 499 | 500 | flush-write-stream@^1.0.0: 501 | version "1.1.1" 502 | resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" 503 | integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== 504 | dependencies: 505 | inherits "^2.0.3" 506 | readable-stream "^2.3.6" 507 | 508 | font-awesome@^4.7.0: 509 | version "4.7.0" 510 | resolved "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz" 511 | integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg== 512 | 513 | from2@^2.1.0: 514 | version "2.3.0" 515 | resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" 516 | integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== 517 | dependencies: 518 | inherits "^2.0.1" 519 | readable-stream "^2.0.0" 520 | 521 | fs-minipass@^2.0.0, fs-minipass@^2.1.0: 522 | version "2.1.0" 523 | resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" 524 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 525 | dependencies: 526 | minipass "^3.0.0" 527 | 528 | fs-write-stream-atomic@^1.0.8: 529 | version "1.0.10" 530 | resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" 531 | integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== 532 | dependencies: 533 | graceful-fs "^4.1.2" 534 | iferr "^0.1.5" 535 | imurmurhash "^0.1.4" 536 | readable-stream "1 || 2" 537 | 538 | fs.realpath@^1.0.0: 539 | version "1.0.0" 540 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 541 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 542 | 543 | get-stream@^5.0.0: 544 | version "5.2.0" 545 | resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" 546 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 547 | dependencies: 548 | pump "^3.0.0" 549 | 550 | glob@^7.1.3, glob@^7.1.4: 551 | version "7.2.3" 552 | resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" 553 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 554 | dependencies: 555 | fs.realpath "^1.0.0" 556 | inflight "^1.0.4" 557 | inherits "2" 558 | minimatch "^3.1.1" 559 | once "^1.3.0" 560 | path-is-absolute "^1.0.0" 561 | 562 | glob@^8.0.1: 563 | version "8.1.0" 564 | resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" 565 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 566 | dependencies: 567 | fs.realpath "^1.0.0" 568 | inflight "^1.0.4" 569 | inherits "2" 570 | minimatch "^5.0.1" 571 | once "^1.3.0" 572 | 573 | graceful-fs@^4.1.15, graceful-fs@^4.1.2: 574 | version "4.2.11" 575 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 576 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 577 | 578 | has-flag@^3.0.0: 579 | version "3.0.0" 580 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 581 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 582 | 583 | http-cache-semantics@^4.1.0: 584 | version "4.1.1" 585 | resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" 586 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 587 | 588 | http-proxy-agent@^5.0.0: 589 | version "5.0.0" 590 | resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" 591 | integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== 592 | dependencies: 593 | "@tootallnate/once" "2" 594 | agent-base "6" 595 | debug "4" 596 | 597 | https-proxy-agent@^5.0.0: 598 | version "5.0.1" 599 | resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" 600 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 601 | dependencies: 602 | agent-base "6" 603 | debug "4" 604 | 605 | humanize-ms@^1.2.1: 606 | version "1.2.1" 607 | resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" 608 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 609 | dependencies: 610 | ms "^2.0.0" 611 | 612 | iconv-lite@^0.6.2: 613 | version "0.6.3" 614 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" 615 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 616 | dependencies: 617 | safer-buffer ">= 2.1.2 < 3.0.0" 618 | 619 | iferr@^0.1.5: 620 | version "0.1.5" 621 | resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" 622 | integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== 623 | 624 | imurmurhash@^0.1.4: 625 | version "0.1.4" 626 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 627 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 628 | 629 | indent-string@^4.0.0: 630 | version "4.0.0" 631 | resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" 632 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 633 | 634 | infer-owner@^1.0.4: 635 | version "1.0.4" 636 | resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" 637 | integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== 638 | 639 | inflight@^1.0.4: 640 | version "1.0.6" 641 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 642 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 643 | dependencies: 644 | once "^1.3.0" 645 | wrappy "1" 646 | 647 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: 648 | version "2.0.4" 649 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 650 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 651 | 652 | ip@^2.0.0: 653 | version "2.0.0" 654 | resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" 655 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 656 | 657 | is-fullwidth-code-point@^3.0.0: 658 | version "3.0.0" 659 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 660 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 661 | 662 | is-lambda@^1.0.1: 663 | version "1.0.1" 664 | resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" 665 | integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== 666 | 667 | is-plain-obj@^2.0.0: 668 | version "2.1.0" 669 | resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" 670 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 671 | 672 | is-stream@^2.0.0: 673 | version "2.0.1" 674 | resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" 675 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 676 | 677 | isarray@~1.0.0: 678 | version "1.0.0" 679 | resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 680 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 681 | 682 | isexe@^2.0.0: 683 | version "2.0.0" 684 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 685 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 686 | 687 | jquery@^3.2.1: 688 | version "3.6.4" 689 | resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" 690 | integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== 691 | 692 | log-symbols@^3.0.0: 693 | version "3.0.0" 694 | resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" 695 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 696 | dependencies: 697 | chalk "^2.4.2" 698 | 699 | log-update@^4.0.0: 700 | version "4.0.0" 701 | resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" 702 | integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== 703 | dependencies: 704 | ansi-escapes "^4.3.0" 705 | cli-cursor "^3.1.0" 706 | slice-ansi "^4.0.0" 707 | wrap-ansi "^6.2.0" 708 | 709 | lru-cache@^5.1.1: 710 | version "5.1.1" 711 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 712 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 713 | dependencies: 714 | yallist "^3.0.2" 715 | 716 | lru-cache@^6.0.0: 717 | version "6.0.0" 718 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 719 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 720 | dependencies: 721 | yallist "^4.0.0" 722 | 723 | lru-cache@^7.7.1: 724 | version "7.18.3" 725 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" 726 | integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== 727 | 728 | make-fetch-happen@^10.0.0: 729 | version "10.2.1" 730 | resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz" 731 | integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== 732 | dependencies: 733 | agentkeepalive "^4.2.1" 734 | cacache "^16.1.0" 735 | http-cache-semantics "^4.1.0" 736 | http-proxy-agent "^5.0.0" 737 | https-proxy-agent "^5.0.0" 738 | is-lambda "^1.0.1" 739 | lru-cache "^7.7.1" 740 | minipass "^3.1.6" 741 | minipass-collect "^1.0.2" 742 | minipass-fetch "^2.0.3" 743 | minipass-flush "^1.0.5" 744 | minipass-pipeline "^1.2.4" 745 | negotiator "^0.6.3" 746 | promise-retry "^2.0.1" 747 | socks-proxy-agent "^7.0.0" 748 | ssri "^9.0.0" 749 | 750 | merge-stream@^2.0.0: 751 | version "2.0.0" 752 | resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" 753 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 754 | 755 | mimic-fn@^2.1.0: 756 | version "2.1.0" 757 | resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" 758 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 759 | 760 | minimatch@^3.1.1: 761 | version "3.1.2" 762 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 763 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 764 | dependencies: 765 | brace-expansion "^1.1.7" 766 | 767 | minimatch@^5.0.1: 768 | version "5.1.6" 769 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" 770 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 771 | dependencies: 772 | brace-expansion "^2.0.1" 773 | 774 | minimist@^1.2.0, minimist@^1.2.6: 775 | version "1.2.8" 776 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" 777 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 778 | 779 | minipass-collect@^1.0.2: 780 | version "1.0.2" 781 | resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" 782 | integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== 783 | dependencies: 784 | minipass "^3.0.0" 785 | 786 | minipass-fetch@^2.0.3: 787 | version "2.1.2" 788 | resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz" 789 | integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== 790 | dependencies: 791 | minipass "^3.1.6" 792 | minipass-sized "^1.0.3" 793 | minizlib "^2.1.2" 794 | optionalDependencies: 795 | encoding "^0.1.13" 796 | 797 | minipass-flush@^1.0.5: 798 | version "1.0.5" 799 | resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" 800 | integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== 801 | dependencies: 802 | minipass "^3.0.0" 803 | 804 | minipass-pipeline@^1.2.4: 805 | version "1.2.4" 806 | resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" 807 | integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== 808 | dependencies: 809 | minipass "^3.0.0" 810 | 811 | minipass-sized@^1.0.3: 812 | version "1.0.3" 813 | resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" 814 | integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== 815 | dependencies: 816 | minipass "^3.0.0" 817 | 818 | minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: 819 | version "3.3.6" 820 | resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" 821 | integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== 822 | dependencies: 823 | yallist "^4.0.0" 824 | 825 | minipass@^4.0.0: 826 | version "4.2.8" 827 | resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" 828 | integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== 829 | 830 | minizlib@^2.1.1, minizlib@^2.1.2: 831 | version "2.1.2" 832 | resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" 833 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 834 | dependencies: 835 | minipass "^3.0.0" 836 | yallist "^4.0.0" 837 | 838 | mississippi@^3.0.0: 839 | version "3.0.0" 840 | resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" 841 | integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== 842 | dependencies: 843 | concat-stream "^1.5.0" 844 | duplexify "^3.4.2" 845 | end-of-stream "^1.1.0" 846 | flush-write-stream "^1.0.0" 847 | from2 "^2.1.0" 848 | parallel-transform "^1.1.0" 849 | pump "^3.0.0" 850 | pumpify "^1.3.3" 851 | stream-each "^1.1.0" 852 | through2 "^2.0.0" 853 | 854 | mkdirp@^0.5.1: 855 | version "0.5.6" 856 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" 857 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 858 | dependencies: 859 | minimist "^1.2.6" 860 | 861 | mkdirp@^1.0.3, mkdirp@^1.0.4: 862 | version "1.0.4" 863 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" 864 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 865 | 866 | moment@^2.19.2: 867 | version "2.29.4" 868 | resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" 869 | integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== 870 | 871 | move-concurrently@^1.0.1: 872 | version "1.0.1" 873 | resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" 874 | integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== 875 | dependencies: 876 | aproba "^1.1.1" 877 | copy-concurrently "^1.0.0" 878 | fs-write-stream-atomic "^1.0.8" 879 | mkdirp "^0.5.1" 880 | rimraf "^2.5.4" 881 | run-queue "^1.0.3" 882 | 883 | ms@2.1.2: 884 | version "2.1.2" 885 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 886 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 887 | 888 | ms@^2.0.0, ms@^2.1.2: 889 | version "2.1.3" 890 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 891 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 892 | 893 | negotiator@^0.6.3: 894 | version "0.6.3" 895 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" 896 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 897 | 898 | npm-run-path@^3.0.0: 899 | version "3.1.0" 900 | resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz" 901 | integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== 902 | dependencies: 903 | path-key "^3.0.0" 904 | 905 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 906 | version "1.4.0" 907 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 908 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 909 | dependencies: 910 | wrappy "1" 911 | 912 | onetime@^5.1.0: 913 | version "5.1.2" 914 | resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" 915 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 916 | dependencies: 917 | mimic-fn "^2.1.0" 918 | 919 | p-finally@^2.0.0: 920 | version "2.0.1" 921 | resolved "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz" 922 | integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== 923 | 924 | p-map@^4.0.0: 925 | version "4.0.0" 926 | resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" 927 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 928 | dependencies: 929 | aggregate-error "^3.0.0" 930 | 931 | parallel-transform@^1.1.0: 932 | version "1.2.0" 933 | resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" 934 | integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== 935 | dependencies: 936 | cyclist "^1.0.1" 937 | inherits "^2.0.3" 938 | readable-stream "^2.1.5" 939 | 940 | path-is-absolute@^1.0.0: 941 | version "1.0.1" 942 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 943 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 944 | 945 | path-key@^3.0.0, path-key@^3.1.0: 946 | version "3.1.1" 947 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 948 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 949 | 950 | popper.js@^1.13.0: 951 | version "1.16.1" 952 | resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" 953 | integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== 954 | 955 | process-nextick-args@~2.0.0: 956 | version "2.0.1" 957 | resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" 958 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 959 | 960 | promise-inflight@^1.0.1: 961 | version "1.0.1" 962 | resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" 963 | integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== 964 | 965 | promise-retry@^2.0.1: 966 | version "2.0.1" 967 | resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" 968 | integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== 969 | dependencies: 970 | err-code "^2.0.2" 971 | retry "^0.12.0" 972 | 973 | pump@^2.0.0: 974 | version "2.0.1" 975 | resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" 976 | integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== 977 | dependencies: 978 | end-of-stream "^1.1.0" 979 | once "^1.3.1" 980 | 981 | pump@^3.0.0: 982 | version "3.0.0" 983 | resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" 984 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 985 | dependencies: 986 | end-of-stream "^1.1.0" 987 | once "^1.3.1" 988 | 989 | pumpify@^1.3.3: 990 | version "1.5.1" 991 | resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" 992 | integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== 993 | dependencies: 994 | duplexify "^3.6.0" 995 | inherits "^2.0.3" 996 | pump "^2.0.0" 997 | 998 | purescript-installer@^0.3.3: 999 | version "0.3.3" 1000 | resolved "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.3.3.tgz" 1001 | integrity sha512-DjHbB4qlWxp1+m1pI9S5ugsjxNfgNyt6sacPD0ZdtuyVBtXwOHfrmUrZq8hXj8mYz5YaxhP+oKhZjxhuTuUEhw== 1002 | dependencies: 1003 | arch "^2.1.1" 1004 | byline "^5.0.0" 1005 | cacache "^11.3.2" 1006 | chalk "^2.4.2" 1007 | env-paths "^2.2.0" 1008 | execa "^2.0.3" 1009 | filesize "^4.1.2" 1010 | is-plain-obj "^2.0.0" 1011 | log-symbols "^3.0.0" 1012 | log-update "^4.0.0" 1013 | make-fetch-happen "^10.0.0" 1014 | minimist "^1.2.0" 1015 | ms "^2.1.2" 1016 | once "^1.4.0" 1017 | rimraf "^2.6.3" 1018 | semver "^7.3.7" 1019 | tar "^6.1.11" 1020 | which "^1.3.1" 1021 | zen-observable "^0.8.14" 1022 | 1023 | purescript@^0.15.2: 1024 | version "0.15.8" 1025 | resolved "https://registry.npmjs.org/purescript/-/purescript-0.15.8.tgz" 1026 | integrity sha512-EnmDDnMKwJ88TvZhE6EkA98wJCLVYn0Ust4j4ZZbQrw5CmCZ9IQpvdUP0NH9+cRrRqtLv+s/XAT4U5r9QvAgAQ== 1027 | dependencies: 1028 | purescript-installer "^0.3.3" 1029 | 1030 | "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: 1031 | version "2.3.8" 1032 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" 1033 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1034 | dependencies: 1035 | core-util-is "~1.0.0" 1036 | inherits "~2.0.3" 1037 | isarray "~1.0.0" 1038 | process-nextick-args "~2.0.0" 1039 | safe-buffer "~5.1.1" 1040 | string_decoder "~1.1.1" 1041 | util-deprecate "~1.0.1" 1042 | 1043 | restore-cursor@^3.1.0: 1044 | version "3.1.0" 1045 | resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" 1046 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1047 | dependencies: 1048 | onetime "^5.1.0" 1049 | signal-exit "^3.0.2" 1050 | 1051 | retry@^0.12.0: 1052 | version "0.12.0" 1053 | resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" 1054 | integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== 1055 | 1056 | rimraf@^2.5.4, rimraf@^2.6.3: 1057 | version "2.7.1" 1058 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" 1059 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1060 | dependencies: 1061 | glob "^7.1.3" 1062 | 1063 | rimraf@^3.0.2: 1064 | version "3.0.2" 1065 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1066 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1067 | dependencies: 1068 | glob "^7.1.3" 1069 | 1070 | run-queue@^1.0.0, run-queue@^1.0.3: 1071 | version "1.0.3" 1072 | resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" 1073 | integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== 1074 | dependencies: 1075 | aproba "^1.1.1" 1076 | 1077 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1078 | version "5.1.2" 1079 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 1080 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1081 | 1082 | "safer-buffer@>= 2.1.2 < 3.0.0": 1083 | version "2.1.2" 1084 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1085 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1086 | 1087 | semver@^7.3.5, semver@^7.3.7: 1088 | version "7.4.0" 1089 | resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" 1090 | integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== 1091 | dependencies: 1092 | lru-cache "^6.0.0" 1093 | 1094 | shebang-command@^2.0.0: 1095 | version "2.0.0" 1096 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1097 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1098 | dependencies: 1099 | shebang-regex "^3.0.0" 1100 | 1101 | shebang-regex@^3.0.0: 1102 | version "3.0.0" 1103 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1104 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1105 | 1106 | signal-exit@^3.0.2: 1107 | version "3.0.7" 1108 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" 1109 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1110 | 1111 | slice-ansi@^4.0.0: 1112 | version "4.0.0" 1113 | resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" 1114 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1115 | dependencies: 1116 | ansi-styles "^4.0.0" 1117 | astral-regex "^2.0.0" 1118 | is-fullwidth-code-point "^3.0.0" 1119 | 1120 | smart-buffer@^4.2.0: 1121 | version "4.2.0" 1122 | resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" 1123 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 1124 | 1125 | socks-proxy-agent@^7.0.0: 1126 | version "7.0.0" 1127 | resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz" 1128 | integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== 1129 | dependencies: 1130 | agent-base "^6.0.2" 1131 | debug "^4.3.3" 1132 | socks "^2.6.2" 1133 | 1134 | socks@^2.6.2: 1135 | version "2.7.1" 1136 | resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" 1137 | integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== 1138 | dependencies: 1139 | ip "^2.0.0" 1140 | smart-buffer "^4.2.0" 1141 | 1142 | ssri@^6.0.1: 1143 | version "6.0.2" 1144 | resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" 1145 | integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== 1146 | dependencies: 1147 | figgy-pudding "^3.5.1" 1148 | 1149 | ssri@^9.0.0: 1150 | version "9.0.1" 1151 | resolved "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz" 1152 | integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== 1153 | dependencies: 1154 | minipass "^3.1.1" 1155 | 1156 | stream-each@^1.1.0: 1157 | version "1.2.3" 1158 | resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" 1159 | integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== 1160 | dependencies: 1161 | end-of-stream "^1.1.0" 1162 | stream-shift "^1.0.0" 1163 | 1164 | stream-shift@^1.0.0: 1165 | version "1.0.1" 1166 | resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" 1167 | integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== 1168 | 1169 | string-width@^4.1.0: 1170 | version "4.2.3" 1171 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1172 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1173 | dependencies: 1174 | emoji-regex "^8.0.0" 1175 | is-fullwidth-code-point "^3.0.0" 1176 | strip-ansi "^6.0.1" 1177 | 1178 | string_decoder@~1.1.1: 1179 | version "1.1.1" 1180 | resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" 1181 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1182 | dependencies: 1183 | safe-buffer "~5.1.0" 1184 | 1185 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1186 | version "6.0.1" 1187 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1188 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1189 | dependencies: 1190 | ansi-regex "^5.0.1" 1191 | 1192 | strip-final-newline@^2.0.0: 1193 | version "2.0.0" 1194 | resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" 1195 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1196 | 1197 | supports-color@^5.3.0: 1198 | version "5.5.0" 1199 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1200 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1201 | dependencies: 1202 | has-flag "^3.0.0" 1203 | 1204 | tar@^6.1.11: 1205 | version "6.1.13" 1206 | resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" 1207 | integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== 1208 | dependencies: 1209 | chownr "^2.0.0" 1210 | fs-minipass "^2.0.0" 1211 | minipass "^4.0.0" 1212 | minizlib "^2.1.1" 1213 | mkdirp "^1.0.3" 1214 | yallist "^4.0.0" 1215 | 1216 | through2@^2.0.0: 1217 | version "2.0.5" 1218 | resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" 1219 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 1220 | dependencies: 1221 | readable-stream "~2.3.6" 1222 | xtend "~4.0.1" 1223 | 1224 | type-fest@^0.21.3: 1225 | version "0.21.3" 1226 | resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" 1227 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 1228 | 1229 | typedarray@^0.0.6: 1230 | version "0.0.6" 1231 | resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" 1232 | integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== 1233 | 1234 | unique-filename@^1.1.1: 1235 | version "1.1.1" 1236 | resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" 1237 | integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== 1238 | dependencies: 1239 | unique-slug "^2.0.0" 1240 | 1241 | unique-filename@^2.0.0: 1242 | version "2.0.1" 1243 | resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz" 1244 | integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== 1245 | dependencies: 1246 | unique-slug "^3.0.0" 1247 | 1248 | unique-slug@^2.0.0: 1249 | version "2.0.2" 1250 | resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" 1251 | integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== 1252 | dependencies: 1253 | imurmurhash "^0.1.4" 1254 | 1255 | unique-slug@^3.0.0: 1256 | version "3.0.0" 1257 | resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz" 1258 | integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== 1259 | dependencies: 1260 | imurmurhash "^0.1.4" 1261 | 1262 | util-deprecate@~1.0.1: 1263 | version "1.0.2" 1264 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1265 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1266 | 1267 | which@^1.3.1: 1268 | version "1.3.1" 1269 | resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" 1270 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1271 | dependencies: 1272 | isexe "^2.0.0" 1273 | 1274 | which@^2.0.1: 1275 | version "2.0.2" 1276 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1277 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1278 | dependencies: 1279 | isexe "^2.0.0" 1280 | 1281 | wrap-ansi@^6.2.0: 1282 | version "6.2.0" 1283 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" 1284 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 1285 | dependencies: 1286 | ansi-styles "^4.0.0" 1287 | string-width "^4.1.0" 1288 | strip-ansi "^6.0.0" 1289 | 1290 | wrappy@1: 1291 | version "1.0.2" 1292 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1293 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1294 | 1295 | xtend@~4.0.1: 1296 | version "4.0.2" 1297 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 1298 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1299 | 1300 | y18n@^4.0.0: 1301 | version "4.0.3" 1302 | resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" 1303 | integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== 1304 | 1305 | yallist@^3.0.2: 1306 | version "3.1.1" 1307 | resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 1308 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1309 | 1310 | yallist@^4.0.0: 1311 | version "4.0.0" 1312 | resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 1313 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1314 | 1315 | zen-observable@^0.8.14: 1316 | version "0.8.15" 1317 | resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" 1318 | integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== 1319 | --------------------------------------------------------------------------------