From 5e30d1763d7f314cefe029e5357f3ade9e0a38a3 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 04:00:51 +0530 Subject: [PATCH 001/163] Restructuring Project --- README.md | 39 ++++++++---------- .../assets}/connector_architecture.png | Bin .../assets}/data_sharing.png | Bin ...mstack_horizontal_color_transparent-bg.png | Bin 0 -> 44161 bytes .../assets/fs-business_sphere.png | Bin .../configs => docs/assets}/uc_1.png | Bin .../configs => docs/assets}/uc_2.png | Bin .../assets/uc_consumer.png | Bin .../assets/uc_provider.png | Bin .../assets}/workspace-architect.png | Bin .../consumer-keystore.p12 | Bin .../provider-keystore.p12 | Bin .../sample-certificates}/truststore.p12 | Bin fs-assets/sample-data/sample_farmer_data1.csv | 3 ++ fs-assets/sample-data/sample_farmer_data2.csv | 3 ++ .../docker-compose-consumer.yaml | 8 ++-- .../docker-compose-provider.yaml | 9 ++-- .../example-consumer-routes.xml | 0 .../example-provider-routes.xml | 11 +++-- .../usage-control-example}/readme.md | 4 +- .../merge-csv-nodejs/Dockerfile | 0 .../merge-csv-nodejs/app.js | 0 .../merge-csv-nodejs/package.json | 28 +++++++++++++ .../merge-csv-nodejs/readme.md | 0 run.sh | 5 +++ usage control implementation/README.md | 4 +- .../configs/csv_data.csv | 3 -- .../merge-csv-nodejs/package.json | 28 ------------- 28 files changed, 75 insertions(+), 70 deletions(-) rename {usage control implementation => docs/assets}/connector_architecture.png (100%) rename {usage control implementation => docs/assets}/data_sharing.png (100%) create mode 100644 docs/assets/farmstack_horizontal_color_transparent-bg.png rename FS-business sphere.png => docs/assets/fs-business_sphere.png (100%) rename {usage control implementation/configs => docs/assets}/uc_1.png (100%) rename {usage control implementation/configs => docs/assets}/uc_2.png (100%) rename usage control implementation/FS_UCDiagram-UC(consumer).png => docs/assets/uc_consumer.png (100%) rename usage control implementation/FS_UCDiagram-UC(Provider).png => docs/assets/uc_provider.png (100%) rename {usage control implementation => docs/assets}/workspace-architect.png (100%) rename {usage control implementation/cert-stores => fs-assets/sample-certificates}/consumer-keystore.p12 (100%) rename {usage control implementation/cert-stores => fs-assets/sample-certificates}/provider-keystore.p12 (100%) rename {usage control implementation/cert-stores => fs-assets/sample-certificates}/truststore.p12 (100%) create mode 100644 fs-assets/sample-data/sample_farmer_data1.csv create mode 100644 fs-assets/sample-data/sample_farmer_data2.csv rename {usage control implementation/configs => fs-configs/usage-control-example}/docker-compose-consumer.yaml (82%) rename {usage control implementation/configs => fs-configs/usage-control-example}/docker-compose-provider.yaml (68%) rename {usage control implementation/configs => fs-configs/usage-control-example}/example-consumer-routes.xml (100%) rename {usage control implementation/configs => fs-configs/usage-control-example}/example-provider-routes.xml (92%) rename {usage control implementation/configs => fs-configs/usage-control-example}/readme.md (98%) rename {usage control implementation/src/consumer-apps => fs-consumer-apps}/merge-csv-nodejs/Dockerfile (100%) rename {usage control implementation/src/consumer-apps => fs-consumer-apps}/merge-csv-nodejs/app.js (100%) create mode 100644 fs-consumer-apps/merge-csv-nodejs/package.json rename {usage control implementation/src/consumer-apps => fs-consumer-apps}/merge-csv-nodejs/readme.md (100%) create mode 100755 run.sh delete mode 100644 usage control implementation/configs/csv_data.csv delete mode 100644 usage control implementation/src/consumer-apps/merge-csv-nodejs/package.json diff --git a/README.md b/README.md index 490b689..5be3381 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,24 @@ -### What is FarmStack? -FarmStack is a digital infrastructure that enables data collaboration between different entities. It does this by providing a means to: -1. Share data directly to the relevant organization without the need of third party through p2p connector (peer to peer connector) -2. Empower the data provider to specify how data can or cannot be used by the receiver through data owner defined usage policies -3. Enable organizations to make their data discoverable by publishing metadata (description of connectors and usage policies) and shareable through data interface containers +# Introduction -### Why is FarmStack required? -FarmStack is required because: -* Lack of trust on misuse or under utilization of data for centralized data repository -* Need to comply with evolving data policy and privacy safeguarding measures +![](docs/assets/farmstack_horizontal_color_transparent-bg.png) -### Value generated by FarmStack -* By combining specific datasets, better services or products can be created -* Potential to unlock value of data that was previously considered not shareable -* More the feedback from farmers is combined, more enriching the solution can be - giving rise to virtuous cycle -### How does someone use FarmStack +## Quick start +```bash +git clone https://github.com/digitalgreenorg/farmstack-open.git +cd farmstack-open +./run.sh +``` -Business roles in FS can be viewed as layered operational spheres: -* __FS Participants__ : These are stakeholders who are actually performing data exchange or providing some services for data exchange. This is mainly a data provider and data consumer -* __FS Central/ Steward__ : This is a nodal agency/ consortium who will run farmstack in that geography/ jurisdiction. They will operate the gateways for the participants. Examples could be MoA or a global consortium. -* __FS Core__: This is the technology stack that is maintained by DG and consortium based on IDS technology stack (Fraunhofer) which consists of the code repo under MIT/ Apache license. They will own the master services agreement - governance structure and the right to provision instance of FS central. +@TODO - Add extra ip instructions -#### Example: -Consider the diagram, there are two instances of FS run by two independent central bodies in different jurisdictions. Let us say MoA of Country1 and Country2 run separate instances of FarmStack C1 and C2 which have participants P1… Pn who do data exchange between each other. By provisioning FS, C1 and C2 run FS on their server in addition to managing the organizations. +## Features - + +## Contributing + + +## Roadmap + + +## License diff --git a/usage control implementation/connector_architecture.png b/docs/assets/connector_architecture.png similarity index 100% rename from usage control implementation/connector_architecture.png rename to docs/assets/connector_architecture.png diff --git a/usage control implementation/data_sharing.png b/docs/assets/data_sharing.png similarity index 100% rename from usage control implementation/data_sharing.png rename to docs/assets/data_sharing.png diff --git a/docs/assets/farmstack_horizontal_color_transparent-bg.png b/docs/assets/farmstack_horizontal_color_transparent-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbcf8210b493ec1fef135be980b4c93bbf1f3be GIT binary patch literal 44161 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 W?JXno@7R~jNkE(1p&Cwm-}pb> - https://www.digitalgreen.org/wheatCsv + https://farmstack.digitalgreen.org/usageControlExample - - https://private.docker.image/sha256-2891251e26d2b9f9c657f918f1648fd1c99237bee41f86a07377eb040a24d966#8081 + https://hub.docker.com/layers/farmstack/merge-csv-nodejs/latest/images/sha256-1b903795a3d3f02967f864ed8f7b0074e283b9b08ce5a02000ce948a3e33bd03#8081 @@ -97,12 +96,12 @@ The specification describes how the components get instantiated and wired togeth - + 10000 - + @@ -112,7 +111,7 @@ The specification describes how the components get instantiated and wired togeth - https://www.digitalgreen.org/wheatCsv + https://farmstack.digitalgreen.org/usageControlExample diff --git a/usage control implementation/configs/readme.md b/fs-configs/usage-control-example/readme.md similarity index 98% rename from usage control implementation/configs/readme.md rename to fs-configs/usage-control-example/readme.md index 5ad4a55..96860a1 100644 --- a/usage control implementation/configs/readme.md +++ b/fs-configs/usage-control-example/readme.md @@ -12,14 +12,14 @@ The fundamental building blocks for IDS Policies are the Contracts. Contracts pr It must be noted that contract requests and contract offers are purely informative pieces of information and do not bind any contract. The figure below represents the hierarchical structure of a usage policy. - + ## Contract agreement message flow Step 1: Data consumer (IDSCP2 - Client) requests contract and sends ContractRequestMessage Step 2: Data provider (IDSCP2 - Server) checks the contract offer and if ok, sends ContractResponseMessage Step 3: Data consumer checks the ContractOffer and sends back the ContractAgreementMessage - + In the current code, step1 is simulated by having a dummy ContractRequest. ## CAMEL Classes diff --git a/usage control implementation/src/consumer-apps/merge-csv-nodejs/Dockerfile b/fs-consumer-apps/merge-csv-nodejs/Dockerfile similarity index 100% rename from usage control implementation/src/consumer-apps/merge-csv-nodejs/Dockerfile rename to fs-consumer-apps/merge-csv-nodejs/Dockerfile diff --git a/usage control implementation/src/consumer-apps/merge-csv-nodejs/app.js b/fs-consumer-apps/merge-csv-nodejs/app.js similarity index 100% rename from usage control implementation/src/consumer-apps/merge-csv-nodejs/app.js rename to fs-consumer-apps/merge-csv-nodejs/app.js diff --git a/fs-consumer-apps/merge-csv-nodejs/package.json b/fs-consumer-apps/merge-csv-nodejs/package.json new file mode 100644 index 0000000..21efd08 --- /dev/null +++ b/fs-consumer-apps/merge-csv-nodejs/package.json @@ -0,0 +1,28 @@ +{ + "name": "@farmstack/merge-csv-nodejs", + "version": "1.0.0", + "description": "A sample application receiving json data and displaying it iin tabular format", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "style": "standard" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/digitalgreen/farmstack-open.git" + }, + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/FarmstackDG" + }, + "homepage": "https://github.com/FarmstackDG", + "dependencies": { + "express": "^4.16.4", + "body-parser": "^1.18.3", + "request": "^2.88.2" + }, + "devDependencies": { + "standard": "^12.0.1" + } +} diff --git a/usage control implementation/src/consumer-apps/merge-csv-nodejs/readme.md b/fs-consumer-apps/merge-csv-nodejs/readme.md similarity index 100% rename from usage control implementation/src/consumer-apps/merge-csv-nodejs/readme.md rename to fs-consumer-apps/merge-csv-nodejs/readme.md diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..25ffc98 --- /dev/null +++ b/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +cd fs-configs/usage-configs/usage-control-example/ +docker-compose -f docker-compose-provider.yaml up -d +docker-compose -f docker-compose-consumer.yaml up -d diff --git a/usage control implementation/README.md b/usage control implementation/README.md index 3aa1522..359cfbd 100644 --- a/usage control implementation/README.md +++ b/usage control implementation/README.md @@ -15,10 +15,10 @@ In this reference implementation, there is one provider and one consumer, both r The usage policy essentially constrains that data be not used by any other container or if the container is modified. This is a basic example that can be used to create multiple usage restrictions that require data being available and used for only specific applications. ## Data provider side - + ## Data consumer side - + ## Code structure Config/ diff --git a/usage control implementation/configs/csv_data.csv b/usage control implementation/configs/csv_data.csv deleted file mode 100644 index 098e2d1..0000000 --- a/usage control implementation/configs/csv_data.csv +++ /dev/null @@ -1,3 +0,0 @@ -"id","name" -1,"test data1" -2,"test data2" \ No newline at end of file diff --git a/usage control implementation/src/consumer-apps/merge-csv-nodejs/package.json b/usage control implementation/src/consumer-apps/merge-csv-nodejs/package.json deleted file mode 100644 index ea42aac..0000000 --- a/usage control implementation/src/consumer-apps/merge-csv-nodejs/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "@fraunhoferaisec/ids-example-010-client", - "version": "1.0.0", - "description": "A sample application retrieving MQTT data and providing it as REST service", - "main": "controller.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "style": "standard" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/industrial-data-space/trusted-connector.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/FraunhoferAISEC" - }, - "homepage": "https://github.com/FraunhoferAISEC", - "dependencies": { - "express": "^4.16.4", - "body-parser": "^1.18.3", - "request": "^2.88.2" - }, - "devDependencies": { - "standard": "^12.0.1" - } -} From a81b75129e61c28b811c21b9558f377e8d932fcb Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 04:08:37 +0530 Subject: [PATCH 002/163] run.sh fix --- run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run.sh b/run.sh index 25ffc98..f9d2b99 100755 --- a/run.sh +++ b/run.sh @@ -1,5 +1,5 @@ #!/bin/sh -cd fs-configs/usage-configs/usage-control-example/ +cd fs-configs/usage-control-example/ docker-compose -f docker-compose-provider.yaml up -d docker-compose -f docker-compose-consumer.yaml up -d From d96b19e42d544140956f819de23231fa69e5d3a6 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 04:10:46 +0530 Subject: [PATCH 003/163] docker log fix --- fs-configs/usage-control-example/docker-compose-consumer.yaml | 2 +- fs-configs/usage-control-example/docker-compose-provider.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs-configs/usage-control-example/docker-compose-consumer.yaml b/fs-configs/usage-control-example/docker-compose-consumer.yaml index 2752eb1..99a193c 100644 --- a/fs-configs/usage-control-example/docker-compose-consumer.yaml +++ b/fs-configs/usage-control-example/docker-compose-consumer.yaml @@ -7,7 +7,7 @@ services: tty: true stdin_open: true volumes: - - logs/consumer/:/root/log/ + - ./logs/consumer/:/root/log/ - /var/run/docker.sock:/var/run/docker.sock - ../../fs-assets/sample-certificates/consumer-keystore.p12:/root/etc/consumer-keystore.p12 - ../../fs-assets/sample-certificates/truststore.p12:/root/etc/truststore.p12 diff --git a/fs-configs/usage-control-example/docker-compose-provider.yaml b/fs-configs/usage-control-example/docker-compose-provider.yaml index aa7f96e..a51600b 100644 --- a/fs-configs/usage-control-example/docker-compose-provider.yaml +++ b/fs-configs/usage-control-example/docker-compose-provider.yaml @@ -7,7 +7,7 @@ services: tty: true stdin_open: true volumes: - - logs/provider/:/root/log/ + - ./logs/provider/:/root/log/ - /var/run/docker.sock:/var/run/docker.sock - ../../fs-assets/sample-certificates/provider-keystore.p12:/root/etc/provider-keystore.p12 - ../../fs-assets/sample-certificates/truststore.p12:/root/etc/truststore.p12 From b94d950bd6b0e11687be8c2f4510f076435bcf48 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 04:24:59 +0530 Subject: [PATCH 004/163] run and stop file changes --- run.sh | 4 +++- stop.sh | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100755 stop.sh diff --git a/run.sh b/run.sh index f9d2b99..6e14c2c 100755 --- a/run.sh +++ b/run.sh @@ -1,5 +1,7 @@ #!/bin/sh cd fs-configs/usage-control-example/ -docker-compose -f docker-compose-provider.yaml up -d +docker-compose -f docker-compose-consumer.yaml down +docker-compose -f docker-compose-provider.yaml down docker-compose -f docker-compose-consumer.yaml up -d +docker-compose -f docker-compose-provider.yaml up -d diff --git a/stop.sh b/stop.sh new file mode 100755 index 0000000..12ba543 --- /dev/null +++ b/stop.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +cd fs-configs/usage-control-example/ +docker-compose -f docker-compose-consumer.yaml down +docker-compose -f docker-compose-provider.yaml down \ No newline at end of file From 69ec51a4421da28e6d5803f185f7b8c829cd8b0a Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 04:27:40 +0530 Subject: [PATCH 005/163] Stopping instructions added to readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 5be3381..c8c0e16 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,11 @@ cd farmstack-open ./run.sh ``` +To stop the containers +```bash +./stop.sh +``` + @TODO - Add extra ip instructions ## Features From aaa8f15d1a3c34ad26cf06ec73110bd44c177c1c Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 09:45:49 +0000 Subject: [PATCH 006/163] GitBook: [main] 12 pages and 18 assets modified --- .../assets/connector_architecture.png | Bin {docs => .gitbook}/assets/data_sharing.png | Bin ...mstack_horizontal_color_transparent-bg.png | Bin .../assets/fs-business_sphere.png | Bin {docs => .gitbook}/assets/uc_1.png | Bin {docs => .gitbook}/assets/uc_2.png | Bin {docs => .gitbook}/assets/uc_consumer.png | Bin {docs => .gitbook}/assets/uc_provider.png | Bin .../assets/workspace-architect.png | Bin README.md | 16 +++- SUMMARY.md | 11 +++ fs-configs/README.md | 2 + fs-configs/usage-control-example/README.md | 2 + fs-configs/usage-control-example/readme.md | 82 ----------------- .../usage-control-example.md | 85 ++++++++++++++++++ fs-consumer-apps/README.md | 2 + fs-consumer-apps/merge-csv-nodejs/README.md | 2 + .../{readme.md => merge-csv-nodejs.md} | 3 + usage control implementation/README.md | 56 ------------ usage-control-implementation.md | 72 +++++++++++++++ 20 files changed, 191 insertions(+), 142 deletions(-) rename {docs => .gitbook}/assets/connector_architecture.png (100%) rename {docs => .gitbook}/assets/data_sharing.png (100%) rename {docs => .gitbook}/assets/farmstack_horizontal_color_transparent-bg.png (100%) rename {docs => .gitbook}/assets/fs-business_sphere.png (100%) rename {docs => .gitbook}/assets/uc_1.png (100%) rename {docs => .gitbook}/assets/uc_2.png (100%) rename {docs => .gitbook}/assets/uc_consumer.png (100%) rename {docs => .gitbook}/assets/uc_provider.png (100%) rename {docs => .gitbook}/assets/workspace-architect.png (100%) create mode 100644 SUMMARY.md create mode 100644 fs-configs/README.md create mode 100644 fs-configs/usage-control-example/README.md delete mode 100644 fs-configs/usage-control-example/readme.md create mode 100644 fs-configs/usage-control-example/usage-control-example.md create mode 100644 fs-consumer-apps/README.md create mode 100644 fs-consumer-apps/merge-csv-nodejs/README.md rename fs-consumer-apps/merge-csv-nodejs/{readme.md => merge-csv-nodejs.md} (94%) delete mode 100644 usage control implementation/README.md create mode 100644 usage-control-implementation.md diff --git a/docs/assets/connector_architecture.png b/.gitbook/assets/connector_architecture.png similarity index 100% rename from docs/assets/connector_architecture.png rename to .gitbook/assets/connector_architecture.png diff --git a/docs/assets/data_sharing.png b/.gitbook/assets/data_sharing.png similarity index 100% rename from docs/assets/data_sharing.png rename to .gitbook/assets/data_sharing.png diff --git a/docs/assets/farmstack_horizontal_color_transparent-bg.png b/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png similarity index 100% rename from docs/assets/farmstack_horizontal_color_transparent-bg.png rename to .gitbook/assets/farmstack_horizontal_color_transparent-bg.png diff --git a/docs/assets/fs-business_sphere.png b/.gitbook/assets/fs-business_sphere.png similarity index 100% rename from docs/assets/fs-business_sphere.png rename to .gitbook/assets/fs-business_sphere.png diff --git a/docs/assets/uc_1.png b/.gitbook/assets/uc_1.png similarity index 100% rename from docs/assets/uc_1.png rename to .gitbook/assets/uc_1.png diff --git a/docs/assets/uc_2.png b/.gitbook/assets/uc_2.png similarity index 100% rename from docs/assets/uc_2.png rename to .gitbook/assets/uc_2.png diff --git a/docs/assets/uc_consumer.png b/.gitbook/assets/uc_consumer.png similarity index 100% rename from docs/assets/uc_consumer.png rename to .gitbook/assets/uc_consumer.png diff --git a/docs/assets/uc_provider.png b/.gitbook/assets/uc_provider.png similarity index 100% rename from docs/assets/uc_provider.png rename to .gitbook/assets/uc_provider.png diff --git a/docs/assets/workspace-architect.png b/.gitbook/assets/workspace-architect.png similarity index 100% rename from docs/assets/workspace-architect.png rename to .gitbook/assets/workspace-architect.png diff --git a/README.md b/README.md index c8c0e16..e12fce7 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@ # Introduction -![](docs/assets/farmstack_horizontal_color_transparent-bg.png) +![](.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) +FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. FarmStack enables network of data providers and consumers through a suite of products and functionalities: + +1. Share data directly without any third party through trusted **peer to peer \(p2p\) connector**. +2. Empower the data provider to restrict usage of data through **usage policies**. +3. Give control of data back to the farmers by managing consent using **data wallet**. +4. Enable entities to create plugins to make their **data discoverable \(description of data\)**. + +FarmStack is the sum total of all the peer to peer connectors and associated usage policies. ## Quick start + ```bash git clone https://github.com/digitalgreenorg/farmstack-open.git cd farmstack-open @@ -11,6 +20,7 @@ cd farmstack-open ``` To stop the containers + ```bash ./stop.sh ``` @@ -19,11 +29,9 @@ To stop the containers ## Features - ## Contributing - ## Roadmap - ## License + diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..9b85eff --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,11 @@ +# Table of contents + +* [Introduction](README.md) +* [fs-consumer-apps](fs-consumer-apps/README.md) + * [merge-csv-nodejs](fs-consumer-apps/merge-csv-nodejs/README.md) + * [readme](fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md) +* [fs-configs](fs-configs/README.md) + * [usage-control-example](fs-configs/usage-control-example/README.md) + * [readme](fs-configs/usage-control-example/usage-control-example.md) +* [README](usage-control-implementation.md) + diff --git a/fs-configs/README.md b/fs-configs/README.md new file mode 100644 index 0000000..7ebb2bd --- /dev/null +++ b/fs-configs/README.md @@ -0,0 +1,2 @@ +# fs-configs + diff --git a/fs-configs/usage-control-example/README.md b/fs-configs/usage-control-example/README.md new file mode 100644 index 0000000..1095f3b --- /dev/null +++ b/fs-configs/usage-control-example/README.md @@ -0,0 +1,2 @@ +# usage-control-example + diff --git a/fs-configs/usage-control-example/readme.md b/fs-configs/usage-control-example/readme.md deleted file mode 100644 index 96860a1..0000000 --- a/fs-configs/usage-control-example/readme.md +++ /dev/null @@ -1,82 +0,0 @@ -## Data usage control -In information security, access control restricts access to digital resources. The term authorization is the process of granting permission to resources. Several access control models exist, such as Discretionary Access Control (DAC), Mandatory Access Control (MAC), Role-based Access Control (RBAC), Attribute-based Access Control (ABAC), etc. The XACML (eXtensible Access Control Markup Language) Standard is commonly used in the field of access control. XACML is a policy language to express ABAC rules. - -In contrast to access control, where access to specific digital resources (e.g., a service or a file) is restricted, the IDS architecture additionally supports data-centric usage control. The overall goal is to enforce usage restrictions for data after access has been granted though policies that bind to data being exchanged. At configuration time, these policies support developers and administrators in setting up correct data flows. Usage control itself does not establish trust in an endpoint. It rather builds upon an existing trust relationship and facilitates the enforcement of legal or technical requirements or data privacy regulations. - -To implement the usage policies, the policies need to be machine readable and based on common standards so that they can be enforced. The IDS usage policy language therefore relies on the Open Digital Rights Language (ODRL). ODRL is a W3C recommendation and specifies a vocabulary and data model for the description of digital and machine-readable contracts. The IDS further extends ODRL towards usage control descriptions and enforcement, provides explanations regarding the compliant interpretation of constructs and defines implications for real-world implementations. This is accomplished in the form of IDS subclass constructs to the according ODRL classes. The design preserves the structure of the introduced terminology, resulting in the compliance of IDS usage policy with ODRL recommendations. - -The fundamental building blocks for IDS Policies are the Contracts. Contracts present the container of any usage control statement and come in three different realizations: Requests, Offers, and Agreements. While all share a similar syntax, their interpretation is slightly different. - - Contract requests are created by data consumers and indicate a desire to achieve a certain contract. - - Contract offers are created by data providers and indicate willingness to exchange data or services as outlined in Contract Offers. - - Contract agreements represent a binding and final consent to the stated constraints and requirements. A contract agreement is the IDS terminology for a valid contract, which both sides accept and therefore is binding as far as the IDS is related. - -It must be noted that contract requests and contract offers are purely informative pieces of information and do not bind any contract. The figure below represents the hierarchical structure of a usage policy. - - - -## Contract agreement message flow - Step 1: Data consumer (IDSCP2 - Client) requests contract and sends ContractRequestMessage - Step 2: Data provider (IDSCP2 - Server) checks the contract offer and if ok, sends ContractResponseMessage - Step 3: Data consumer checks the ContractOffer and sends back the ContractAgreementMessage - - -In the current code, step1 is simulated by having a dummy ContractRequest. - -## CAMEL Classes - Following classes are used in the respective xml files in provider and consumer. The actual classes are hosted by Fraunhofer. -## Provider -1. Class name: ContractOfferCreationProcessor - 1. Function: - - takes ContractRequestMessage as input and gives ContractResponseMessage as output - - Sets container uri property to a hash value thereby allowing use of data only by a specific container - - Serializes ContractOffer to a json object - 2. Important methods: - - ContractOfferBuilder() from de.fraunhofer.iais.eis.* - - [Utils](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Utils.kt) - - [Constants](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) - 3. Where: the first step of the route - -2. Class name: TypeExtractionProcessor - 1. Function: Extracts the type of the message - 2. Why: Need to know what is the message type to trigger necessary action - 3. Where: After Provider sends ContractResponseMessage ContractAgreementMessage is -3. Class name: ContractAgreementReceiverProcessor - 1. Function: - - Takes ContractAgreement as input and saves it to UsageControlMaps object - - Deserialize ContractAgreement and saves its properties like container uri and artifacturi to hashmap for quick lookup in ProviderDB object - 2. Important methods: - - [ProviderDB](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) - - [UsageCotnrolMaps](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/UsageControlMaps.kt) - 3. Where: Last step of accepting agreement -4. Class name: ResourceUpdateCreationProcessor - 1. Function: - Message indicating the availability and current description of a specific resource - 2. Important Methods: Covered in previous classes - 3. Where: While sending the data (resource) - -## Consumer -1. Class name: ContractOfferProcessor - 1. Function: - - Handles a ContractResponseMessage and creates a ContractAgreementMessage - 2. Saves contract - - Important methods: covered in previous classes - 3. Where: The first message to consumer -2. Class name: TypeExtractionProcessor - 1. Covered in provider (same function here) - - -## File structure - -**docker-compose-provider.yaml:**
- Instantiates the configuration of docker containers on provider connector like ports, networks etc. It also mounts the file that defines data routing at provider connector: example-provider-routes.xml
- This is the file that needs to be executed to run the provider connector. To run the provider connector execute the command, docker-compose -f docker-compose-provider.yaml up
- -**docker-compose-consumer.yaml:**
- Instantiates the configuration of docker containers on consumer connector like ports, networks etc. It also mounts the file that defines data routing at consumer connector: example-consumer-routes.xml
- This is the file that needs to be executed to run the consumer connector. To run the provider connector execute the command, docker-compose -f docker-compose-consumer.yaml up
- -**example-provider-routes.xml:**
- Configures data routing at the provider connector using [CAMEL](https://camel.apache.org/). - -**example-consumer-routes.xml:**
- Configures data routing at the consumer connector using [CAMEL](https://camel.apache.org/). diff --git a/fs-configs/usage-control-example/usage-control-example.md b/fs-configs/usage-control-example/usage-control-example.md new file mode 100644 index 0000000..06f2ac3 --- /dev/null +++ b/fs-configs/usage-control-example/usage-control-example.md @@ -0,0 +1,85 @@ +# readme + +## Data usage control + +In information security, access control restricts access to digital resources. The term authorization is the process of granting permission to resources. Several access control models exist, such as Discretionary Access Control \(DAC\), Mandatory Access Control \(MAC\), Role-based Access Control \(RBAC\), Attribute-based Access Control \(ABAC\), etc. The XACML \(eXtensible Access Control Markup Language\) Standard is commonly used in the field of access control. XACML is a policy language to express ABAC rules. + +In contrast to access control, where access to specific digital resources \(e.g., a service or a file\) is restricted, the IDS architecture additionally supports data-centric usage control. The overall goal is to enforce usage restrictions for data after access has been granted though policies that bind to data being exchanged. At configuration time, these policies support developers and administrators in setting up correct data flows. Usage control itself does not establish trust in an endpoint. It rather builds upon an existing trust relationship and facilitates the enforcement of legal or technical requirements or data privacy regulations. + +To implement the usage policies, the policies need to be machine readable and based on common standards so that they can be enforced. The IDS usage policy language therefore relies on the Open Digital Rights Language \(ODRL\). ODRL is a W3C recommendation and specifies a vocabulary and data model for the description of digital and machine-readable contracts. The IDS further extends ODRL towards usage control descriptions and enforcement, provides explanations regarding the compliant interpretation of constructs and defines implications for real-world implementations. This is accomplished in the form of IDS subclass constructs to the according ODRL classes. The design preserves the structure of the introduced terminology, resulting in the compliance of IDS usage policy with ODRL recommendations. + +The fundamental building blocks for IDS Policies are the Contracts. Contracts present the container of any usage control statement and come in three different realizations: Requests, Offers, and Agreements. While all share a similar syntax, their interpretation is slightly different. + +* Contract requests are created by data consumers and indicate a desire to achieve a certain contract. +* Contract offers are created by data providers and indicate willingness to exchange data or services as outlined in Contract Offers. +* Contract agreements represent a binding and final consent to the stated constraints and requirements. A contract agreement is the IDS terminology for a valid contract, which both sides accept and therefore is binding as far as the IDS is related. + +It must be noted that contract requests and contract offers are purely informative pieces of information and do not bind any contract. The figure below represents the hierarchical structure of a usage policy. + +![](../../.gitbook/assets/uc_1.png) + +## Contract agreement message flow + +```text +Step 1: Data consumer (IDSCP2 - Client) requests contract and sends ContractRequestMessage +Step 2: Data provider (IDSCP2 - Server) checks the contract offer and if ok, sends ContractResponseMessage +Step 3: Data consumer checks the ContractOffer and sends back the ContractAgreementMessage +``` + +![](../../.gitbook/assets/uc_2.png) In the current code, step1 is simulated by having a dummy ContractRequest. + +## CAMEL Classes + +```text +Following classes are used in the respective xml files in provider and consumer. The actual classes are hosted by Fraunhofer. +``` + +## Provider + +1. Class name: ContractOfferCreationProcessor 1. Function: + * takes ContractRequestMessage as input and gives ContractResponseMessage as output + * Sets container uri property to a hash value thereby allowing use of data only by a specific container + * Serializes ContractOffer to a json object + 1. Important methods: + * ContractOfferBuilder\(\) from de.fraunhofer.iais.eis.\* + * [Utils](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Utils.kt) + * [Constants](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) + 1. Where: the first step of the route +2. Class name: TypeExtractionProcessor 1. Function: Extracts the type of the message 2. Why: Need to know what is the message type to trigger necessary action 3. Where: After Provider sends ContractResponseMessage ContractAgreementMessage is +3. Class name: ContractAgreementReceiverProcessor + 1. Function: + * Takes ContractAgreement as input and saves it to UsageControlMaps object + * Deserialize ContractAgreement and saves its properties like container uri and artifacturi to hashmap for quick lookup in ProviderDB object + 2. Important methods: + * [ProviderDB](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) + * [UsageCotnrolMaps](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/UsageControlMaps.kt) + 3. Where: Last step of accepting agreement +4. Class name: ResourceUpdateCreationProcessor + 1. Function: + + Message indicating the availability and current description of a specific resource + + 2. Important Methods: Covered in previous classes + 3. Where: While sending the data \(resource\) + +## Consumer + +1. Class name: ContractOfferProcessor + 1. Function: + * Handles a ContractResponseMessage and creates a ContractAgreementMessage + 2. Saves contract + * Important methods: covered in previous classes + 3. Where: The first message to consumer +2. Class name: TypeExtractionProcessor + 1. Covered in provider \(same function here\) + +## File structure + +**docker-compose-provider.yaml:**</br> Instantiates the configuration of docker containers on provider connector like ports, networks etc. It also mounts the file that defines data routing at provider connector: example-provider-routes.xml </br> This is the file that needs to be executed to run the provider connector. To run the provider connector execute the command, docker-compose -f docker-compose-provider.yaml up</br> + +**docker-compose-consumer.yaml:** </br> Instantiates the configuration of docker containers on consumer connector like ports, networks etc. It also mounts the file that defines data routing at consumer connector: example-consumer-routes.xml </br> This is the file that needs to be executed to run the consumer connector. To run the provider connector execute the command, docker-compose -f docker-compose-consumer.yaml up</br> + +**example-provider-routes.xml:** </br> Configures data routing at the provider connector using [CAMEL](https://camel.apache.org/). + +**example-consumer-routes.xml:**</br> Configures data routing at the consumer connector using [CAMEL](https://camel.apache.org/). + diff --git a/fs-consumer-apps/README.md b/fs-consumer-apps/README.md new file mode 100644 index 0000000..b8f07ad --- /dev/null +++ b/fs-consumer-apps/README.md @@ -0,0 +1,2 @@ +# fs-consumer-apps + diff --git a/fs-consumer-apps/merge-csv-nodejs/README.md b/fs-consumer-apps/merge-csv-nodejs/README.md new file mode 100644 index 0000000..add1531 --- /dev/null +++ b/fs-consumer-apps/merge-csv-nodejs/README.md @@ -0,0 +1,2 @@ +# merge-csv-nodejs + diff --git a/fs-consumer-apps/merge-csv-nodejs/readme.md b/fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md similarity index 94% rename from fs-consumer-apps/merge-csv-nodejs/readme.md rename to fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md index 29235c9..98d8781 100644 --- a/fs-consumer-apps/merge-csv-nodejs/readme.md +++ b/fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md @@ -1 +1,4 @@ +# readme + This is demo nodejs app that displays the data received by the consumer connector. This app runs in the consumer-app container defined in the file: docker-compose-consumer.yaml. + diff --git a/usage control implementation/README.md b/usage control implementation/README.md deleted file mode 100644 index 359cfbd..0000000 --- a/usage control implementation/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Overview -This project is a reference implementation of farmstack to showcase restricting the usage of data by an application container running a node.js application. This reference implementation can be used to create usage policies that require constraining the usage of data for the specific purpose of the project and/or avoid unintended leak or misuse of data. Most of the data sharing agreements require that the data consumer use the data for that purpose for which data is being exchanged. This can be bundled as a node.js or python application (language independent) hosted inside of an application container and the data usage policy with p2p connectors can be used to restrict data usage beyond the container. Usage control also dovetails with the consent management framework enhancing the access control to finegrained enforceable restrictions. The usage control can be viewed as superset of the access control. - -FarmStack consists of a p2p connector which is a fork from the [trusted connector](https://github.com/industrial-data-space/trusted-connector/) provided by IDSA - Fraunhofer AISEC. The p2p connectors manage docker containers and are assigned identities through which they can mutually authenticate each other and encrypt messages. IDSA also provides an IDS communication protocol which creates a secure web socket between connectors and acts as a remote attestation endpoint. The p2p connectors can be installed and run on premise by respective participants and used to provide data which can be accessed through a filesystem or a set of flexible APIs. The architecture laid down in the [IDSA reference architecture](https://www.internationaldataspaces.org/wp-content/uploads/2019/03/IDS-Reference-Architecture-Model-3.0.pdf) (published by Fraunhofer) is a message/stream driven architecture which routes data using the open source [Apache Camel](https://camel.apache.org/docs/) framework. At the core of IDSA architecture is an [information model](https://github.com/International-Data-Spaces-Association/InformationModel) which provides the language independent description of digital resources (connectors, data description or any service etc). The information model is programmatically implemented in Java and the maven repositories are hosted in the public domain [here](https://jira.iais.fraunhofer.de/stash/projects/ICTSL/repos/ids-infomodel-demo/browse) by Fraunhofer IAIS. These classes are used to construct messages that are used to control the routing of data. The [available message types](https://htmlpreview.github.io/?https://github.com/IndustrialDataSpace/InformationModel/blob/feature/message_taxonomy_description/model/communication/Message_Description.htm) of IDSA is given here. The high level abstraction of data sharing using connectors is shown below. - - - -## Trusted Connector details - - - -# Implementation -In this reference implementation, there is one provider and one consumer, both running a FarmStack p2p connector. The connectors mutually authenticate and encrypt data through the SSL certificates provided to them from a simulated certificate authority. The provider configures a usage policy that refers to the hash of a container that can access data. The data provider has one sample csv file. The data consumer receives the data in IDS protocol (a secured web socket protocol developed by Fraunhofer AISEC). IDSCP enables metadata exchange and remote attestation, creating a trusted tunnel between connector instances. It has a node application running within the container of the p2p connector that renders and displays the data in html format (browser). - -The usage policy essentially constrains that data be not used by any other container or if the container is modified. This is a basic example that can be used to create multiple usage restrictions that require data being available and used for only specific applications. - -## Data provider side - - -## Data consumer side - - -## Code structure -Config/ - - Includes the configuration related files:
- - Docker configuration for provider and consumer connectors (yaml files) - - Data routing configurations of provider and consumer (xml files)
- -Src/ - - Includes the demo nodejs application code - -Cert stores/ - - Includes the certificate files issued by certificate authority - -## To run connectors on single machine - - To run provider node - - change directory to IDSA-FS-DEMO/configs run $docker-compose -f docker-compose-provider.yaml up - - To run the consumer node - - Change directory to IDSA-FS-DEMO/configs run $docker-compose -f docker-compose-consumer.yaml up - -## To run connectors separately on provider and consumer - - ### Add following lines in the respective files - a. In the directory Configs/ add in the file docker-compose-provider.yaml following line in the provider-core docker service - extra_hosts: - "consumer-core:your-consumer-machine-ip" - - b. In the directory Configs/ add in the file docker-compose-consumer.yaml following line in the consumer-core docker service - extra_hosts: - "provider-core:your-provider-machine-ip" - -## To test usage control(UC) -The current UC integration is provisioned to facilitate no-tampering in the running data-application consumer container using the digest(docker image’s id) which contains SHA256 hash, In case there is any change in the running data-application consumer container the image hash won’t match and the transfer would get rejected. - -### Steps to prepare for UC integration : - -1. Change permission of script to executable: `chmod a+x prepareUC.sh` -2. Run the Script: `./prepareUC.sh` \ No newline at end of file diff --git a/usage-control-implementation.md b/usage-control-implementation.md new file mode 100644 index 0000000..9eb1daa --- /dev/null +++ b/usage-control-implementation.md @@ -0,0 +1,72 @@ +# README + +## Overview + +This project is a reference implementation of farmstack to showcase restricting the usage of data by an application container running a node.js application. This reference implementation can be used to create usage policies that require constraining the usage of data for the specific purpose of the project and/or avoid unintended leak or misuse of data. Most of the data sharing agreements require that the data consumer use the data for that purpose for which data is being exchanged. This can be bundled as a node.js or python application \(language independent\) hosted inside of an application container and the data usage policy with p2p connectors can be used to restrict data usage beyond the container. Usage control also dovetails with the consent management framework enhancing the access control to finegrained enforceable restrictions. The usage control can be viewed as superset of the access control. + +FarmStack consists of a p2p connector which is a fork from the [trusted connector](https://github.com/industrial-data-space/trusted-connector/) provided by IDSA - Fraunhofer AISEC. The p2p connectors manage docker containers and are assigned identities through which they can mutually authenticate each other and encrypt messages. IDSA also provides an IDS communication protocol which creates a secure web socket between connectors and acts as a remote attestation endpoint. The p2p connectors can be installed and run on premise by respective participants and used to provide data which can be accessed through a filesystem or a set of flexible APIs. The architecture laid down in the [IDSA reference architecture](https://www.internationaldataspaces.org/wp-content/uploads/2019/03/IDS-Reference-Architecture-Model-3.0.pdf) \(published by Fraunhofer\) is a message/stream driven architecture which routes data using the open source [Apache Camel](https://camel.apache.org/docs/) framework. At the core of IDSA architecture is an [information model](https://github.com/International-Data-Spaces-Association/InformationModel) which provides the language independent description of digital resources \(connectors, data description or any service etc\). The information model is programmatically implemented in Java and the maven repositories are hosted in the public domain [here](https://jira.iais.fraunhofer.de/stash/projects/ICTSL/repos/ids-infomodel-demo/browse) by Fraunhofer IAIS. These classes are used to construct messages that are used to control the routing of data. The [available message types](https://htmlpreview.github.io/?https://github.com/IndustrialDataSpace/InformationModel/blob/feature/message_taxonomy_description/model/communication/Message_Description.htm) of IDSA is given here. The high level abstraction of data sharing using connectors is shown below. + +![](https://github.com/digitalgreenorg/farmstack-open/tree/6fb98bcd4ec82f0a7d3ef9df0d293f4a0e202b63/usage%20control%20implementation/data_sharing.png) + +### Trusted Connector details + +![](https://github.com/digitalgreenorg/farmstack-open/tree/6fb98bcd4ec82f0a7d3ef9df0d293f4a0e202b63/usage%20control%20implementation/connector_architecture.png) + +## Implementation + +In this reference implementation, there is one provider and one consumer, both running a FarmStack p2p connector. The connectors mutually authenticate and encrypt data through the SSL certificates provided to them from a simulated certificate authority. The provider configures a usage policy that refers to the hash of a container that can access data. The data provider has one sample csv file. The data consumer receives the data in IDS protocol \(a secured web socket protocol developed by Fraunhofer AISEC\). IDSCP enables metadata exchange and remote attestation, creating a trusted tunnel between connector instances. It has a node application running within the container of the p2p connector that renders and displays the data in html format \(browser\). + +The usage policy essentially constrains that data be not used by any other container or if the container is modified. This is a basic example that can be used to create multiple usage restrictions that require data being available and used for only specific applications. + +### Data provider side + +![](.gitbook/assets/uc_provider.png) + +### Data consumer side + +![](.gitbook/assets/uc_consumer.png) + +### Code structure + +Config/ + +* Includes the configuration related files: + * Docker configuration for provider and consumer connectors \(yaml files\) + * Data routing configurations of provider and consumer \(xml files\) + +Src/ + +* Includes the demo nodejs application code + +Cert stores/ + +* Includes the certificate files issued by certificate authority + +### To run connectors on single machine + +* To run provider node + * change directory to IDSA-FS-DEMO/configs run $docker-compose -f docker-compose-provider.yaml up +* To run the consumer node + * Change directory to IDSA-FS-DEMO/configs run $docker-compose -f docker-compose-consumer.yaml up + +### To run connectors separately on provider and consumer + +#### Add following lines in the respective files + +```text + a. In the directory Configs/ add in the file docker-compose-provider.yaml following line in the provider-core docker service + extra_hosts: - "consumer-core:your-consumer-machine-ip" + + b. In the directory Configs/ add in the file docker-compose-consumer.yaml following line in the consumer-core docker service + extra_hosts: - "provider-core:your-provider-machine-ip" +``` + +### To test usage control\(UC\) + +The current UC integration is provisioned to facilitate no-tampering in the running data-application consumer container using the digest\(docker image’s id\) which contains SHA256 hash, In case there is any change in the running data-application consumer container the image hash won’t match and the transfer would get rejected. + +#### Steps to prepare for UC integration : + +1. Change permission of script to executable: `chmod a+x prepareUC.sh` +2. Run the Script: `./prepareUC.sh` + From 5b29253ac025bf90525ba4b5392f255aec960555 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 15:27:49 +0530 Subject: [PATCH 007/163] gitbook yml created, structure changed --- .gitbook.yaml | 5 +++++ SUMMARY.md | 11 ----------- .../.gitbook}/assets/connector_architecture.png | Bin {.gitbook => docs/.gitbook}/assets/data_sharing.png | Bin .../farmstack_horizontal_color_transparent-bg.png | Bin .../.gitbook}/assets/fs-business_sphere.png | Bin {.gitbook => docs/.gitbook}/assets/uc_1.png | Bin {.gitbook => docs/.gitbook}/assets/uc_2.png | Bin {.gitbook => docs/.gitbook}/assets/uc_consumer.png | Bin {.gitbook => docs/.gitbook}/assets/uc_provider.png | Bin .../.gitbook}/assets/workspace-architect.png | Bin docs/SUMMARY.md | 11 +++++++++++ .../usage-control-implementation.md | 0 13 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 .gitbook.yaml delete mode 100644 SUMMARY.md rename {.gitbook => docs/.gitbook}/assets/connector_architecture.png (100%) rename {.gitbook => docs/.gitbook}/assets/data_sharing.png (100%) rename {.gitbook => docs/.gitbook}/assets/farmstack_horizontal_color_transparent-bg.png (100%) rename {.gitbook => docs/.gitbook}/assets/fs-business_sphere.png (100%) rename {.gitbook => docs/.gitbook}/assets/uc_1.png (100%) rename {.gitbook => docs/.gitbook}/assets/uc_2.png (100%) rename {.gitbook => docs/.gitbook}/assets/uc_consumer.png (100%) rename {.gitbook => docs/.gitbook}/assets/uc_provider.png (100%) rename {.gitbook => docs/.gitbook}/assets/workspace-architect.png (100%) create mode 100644 docs/SUMMARY.md rename usage-control-implementation.md => docs/usage-control-implementation.md (100%) diff --git a/.gitbook.yaml b/.gitbook.yaml new file mode 100644 index 0000000..8f63d68 --- /dev/null +++ b/.gitbook.yaml @@ -0,0 +1,5 @@ +root: ./docs/ + +structure: + readme: ../README.md + summary: SUMMARY.md \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 9b85eff..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,11 +0,0 @@ -# Table of contents - -* [Introduction](README.md) -* [fs-consumer-apps](fs-consumer-apps/README.md) - * [merge-csv-nodejs](fs-consumer-apps/merge-csv-nodejs/README.md) - * [readme](fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md) -* [fs-configs](fs-configs/README.md) - * [usage-control-example](fs-configs/usage-control-example/README.md) - * [readme](fs-configs/usage-control-example/usage-control-example.md) -* [README](usage-control-implementation.md) - diff --git a/.gitbook/assets/connector_architecture.png b/docs/.gitbook/assets/connector_architecture.png similarity index 100% rename from .gitbook/assets/connector_architecture.png rename to docs/.gitbook/assets/connector_architecture.png diff --git a/.gitbook/assets/data_sharing.png b/docs/.gitbook/assets/data_sharing.png similarity index 100% rename from .gitbook/assets/data_sharing.png rename to docs/.gitbook/assets/data_sharing.png diff --git a/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png b/docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png similarity index 100% rename from .gitbook/assets/farmstack_horizontal_color_transparent-bg.png rename to docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png diff --git a/.gitbook/assets/fs-business_sphere.png b/docs/.gitbook/assets/fs-business_sphere.png similarity index 100% rename from .gitbook/assets/fs-business_sphere.png rename to docs/.gitbook/assets/fs-business_sphere.png diff --git a/.gitbook/assets/uc_1.png b/docs/.gitbook/assets/uc_1.png similarity index 100% rename from .gitbook/assets/uc_1.png rename to docs/.gitbook/assets/uc_1.png diff --git a/.gitbook/assets/uc_2.png b/docs/.gitbook/assets/uc_2.png similarity index 100% rename from .gitbook/assets/uc_2.png rename to docs/.gitbook/assets/uc_2.png diff --git a/.gitbook/assets/uc_consumer.png b/docs/.gitbook/assets/uc_consumer.png similarity index 100% rename from .gitbook/assets/uc_consumer.png rename to docs/.gitbook/assets/uc_consumer.png diff --git a/.gitbook/assets/uc_provider.png b/docs/.gitbook/assets/uc_provider.png similarity index 100% rename from .gitbook/assets/uc_provider.png rename to docs/.gitbook/assets/uc_provider.png diff --git a/.gitbook/assets/workspace-architect.png b/docs/.gitbook/assets/workspace-architect.png similarity index 100% rename from .gitbook/assets/workspace-architect.png rename to docs/.gitbook/assets/workspace-architect.png diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000..95a7fdd --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,11 @@ +# Table of contents + +* [Introduction](../README.md) +* [fs-consumer-apps](../fs-consumer-apps/README.md) + * [merge-csv-nodejs](../fs-consumer-apps/merge-csv-nodejs/README.md) + * [readme](../fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md) +* [fs-configs](../fs-configs/README.md) + * [usage-control-example](../fs-configs/usage-control-example/README.md) + * [readme](../fs-configs/usage-control-example/usage-control-example.md) +* [README](../usage-control-implementation.md) + diff --git a/usage-control-implementation.md b/docs/usage-control-implementation.md similarity index 100% rename from usage-control-implementation.md rename to docs/usage-control-implementation.md From eb37b175d4d1118ad019a3985e9742267a48a5c7 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 10:25:44 +0000 Subject: [PATCH 008/163] GitBook: [main] 11 pages and 2 assets modified --- README.md | 10 ++- ...ovider.png => workspace-architect (1).png} | Bin docs/SUMMARY.md | 16 ++-- docs/deploying-farmstack/README.md | 2 + docs/deploying-farmstack/aws-ec2.md | 2 + docs/deploying-farmstack/local-deployment.md | 27 ++++++ docs/fs-configs/README.md | 2 + .../usage-control-example/README.md | 2 + .../usage-control-example.md | 85 ++++++++++++++++++ docs/fs-consumer-apps/README.md | 2 + docs/fs-consumer-apps/merge-csv-nodejs.md | 2 + docs/readme.md | 2 + 12 files changed, 143 insertions(+), 9 deletions(-) rename docs/.gitbook/assets/{uc_provider.png => workspace-architect (1).png} (100%) create mode 100644 docs/deploying-farmstack/README.md create mode 100644 docs/deploying-farmstack/aws-ec2.md create mode 100644 docs/deploying-farmstack/local-deployment.md create mode 100644 docs/fs-configs/README.md create mode 100644 docs/fs-configs/usage-control-example/README.md create mode 100644 docs/fs-configs/usage-control-example/usage-control-example.md create mode 100644 docs/fs-consumer-apps/README.md create mode 100644 docs/fs-consumer-apps/merge-csv-nodejs.md create mode 100644 docs/readme.md diff --git a/README.md b/README.md index e12fce7..bce4375 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # Introduction -![](.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) +![](docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) -FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. FarmStack enables network of data providers and consumers through a suite of products and functionalities: +FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. + + + +FarmStack enables network of data providers and consumers through a suite of products and functionalities: 1. Share data directly without any third party through trusted **peer to peer \(p2p\) connector**. 2. Empower the data provider to restrict usage of data through **usage policies**. @@ -19,6 +23,8 @@ cd farmstack-open ./run.sh ``` +In browser, open: [https://localhost:8081/](https://localhost:8081/) + To stop the containers ```bash diff --git a/docs/.gitbook/assets/uc_provider.png b/docs/.gitbook/assets/workspace-architect (1).png similarity index 100% rename from docs/.gitbook/assets/uc_provider.png rename to docs/.gitbook/assets/workspace-architect (1).png diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 95a7fdd..9aba6fd 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,11 +1,13 @@ # Table of contents * [Introduction](../README.md) -* [fs-consumer-apps](../fs-consumer-apps/README.md) - * [merge-csv-nodejs](../fs-consumer-apps/merge-csv-nodejs/README.md) - * [readme](../fs-consumer-apps/merge-csv-nodejs/merge-csv-nodejs.md) -* [fs-configs](../fs-configs/README.md) - * [usage-control-example](../fs-configs/usage-control-example/README.md) - * [readme](../fs-configs/usage-control-example/usage-control-example.md) -* [README](../usage-control-implementation.md) +* [Deploying Farmstack](deploying-farmstack/README.md) + * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) + * [Local Deployment](deploying-farmstack/local-deployment.md) +* [fs-consumer-apps](fs-consumer-apps/README.md) + * [merge-csv-nodejs](fs-consumer-apps/merge-csv-nodejs.md) +* [fs-configs](fs-configs/README.md) + * [usage-control-example](fs-configs/usage-control-example/README.md) + * [readme](fs-configs/usage-control-example/usage-control-example.md) +* [README](readme.md) diff --git a/docs/deploying-farmstack/README.md b/docs/deploying-farmstack/README.md new file mode 100644 index 0000000..3949233 --- /dev/null +++ b/docs/deploying-farmstack/README.md @@ -0,0 +1,2 @@ +# Deploying Farmstack + diff --git a/docs/deploying-farmstack/aws-ec2.md b/docs/deploying-farmstack/aws-ec2.md new file mode 100644 index 0000000..a1a260b --- /dev/null +++ b/docs/deploying-farmstack/aws-ec2.md @@ -0,0 +1,2 @@ +# Deployment on AWS EC2 + diff --git a/docs/deploying-farmstack/local-deployment.md b/docs/deploying-farmstack/local-deployment.md new file mode 100644 index 0000000..02f43ad --- /dev/null +++ b/docs/deploying-farmstack/local-deployment.md @@ -0,0 +1,27 @@ +# Local Deployment + +{% hint style="info" %} + This deployment has been tested on Linux, MacOS and Windows \(with wsl2 and Docker Desktop on wsl2\). +{% endhint %} + +## Deployment on MacOS and Linux + +* Install Docker Desktop on your system \([instructions on docker](https://www.docker.com/products/docker-desktop)\). +* After docker has been installed you can quickstart by using these commands + +```bash +git clone https://github.com/digitalgreenorg/farmstack-open.git +cd farmstack-open +./run.sh +``` + +To view the consumer app, visit consumer url: http://localhost:8081/ + +To stop the containers: + +```bash +./stop.sh +``` + + + diff --git a/docs/fs-configs/README.md b/docs/fs-configs/README.md new file mode 100644 index 0000000..7ebb2bd --- /dev/null +++ b/docs/fs-configs/README.md @@ -0,0 +1,2 @@ +# fs-configs + diff --git a/docs/fs-configs/usage-control-example/README.md b/docs/fs-configs/usage-control-example/README.md new file mode 100644 index 0000000..1095f3b --- /dev/null +++ b/docs/fs-configs/usage-control-example/README.md @@ -0,0 +1,2 @@ +# usage-control-example + diff --git a/docs/fs-configs/usage-control-example/usage-control-example.md b/docs/fs-configs/usage-control-example/usage-control-example.md new file mode 100644 index 0000000..06f2ac3 --- /dev/null +++ b/docs/fs-configs/usage-control-example/usage-control-example.md @@ -0,0 +1,85 @@ +# readme + +## Data usage control + +In information security, access control restricts access to digital resources. The term authorization is the process of granting permission to resources. Several access control models exist, such as Discretionary Access Control \(DAC\), Mandatory Access Control \(MAC\), Role-based Access Control \(RBAC\), Attribute-based Access Control \(ABAC\), etc. The XACML \(eXtensible Access Control Markup Language\) Standard is commonly used in the field of access control. XACML is a policy language to express ABAC rules. + +In contrast to access control, where access to specific digital resources \(e.g., a service or a file\) is restricted, the IDS architecture additionally supports data-centric usage control. The overall goal is to enforce usage restrictions for data after access has been granted though policies that bind to data being exchanged. At configuration time, these policies support developers and administrators in setting up correct data flows. Usage control itself does not establish trust in an endpoint. It rather builds upon an existing trust relationship and facilitates the enforcement of legal or technical requirements or data privacy regulations. + +To implement the usage policies, the policies need to be machine readable and based on common standards so that they can be enforced. The IDS usage policy language therefore relies on the Open Digital Rights Language \(ODRL\). ODRL is a W3C recommendation and specifies a vocabulary and data model for the description of digital and machine-readable contracts. The IDS further extends ODRL towards usage control descriptions and enforcement, provides explanations regarding the compliant interpretation of constructs and defines implications for real-world implementations. This is accomplished in the form of IDS subclass constructs to the according ODRL classes. The design preserves the structure of the introduced terminology, resulting in the compliance of IDS usage policy with ODRL recommendations. + +The fundamental building blocks for IDS Policies are the Contracts. Contracts present the container of any usage control statement and come in three different realizations: Requests, Offers, and Agreements. While all share a similar syntax, their interpretation is slightly different. + +* Contract requests are created by data consumers and indicate a desire to achieve a certain contract. +* Contract offers are created by data providers and indicate willingness to exchange data or services as outlined in Contract Offers. +* Contract agreements represent a binding and final consent to the stated constraints and requirements. A contract agreement is the IDS terminology for a valid contract, which both sides accept and therefore is binding as far as the IDS is related. + +It must be noted that contract requests and contract offers are purely informative pieces of information and do not bind any contract. The figure below represents the hierarchical structure of a usage policy. + +![](../../.gitbook/assets/uc_1.png) + +## Contract agreement message flow + +```text +Step 1: Data consumer (IDSCP2 - Client) requests contract and sends ContractRequestMessage +Step 2: Data provider (IDSCP2 - Server) checks the contract offer and if ok, sends ContractResponseMessage +Step 3: Data consumer checks the ContractOffer and sends back the ContractAgreementMessage +``` + +![](../../.gitbook/assets/uc_2.png) In the current code, step1 is simulated by having a dummy ContractRequest. + +## CAMEL Classes + +```text +Following classes are used in the respective xml files in provider and consumer. The actual classes are hosted by Fraunhofer. +``` + +## Provider + +1. Class name: ContractOfferCreationProcessor 1. Function: + * takes ContractRequestMessage as input and gives ContractResponseMessage as output + * Sets container uri property to a hash value thereby allowing use of data only by a specific container + * Serializes ContractOffer to a json object + 1. Important methods: + * ContractOfferBuilder\(\) from de.fraunhofer.iais.eis.\* + * [Utils](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Utils.kt) + * [Constants](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) + 1. Where: the first step of the route +2. Class name: TypeExtractionProcessor 1. Function: Extracts the type of the message 2. Why: Need to know what is the message type to trigger necessary action 3. Where: After Provider sends ContractResponseMessage ContractAgreementMessage is +3. Class name: ContractAgreementReceiverProcessor + 1. Function: + * Takes ContractAgreement as input and saves it to UsageControlMaps object + * Deserialize ContractAgreement and saves its properties like container uri and artifacturi to hashmap for quick lookup in ProviderDB object + 2. Important methods: + * [ProviderDB](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/Constants.kt) + * [UsageCotnrolMaps](https://github.com/industrial-data-space/trusted-connector/blob/develop/camel-idscp2/src/main/kotlin/de/fhg/aisec/ids/camel/idscp2/UsageControlMaps.kt) + 3. Where: Last step of accepting agreement +4. Class name: ResourceUpdateCreationProcessor + 1. Function: + + Message indicating the availability and current description of a specific resource + + 2. Important Methods: Covered in previous classes + 3. Where: While sending the data \(resource\) + +## Consumer + +1. Class name: ContractOfferProcessor + 1. Function: + * Handles a ContractResponseMessage and creates a ContractAgreementMessage + 2. Saves contract + * Important methods: covered in previous classes + 3. Where: The first message to consumer +2. Class name: TypeExtractionProcessor + 1. Covered in provider \(same function here\) + +## File structure + +**docker-compose-provider.yaml:**</br> Instantiates the configuration of docker containers on provider connector like ports, networks etc. It also mounts the file that defines data routing at provider connector: example-provider-routes.xml </br> This is the file that needs to be executed to run the provider connector. To run the provider connector execute the command, docker-compose -f docker-compose-provider.yaml up</br> + +**docker-compose-consumer.yaml:** </br> Instantiates the configuration of docker containers on consumer connector like ports, networks etc. It also mounts the file that defines data routing at consumer connector: example-consumer-routes.xml </br> This is the file that needs to be executed to run the consumer connector. To run the provider connector execute the command, docker-compose -f docker-compose-consumer.yaml up</br> + +**example-provider-routes.xml:** </br> Configures data routing at the provider connector using [CAMEL](https://camel.apache.org/). + +**example-consumer-routes.xml:**</br> Configures data routing at the consumer connector using [CAMEL](https://camel.apache.org/). + diff --git a/docs/fs-consumer-apps/README.md b/docs/fs-consumer-apps/README.md new file mode 100644 index 0000000..b8f07ad --- /dev/null +++ b/docs/fs-consumer-apps/README.md @@ -0,0 +1,2 @@ +# fs-consumer-apps + diff --git a/docs/fs-consumer-apps/merge-csv-nodejs.md b/docs/fs-consumer-apps/merge-csv-nodejs.md new file mode 100644 index 0000000..add1531 --- /dev/null +++ b/docs/fs-consumer-apps/merge-csv-nodejs.md @@ -0,0 +1,2 @@ +# merge-csv-nodejs + diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000..22517a5 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,2 @@ +# README + From dd468b827e64cefed346975a7083b345630aadde Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 15:57:36 +0530 Subject: [PATCH 009/163] Summary changes --- docs/SUMMARY.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 9aba6fd..bbe9117 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,10 +4,5 @@ * [Deploying Farmstack](deploying-farmstack/README.md) * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) * [Local Deployment](deploying-farmstack/local-deployment.md) -* [fs-consumer-apps](fs-consumer-apps/README.md) - * [merge-csv-nodejs](fs-consumer-apps/merge-csv-nodejs.md) -* [fs-configs](fs-configs/README.md) - * [usage-control-example](fs-configs/usage-control-example/README.md) - * [readme](fs-configs/usage-control-example/usage-control-example.md) * [README](readme.md) From 3c8444dfa603beaff8474a20e4fc49e10dea9ae1 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 12:02:47 +0000 Subject: [PATCH 010/163] GitBook: [main] 5 pages and 2 assets modified --- README.md | 31 +++++++++++++----- ...ct.png => workspace-architect (1) (1).png} | Bin 2 files changed, 22 insertions(+), 9 deletions(-) rename docs/.gitbook/assets/{workspace-architect.png => workspace-architect (1) (1).png} (100%) diff --git a/README.md b/README.md index bce4375..f75489c 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,12 @@ FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. +Farmstack is required because: - -FarmStack enables network of data providers and consumers through a suite of products and functionalities: - -1. Share data directly without any third party through trusted **peer to peer \(p2p\) connector**. -2. Empower the data provider to restrict usage of data through **usage policies**. -3. Give control of data back to the farmers by managing consent using **data wallet**. -4. Enable entities to create plugins to make their **data discoverable \(description of data\)**. - -FarmStack is the sum total of all the peer to peer connectors and associated usage policies. +* Relevant farmer profile including farmer activity not available +* Lack of trust on misuse or under utilisation of data with a centralised data warehouse +* Need to comply with evolving data policy and privacy safeguarding measures +* Existing data integration tools lack the customisation ## Quick start @@ -35,9 +31,26 @@ To stop the containers ## Features +FarmStack enables network of data providers and consumers through a suite of products and functionalities: + +1. Share data directly without any third party through trusted **peer to peer \(p2p\) connector**. +2. Empower the data provider to restrict usage of data through **usage policies**. +3. Give control of data back to the farmers by managing consent using **data wallet**. +4. Enable entities to create plugins to make their **data discoverable \(description of data\)**. + +FarmStack is the sum total of all the peer to peer connectors and associated usage policies. + +For more information visit [our website](https://farmstack.digitalgreen.org) or [Confluence Page](https://digitalgreenorg.atlassian.net/wiki/spaces/FS/overview). + ## Contributing +@TODO - Add contribution guide + ## Roadmap +@TODO - Add Roadmap + ## License +@TODO - Add License + diff --git a/docs/.gitbook/assets/workspace-architect.png b/docs/.gitbook/assets/workspace-architect (1) (1).png similarity index 100% rename from docs/.gitbook/assets/workspace-architect.png rename to docs/.gitbook/assets/workspace-architect (1) (1).png From 3cb15c92b5b6471467dfab13c84de7377a3168ed Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 17:37:42 +0530 Subject: [PATCH 011/163] removed extra readme --- docs/SUMMARY.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index bbe9117..cfa304c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,5 +4,4 @@ * [Deploying Farmstack](deploying-farmstack/README.md) * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) * [Local Deployment](deploying-farmstack/local-deployment.md) -* [README](readme.md) From f9c8acae217b9727c43b4ed5a85b36bdfb31737f Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 17:50:39 +0530 Subject: [PATCH 012/163] Added Contributing to Farmstack --- README.md | 4 +++- docs/SUMMARY.md | 3 ++- docs/contributing-to-farmstack/README.md | 0 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 docs/contributing-to-farmstack/README.md diff --git a/README.md b/README.md index f75489c..f282e83 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,9 @@ For more information visit [our website](https://farmstack.digitalgreen.org) or ## Contributing -@TODO - Add contribution guide +We would love your contribution to this project no matter big or small. + +To get started see our [contribution guide](docs/contribution/contribution.md). ## Roadmap diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index cfa304c..a6a779c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -2,6 +2,7 @@ * [Introduction](../README.md) * [Deploying Farmstack](deploying-farmstack/README.md) - * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) * [Local Deployment](deploying-farmstack/local-deployment.md) + * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) +* [Contributing to Farmstack](contributing-to-farmstack/README.md) diff --git a/docs/contributing-to-farmstack/README.md b/docs/contributing-to-farmstack/README.md new file mode 100644 index 0000000..e69de29 From 5bab5e043ae92f94f6bc0de1ab8221b50d04e622 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 17:51:42 +0530 Subject: [PATCH 013/163] created scripts folder --- {usage control implementation => scripts}/prepareUC.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {usage control implementation => scripts}/prepareUC.sh (100%) diff --git a/usage control implementation/prepareUC.sh b/scripts/prepareUC.sh similarity index 100% rename from usage control implementation/prepareUC.sh rename to scripts/prepareUC.sh From ff0d5b036c986e2040c4790a45b23ccfdf941014 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 12:23:33 +0000 Subject: [PATCH 014/163] GitBook: [main] 4 pages modified --- README.md | 4 ++-- docs/SUMMARY.md | 2 +- docs/contributing-to-farmstack.md | 2 ++ docs/contributing-to-farmstack/README.md | 0 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 docs/contributing-to-farmstack.md delete mode 100644 docs/contributing-to-farmstack/README.md diff --git a/README.md b/README.md index f282e83..dbdd3fe 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![](docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) -FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. +FarmStack is a reference implementation of an open and interoperable data sharing protocol in agriculture sector. Farmstack is required because: @@ -46,7 +46,7 @@ For more information visit [our website](https://farmstack.digitalgreen.org) or We would love your contribution to this project no matter big or small. -To get started see our [contribution guide](docs/contribution/contribution.md). +To get started see our [contribution guide](docs/contributing-to-farmstack.md). ## Roadmap diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index a6a779c..f5eef45 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,5 +4,5 @@ * [Deploying Farmstack](deploying-farmstack/README.md) * [Local Deployment](deploying-farmstack/local-deployment.md) * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) -* [Contributing to Farmstack](contributing-to-farmstack/README.md) +* [Contributing to Farmstack](contributing-to-farmstack.md) diff --git a/docs/contributing-to-farmstack.md b/docs/contributing-to-farmstack.md new file mode 100644 index 0000000..ea713d8 --- /dev/null +++ b/docs/contributing-to-farmstack.md @@ -0,0 +1,2 @@ +# Contributing to Farmstack + diff --git a/docs/contributing-to-farmstack/README.md b/docs/contributing-to-farmstack/README.md deleted file mode 100644 index e69de29..0000000 From 14dff0c1d5f2554880cd7f3f94496bbdc3e55319 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 12:29:50 +0000 Subject: [PATCH 015/163] GitBook: [main] 5 pages modified --- README.md | 2 +- docs/SUMMARY.md | 3 ++- docs/contributing-to-farmstack.md | 2 -- docs/contributing-to-farmstack/README.md | 4 ++++ docs/contributing-to-farmstack/untitled.md | 2 ++ 5 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 docs/contributing-to-farmstack.md create mode 100644 docs/contributing-to-farmstack/README.md create mode 100644 docs/contributing-to-farmstack/untitled.md diff --git a/README.md b/README.md index dbdd3fe..983f93f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ For more information visit [our website](https://farmstack.digitalgreen.org) or We would love your contribution to this project no matter big or small. -To get started see our [contribution guide](docs/contributing-to-farmstack.md). +To get started see our [contribution guide](docs/contributing-to-farmstack/). ## Roadmap diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index f5eef45..fbaa7fa 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,5 +4,6 @@ * [Deploying Farmstack](deploying-farmstack/README.md) * [Local Deployment](deploying-farmstack/local-deployment.md) * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) -* [Contributing to Farmstack](contributing-to-farmstack.md) +* [Contributing to FarmStack](contributing-to-farmstack/README.md) + * [Untitled](contributing-to-farmstack/untitled.md) diff --git a/docs/contributing-to-farmstack.md b/docs/contributing-to-farmstack.md deleted file mode 100644 index ea713d8..0000000 --- a/docs/contributing-to-farmstack.md +++ /dev/null @@ -1,2 +0,0 @@ -# Contributing to Farmstack - diff --git a/docs/contributing-to-farmstack/README.md b/docs/contributing-to-farmstack/README.md new file mode 100644 index 0000000..5288a04 --- /dev/null +++ b/docs/contributing-to-farmstack/README.md @@ -0,0 +1,4 @@ +# Contributing to FarmStack + +Thank you for your interest in contributing to FarmStack, currently we are building our contribution guidelines. Meanwhile you can contact us on our [website](https://farmstack.digitalgreen.org) and [confluence](https://digitalgreenorg.atlassian.net/wiki/spaces/FS/overview). + diff --git a/docs/contributing-to-farmstack/untitled.md b/docs/contributing-to-farmstack/untitled.md new file mode 100644 index 0000000..5094080 --- /dev/null +++ b/docs/contributing-to-farmstack/untitled.md @@ -0,0 +1,2 @@ +# Untitled + From 4ffbc583e7da6bb44755eb0a00e28bc65ebe4daa Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Mon, 21 Jun 2021 12:30:10 +0000 Subject: [PATCH 016/163] GitBook: [main] 5 pages modified --- README.md | 2 +- docs/SUMMARY.md | 3 +-- .../README.md => contributing-to-farmstack.md} | 0 docs/contributing-to-farmstack/untitled.md | 2 -- 4 files changed, 2 insertions(+), 5 deletions(-) rename docs/{contributing-to-farmstack/README.md => contributing-to-farmstack.md} (100%) delete mode 100644 docs/contributing-to-farmstack/untitled.md diff --git a/README.md b/README.md index 983f93f..dbdd3fe 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ For more information visit [our website](https://farmstack.digitalgreen.org) or We would love your contribution to this project no matter big or small. -To get started see our [contribution guide](docs/contributing-to-farmstack/). +To get started see our [contribution guide](docs/contributing-to-farmstack.md). ## Roadmap diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index fbaa7fa..564fe9c 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,6 +4,5 @@ * [Deploying Farmstack](deploying-farmstack/README.md) * [Local Deployment](deploying-farmstack/local-deployment.md) * [Deployment on AWS EC2](deploying-farmstack/aws-ec2.md) -* [Contributing to FarmStack](contributing-to-farmstack/README.md) - * [Untitled](contributing-to-farmstack/untitled.md) +* [Contributing to FarmStack](contributing-to-farmstack.md) diff --git a/docs/contributing-to-farmstack/README.md b/docs/contributing-to-farmstack.md similarity index 100% rename from docs/contributing-to-farmstack/README.md rename to docs/contributing-to-farmstack.md diff --git a/docs/contributing-to-farmstack/untitled.md b/docs/contributing-to-farmstack/untitled.md deleted file mode 100644 index 5094080..0000000 --- a/docs/contributing-to-farmstack/untitled.md +++ /dev/null @@ -1,2 +0,0 @@ -# Untitled - From 75f5e5a52aaf3180afd53ec1b51c494747a11561 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 22:30:31 +0530 Subject: [PATCH 017/163] Create example_uc.yml --- .github/workflows/example_uc.yml | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/workflows/example_uc.yml diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml new file mode 100644 index 0000000..883695f --- /dev/null +++ b/.github/workflows/example_uc.yml @@ -0,0 +1,40 @@ +# This is a basic workflow to help you get started with Actions + +name: Running example use case test + +# Controls when the action will run. +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [ main ] + pull_request: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + + # Runs a single command using the runners shell + - name: Running setup script + run: ./run.sh + + # Runs a set of commands using the runners shell + - name: Wait for connector to come online + run: sleep 60 + + - name: Checking for data + run: curl http://localhost:8081 | echo + + - name: Stopping containers + run: ./stop.sh From 7707f4e2b8cbba50866499bb3cc1d4c6e01fb241 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 22:35:05 +0530 Subject: [PATCH 018/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 883695f..1939ebc 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -34,7 +34,7 @@ jobs: run: sleep 60 - name: Checking for data - run: curl http://localhost:8081 | echo + run: curl http://localhost:8081 | jq '.' - name: Stopping containers run: ./stop.sh From 1da437db9082ebc71428bc6a944231d4139f0ccd Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 22:38:26 +0530 Subject: [PATCH 019/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 1939ebc..061e47c 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -1,16 +1,11 @@ -# This is a basic workflow to help you get started with Actions - name: Running example use case test -# Controls when the action will run. on: - # Triggers the workflow on push or pull request events but only for the main branch push: - branches: [ main ] + branches: [ main, mayank/new/github-actions ] pull_request: branches: [ main ] - # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel From d9d45164d623383ca7a1b4af4686d1240a968109 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 22:41:15 +0530 Subject: [PATCH 020/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 061e47c..29b99ad 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -29,7 +29,7 @@ jobs: run: sleep 60 - name: Checking for data - run: curl http://localhost:8081 | jq '.' + run: curl http://localhost:8081 - name: Stopping containers run: ./stop.sh From d8d57264b13d837ef39b9e57cc1eb4ed6178df02 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 22:54:22 +0530 Subject: [PATCH 021/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 29b99ad..28196c0 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -24,12 +24,15 @@ jobs: - name: Running setup script run: ./run.sh + - name: Checking for data + run: echo ${#$(curl http://localhost:8081)} + # Runs a set of commands using the runners shell - name: Wait for connector to come online run: sleep 60 - name: Checking for data - run: curl http://localhost:8081 + run: echo ${#$(curl http://localhost:8081)} - name: Stopping containers run: ./stop.sh From 03c36c76dca8b3b72927701aae813fe91cf361c3 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:00:18 +0530 Subject: [PATCH 022/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 28196c0..7fdde25 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -25,14 +25,18 @@ jobs: run: ./run.sh - name: Checking for data - run: echo ${#$(curl http://localhost:8081)} + run: | + data=$(curl http://localhost:8081) + echo ${#data} # Runs a set of commands using the runners shell - name: Wait for connector to come online run: sleep 60 - name: Checking for data - run: echo ${#$(curl http://localhost:8081)} + run: | + data=$(curl http://localhost:8081) + echo ${#data} - name: Stopping containers run: ./stop.sh From 01d240b68b2ee0f073b82f9056ac0409b775902b Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:08:59 +0530 Subject: [PATCH 023/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 7fdde25..e28a7cd 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -12,31 +12,23 @@ on: jobs: # This workflow contains a single job called "build" build: - # The type of runner that the job will run on runs-on: ubuntu-latest - # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - # Runs a single command using the runners shell - name: Running setup script run: ./run.sh - - - name: Checking for data - run: | - data=$(curl http://localhost:8081) - echo ${#data} # Runs a set of commands using the runners shell - - name: Wait for connector to come online - run: sleep 60 +# - name: Wait for connector to come online +# run: sleep 60 - name: Checking for data run: | data=$(curl http://localhost:8081) - echo ${#data} + len=${#data} + [ $len -le 93 ] && echo 'No data received at consumer' && exit 1 - name: Stopping containers run: ./stop.sh From b9aaaa260667075460be800b3c62a5892667abf5 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:09:33 +0530 Subject: [PATCH 024/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index e28a7cd..306a4e8 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -21,8 +21,8 @@ jobs: run: ./run.sh # Runs a set of commands using the runners shell -# - name: Wait for connector to come online -# run: sleep 60 + - name: Wait for connector to come online + run: sleep 60 - name: Checking for data run: | From 98164d84a6083f31db3ea33113cf3e14a636545c Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:18:00 +0530 Subject: [PATCH 025/163] Update example_uc.yml --- .github/workflows/example_uc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 306a4e8..6ac1644 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -28,7 +28,7 @@ jobs: run: | data=$(curl http://localhost:8081) len=${#data} - [ $len -le 93 ] && echo 'No data received at consumer' && exit 1 + $([ $len -le 93 ] && echo 'No data received at consumer' && exit 1) - name: Stopping containers run: ./stop.sh From a09eb8696c98f8468ff924c4a951a730ae94f0e0 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:26:42 +0530 Subject: [PATCH 026/163] updated workflow --- .github/workflows/example_uc.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 6ac1644..4e7a473 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -21,14 +21,21 @@ jobs: run: ./run.sh # Runs a set of commands using the runners shell - - name: Wait for connector to come online - run: sleep 60 + # - name: Wait for connector to come online + # run: sleep 60 + + + - name: Checking for data1 + run: | + data=$(curl http://localhost:8081) + len=${#data} + [ $len -le 90 ] && echo "No data received at consumer $len" && exit 1 - - name: Checking for data + - name: Checking for data2 run: | data=$(curl http://localhost:8081) len=${#data} - $([ $len -le 93 ] && echo 'No data received at consumer' && exit 1) + [ $len -le 93 ] && echo "No data received at consumer $len" && exit 1 - name: Stopping containers run: ./stop.sh From 438efa47c3a0af5508ce7ec93665aef51987f5e7 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:35:13 +0530 Subject: [PATCH 027/163] check for data ci --- .github/workflows/example_uc.yml | 13 ++----------- scripts/checkData.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 11 deletions(-) create mode 100755 scripts/checkData.sh diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 4e7a473..6689929 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -25,17 +25,8 @@ jobs: # run: sleep 60 - - name: Checking for data1 - run: | - data=$(curl http://localhost:8081) - len=${#data} - [ $len -le 90 ] && echo "No data received at consumer $len" && exit 1 - - - name: Checking for data2 - run: | - data=$(curl http://localhost:8081) - len=${#data} - [ $len -le 93 ] && echo "No data received at consumer $len" && exit 1 + - name: Checking for data transfer + run: ./scripts/checkData.sh - name: Stopping containers run: ./stop.sh diff --git a/scripts/checkData.sh b/scripts/checkData.sh new file mode 100755 index 0000000..2cd010a --- /dev/null +++ b/scripts/checkData.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +data=$(curl http://localhost:8081) +len=${#data} +if [[ $len -le 90 ]] +then + echo "No data received at consumer $len" + exit 1 +else + echo "Data transfer validation complete" +fi \ No newline at end of file From 72e3e6207bf69efd41f838bb0d2c8d0b2922f505 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:37:02 +0530 Subject: [PATCH 028/163] Data validation update --- scripts/checkData.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/checkData.sh b/scripts/checkData.sh index 2cd010a..6ba0163 100755 --- a/scripts/checkData.sh +++ b/scripts/checkData.sh @@ -2,7 +2,7 @@ data=$(curl http://localhost:8081) len=${#data} -if [[ $len -le 90 ]] +if [[ $len -le 93 ]] then echo "No data received at consumer $len" exit 1 From d5d0f8b8f9a32d4f93c9925b3e9cfc622b45b305 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:43:40 +0530 Subject: [PATCH 029/163] added badge to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dbdd3fe..284d107 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Introduction +![build](https://github.com/digitalgreenorg/farmstack-open/workflows/example_uc/badge.svg) ![](docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) From 783fc238b256587a73e4ff0d81a53311a9b6dbca Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:48:42 +0530 Subject: [PATCH 030/163] UC Test case --- .github/workflows/example_uc.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 6689929..ace42f6 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -1,4 +1,4 @@ -name: Running example use case test +name: UC Test Case on: push: diff --git a/README.md b/README.md index 284d107..aea3d55 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Introduction -![build](https://github.com/digitalgreenorg/farmstack-open/workflows/example_uc/badge.svg) +![build](https://github.com/digitalgreenorg/farmstack-open/actions/workflows/example_uc.yml/badge.svg) ![](docs/.gitbook/assets/farmstack_horizontal_color_transparent-bg.png) From 66953352980b28502fa658a86f44caaf5b49e281 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Tue, 22 Jun 2021 23:50:01 +0530 Subject: [PATCH 031/163] Updated action --- .github/workflows/example_uc.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index ace42f6..48cb064 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -21,9 +21,8 @@ jobs: run: ./run.sh # Runs a set of commands using the runners shell - # - name: Wait for connector to come online - # run: sleep 60 - + - name: Wait for connector to come online + run: sleep 60 - name: Checking for data transfer run: ./scripts/checkData.sh From bc0575d58b6f46522a98159ec3fc665701c91eb7 Mon Sep 17 00:00:00 2001 From: sagardg Date: Wed, 23 Jun 2021 17:04:12 +0530 Subject: [PATCH 032/163] add setup and integrate files --- connector/.vscode/settings.json | 3 + connector/connector/__init__.py | 0 connector/connector/base_models.py | 8 ++ connector/connector/settings.py | 136 ++++++++++++++++++ connector/connector/urls.py | 24 ++++ connector/connector/wsgi.py | 16 +++ connector/connector_api/__init__.py | 0 connector/connector_api/admin.py | 4 + connector/connector_api/apps.py | 5 + .../connector_api/migrations/0001_initial.py | 29 ++++ .../connector_api/migrations/__init__.py | 0 connector/connector_api/models.py | 12 ++ connector/connector_api/serializers.py | 9 ++ connector/connector_api/tests.py | 3 + connector/connector_api/urls.py | 18 +++ connector/connector_api/views.py | 126 ++++++++++++++++ connector/connector_views/__init__.py | 0 connector/connector_views/admin.py | 1 + connector/connector_views/apps.py | 5 + .../connector_views/migrations/__init__.py | 0 connector/connector_views/models.py | 0 connector/connector_views/tests.py | 3 + connector/connector_views/urls.py | 28 ++++ connector/connector_views/views.py | 21 +++ connector/db.sqlite3 | Bin 0 -> 143360 bytes connector/manage.py | 21 +++ connector/requirements.txt | 16 +++ connector/static/css/external-styles.css | 93 ++++++++++++ connector/static/css/style.css | 78 ++++++++++ connector/static/css/theme.css | 1 + connector/static/js/app.js | 47 ++++++ connector/static/js/bootstrap.js | 7 + connector/static/js/fontawesome.js | 5 + connector/static/js/jquery.js | 4 + connector/static/js/popper.js | 5 + connector/templates/connection.html | 134 +++++++++++++++++ connector/templates/home.html | 0 connector/templates/logs.html | 55 +++++++ connector/templates/status.html | 71 +++++++++ setup.py | 32 +++++ 40 files changed, 1020 insertions(+) create mode 100644 connector/.vscode/settings.json create mode 100644 connector/connector/__init__.py create mode 100644 connector/connector/base_models.py create mode 100644 connector/connector/settings.py create mode 100644 connector/connector/urls.py create mode 100644 connector/connector/wsgi.py create mode 100644 connector/connector_api/__init__.py create mode 100644 connector/connector_api/admin.py create mode 100644 connector/connector_api/apps.py create mode 100644 connector/connector_api/migrations/0001_initial.py create mode 100644 connector/connector_api/migrations/__init__.py create mode 100644 connector/connector_api/models.py create mode 100644 connector/connector_api/serializers.py create mode 100644 connector/connector_api/tests.py create mode 100644 connector/connector_api/urls.py create mode 100644 connector/connector_api/views.py create mode 100644 connector/connector_views/__init__.py create mode 100644 connector/connector_views/admin.py create mode 100644 connector/connector_views/apps.py create mode 100644 connector/connector_views/migrations/__init__.py create mode 100644 connector/connector_views/models.py create mode 100644 connector/connector_views/tests.py create mode 100644 connector/connector_views/urls.py create mode 100644 connector/connector_views/views.py create mode 100644 connector/db.sqlite3 create mode 100644 connector/manage.py create mode 100644 connector/requirements.txt create mode 100644 connector/static/css/external-styles.css create mode 100644 connector/static/css/style.css create mode 100644 connector/static/css/theme.css create mode 100644 connector/static/js/app.js create mode 100644 connector/static/js/bootstrap.js create mode 100644 connector/static/js/fontawesome.js create mode 100644 connector/static/js/jquery.js create mode 100644 connector/static/js/popper.js create mode 100644 connector/templates/connection.html create mode 100644 connector/templates/home.html create mode 100644 connector/templates/logs.html create mode 100644 connector/templates/status.html create mode 100644 setup.py diff --git a/connector/.vscode/settings.json b/connector/.vscode/settings.json new file mode 100644 index 0000000..adf7e3a --- /dev/null +++ b/connector/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/Library/Frameworks/Python.framework/Versions/3.7/bin/python3" +} \ No newline at end of file diff --git a/connector/connector/__init__.py b/connector/connector/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector/base_models.py b/connector/connector/base_models.py new file mode 100644 index 0000000..bfa0692 --- /dev/null +++ b/connector/connector/base_models.py @@ -0,0 +1,8 @@ +from django.db import models + +class TimeStampMixin(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + abstract = True \ No newline at end of file diff --git a/connector/connector/settings.py b/connector/connector/settings.py new file mode 100644 index 0000000..b2a3fac --- /dev/null +++ b/connector/connector/settings.py @@ -0,0 +1,136 @@ +""" +Django settings for connector project. + +Generated by 'django-admin startproject' using Django 2.2. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'r_*7r+@aj*09v)3qzm$$scup6mdg^6#a_iy1gwpp2adtyukhw3' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['*'] + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'connector_views', + 'rest_framework', + 'connector_api', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'connector.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + + +WSGI_APPLICATION = 'connector.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Asia/Kolkata' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.2/howto/static-files/ + + +STATIC_URL = '/static/' + +MEDIA_URL = '/media/' + +STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] + +VENV_PATH = os.path.dirname(BASE_DIR) + +STATIC_ROOT = os.path.join(VENV_PATH, 'static_root') + +MEDIA_ROOT = os.path.join(VENV_PATH, 'media_root') \ No newline at end of file diff --git a/connector/connector/urls.py b/connector/connector/urls.py new file mode 100644 index 0000000..97e65e0 --- /dev/null +++ b/connector/connector/urls.py @@ -0,0 +1,24 @@ +"""provider URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('home/', include("connector_views.urls")), + path('connector_api/', include("connector_api.urls")), + path('', include("connector_views.urls")) +] diff --git a/connector/connector/wsgi.py b/connector/connector/wsgi.py new file mode 100644 index 0000000..87541dd --- /dev/null +++ b/connector/connector/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for dashboard project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dashboard.settings') + +application = get_wsgi_application() diff --git a/connector/connector_api/__init__.py b/connector/connector_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector_api/admin.py b/connector/connector_api/admin.py new file mode 100644 index 0000000..c9e108d --- /dev/null +++ b/connector/connector_api/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import Connector + +admin.site.register(Connector) \ No newline at end of file diff --git a/connector/connector_api/apps.py b/connector/connector_api/apps.py new file mode 100644 index 0000000..af2ddd1 --- /dev/null +++ b/connector/connector_api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DataTransferConfig(AppConfig): + name = 'connector_api' diff --git a/connector/connector_api/migrations/0001_initial.py b/connector/connector_api/migrations/0001_initial.py new file mode 100644 index 0000000..239ba12 --- /dev/null +++ b/connector/connector_api/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2 on 2021-06-23 08:03 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Connector', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=120, unique=True)), + ('status', models.CharField(default='active', max_length=10)), + ('connector_type', models.CharField(blank=True, max_length=60, null=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/connector/connector_api/migrations/__init__.py b/connector/connector_api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector_api/models.py b/connector/connector_api/models.py new file mode 100644 index 0000000..2ebc078 --- /dev/null +++ b/connector/connector_api/models.py @@ -0,0 +1,12 @@ +from django.db import models +import uuid +from connector.base_models import TimeStampMixin + +class Connector(TimeStampMixin): + id = models.UUIDField(primary_key=True, default=uuid.uuid4) + name = models.CharField(max_length=120, unique=True) + status = models.CharField(max_length=10, default="active") + connector_type = models.CharField(max_length=60, null=True, blank=True) + + def __str__(self): + return self.name \ No newline at end of file diff --git a/connector/connector_api/serializers.py b/connector/connector_api/serializers.py new file mode 100644 index 0000000..0344f2d --- /dev/null +++ b/connector/connector_api/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers +from .models import Connector + + +class ConnectorSerializer(serializers.ModelSerializer): + + class Meta: + model = Connector + fields = ('name', 'connector_type', 'status') \ No newline at end of file diff --git a/connector/connector_api/tests.py b/connector/connector_api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/connector/connector_api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/connector/connector_api/urls.py b/connector/connector_api/urls.py new file mode 100644 index 0000000..12849c7 --- /dev/null +++ b/connector/connector_api/urls.py @@ -0,0 +1,18 @@ +from django.urls import path, re_path +from .views import RunLocal, StopConnector + +urlpatterns = [ + + path( + 'run_local/', + RunLocal.as_view(), + name='run_local' + ), + + re_path( + r'delete/(?P(provider|consumer))/(?P[0-9a-f-]+)/', + StopConnector.as_view(), + name='stop_connector' + ), + +] \ No newline at end of file diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py new file mode 100644 index 0000000..fa6cecc --- /dev/null +++ b/connector/connector_api/views.py @@ -0,0 +1,126 @@ +from connector_api.models import Connector +from datetime import date +import requests +import os +import time +import subprocess +import json, csv +from django import contrib, urls +from django.shortcuts import render, redirect +from django.utils.formats import localize +from rest_framework.response import Response +from rest_framework.views import status +from rest_framework import viewsets, generics +from rest_framework.authentication import SessionAuthentication, BasicAuthentication +from django.views.decorators.csrf import csrf_exempt +from subprocess import check_output +from .serializers import ConnectorSerializer + +class CsrfExemptSessionAuthentication(SessionAuthentication): + + def enforce_csrf(self, request): + return # To not perform the csrf check + + +class RunLocal(generics.RetrieveUpdateDestroyAPIView): + authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication) + + def get(self, request, *args, **kwargs): + return Response(status=status.HTTP_404_NOT_FOUND) + + def post(self, request, *args, **kwargs): + try: + # create connector instance + create_connector = ConnectorSerializer(data=request.data, many=isinstance(request.data, list)) + if create_connector.is_valid(): + create_connector.save() + messagae = "Created connectors successfully." + else: + messagae = "Created connectors successfully." + errors = create_connector.error + + # check if docker for connectors alreay running + docker_outout = check_output(["docker", "container", "ls", "-a"]) + output_string = docker_outout.decode('utf-8') + # check for consumer and provider core + if "provider-core" in output_string and "consumer-core" in output_string: + # redirect to status page as connectors already running + return redirect("http://localhost:%s/status/" % (8000)) + else: + try: + pid = os.fork() + except Exception as e: + print(e) + + # create a background process + if pid == 0: + subprocess.call(["./run.sh"]) + os._exit(0) + return redirect("http://localhost:%s/status/" % (8000)) + except Exception as e: + print(e) + return Response(data={"message": "message not saved"}, status=status.HTTP_304_NOT_MODIFIED) + + +class StopConnector(generics.RetrieveUpdateDestroyAPIView): + authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication) + + def post(self, request, *args, **kwargs): + return Response(status=status.HTTP_404_NOT_FOUND) + + def get(self, request, con_type, connector_uuid, *args, **kwargs): + try: + + if con_type == "provider": + # delete provider instance from database + try: + # create background process + try: + pid = os.fork() + except Exception as e: + print(e) + + # check if any provider connector running + docker_outout = check_output(["docker", "container", "ls", "-a"]) + output_string = docker_outout.decode('utf-8') + # check for consumer and provider core, if running stop it, else return to status + if "provider-core" in output_string: + # redirect to status page as connectors already running + if pid == 0: + subprocess.call(["./stop_provider.sh"]) + print(os.getpid()) + os._exit(0) + connector_object = Connector.objects.get(pk=connector_uuid) + connector_object.delete() + except: + pass + print("stop provider instnace") + else: + # delete consumer instance from database + try: + # create background process + try: + pid = os.fork() + except Exception as e: + print(e) + + # check if any consumer connector running + docker_outout = check_output(["docker", "container", "ls", "-a"]) + output_string = docker_outout.decode('utf-8') + # check for consumer and provider core, if running stop it, else return to status + if "consumer-core" in output_string: + # redirect to status page as connectors already running + if pid == 0: + subprocess.call(["./stop_consumer.sh"]) + print(os.getpid()) + os._exit(0) + connector_object = Connector.objects.get(pk=connector_uuid) + connector_object.delete() + except: + pass + + time.sleep(5) + return redirect("http://localhost:8000/home/status/") + except Exception as e: + print(e) + return Response(data={"message": "message not saved"}, status=status.HTTP_304_NOT_MODIFIED) \ No newline at end of file diff --git a/connector/connector_views/__init__.py b/connector/connector_views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector_views/admin.py b/connector/connector_views/admin.py new file mode 100644 index 0000000..a23ff81 --- /dev/null +++ b/connector/connector_views/admin.py @@ -0,0 +1 @@ +from django.contrib import admin \ No newline at end of file diff --git a/connector/connector_views/apps.py b/connector/connector_views/apps.py new file mode 100644 index 0000000..6d34160 --- /dev/null +++ b/connector/connector_views/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class GraphConfig(AppConfig): + name = 'connector_views' diff --git a/connector/connector_views/migrations/__init__.py b/connector/connector_views/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector_views/models.py b/connector/connector_views/models.py new file mode 100644 index 0000000..e69de29 diff --git a/connector/connector_views/tests.py b/connector/connector_views/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/connector/connector_views/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/connector/connector_views/urls.py b/connector/connector_views/urls.py new file mode 100644 index 0000000..b34f244 --- /dev/null +++ b/connector/connector_views/urls.py @@ -0,0 +1,28 @@ +from django.urls import path +from .views import home, start_connector, con_status, log + +urlpatterns = [ + path( + "home/", + home, + name="home" + ), + + path( + "start_connector/", + start_connector, + name="start_connector" + ), + + path( + "status/", + con_status, + name="status" + ), + + path( + "log/", + log, + name="log" + ), +] \ No newline at end of file diff --git a/connector/connector_views/views.py b/connector/connector_views/views.py new file mode 100644 index 0000000..ea59b45 --- /dev/null +++ b/connector/connector_views/views.py @@ -0,0 +1,21 @@ +from django.shortcuts import render +import json +import requests +from connector_api.models import Connector + +def home(request): + return render(request, "connection.html") + +def start_connector(request): + return render(request, "connection.html") + +def con_status(request): + connectors = Connector.objects.all() + return render(request, "status.html", context={"connectors": connectors}) + +def log(request): + log_json = requests.get('http://localhost:3100/loki/api/v1/query_range?direction=BACKWARD&limit=1000&query=%7Bjob%3D%22varlogs%22%7D&start=1623317555000000000&end=1623321156000000000') + log_json = json.loads(log_json.text)["data"]["result"][0]["values"][:100] + for i, log in enumerate(log_json): + log_json[i] = json.loads(log[-1]) + return render(request, "logs.html", context={"logs": log_json}) diff --git a/connector/db.sqlite3 b/connector/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..13f2deba0580ef56647e3e7cbc4088c9fcbf455b GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/connector/manage.py b/connector/manage.py new file mode 100644 index 0000000..04c8634 --- /dev/null +++ b/connector/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'connector.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/connector/requirements.txt b/connector/requirements.txt new file mode 100644 index 0000000..85bae54 --- /dev/null +++ b/connector/requirements.txt @@ -0,0 +1,16 @@ +bcrypt +certifi +cffi +chardet +cryptography +Django==2.2 +djangorestframework==3.12.2 +idna +pycparser +PyNaCl +pytz +PyYAML +requests==2.25.1 +six +sqlparse +urllib3==1.26.3 \ No newline at end of file diff --git a/connector/static/css/external-styles.css b/connector/static/css/external-styles.css new file mode 100644 index 0000000..26ba728 --- /dev/null +++ b/connector/static/css/external-styles.css @@ -0,0 +1,93 @@ +:root { + --primary: #f7b733; + --primary-hover: #fbaf11; + --primary-light: #f4c769; +} + +.content-wrapper { + padding: 1rem; +} + +/* Primary Button Color CSS Starts */ +.btn-primary-2 { + background-color: var(--primary); + border: 1px solid transparent; + color: #fff; +} +.btn-primary-2:hover, .btn-primary-2:active { + background-color: var(--primary-hover); + border: 1px solid transparent; + color: #fff; +} +/* Primary Button Color CSS Ends */ + +/* Toggle Switch CSS Starts */ +.toggle-switch input:checked+.toggle-switch-slider { + border: .0625rem solid var(--primary); +} +.toggle-switch input:checked+.toggle-switch-slider:before { + background-color: var(--primary); + border-color: var(--primary); +} +/* Toggle Switch CSS Ends */ + +.card { + background-color: #fff; + border: none; + border-radius: .625rem; + box-shadow: 0 0.46875rem 2.1875rem rgb(90 97 105 / 10%), 0 0.9375rem 1.40625rem rgb(90 97 105 / 10%), 0 0.25rem 0.53125rem rgb(90 97 105 / 12%), 0 0.125rem 0.1875rem rgb(90 97 105 / 10%); +} + +.card { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0,0,0,.125); + border-radius: .25rem; +} + +.card-body { + padding: 1.875rem; +} + +.card-body { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; +} + +/* .bootstrap-select .dropdown-toggle:focus { + outline: 5px auto var(--primary) !important; +} +.bootstrap-select .dropdown-menu .selected .dropdown-item { + color: var(--primary-light); +} */ + +.nav-pills .nav-link.active, .nav-pills .show>.nav-link { + color: var(--primary-light); +} + +.disbaled-control { + cursor: not-allowed; +} + +@media screen and (max-width: 640px) { + .btn-container-right { + display: block !important; + } + + .btn-container-right .btn { + width: 100%; + margin-bottom: 1rem; + } +} \ No newline at end of file diff --git a/connector/static/css/style.css b/connector/static/css/style.css new file mode 100644 index 0000000..82e6a23 --- /dev/null +++ b/connector/static/css/style.css @@ -0,0 +1,78 @@ + +.card-table-container { + overflow: auto; +} +.page-title { + display: flex; + justify-content: space-between; +} +.page-title .title { + margin-bottom: 0; +} + +/* Source List Page CSS Starts */ +.source-title .page-title .title { + line-height: 1.5; +} +/* Source List Page CSS Ends */ + +/* Connection Page CSS Starts */ +.detail-item { + border-bottom: 1px solid #ccc; + border-left: .5rem solid var(--primary); + padding: .3rem; + margin-bottom: 1rem; + border-radius: 10px; +} +.detail-item h6 { + text-transform: uppercase; + font-size: 1rem; +} +.detail-item .data-item { + border: 1px solid #eee; + padding: 5px; + margin-bottom: 5px; + background-color: #eee; +} +.connection-container .nav-pills .nav-link { + padding: 0; + border: none; +} +.connection-container .nav-link span { + border: 1px solid var(--primary); + padding: 5px 10px; + border-radius: 20px; +} +.connection-container .nav-link.active span { + background-color: var(--primary); + color: #fff; +} +/* Connection Page CSS Ends */ + +/* Logs Page CSS Starts */ +.logs-container .page-title .title { + line-height: 2.5; +} +.logs-container .card-body { + padding: 1rem 1.2rem; +} +.logs-content-wrapper { + background-color: #efefef; +} +.logs-json-content { + padding: 1rem 2rem; +} +/* Logs Page CSS Ends */ + + +@media screen and (max-width: 640px) { + .page-title { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + .page-title .btn { + width: 100%; + } +} \ No newline at end of file diff --git a/connector/static/css/theme.css b/connector/static/css/theme.css new file mode 100644 index 0000000..fef9410 --- /dev/null +++ b/connector/static/css/theme.css @@ -0,0 +1 @@ +:root{--blue: #3369d6;--indigo: #5603ad;--purple: #801096;--pink: #e36397;--red: #f03;--orange: #ff3b00;--yellow: #ffd600;--green: #00c759;--teal: #73e9ef;--cyan: #2bffc6;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--light: #dee2e6;--lighter: #f8f9fa;--primary: #288cff;--secondary: #e8f2ff;--success: #00c759;--info: #73e9ef;--warning: #ff3b00;--danger: #f03;--light: #e9ecef;--dark: #343a40;--tertiary: #192b3f;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Nunito",sans-serif;font-size:.875rem;font-weight:400;line-height:1.6;color:#495057;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#288cff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0066db;text-decoration:unone}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace, monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#adb5bd;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:600;line-height:1.3;color:#343a40}h1,.h1{font-size:2.1875rem}h2,.h2{font-size:1.75rem}h3,.h3{font-size:1.53125rem}h4,.h4{font-size:1.3125rem}h5,.h5{font-size:1.09375rem}h6,.h6{font-size:.875rem}.lead{font-size:1.09375rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.3}.display-2{font-size:5.5rem;font-weight:300;line-height:1.3}.display-3{font-size:4.5rem;font-weight:300;line-height:1.3}.display-4{font-size:3.5rem;font-weight:300;line-height:1.3}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:.0625rem solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.09375rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:.0625rem solid #dee2e6;border-radius:.375rem;box-shadow:0 1px 2px rgba(0,0,0,0.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e36397;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.25rem;box-shadow:inset 0 -0.1rem 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:600;box-shadow:none}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table th,.table td{padding:.75rem;vertical-align:top;border-top:.0625rem solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:.125rem solid #dee2e6}.table tbody+tbody{border-top:.125rem solid #dee2e6}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:.0625rem solid #dee2e6}.table-bordered th,.table-bordered td{border:.0625rem solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:.125rem}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c3dfff}.table-hover .table-primary:hover{background-color:#aad1ff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#aad1ff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#f9fbff}.table-hover .table-secondary:hover{background-color:#e0eaff}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e0eaff}.table-success,.table-success>th,.table-success>td{background-color:#b8efd1}.table-hover .table-success:hover{background-color:#a3eac4}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a3eac4}.table-info,.table-info>th,.table-info>td{background-color:#d8f9fb}.table-hover .table-info:hover{background-color:#c1f5f9}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c1f5f9}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffc8b8}.table-hover .table-warning:hover{background-color:#ffb49f}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffb49f}.table-danger,.table-danger>th,.table-danger>td{background-color:#ffb8c6}.table-hover .table-danger:hover{background-color:#ff9fb2}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ff9fb2}.table-light,.table-light>th,.table-light>td{background-color:#f9fafb}.table-hover .table-light:hover{background-color:#eaedf1}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#eaedf1}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-tertiary,.table-tertiary>th,.table-tertiary>td{background-color:#bfc4c9}.table-hover .table-tertiary:hover{background-color:#b1b7bd}.table-hover .table-tertiary:hover>td,.table-hover .table-tertiary:hover>th{background-color:#b1b7bd}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.75rem 1rem;font-size:.875rem;line-height:1.6;color:#495057;background-color:#fff;background-clip:padding-box;border:.0625rem solid #ced4da;border-radius:.375rem;box-shadow:none;transition:all 0.2s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#f8f9fa;border-color:#ced4da;outline:0;box-shadow:none,0 4px 10px 0 rgba(0,0,0,0.04)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.9rem + .125rem)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.75rem + .0625rem);padding-bottom:calc(.75rem + .0625rem);margin-bottom:0;font-size:inherit;line-height:1.6}.col-form-label-lg{padding-top:calc(.95rem + .0625rem);padding-bottom:calc(.95rem + .0625rem);font-size:1.09375rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.55rem + .0625rem);padding-bottom:calc(.55rem + .0625rem);font-size:.765625rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.75rem;padding-bottom:.75rem;margin-bottom:0;line-height:1.6;background-color:transparent;border:solid transparent;border-width:.0625rem 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.55rem 1rem;font-size:.765625rem;line-height:1.5;border-radius:.25rem}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(2.2484375rem + .125rem)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.95rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:.375rem}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(3.540625rem + .125rem)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#adb5bd}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#00c759}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(0,199,89,0.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#00c759}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#00c759;box-shadow:0 0 0 0 rgba(0,199,89,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#00c759}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#00c759}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{background-color:#48ff9a;border-color:#48ff9a}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{background:#00fa70 linear-gradient(180deg, #26fb85, #00fa70) repeat-x;border-color:#48ff9a}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 0 rgba(0,199,89,0.25)}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#00c759}.was-validated .custom-file-input:valid ~ .custom-file-label::before,.custom-file-input.is-valid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{box-shadow:0 0 0 0 rgba(0,199,89,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#f03}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(255,0,51,0.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#f03}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#f03;box-shadow:0 0 0 0 rgba(255,0,51,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#f03}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#f03}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{background-color:#ff8099;border-color:#ff8099}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{background:#ff335c linear-gradient(180deg, #ff5274, #ff335c) repeat-x;border-color:#ff8099}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 0 rgba(255,0,51,0.25)}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#f03}.was-validated .custom-file-input:invalid ~ .custom-file-label::before,.custom-file-input.is-invalid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{box-shadow:0 0 0 0 rgba(255,0,51,0.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:600;text-align:center;white-space:nowrap;vertical-align:middle;user-select:none;border:.0625rem solid transparent;padding:.75rem 1.5rem;font-size:.875rem;line-height:1.6;border-radius:.375rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 4px 10px 0 rgba(0,0,0,0.04)}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{background-image:none;box-shadow:none}.btn:not(:disabled):not(.disabled):active:focus,.btn:not(:disabled):not(.disabled).active:focus{box-shadow:0 4px 10px 0 rgba(0,0,0,0.04),none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x;border-color:#288cff;box-shadow:none}.btn-primary:hover{color:#fff;background:#0278ff linear-gradient(180deg, #288cff, #0278ff) repeat-x;border-color:#0071f4}.btn-primary:focus,.btn-primary.focus{box-shadow:none,0 0 0 0 rgba(40,140,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#288cff;border-color:#288cff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0071f4;background-image:none;border-color:#006ce7}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(40,140,255,0.5)}.btn-secondary{color:#212529;background:#e8f2ff linear-gradient(180deg, #ebf4ff, #e8f2ff) repeat-x;border-color:#e8f2ff;box-shadow:none}.btn-secondary:hover{color:#212529;background:#c2dcff linear-gradient(180deg, #cbe1ff, #c2dcff) repeat-x;border-color:#b5d5ff}.btn-secondary:focus,.btn-secondary.focus{box-shadow:none,0 0 0 0 rgba(232,242,255,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#212529;background-color:#e8f2ff;border-color:#e8f2ff}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#212529;background-color:#b5d5ff;background-image:none;border-color:#a8ceff}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(232,242,255,0.5)}.btn-success{color:#fff;background:#00c759 linear-gradient(180deg, #26cf72, #00c759) repeat-x;border-color:#00c759;box-shadow:none}.btn-success:hover{color:#fff;background:#00a148 linear-gradient(180deg, #26af63, #00a148) repeat-x;border-color:#009442}.btn-success:focus,.btn-success.focus{box-shadow:none,0 0 0 0 rgba(0,199,89,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#00c759;border-color:#00c759}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#009442;background-image:none;border-color:#00873c}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(0,199,89,0.5)}.btn-info{color:#212529;background:#73e9ef linear-gradient(180deg, #88ecf1, #73e9ef) repeat-x;border-color:#73e9ef;box-shadow:none}.btn-info:hover{color:#212529;background:#51e4eb linear-gradient(180deg, #6be8ee, #51e4eb) repeat-x;border-color:#45e2ea}.btn-info:focus,.btn-info.focus{box-shadow:none,0 0 0 0 rgba(115,233,239,0.5)}.btn-info.disabled,.btn-info:disabled{color:#212529;background-color:#73e9ef;border-color:#73e9ef}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#212529;background-color:#45e2ea;background-image:none;border-color:#3ae0e8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(115,233,239,0.5)}.btn-warning{color:#fff;background:#ff3b00 linear-gradient(180deg, #ff5826, #ff3b00) repeat-x;border-color:#ff3b00;box-shadow:none}.btn-warning:hover{color:#fff;background:#d93200 linear-gradient(180deg, #df5126, #d93200) repeat-x;border-color:#cc2f00}.btn-warning:focus,.btn-warning.focus{box-shadow:none,0 0 0 0 rgba(255,59,0,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ff3b00;border-color:#ff3b00}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cc2f00;background-image:none;border-color:#bf2c00}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(255,59,0,0.5)}.btn-danger{color:#fff;background:#f03 linear-gradient(180deg, #ff2652, #f03) repeat-x;border-color:#f03;box-shadow:none}.btn-danger:hover{color:#fff;background:#d9002b linear-gradient(180deg, #df264b, #d9002b) repeat-x;border-color:#cc0029}.btn-danger:focus,.btn-danger.focus{box-shadow:none,0 0 0 0 rgba(255,0,51,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#f03;border-color:#f03}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#cc0029;background-image:none;border-color:#bf0026}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(255,0,51,0.5)}.btn-light{color:#212529;background:#e9ecef linear-gradient(180deg, #eceff1, #e9ecef) repeat-x;border-color:#e9ecef;box-shadow:none}.btn-light:hover{color:#212529;background:#d3d9df linear-gradient(180deg, #dadfe4, #d3d9df) repeat-x;border-color:#cbd3da}.btn-light:focus,.btn-light.focus{box-shadow:none,0 0 0 0 rgba(233,236,239,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#cbd3da;background-image:none;border-color:#c4ccd4}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(233,236,239,0.5)}.btn-dark{color:#fff;background:#343a40 linear-gradient(180deg, #52585d, #343a40) repeat-x;border-color:#343a40;box-shadow:none}.btn-dark:hover{color:#fff;background:#23272b linear-gradient(180deg, #44474b, #23272b) repeat-x;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:none,0 0 0 0 rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;background-image:none;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(52,58,64,0.5)}.btn-tertiary{color:#fff;background:#192b3f linear-gradient(180deg, #3c4b5c, #192b3f) repeat-x;border-color:#192b3f;box-shadow:none}.btn-tertiary:hover{color:#fff;background:#0e1824 linear-gradient(180deg, #323b45, #0e1824) repeat-x;border-color:#0b121a}.btn-tertiary:focus,.btn-tertiary.focus{box-shadow:none,0 0 0 0 rgba(25,43,63,0.5)}.btn-tertiary.disabled,.btn-tertiary:disabled{color:#fff;background-color:#192b3f;border-color:#192b3f}.btn-tertiary:not(:disabled):not(.disabled):active,.btn-tertiary:not(:disabled):not(.disabled).active,.show>.btn-tertiary.dropdown-toggle{color:#fff;background-color:#0b121a;background-image:none;border-color:#070c11}.btn-tertiary:not(:disabled):not(.disabled):active:focus,.btn-tertiary:not(:disabled):not(.disabled).active:focus,.show>.btn-tertiary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(25,43,63,0.5)}.btn-outline-primary{color:#288cff;background-color:transparent;background-image:none;border-color:#288cff}.btn-outline-primary:hover{color:#fff;background-color:#288cff;border-color:#288cff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 0 rgba(40,140,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#288cff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#288cff;border-color:#288cff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(40,140,255,0.5)}.btn-outline-secondary{color:#e8f2ff;background-color:transparent;background-image:none;border-color:#e8f2ff}.btn-outline-secondary:hover{color:#212529;background-color:#e8f2ff;border-color:#e8f2ff}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 0 rgba(232,242,255,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#e8f2ff;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#212529;background-color:#e8f2ff;border-color:#e8f2ff}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(232,242,255,0.5)}.btn-outline-success{color:#00c759;background-color:transparent;background-image:none;border-color:#00c759}.btn-outline-success:hover{color:#fff;background-color:#00c759;border-color:#00c759}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 0 rgba(0,199,89,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#00c759;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#00c759;border-color:#00c759}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(0,199,89,0.5)}.btn-outline-info{color:#73e9ef;background-color:transparent;background-image:none;border-color:#73e9ef}.btn-outline-info:hover{color:#212529;background-color:#73e9ef;border-color:#73e9ef}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 0 rgba(115,233,239,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#73e9ef;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#212529;background-color:#73e9ef;border-color:#73e9ef}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(115,233,239,0.5)}.btn-outline-warning{color:#ff3b00;background-color:transparent;background-image:none;border-color:#ff3b00}.btn-outline-warning:hover{color:#fff;background-color:#ff3b00;border-color:#ff3b00}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 0 rgba(255,59,0,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ff3b00;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ff3b00;border-color:#ff3b00}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(255,59,0,0.5)}.btn-outline-danger{color:#f03;background-color:transparent;background-image:none;border-color:#f03}.btn-outline-danger:hover{color:#fff;background-color:#f03;border-color:#f03}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 0 rgba(255,0,51,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#f03;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#f03;border-color:#f03}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(255,0,51,0.5)}.btn-outline-light{color:#e9ecef;background-color:transparent;background-image:none;border-color:#e9ecef}.btn-outline-light:hover{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 0 rgba(233,236,239,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#e9ecef;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(233,236,239,0.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-tertiary{color:#192b3f;background-color:transparent;background-image:none;border-color:#192b3f}.btn-outline-tertiary:hover{color:#fff;background-color:#192b3f;border-color:#192b3f}.btn-outline-tertiary:focus,.btn-outline-tertiary.focus{box-shadow:0 0 0 0 rgba(25,43,63,0.5)}.btn-outline-tertiary.disabled,.btn-outline-tertiary:disabled{color:#192b3f;background-color:transparent}.btn-outline-tertiary:not(:disabled):not(.disabled):active,.btn-outline-tertiary:not(:disabled):not(.disabled).active,.show>.btn-outline-tertiary.dropdown-toggle{color:#fff;background-color:#192b3f;border-color:#192b3f}.btn-outline-tertiary:not(:disabled):not(.disabled):active:focus,.btn-outline-tertiary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-tertiary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(25,43,63,0.5)}.btn-link{font-weight:400;color:#288cff;background-color:transparent}.btn-link:hover{color:#0066db;text-decoration:unone;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:unone;border-color:transparent;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.95rem 1rem;font-size:1.09375rem;line-height:1.5;border-radius:.375rem}.btn-sm,.btn-group-sm>.btn{padding:.55rem 1rem;font-size:.765625rem;line-height:1.5;border-radius:.375rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;transition:opacity 0.15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height 0.35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.875rem;color:#495057;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,0.15);border-radius:.375rem;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.175)}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background:#f8f9fa linear-gradient(180deg, #f9fafb, #f8f9fa) repeat-x}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent;background-image:none}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.765625rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-0.0625rem}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:none}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-0.0625rem;margin-left:0}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file:focus{z-index:3}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-0.0625rem}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-0.0625rem}.input-group-prepend{margin-right:-0.0625rem}.input-group-append{margin-left:-0.0625rem}.input-group-text{display:flex;align-items:center;padding:.75rem 1rem;margin-bottom:0;font-size:.875rem;font-weight:400;line-height:1.6;color:#6c757d;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:.0625rem solid #ced4da;border-radius:.375rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.6rem;padding-left:1.75rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x;box-shadow:none}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 4px 10px 0 rgba(0,0,0,0.04)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#288cff;box-shadow:none}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.175rem;left:0;display:block;width:1.25rem;height:1.25rem;pointer-events:none;content:"";user-select:none;background-color:#fff;box-shadow:none}.custom-control-label::after{position:absolute;top:.175rem;left:0;display:block;width:1.25rem;height:1.25rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x;box-shadow:none}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(40,140,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(40,140,255,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(40,140,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.9rem + .125rem);padding:.375rem 1.75rem .375rem .75rem;line-height:1.6;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:.0625rem solid #ced4da;border-radius:.375rem;appearance:none}.custom-select:focus{border-color:#ced4da;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(206,212,218,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(2.2484375rem + .125rem);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(3.540625rem + .125rem);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.9rem + .125rem);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.9rem + .125rem);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#ced4da;box-shadow:0 4px 10px 0 rgba(0,0,0,0.04)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#ced4da}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.9rem + .125rem);padding:.75rem 1rem;line-height:1.6;color:#495057;background-color:#fff;border:.0625rem solid #ced4da;border-radius:.375rem;box-shadow:none}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.9rem + .125rem) - .0625rem * 2);padding:.75rem 1rem;line-height:1.6;color:#495057;content:"Browse";background:#f8f9fa linear-gradient(180deg, #f9fafb, #f8f9fa) repeat-x;border-left:.0625rem solid #ced4da;border-radius:0 .375rem .375rem 0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:.0625rem solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-0.0625rem}.nav-tabs .nav-link{border:.0625rem solid transparent;border-top-left-radius:.375rem;border-top-right-radius:.375rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-0.0625rem;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.375rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#288cff;background-color:transparent}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.325rem;padding-bottom:.325rem;margin-right:1rem;font-size:1.09375rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.09375rem;line-height:1;background-color:transparent;border:.0625rem solid transparent;border-radius:.375rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:1rem;padding-left:1rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:transparent}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:.0625rem solid rgba(0,0,0,0.05);border-radius:.375rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.card-body{flex:1 1 auto;padding:1.5rem}.card-title{margin-bottom:1.25rem}.card-subtitle{margin-top:-0.625rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.5rem}.card-header{padding:1.25rem 1.5rem;margin-bottom:0;background-color:#fff;border-bottom:.0625rem solid rgba(0,0,0,0.05)}.card-header:first-child{border-radius:calc(.375rem - .0625rem) calc(.375rem - .0625rem) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:1.25rem 1.5rem;background-color:#fff;border-top:.0625rem solid rgba(0,0,0,0.05)}.card-footer:last-child{border-radius:0 0 calc(.375rem - .0625rem) calc(.375rem - .0625rem)}.card-header-tabs{margin-right:-0.75rem;margin-bottom:-1.25rem;margin-left:-0.75rem;border-bottom:0}.card-header-pills{margin-right:-0.75rem;margin-left:-0.75rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.375rem - .0625rem)}.card-img-top{width:100%;border-top-left-radius:calc(.375rem - .0625rem);border-top-right-radius:calc(.375rem - .0625rem)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.375rem - .0625rem);border-bottom-left-radius:calc(.375rem - .0625rem)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.375rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:1.25rem}@media (min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.375rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.375rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-0.0625rem;line-height:1.25;color:#6c757d;background-color:#fff;border:.0625rem solid #dee2e6}.page-link:hover{color:#6c757d;text-decoration:none;background-color:#dee2e6;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 4px 10px 0 rgba(0,0,0,0.04)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#288cff;border-color:#288cff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.09375rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.765625rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.badge{display:inline-block;padding:.25rem .375rem;font-size:65%;font-weight:600;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.375rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.65em;padding-left:.65em;border-radius:10rem}.badge-primary{color:#fff;background-color:#288cff}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#0071f4}.badge-secondary{color:#212529;background-color:#e8f2ff}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#212529;text-decoration:none;background-color:#b5d5ff}.badge-success{color:#fff;background-color:#00c759}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#009442}.badge-info{color:#212529;background-color:#73e9ef}.badge-info[href]:hover,.badge-info[href]:focus{color:#212529;text-decoration:none;background-color:#45e2ea}.badge-warning{color:#fff;background-color:#ff3b00}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#fff;text-decoration:none;background-color:#cc2f00}.badge-danger{color:#fff;background-color:#f03}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#cc0029}.badge-light{color:#212529;background-color:#e9ecef}.badge-light[href]:hover,.badge-light[href]:focus{color:#212529;text-decoration:none;background-color:#cbd3da}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#1d2124}.badge-tertiary{color:#fff;background-color:#192b3f}.badge-tertiary[href]:hover,.badge-tertiary[href]:focus{color:#fff;text-decoration:none;background-color:#0b121a}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.375rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:1rem 1.5rem;margin-bottom:1rem;border:.0625rem solid transparent;border-radius:.375rem}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:4.3125rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:1rem 1.5rem;color:inherit}.alert-primary{color:#fff;background:#4a9eff linear-gradient(180deg, #65adff, #4a9eff) repeat-x;border-color:#4a9eff}.alert-primary hr{border-top-color:#3190ff}.alert-primary .alert-link{color:#0071f4}.alert-secondary{color:#212529;background:#ecf4ff linear-gradient(180deg, #eff6ff, #ecf4ff) repeat-x;border-color:#ecf4ff}.alert-secondary hr{border-top-color:#d3e5ff}.alert-secondary .alert-link{color:#b5d5ff}.alert-success{color:#fff;background:#29d074 linear-gradient(180deg, #49d789, #29d074) repeat-x;border-color:#29d074}.alert-success hr{border-top-color:#25bb68}.alert-success .alert-link{color:#009442}.alert-info{color:#212529;background:#89edf2 linear-gradient(180deg, #9bf0f4, #89edf2) repeat-x;border-color:#89edf2}.alert-info hr{border-top-color:#72e9ef}.alert-info .alert-link{color:#45e2ea}.alert-warning{color:#fff;background:#ff5a29 linear-gradient(180deg, #ff7349, #ff5a29) repeat-x;border-color:#ff5a29}.alert-warning hr{border-top-color:#ff4610}.alert-warning .alert-link{color:#cc2f00}.alert-danger{color:#fff;background:#ff2954 linear-gradient(180deg, #ff496e, #ff2954) repeat-x;border-color:#ff2954}.alert-danger hr{border-top-color:#ff1040}.alert-danger .alert-link{color:#cc0029}.alert-light{color:#212529;background:#edeff2 linear-gradient(180deg, #f0f1f4, #edeff2) repeat-x;border-color:#edeff2}.alert-light hr{border-top-color:#dee2e7}.alert-light .alert-link{color:#cbd3da}.alert-dark{color:#fff;background:#545a5f linear-gradient(180deg, #6e7377, #545a5f) repeat-x;border-color:#545a5f}.alert-dark hr{border-top-color:#484d51}.alert-dark .alert-link{color:#1d2124}.alert-tertiary{color:#fff;background:#3e4d5e linear-gradient(180deg, #5b6876, #3e4d5e) repeat-x;border-color:#3e4d5e}.alert-tertiary hr{border-top-color:#34404f}.alert-tertiary .alert-link{color:#0b121a}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.65625rem;background-color:#e9ecef;border-radius:.375rem;box-shadow:inset 0 0.1rem 0.1rem rgba(0,0,0,0.1)}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;background-color:#288cff;transition:width 0.6s ease}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#495057;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-0.0625rem;background-color:#fff;border:.0625rem solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#288cff;border-color:#288cff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#154985;background-color:#c3dfff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#154985;background-color:#aad1ff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#154985;border-color:#154985}.list-group-item-secondary{color:#797e85;background-color:#f9fbff}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#797e85;background-color:#e0eaff}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#797e85;border-color:#797e85}.list-group-item-success{color:#00672e;background-color:#b8efd1}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#00672e;background-color:#a3eac4}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#00672e;border-color:#00672e}.list-group-item-info{color:#3c797c;background-color:#d8f9fb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#3c797c;background-color:#c1f5f9}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#3c797c;border-color:#3c797c}.list-group-item-warning{color:#851f00;background-color:#ffc8b8}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#851f00;background-color:#ffb49f}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#851f00;border-color:#851f00}.list-group-item-danger{color:#85001b;background-color:#ffb8c6}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#85001b;background-color:#ff9fb2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#85001b;border-color:#85001b}.list-group-item-light{color:#797b7c;background-color:#f9fafb}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#797b7c;background-color:#eaedf1}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#797b7c;border-color:#797b7c}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.list-group-item-tertiary{color:#0d1621;background-color:#bfc4c9}.list-group-item-tertiary.list-group-item-action:hover,.list-group-item-tertiary.list-group-item-action:focus{color:#0d1621;background-color:#b1b7bd}.list-group-item-tertiary.list-group-item-action.active{color:#fff;background-color:#0d1621;border-color:#0d1621}.close{float:right;font-size:1.3125rem;font-weight:600;line-height:1;color:rgba(255,255,255,0.6);text-shadow:none;opacity:.5}.close:hover,.close:focus{color:rgba(255,255,255,0.6);text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -25%)}.modal.show .modal-dialog{transform:translate(0, 0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.375rem;box-shadow:0 0.25rem 0.5rem rgba(0,0,0,0.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.3}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1.25rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.375rem;border-top-right-radius:.375rem}.modal-header .close{padding:1.25rem;margin:-1.25rem -1.25rem -1.25rem auto}.modal-title{margin-bottom:0;line-height:1.6}.modal-body{position:relative;flex:1 1 auto;padding:1.5rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1.5rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-content{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.5)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Nunito",sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.375rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Nunito",sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.765625rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.05);border-radius:.375rem;box-shadow:0px 0.5rem 2rem 0px rgba(0,0,0,0.2)}.popover .arrow{position:absolute;display:block;width:1.5rem;height:.75rem;margin:0 .375rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:.75rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((.75rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:.75rem .75rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:transparent}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:.75rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((.75rem + 1px) * -1);width:.75rem;height:1.5rem;margin:.375rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:.75rem .75rem .75rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:transparent}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:.75rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((.75rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 .75rem .75rem .75rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:transparent}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1.5rem;margin-left:-.75rem;content:"";border-bottom:1px solid #fff}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:.75rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((.75rem + 1px) * -1);width:.75rem;height:1.5rem;margin:.375rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:.75rem 0 .75rem .75rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:transparent}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.75rem .75rem;margin-bottom:0;font-size:.875rem;color:#343a40;background-color:#fff;border-bottom:1px solid #f2f2f2;border-top-left-radius:calc(.375rem - 1px);border-top-right-radius:calc(.375rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.75rem .75rem;color:#495057}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;align-items:center;width:100%;transition:transform 0.6s ease;backface-visibility:hidden;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translateX(0)}@supports (transform-style: preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translate3d(0, 0, 0)}}.carousel-item-next,.active.carousel-item-right{transform:translateX(100%)}@supports (transform-style: preserve-3d){.carousel-item-next,.active.carousel-item-right{transform:translate3d(100%, 0, 0)}}.carousel-item-prev,.active.carousel-item-left{transform:translateX(-100%)}@supports (transform-style: preserve-3d){.carousel-item-prev,.active.carousel-item-left{transform:translate3d(-100%, 0, 0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0;background:linear-gradient(90deg, rgba(0,0,0,0.25), rgba(0,0,0,0.001))}.carousel-control-next{right:0;background:linear-gradient(270deg, rgba(0,0,0,0.25), rgba(0,0,0,0.001))}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#288cff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0071f4 !important}.bg-secondary{background-color:#e8f2ff !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#b5d5ff !important}.bg-success{background-color:#00c759 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#009442 !important}.bg-info{background-color:#73e9ef !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#45e2ea !important}.bg-warning{background-color:#ff3b00 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#cc2f00 !important}.bg-danger{background-color:#f03 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#cc0029 !important}.bg-light{background-color:#e9ecef !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#cbd3da !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-tertiary{background-color:#192b3f !important}a.bg-tertiary:hover,a.bg-tertiary:focus,button.bg-tertiary:hover,button.bg-tertiary:focus{background-color:#0b121a !important}.bg-gradient-primary{background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x !important}.bg-gradient-secondary{background:#e8f2ff linear-gradient(180deg, #ebf4ff, #e8f2ff) repeat-x !important}.bg-gradient-success{background:#00c759 linear-gradient(180deg, #26cf72, #00c759) repeat-x !important}.bg-gradient-info{background:#73e9ef linear-gradient(180deg, #88ecf1, #73e9ef) repeat-x !important}.bg-gradient-warning{background:#ff3b00 linear-gradient(180deg, #ff5826, #ff3b00) repeat-x !important}.bg-gradient-danger{background:#f03 linear-gradient(180deg, #ff2652, #f03) repeat-x !important}.bg-gradient-light{background:#e9ecef linear-gradient(180deg, #eceff1, #e9ecef) repeat-x !important}.bg-gradient-dark{background:#343a40 linear-gradient(180deg, #52585d, #343a40) repeat-x !important}.bg-gradient-tertiary{background:#192b3f linear-gradient(180deg, #3c4b5c, #192b3f) repeat-x !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:.0625rem solid #e9ecef !important}.border-top{border-top:.0625rem solid #e9ecef !important}.border-right{border-right:.0625rem solid #e9ecef !important}.border-bottom{border-bottom:.0625rem solid #e9ecef !important}.border-left{border-left:.0625rem solid #e9ecef !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#288cff !important}.border-secondary{border-color:#e8f2ff !important}.border-success{border-color:#00c759 !important}.border-info{border-color:#73e9ef !important}.border-warning{border-color:#ff3b00 !important}.border-danger{border-color:#f03 !important}.border-light{border-color:#e9ecef !important}.border-dark{border-color:#343a40 !important}.border-tertiary{border-color:#192b3f !important}.border-white{border-color:#fff !important}.rounded{border-radius:.375rem !important}.rounded-top{border-top-left-radius:.375rem !important;border-top-right-radius:.375rem !important}.rounded-right{border-top-right-radius:.375rem !important;border-bottom-right-radius:.375rem !important}.rounded-bottom{border-bottom-right-radius:.375rem !important;border-bottom-left-radius:.375rem !important}.rounded-left{border-top-left-radius:.375rem !important;border-bottom-left-radius:.375rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.m-sm{margin:2rem !important}.mt-sm,.my-sm{margin-top:2rem !important}.mr-sm,.mx-sm{margin-right:2rem !important}.mb-sm,.my-sm{margin-bottom:2rem !important}.ml-sm,.mx-sm{margin-left:2rem !important}.m-md{margin:4rem !important}.mt-md,.my-md{margin-top:4rem !important}.mr-md,.mx-md{margin-right:4rem !important}.mb-md,.my-md{margin-bottom:4rem !important}.ml-md,.mx-md{margin-left:4rem !important}.m-lg{margin:6rem !important}.mt-lg,.my-lg{margin-top:6rem !important}.mr-lg,.mx-lg{margin-right:6rem !important}.mb-lg,.my-lg{margin-bottom:6rem !important}.ml-lg,.mx-lg{margin-left:6rem !important}.m-xl{margin:8rem !important}.mt-xl,.my-xl{margin-top:8rem !important}.mr-xl,.mx-xl{margin-right:8rem !important}.mb-xl,.my-xl{margin-bottom:8rem !important}.ml-xl,.mx-xl{margin-left:8rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.p-sm{padding:2rem !important}.pt-sm,.py-sm{padding-top:2rem !important}.pr-sm,.px-sm{padding-right:2rem !important}.pb-sm,.py-sm{padding-bottom:2rem !important}.pl-sm,.px-sm{padding-left:2rem !important}.p-md{padding:4rem !important}.pt-md,.py-md{padding-top:4rem !important}.pr-md,.px-md{padding-right:4rem !important}.pb-md,.py-md{padding-bottom:4rem !important}.pl-md,.px-md{padding-left:4rem !important}.p-lg{padding:6rem !important}.pt-lg,.py-lg{padding-top:6rem !important}.pr-lg,.px-lg{padding-right:6rem !important}.pb-lg,.py-lg{padding-bottom:6rem !important}.pl-lg,.px-lg{padding-left:6rem !important}.p-xl{padding:8rem !important}.pt-xl,.py-xl{padding-top:8rem !important}.pr-xl,.px-xl{padding-right:8rem !important}.pb-xl,.py-xl{padding-bottom:8rem !important}.pl-xl,.px-xl{padding-left:8rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.m-sm-sm{margin:2rem !important}.mt-sm-sm,.my-sm-sm{margin-top:2rem !important}.mr-sm-sm,.mx-sm-sm{margin-right:2rem !important}.mb-sm-sm,.my-sm-sm{margin-bottom:2rem !important}.ml-sm-sm,.mx-sm-sm{margin-left:2rem !important}.m-sm-md{margin:4rem !important}.mt-sm-md,.my-sm-md{margin-top:4rem !important}.mr-sm-md,.mx-sm-md{margin-right:4rem !important}.mb-sm-md,.my-sm-md{margin-bottom:4rem !important}.ml-sm-md,.mx-sm-md{margin-left:4rem !important}.m-sm-lg{margin:6rem !important}.mt-sm-lg,.my-sm-lg{margin-top:6rem !important}.mr-sm-lg,.mx-sm-lg{margin-right:6rem !important}.mb-sm-lg,.my-sm-lg{margin-bottom:6rem !important}.ml-sm-lg,.mx-sm-lg{margin-left:6rem !important}.m-sm-xl{margin:8rem !important}.mt-sm-xl,.my-sm-xl{margin-top:8rem !important}.mr-sm-xl,.mx-sm-xl{margin-right:8rem !important}.mb-sm-xl,.my-sm-xl{margin-bottom:8rem !important}.ml-sm-xl,.mx-sm-xl{margin-left:8rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.p-sm-sm{padding:2rem !important}.pt-sm-sm,.py-sm-sm{padding-top:2rem !important}.pr-sm-sm,.px-sm-sm{padding-right:2rem !important}.pb-sm-sm,.py-sm-sm{padding-bottom:2rem !important}.pl-sm-sm,.px-sm-sm{padding-left:2rem !important}.p-sm-md{padding:4rem !important}.pt-sm-md,.py-sm-md{padding-top:4rem !important}.pr-sm-md,.px-sm-md{padding-right:4rem !important}.pb-sm-md,.py-sm-md{padding-bottom:4rem !important}.pl-sm-md,.px-sm-md{padding-left:4rem !important}.p-sm-lg{padding:6rem !important}.pt-sm-lg,.py-sm-lg{padding-top:6rem !important}.pr-sm-lg,.px-sm-lg{padding-right:6rem !important}.pb-sm-lg,.py-sm-lg{padding-bottom:6rem !important}.pl-sm-lg,.px-sm-lg{padding-left:6rem !important}.p-sm-xl{padding:8rem !important}.pt-sm-xl,.py-sm-xl{padding-top:8rem !important}.pr-sm-xl,.px-sm-xl{padding-right:8rem !important}.pb-sm-xl,.py-sm-xl{padding-bottom:8rem !important}.pl-sm-xl,.px-sm-xl{padding-left:8rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.m-md-sm{margin:2rem !important}.mt-md-sm,.my-md-sm{margin-top:2rem !important}.mr-md-sm,.mx-md-sm{margin-right:2rem !important}.mb-md-sm,.my-md-sm{margin-bottom:2rem !important}.ml-md-sm,.mx-md-sm{margin-left:2rem !important}.m-md-md{margin:4rem !important}.mt-md-md,.my-md-md{margin-top:4rem !important}.mr-md-md,.mx-md-md{margin-right:4rem !important}.mb-md-md,.my-md-md{margin-bottom:4rem !important}.ml-md-md,.mx-md-md{margin-left:4rem !important}.m-md-lg{margin:6rem !important}.mt-md-lg,.my-md-lg{margin-top:6rem !important}.mr-md-lg,.mx-md-lg{margin-right:6rem !important}.mb-md-lg,.my-md-lg{margin-bottom:6rem !important}.ml-md-lg,.mx-md-lg{margin-left:6rem !important}.m-md-xl{margin:8rem !important}.mt-md-xl,.my-md-xl{margin-top:8rem !important}.mr-md-xl,.mx-md-xl{margin-right:8rem !important}.mb-md-xl,.my-md-xl{margin-bottom:8rem !important}.ml-md-xl,.mx-md-xl{margin-left:8rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.p-md-sm{padding:2rem !important}.pt-md-sm,.py-md-sm{padding-top:2rem !important}.pr-md-sm,.px-md-sm{padding-right:2rem !important}.pb-md-sm,.py-md-sm{padding-bottom:2rem !important}.pl-md-sm,.px-md-sm{padding-left:2rem !important}.p-md-md{padding:4rem !important}.pt-md-md,.py-md-md{padding-top:4rem !important}.pr-md-md,.px-md-md{padding-right:4rem !important}.pb-md-md,.py-md-md{padding-bottom:4rem !important}.pl-md-md,.px-md-md{padding-left:4rem !important}.p-md-lg{padding:6rem !important}.pt-md-lg,.py-md-lg{padding-top:6rem !important}.pr-md-lg,.px-md-lg{padding-right:6rem !important}.pb-md-lg,.py-md-lg{padding-bottom:6rem !important}.pl-md-lg,.px-md-lg{padding-left:6rem !important}.p-md-xl{padding:8rem !important}.pt-md-xl,.py-md-xl{padding-top:8rem !important}.pr-md-xl,.px-md-xl{padding-right:8rem !important}.pb-md-xl,.py-md-xl{padding-bottom:8rem !important}.pl-md-xl,.px-md-xl{padding-left:8rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.m-lg-sm{margin:2rem !important}.mt-lg-sm,.my-lg-sm{margin-top:2rem !important}.mr-lg-sm,.mx-lg-sm{margin-right:2rem !important}.mb-lg-sm,.my-lg-sm{margin-bottom:2rem !important}.ml-lg-sm,.mx-lg-sm{margin-left:2rem !important}.m-lg-md{margin:4rem !important}.mt-lg-md,.my-lg-md{margin-top:4rem !important}.mr-lg-md,.mx-lg-md{margin-right:4rem !important}.mb-lg-md,.my-lg-md{margin-bottom:4rem !important}.ml-lg-md,.mx-lg-md{margin-left:4rem !important}.m-lg-lg{margin:6rem !important}.mt-lg-lg,.my-lg-lg{margin-top:6rem !important}.mr-lg-lg,.mx-lg-lg{margin-right:6rem !important}.mb-lg-lg,.my-lg-lg{margin-bottom:6rem !important}.ml-lg-lg,.mx-lg-lg{margin-left:6rem !important}.m-lg-xl{margin:8rem !important}.mt-lg-xl,.my-lg-xl{margin-top:8rem !important}.mr-lg-xl,.mx-lg-xl{margin-right:8rem !important}.mb-lg-xl,.my-lg-xl{margin-bottom:8rem !important}.ml-lg-xl,.mx-lg-xl{margin-left:8rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.p-lg-sm{padding:2rem !important}.pt-lg-sm,.py-lg-sm{padding-top:2rem !important}.pr-lg-sm,.px-lg-sm{padding-right:2rem !important}.pb-lg-sm,.py-lg-sm{padding-bottom:2rem !important}.pl-lg-sm,.px-lg-sm{padding-left:2rem !important}.p-lg-md{padding:4rem !important}.pt-lg-md,.py-lg-md{padding-top:4rem !important}.pr-lg-md,.px-lg-md{padding-right:4rem !important}.pb-lg-md,.py-lg-md{padding-bottom:4rem !important}.pl-lg-md,.px-lg-md{padding-left:4rem !important}.p-lg-lg{padding:6rem !important}.pt-lg-lg,.py-lg-lg{padding-top:6rem !important}.pr-lg-lg,.px-lg-lg{padding-right:6rem !important}.pb-lg-lg,.py-lg-lg{padding-bottom:6rem !important}.pl-lg-lg,.px-lg-lg{padding-left:6rem !important}.p-lg-xl{padding:8rem !important}.pt-lg-xl,.py-lg-xl{padding-top:8rem !important}.pr-lg-xl,.px-lg-xl{padding-right:8rem !important}.pb-lg-xl,.py-lg-xl{padding-bottom:8rem !important}.pl-lg-xl,.px-lg-xl{padding-left:8rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.m-xl-sm{margin:2rem !important}.mt-xl-sm,.my-xl-sm{margin-top:2rem !important}.mr-xl-sm,.mx-xl-sm{margin-right:2rem !important}.mb-xl-sm,.my-xl-sm{margin-bottom:2rem !important}.ml-xl-sm,.mx-xl-sm{margin-left:2rem !important}.m-xl-md{margin:4rem !important}.mt-xl-md,.my-xl-md{margin-top:4rem !important}.mr-xl-md,.mx-xl-md{margin-right:4rem !important}.mb-xl-md,.my-xl-md{margin-bottom:4rem !important}.ml-xl-md,.mx-xl-md{margin-left:4rem !important}.m-xl-lg{margin:6rem !important}.mt-xl-lg,.my-xl-lg{margin-top:6rem !important}.mr-xl-lg,.mx-xl-lg{margin-right:6rem !important}.mb-xl-lg,.my-xl-lg{margin-bottom:6rem !important}.ml-xl-lg,.mx-xl-lg{margin-left:6rem !important}.m-xl-xl{margin:8rem !important}.mt-xl-xl,.my-xl-xl{margin-top:8rem !important}.mr-xl-xl,.mx-xl-xl{margin-right:8rem !important}.mb-xl-xl,.my-xl-xl{margin-bottom:8rem !important}.ml-xl-xl,.mx-xl-xl{margin-left:8rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.p-xl-sm{padding:2rem !important}.pt-xl-sm,.py-xl-sm{padding-top:2rem !important}.pr-xl-sm,.px-xl-sm{padding-right:2rem !important}.pb-xl-sm,.py-xl-sm{padding-bottom:2rem !important}.pl-xl-sm,.px-xl-sm{padding-left:2rem !important}.p-xl-md{padding:4rem !important}.pt-xl-md,.py-xl-md{padding-top:4rem !important}.pr-xl-md,.px-xl-md{padding-right:4rem !important}.pb-xl-md,.py-xl-md{padding-bottom:4rem !important}.pl-xl-md,.px-xl-md{padding-left:4rem !important}.p-xl-lg{padding:6rem !important}.pt-xl-lg,.py-xl-lg{padding-top:6rem !important}.pr-xl-lg,.px-xl-lg{padding-right:6rem !important}.pb-xl-lg,.py-xl-lg{padding-bottom:6rem !important}.pl-xl-lg,.px-xl-lg{padding-left:6rem !important}.p-xl-xl{padding:8rem !important}.pt-xl-xl,.py-xl-xl{padding-top:8rem !important}.pr-xl-xl,.px-xl-xl{padding-right:8rem !important}.pb-xl-xl,.py-xl-xl{padding-bottom:8rem !important}.pl-xl-xl,.px-xl-xl{padding-left:8rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:600 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#288cff !important}a.text-primary:hover,a.text-primary:focus{color:#0071f4 !important}.text-secondary{color:#e8f2ff !important}a.text-secondary:hover,a.text-secondary:focus{color:#b5d5ff !important}.text-success{color:#00c759 !important}a.text-success:hover,a.text-success:focus{color:#009442 !important}.text-info{color:#73e9ef !important}a.text-info:hover,a.text-info:focus{color:#45e2ea !important}.text-warning{color:#ff3b00 !important}a.text-warning:hover,a.text-warning:focus{color:#cc2f00 !important}.text-danger{color:#f03 !important}a.text-danger:hover,a.text-danger:focus{color:#cc0029 !important}.text-light{color:#e9ecef !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#1d2124 !important}.text-tertiary{color:#192b3f !important}a.text-tertiary:hover,a.text-tertiary:focus{color:#0b121a !important}.text-muted{color:#adb5bd !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:.0625rem solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:.0625rem solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}body{color:#495057;background-color:#fff}iframe{border:0}figcaption,figure,main{display:block}.body-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;cursor:pointer;z-index:1040}.bg-blue{background-color:#3369d6 !important}a.bg-blue:hover,a.bg-blue:focus,button.bg-blue:hover,button.bg-blue:focus{background-color:#2453b2 !important}.bg-indigo{background-color:#5603ad !important}a.bg-indigo:hover,a.bg-indigo:focus,button.bg-indigo:hover,button.bg-indigo:focus{background-color:#3d027b !important}.bg-purple{background-color:#801096 !important}a.bg-purple:hover,a.bg-purple:focus,button.bg-purple:hover,button.bg-purple:focus{background-color:#590b68 !important}.bg-pink{background-color:#e36397 !important}a.bg-pink:hover,a.bg-pink:focus,button.bg-pink:hover,button.bg-pink:focus{background-color:#db387a !important}.bg-red{background-color:#f03 !important}a.bg-red:hover,a.bg-red:focus,button.bg-red:hover,button.bg-red:focus{background-color:#cc0029 !important}.bg-orange{background-color:#ff3b00 !important}a.bg-orange:hover,a.bg-orange:focus,button.bg-orange:hover,button.bg-orange:focus{background-color:#cc2f00 !important}.bg-yellow{background-color:#ffd600 !important}a.bg-yellow:hover,a.bg-yellow:focus,button.bg-yellow:hover,button.bg-yellow:focus{background-color:#ccab00 !important}.bg-green{background-color:#00c759 !important}a.bg-green:hover,a.bg-green:focus,button.bg-green:hover,button.bg-green:focus{background-color:#009442 !important}.bg-teal{background-color:#73e9ef !important}a.bg-teal:hover,a.bg-teal:focus,button.bg-teal:hover,button.bg-teal:focus{background-color:#45e2ea !important}.bg-cyan{background-color:#2bffc6 !important}a.bg-cyan:hover,a.bg-cyan:focus,button.bg-cyan:hover,button.bg-cyan:focus{background-color:#00f7b5 !important}.bg-white{background-color:#fff !important}a.bg-white:hover,a.bg-white:focus,button.bg-white:hover,button.bg-white:focus{background-color:#e6e6e6 !important}.bg-gray{background-color:#6c757d !important}a.bg-gray:hover,a.bg-gray:focus,button.bg-gray:hover,button.bg-gray:focus{background-color:#545b62 !important}.bg-gray-dark{background-color:#343a40 !important}a.bg-gray-dark:hover,a.bg-gray-dark:focus,button.bg-gray-dark:hover,button.bg-gray-dark:focus{background-color:#1d2124 !important}.bg-light{background-color:#dee2e6 !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#c1c9d0 !important}.bg-lighter{background-color:#f8f9fa !important}a.bg-lighter:hover,a.bg-lighter:focus,button.bg-lighter:hover,button.bg-lighter:focus{background-color:#dae0e5 !important}.bg-gradient-blue{background:#3369d6 linear-gradient(180deg, #5280dc, #3369d6) repeat-x !important}.bg-gradient-indigo{background:#5603ad linear-gradient(180deg, #6f29b9, #5603ad) repeat-x !important}.bg-gradient-purple{background:#801096 linear-gradient(180deg, #9334a6, #801096) repeat-x !important}.bg-gradient-pink{background:#e36397 linear-gradient(180deg, #e77aa7, #e36397) repeat-x !important}.bg-gradient-red{background:#f03 linear-gradient(180deg, #ff2652, #f03) repeat-x !important}.bg-gradient-orange{background:#ff3b00 linear-gradient(180deg, #ff5826, #ff3b00) repeat-x !important}.bg-gradient-yellow{background:#ffd600 linear-gradient(180deg, #ffdc26, #ffd600) repeat-x !important}.bg-gradient-green{background:#00c759 linear-gradient(180deg, #26cf72, #00c759) repeat-x !important}.bg-gradient-teal{background:#73e9ef linear-gradient(180deg, #88ecf1, #73e9ef) repeat-x !important}.bg-gradient-cyan{background:#2bffc6 linear-gradient(180deg, #4bffcf, #2bffc6) repeat-x !important}.bg-gradient-white{background:#fff linear-gradient(180deg, #fff, #fff) repeat-x !important}.bg-gradient-gray{background:#6c757d linear-gradient(180deg, #828a91, #6c757d) repeat-x !important}.bg-gradient-gray-dark{background:#343a40 linear-gradient(180deg, #52585d, #343a40) repeat-x !important}.bg-gradient-light{background:#dee2e6 linear-gradient(180deg, #e3e6ea, #dee2e6) repeat-x !important}.bg-gradient-lighter{background:#f8f9fa linear-gradient(180deg, #f9fafb, #f8f9fa) repeat-x !important}.z-depth--removed{border-width:1px !important;box-shadow:none !important}.z-depth-1:not(.btn),.z-depth-1--hover:not(.btn):hover,.z-depth-1-top:not(.btn),.z-depth-1-top--hover:not(.btn):hover,.z-depth-1-bottom:not(.btn),.z-depth-1-bottom--hover:not(.btn):hover,.z-depth-2:not(.btn),.z-depth-2--hover:not(.btn):hover,.z-depth-2-top:not(.btn),.z-depth-2-top--hover:not(.btn):hover,.z-depth-2-bottom:not(.btn),.z-depth-2-bottom--hover:not(.btn):hover,.z-depth-3:not(.btn),.z-depth-3--hover:not(.btn):hover,.z-depth-3-top:not(.btn),.z-depth-3-top--hover:not(.btn):hover,.z-depth-3-bottom:not(.btn),.z-depth-3-bottom--hover:not(.btn):hover,.z-depth-4:not(.btn),.z-depth-4--hover:not(.btn):hover,.z-depth-4-top:not(.btn),.z-depth-4-top--hover:not(.btn):hover,.z-depth-4-bottom:not(.btn),.z-depth-4-bottom--hover:not(.btn):hover,.z-depth-5:not(.btn),.z-depth-5--hover:not(.btn):hover,.z-depth-5-top:not(.btn),.z-depth-5-top--hover:not(.btn):hover,.z-depth-5-bottom:not(.btn),.z-depth-5-bottom--hover:not(.btn):hover{border-color:transparent !important}.z-depth-0,.z-depth-0--hover:hover{box-shadow:none !important}.z-depth-1,.z-depth-1--hover:hover{box-shadow:0 2px 5px rgba(0,0,0,0.1),0 2px 10px rgba(0,0,0,0.1)}.z-depth-1-top,.z-depth-1-top--hover:hover{box-shadow:0 2px 10px rgba(0,0,0,0.1)}.z-depth-1-bottom,.z-depth-1-bottom--hover:hover{box-shadow:0 2px 5px rgba(0,0,0,0.1)}.z-depth-2,.z-depth-2--hover:hover{box-shadow:0 8px 17px rgba(0,0,0,0.1),0 6px 20px rgba(0,0,0,0.1)}.z-depth-2-top,.z-depth-2-top--hover:hover{box-shadow:0 6px 20px rgba(0,0,0,0.1)}.z-depth-2-bottom,.z-depth-2-bottom--hover:hover{box-shadow:0 8px 17px rgba(0,0,0,0.1)}.z-depth-3,.z-depth-3--hover:hover{box-shadow:0 12px 15px rgba(0,0,0,0.1),0 17px 50px rgba(0,0,0,0.1)}.z-depth-3-top,.z-depth-3-top--hover:hover{box-shadow:0 17px 50px rgba(0,0,0,0.1)}.z-depth-3-bottom,.z-depth-3-bottom--hover:hover{box-shadow:0 12px 15px rgba(0,0,0,0.1)}.z-depth-4,.z-depth-4--hover:hover{box-shadow:0 16px 28px rgba(0,0,0,0.1),0 25px 55px rgba(0,0,0,0.1)}.z-depth-4-top,.z-depth-4-top--hover:hover{box-shadow:0 25px 55px rgba(0,0,0,0.1)}.z-depth-4-bottom,.z-depth-4-bottom--hover:hover{box-shadow:0 16px 28px rgba(0,0,0,0.1)}.z-depth-5,.z-depth-5--hover:hover{box-shadow:0 27px 24px rgba(0,0,0,0.1),0 40px 77px rgba(0,0,0,0.1)}.z-depth-5-top,.z-depth-5-top--hover:hover{box-shadow:0 40px 77px rgba(0,0,0,0.1)}.z-depth-5-bottom,.z-depth-5-bottom--hover:hover{box-shadow:0 27px 24px rgba(0,0,0,0.1)}.overflow-visible{overflow:visible !important}.overflow-hidden{overflow:hidden !important}.alpha-1,.alpha-container:hover .alpha-1--hover{opacity:0.1}.alpha-2,.alpha-container:hover .alpha-2--hover{opacity:0.2}.alpha-3,.alpha-container:hover .alpha-3--hover{opacity:0.3}.alpha-4,.alpha-container:hover .alpha-4--hover{opacity:0.4}.alpha-5,.alpha-container:hover .alpha-5--hover{opacity:0.5}.alpha-6,.alpha-container:hover .alpha-6--hover{opacity:0.6}.alpha-7,.alpha-container:hover .alpha-7--hover{opacity:0.7}.alpha-8,.alpha-container:hover .alpha-8--hover{opacity:0.8}.alpha-9,.alpha-container:hover .alpha-9--hover{opacity:0.9}.img-center{display:block;margin-left:auto;margin-right:auto}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.top-3{top:1rem}.right-3{right:1rem}.bottom-3{bottom:1rem}.left-3{left:1rem}.top-4{top:1.5rem}.right-4{right:1.5rem}.bottom-4{bottom:1.5rem}.left-4{left:1.5rem}.top-5{top:3rem}.right-5{right:3rem}.bottom-5{bottom:3rem}.left-5{left:3rem}.top-sm{top:2rem}.right-sm{right:2rem}.bottom-sm{bottom:2rem}.left-sm{left:2rem}.top-md{top:4rem}.right-md{right:4rem}.bottom-md{bottom:4rem}.left-md{left:4rem}.top-lg{top:6rem}.right-lg{right:6rem}.bottom-lg{bottom:6rem}.left-lg{left:6rem}.top-xl{top:8rem}.right-xl{right:8rem}.bottom-xl{bottom:8rem}.left-xl{left:8rem}.cols-space>div[class*='col-']:not(:last-child){margin-bottom:4rem}@media (max-width: 575px){.cols-xs-space>div[class*='col-']:not(:last-child){margin-bottom:4rem}}@media (max-width: 767px){.cols-sm-space>div[class*='col-']:not(:last-child){margin-bottom:4rem}}@media (max-width: 991px){.cols-md-space>div[class*='col-']:not(:last-child){margin-bottom:4rem}}@media (max-width: 1199px){.cols-lg-space>div[class*='col-']:not(:last-child){margin-bottom:4rem}}@media (max-width: 575px){.row-wrapper>.row .col-12:not(:last-child),.row-wrapper>.row:not(:last-child){margin-bottom:3rem}}@media (min-width: 576px) and (max-width: 767px){.row-wrapper>.row .col-sm-12:not(:last-child),.row-wrapper>.row:not(:last-child){margin-bottom:3rem}}@media (min-width: 768px) and (max-width: 991px){.row-wrapper .row .col-md-12:not(:last-child),.row-wrapper .row:not(:last-child){margin-bottom:3rem}}@media (min-width: 992px){.row-wrapper>.row:not(:last-child){margin-bottom:3rem}}.font-weight-300{font-weight:300 !important}.font-weight-400{font-weight:400 !important}.font-weight-500{font-weight:500 !important}.font-weight-600{font-weight:600 !important}.font-weight-700{font-weight:700 !important}.font-weight-800{font-weight:800 !important}.font-weight-900{font-weight:900 !important}.lh-100{line-height:1}.lh-125{line-height:1.25}.lh-150{line-height:1.5}.lh-180{line-height:1.8}.alert{padding:1rem 1.5rem;border:0;border-radius:.375rem}.alert .alert-inner--icon{font-size:1.25rem;margin-right:1.25rem;display:inline-block;vertical-align:middle}.alert .alert-inner--text{display:inline-block;vertical-align:middle}.alert-shadow{box-shadow:0 8px 22px 0 rgba(0,0,0,0.37)}[class*="alert-"] .alert-link{color:#fff;border-bottom:1px dotted rgba(255,255,255,0.5)}.alert-heading{font-weight:600;font-size:1.3125rem;margin-top:0.15rem}.alert-dismissible .close{top:50%;right:1.5rem;padding:0;transform:translateY(-50%);color:rgba(255,255,255,0.6)}.alert-dismissible .close>span:not(.sr-only){background-color:rgba(255,255,255,0.3);line-height:19px;height:20px;width:20px;border-radius:50%;font-size:0.8rem;display:block}.alert-dismissible .close:hover,.alert-dismissible .close:focus{color:#fff}.alert-dismissible .close:hover span:not(.sr-only),.alert-dismissible .close:focus span:not(.sr-only){background-color:rgba(255,255,255,0.5)}.alert-dismissible .undo{position:absolute;right:3.5rem;top:50%;transform:translateY(-50%);color:rgba(255,255,255,0.5);text-transform:uppercase;font-size:.765625rem;font-weight:600;background:transparent;border:0;cursor:pointer}.alert-dismissible .undo:hover,.alert-dismissible .undo:focus{color:rgba(255,255,255,0.8)}.alert-inverse{background-color:#454545;color:#fff}.alert-notify{max-width:600px;width:100%;padding-right:60px}.avatar{color:#fff;background-color:#adb5bd;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;border-radius:50%;height:48px;width:48px}.avatar img{width:100%;border-radius:50%}.avatar+.avatar-content{display:inline-block;margin-left:.75rem}.avatar-lg{width:58px;height:58px;font-size:.765625rem}.avatar-sm{width:38px;height:38px;font-size:.765625rem}.badge a{color:#FFF}.badge-inline{margin-right:.625rem}.badge-inline+span{top:2px;position:relative}.badge-inline+span>a{text-decoration:underline}.badge-md{padding:.65em 1em}.badge-lg{padding:.85em 1.375em}.badge-dot{padding-left:0;padding-right:0;background:transparent;color:#ced4da;font-size:.765625rem}.badge-dot strong{color:#343a40}.badge-dot>i{display:inline-block;vertical-align:middle;width:6px;height:6px;border-radius:6px;margin-right:6px}.btn-outline-secondary{color:#0065e8}.btn-xl{padding:1.15rem 1rem;font-size:1.3125rem;line-height:1.5;border-radius:.375rem}.btn svg:not(:first-child),.btn i:not(:first-child){margin-left:0.5rem}.btn svg:not(:last-child),.btn i:not(:last-child){margin-right:0.5rem}.btn-animated{position:relative;overflow:hidden}.btn-animated .btn-inner--visible{position:relative}.btn-animated .btn-inner--hidden{position:absolute;width:100%;top:50%;transform:translateY(-50%)}.btn-animated-x .btn-inner--visible{right:0;-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.btn-animated-x .btn-inner--hidden{right:-100%;-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.btn-animated-x:hover .btn-inner--hidden{right:0}.btn-animated-x:hover .btn-inner--visible{right:150%}.btn-animated-y .btn-inner--visible{top:0;-webkit-transition:top .3s ease 0s;transition:top .3s ease 0s}.btn-animated-y .btn-inner--hidden{left:0;bottom:-150%;-webkit-transition:bottom .3s ease 0s;transition:bottom .3s ease 0s}.btn-animated-y:hover .btn-inner--hidden{bottom:0}.btn-animated-y:hover .btn-inner--visible{top:100px}.btn-action-label .btn-label:hover{background:transparent;color:#343a40}.btn-action-label .btn-secondary:hover{color:#288cff}.btn-icon-label{position:relative}.btn-icon-label .btn-inner--icon{position:absolute;height:100%;line-height:1;border-radius:0;text-align:center;margin:0;width:3em;background-color:rgba(0,0,0,0.1)}.btn-icon-label .btn-inner--icon:not(:first-child){right:0;top:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit}.btn-icon-label .btn-inner--icon:not(:last-child){left:0;top:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.btn-icon-label .btn-inner--icon svg{position:relative;top:50%;transform:translateY(-50%)}.btn-icon-label .btn-inner--text:not(:first-child){padding-left:3em}.btn-icon-label .btn-inner--text:not(:last-child){padding-right:3em}.btn-icon .btn-inner--text:not(:first-child){margin-left:0.75em}.btn-icon .btn-inner--text:not(:last-child){margin-right:0.75em}.btn-icon-only{width:3rem;height:3rem;padding:0}a.btn-icon-only{line-height:3rem}.btn-icon-only.btn-sm,.btn-group-sm>.btn-icon-only.btn{width:2rem;height:2rem}.btn-nobg{padding:0;background:transparent !important}.btn-nobg:hover{background:transparent !important;border-color:transparent !important}.btn-facebook{color:#fff;background:#3b5999 linear-gradient(180deg, #5872a8, #3b5999) repeat-x;border-color:#3b5999;box-shadow:none}.btn-facebook:hover{color:#fff;background:#30497d linear-gradient(180deg, #4f6491, #30497d) repeat-x;border-color:#2d4474}.btn-facebook:focus,.btn-facebook.focus{box-shadow:none,0 0 0 0 rgba(59,89,153,0.5)}.btn-facebook.disabled,.btn-facebook:disabled{color:#fff;background-color:#3b5999;border-color:#3b5999}.btn-facebook:not(:disabled):not(.disabled):active,.btn-facebook:not(:disabled):not(.disabled).active,.show>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4474;background-image:none;border-color:#293e6b}.btn-facebook:not(:disabled):not(.disabled):active:focus,.btn-facebook:not(:disabled):not(.disabled).active:focus,.show>.btn-facebook.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(59,89,153,0.5)}.btn-twitter{color:#fff;background:#1da1f2 linear-gradient(180deg, #3faff4, #1da1f2) repeat-x;border-color:#1da1f2;box-shadow:none}.btn-twitter:hover{color:#fff;background:#0d8ddc linear-gradient(180deg, #319ee1, #0d8ddc) repeat-x;border-color:#0c85d0}.btn-twitter:focus,.btn-twitter.focus{box-shadow:none,0 0 0 0 rgba(29,161,242,0.5)}.btn-twitter.disabled,.btn-twitter:disabled{color:#fff;background-color:#1da1f2;border-color:#1da1f2}.btn-twitter:not(:disabled):not(.disabled):active,.btn-twitter:not(:disabled):not(.disabled).active,.show>.btn-twitter.dropdown-toggle{color:#fff;background-color:#0c85d0;background-image:none;border-color:#0b7ec4}.btn-twitter:not(:disabled):not(.disabled):active:focus,.btn-twitter:not(:disabled):not(.disabled).active:focus,.show>.btn-twitter.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(29,161,242,0.5)}.btn-google-plus{color:#fff;background:#dd4b39 linear-gradient(180deg, #e26657, #dd4b39) repeat-x;border-color:#dd4b39;box-shadow:none}.btn-google-plus:hover{color:#fff;background:#cd3623 linear-gradient(180deg, #d55444, #cd3623) repeat-x;border-color:#c23321}.btn-google-plus:focus,.btn-google-plus.focus{box-shadow:none,0 0 0 0 rgba(221,75,57,0.5)}.btn-google-plus.disabled,.btn-google-plus:disabled{color:#fff;background-color:#dd4b39;border-color:#dd4b39}.btn-google-plus:not(:disabled):not(.disabled):active,.btn-google-plus:not(:disabled):not(.disabled).active,.show>.btn-google-plus.dropdown-toggle{color:#fff;background-color:#c23321;background-image:none;border-color:#b7301f}.btn-google-plus:not(:disabled):not(.disabled):active:focus,.btn-google-plus:not(:disabled):not(.disabled).active:focus,.show>.btn-google-plus.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(221,75,57,0.5)}.btn-instagram{color:#fff;background:#e4405f linear-gradient(180deg, #e85d77, #e4405f) repeat-x;border-color:#e4405f;box-shadow:none}.btn-instagram:hover{color:#fff;background:#de1f44 linear-gradient(180deg, #e34160, #de1f44) repeat-x;border-color:#d31e40}.btn-instagram:focus,.btn-instagram.focus{box-shadow:none,0 0 0 0 rgba(228,64,95,0.5)}.btn-instagram.disabled,.btn-instagram:disabled{color:#fff;background-color:#e4405f;border-color:#e4405f}.btn-instagram:not(:disabled):not(.disabled):active,.btn-instagram:not(:disabled):not(.disabled).active,.show>.btn-instagram.dropdown-toggle{color:#fff;background-color:#d31e40;background-image:none;border-color:#c81c3d}.btn-instagram:not(:disabled):not(.disabled):active:focus,.btn-instagram:not(:disabled):not(.disabled).active:focus,.show>.btn-instagram.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(228,64,95,0.5)}.btn-pinterest{color:#fff;background:#bd081c linear-gradient(180deg, #c72d3e, #bd081c) repeat-x;border-color:#bd081c;box-shadow:none}.btn-pinterest:hover{color:#fff;background:#980617 linear-gradient(180deg, #a72b3a, #980617) repeat-x;border-color:#8c0615}.btn-pinterest:focus,.btn-pinterest.focus{box-shadow:none,0 0 0 0 rgba(189,8,28,0.5)}.btn-pinterest.disabled,.btn-pinterest:disabled{color:#fff;background-color:#bd081c;border-color:#bd081c}.btn-pinterest:not(:disabled):not(.disabled):active,.btn-pinterest:not(:disabled):not(.disabled).active,.show>.btn-pinterest.dropdown-toggle{color:#fff;background-color:#8c0615;background-image:none;border-color:#800513}.btn-pinterest:not(:disabled):not(.disabled):active:focus,.btn-pinterest:not(:disabled):not(.disabled).active:focus,.show>.btn-pinterest.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(189,8,28,0.5)}.btn-youtube{color:#fff;background:#cd201f linear-gradient(180deg, #d54141, #cd201f) repeat-x;border-color:#cd201f;box-shadow:none}.btn-youtube:hover{color:#fff;background:#ac1b1a linear-gradient(180deg, #b83d3c, #ac1b1a) repeat-x;border-color:#a11918}.btn-youtube:focus,.btn-youtube.focus{box-shadow:none,0 0 0 0 rgba(205,32,31,0.5)}.btn-youtube.disabled,.btn-youtube:disabled{color:#fff;background-color:#cd201f;border-color:#cd201f}.btn-youtube:not(:disabled):not(.disabled):active,.btn-youtube:not(:disabled):not(.disabled).active,.show>.btn-youtube.dropdown-toggle{color:#fff;background-color:#a11918;background-image:none;border-color:#961717}.btn-youtube:not(:disabled):not(.disabled):active:focus,.btn-youtube:not(:disabled):not(.disabled).active:focus,.show>.btn-youtube.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(205,32,31,0.5)}.btn-slack{color:#fff;background:#3aaf85 linear-gradient(180deg, #58bb97, #3aaf85) repeat-x;border-color:#3aaf85;box-shadow:none}.btn-slack:hover{color:#fff;background:#30926f linear-gradient(180deg, #4fa285, #30926f) repeat-x;border-color:#2d8968}.btn-slack:focus,.btn-slack.focus{box-shadow:none,0 0 0 0 rgba(58,175,133,0.5)}.btn-slack.disabled,.btn-slack:disabled{color:#fff;background-color:#3aaf85;border-color:#3aaf85}.btn-slack:not(:disabled):not(.disabled):active,.btn-slack:not(:disabled):not(.disabled).active,.show>.btn-slack.dropdown-toggle{color:#fff;background-color:#2d8968;background-image:none;border-color:#2a7f61}.btn-slack:not(:disabled):not(.disabled):active:focus,.btn-slack:not(:disabled):not(.disabled).active:focus,.show>.btn-slack.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(58,175,133,0.5)}.btn-dribbble{color:#fff;background:#ea4c89 linear-gradient(180deg, #ed679b, #ea4c89) repeat-x;border-color:#ea4c89;box-shadow:none}.btn-dribbble:hover{color:#fff;background:#e62a72 linear-gradient(180deg, #ea4a87, #e62a72) repeat-x;border-color:#e51e6b}.btn-dribbble:focus,.btn-dribbble.focus{box-shadow:none,0 0 0 0 rgba(234,76,137,0.5)}.btn-dribbble.disabled,.btn-dribbble:disabled{color:#fff;background-color:#ea4c89;border-color:#ea4c89}.btn-dribbble:not(:disabled):not(.disabled):active,.btn-dribbble:not(:disabled):not(.disabled).active,.show>.btn-dribbble.dropdown-toggle{color:#fff;background-color:#e51e6b;background-image:none;border-color:#dc1a65}.btn-dribbble:not(:disabled):not(.disabled):active:focus,.btn-dribbble:not(:disabled):not(.disabled).active:focus,.show>.btn-dribbble.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(234,76,137,0.5)}.btn-primary{color:#fff;background:#288cff linear-gradient(180deg, #489dff, #288cff) repeat-x;border-color:#288cff;box-shadow:none}.btn-primary:hover{color:#fff;background:#0278ff linear-gradient(180deg, #288cff, #0278ff) repeat-x;border-color:#0071f4}.btn-primary:focus,.btn-primary.focus{box-shadow:none,0 0 0 0 rgba(40,140,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#288cff;border-color:#288cff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0071f4;background-image:none;border-color:#006ce7}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(40,140,255,0.5)}.btn-secondary{color:#212529;background:#e8f2ff linear-gradient(180deg, #ebf4ff, #e8f2ff) repeat-x;border-color:#e8f2ff;box-shadow:none}.btn-secondary:hover{color:#212529;background:#c2dcff linear-gradient(180deg, #cbe1ff, #c2dcff) repeat-x;border-color:#b5d5ff}.btn-secondary:focus,.btn-secondary.focus{box-shadow:none,0 0 0 0 rgba(232,242,255,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#212529;background-color:#e8f2ff;border-color:#e8f2ff}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#212529;background-color:#b5d5ff;background-image:none;border-color:#a8ceff}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(232,242,255,0.5)}.btn-tertiary{color:#fff;background:#192b3f linear-gradient(180deg, #3c4b5c, #192b3f) repeat-x;border-color:#192b3f;box-shadow:none}.btn-tertiary:hover{color:#fff;background:#0e1824 linear-gradient(180deg, #323b45, #0e1824) repeat-x;border-color:#0b121a}.btn-tertiary:focus,.btn-tertiary.focus{box-shadow:none,0 0 0 0 rgba(25,43,63,0.5)}.btn-tertiary.disabled,.btn-tertiary:disabled{color:#fff;background-color:#192b3f;border-color:#192b3f}.btn-tertiary:not(:disabled):not(.disabled):active,.btn-tertiary:not(:disabled):not(.disabled).active,.show>.btn-tertiary.dropdown-toggle{color:#fff;background-color:#0b121a;background-image:none;border-color:#070c11}.btn-tertiary:not(:disabled):not(.disabled):active:focus,.btn-tertiary:not(:disabled):not(.disabled).active:focus,.show>.btn-tertiary.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(25,43,63,0.5)}.btn-success{color:#fff;background:#00c759 linear-gradient(180deg, #26cf72, #00c759) repeat-x;border-color:#00c759;box-shadow:none}.btn-success:hover{color:#fff;background:#00a148 linear-gradient(180deg, #26af63, #00a148) repeat-x;border-color:#009442}.btn-success:focus,.btn-success.focus{box-shadow:none,0 0 0 0 rgba(0,199,89,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#00c759;border-color:#00c759}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#009442;background-image:none;border-color:#00873c}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(0,199,89,0.5)}.btn-info{color:#212529;background:#73e9ef linear-gradient(180deg, #88ecf1, #73e9ef) repeat-x;border-color:#73e9ef;box-shadow:none}.btn-info:hover{color:#212529;background:#51e4eb linear-gradient(180deg, #6be8ee, #51e4eb) repeat-x;border-color:#45e2ea}.btn-info:focus,.btn-info.focus{box-shadow:none,0 0 0 0 rgba(115,233,239,0.5)}.btn-info.disabled,.btn-info:disabled{color:#212529;background-color:#73e9ef;border-color:#73e9ef}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#212529;background-color:#45e2ea;background-image:none;border-color:#3ae0e8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(115,233,239,0.5)}.btn-warning{color:#fff;background:#ff3b00 linear-gradient(180deg, #ff5826, #ff3b00) repeat-x;border-color:#ff3b00;box-shadow:none}.btn-warning:hover{color:#fff;background:#d93200 linear-gradient(180deg, #df5126, #d93200) repeat-x;border-color:#cc2f00}.btn-warning:focus,.btn-warning.focus{box-shadow:none,0 0 0 0 rgba(255,59,0,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ff3b00;border-color:#ff3b00}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cc2f00;background-image:none;border-color:#bf2c00}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(255,59,0,0.5)}.btn-danger{color:#fff;background:#f03 linear-gradient(180deg, #ff2652, #f03) repeat-x;border-color:#f03;box-shadow:none}.btn-danger:hover{color:#fff;background:#d9002b linear-gradient(180deg, #df264b, #d9002b) repeat-x;border-color:#cc0029}.btn-danger:focus,.btn-danger.focus{box-shadow:none,0 0 0 0 rgba(255,0,51,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#f03;border-color:#f03}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#cc0029;background-image:none;border-color:#bf0026}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(255,0,51,0.5)}.btn-light{color:#212529;background:#e9ecef linear-gradient(180deg, #eceff1, #e9ecef) repeat-x;border-color:#e9ecef;box-shadow:none}.btn-light:hover{color:#212529;background:#d3d9df linear-gradient(180deg, #dadfe4, #d3d9df) repeat-x;border-color:#cbd3da}.btn-light:focus,.btn-light.focus{box-shadow:none,0 0 0 0 rgba(233,236,239,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#e9ecef;border-color:#e9ecef}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#cbd3da;background-image:none;border-color:#c4ccd4}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(233,236,239,0.5)}.btn-dark{color:#fff;background:#343a40 linear-gradient(180deg, #52585d, #343a40) repeat-x;border-color:#343a40;box-shadow:none}.btn-dark:hover{color:#fff;background:#23272b linear-gradient(180deg, #44474b, #23272b) repeat-x;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:none,0 0 0 0 rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;background-image:none;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:none,0 0 0 0 rgba(52,58,64,0.5)}.btn-zoom--hover:hover{transform:scale(1.1)}.card-img-bg{width:100%;height:100%;position:absolute;left:0;top:0;background-size:cover;border-radius:.375rem;-webkit-backface-visibility:hidden;transition:all 0.7s cubic-bezier(0.2, 1, 0.22, 1);-webkit-transition:all 0.7s cubic-bezier(0.2, 1, 0.22, 1)}.card:hover .card-img-bg{transform:scale(1.1);-webkit-transform:scale(1.1)}.card-img-bg ~ .card-body{position:relative}.card-pricing .card-header{padding-top:1.25rem;padding-bottom:1.25rem}.card-pricing .list-unstyled li{padding:.5rem 0;color:#6c757d}.card-pricing.popular{border:3px solid #288cff !important}.card-icon-actions a{display:inline-block;margin-right:0.625rem;color:#6c757d;font-size:0.875rem}.card-icon-actions-lg a{font-size:1.25rem;margin-right:0.875rem}.card-icon-actions a:last-of-type{margin-right:0}.card-icon-actions>a:hover,.card-icon-actions>.active{color:#343a40}.card-icon-actions>.favorite:hover,.card-icon-actions>.favorite.active{color:#ffd600}.card-icon-actions>.love:hover,.card-icon-actions>.love.active{color:#f03}.card-icon-actions>.like:hover,.card-icon-actions>.like.active{color:#3369d6}.card-comment-box input,.card-comment-box textarea{width:100%;border:0;background:transparent;padding:0.3125rem 0;margin:0;color:#343a40;outline:none;resize:none}.card-comment-box input:focus,.card-comment-box textarea:focus{background:transparent}.close{transition:all 0.2s ease-in-out}.close>span:not(.sr-only){background-color:rgba(0,0,0,0.3);line-height:17px;height:1.25rem;width:1.25rem;border-radius:50%;font-size:.8rem;display:block;transition:all 0.2s ease-in-out}.close:hover,.close:focus{color:#fff}.close:hover span:not(.sr-only),.close:focus span:not(.sr-only){background-color:rgba(0,0,0,0.5)}.custom-control-label::before{border:.0625rem solid #ced4da;transition:all 0.2s ease-in-out}.custom-control-label:hover::before{background:#dee2e6;border-color:#dee2e6}.custom-control-input:active ~ .custom-control-label::before{border-color:#288cff}.custom-checkbox .custom-control-input ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{border-color:#288cff}.custom-radio .custom-control-input ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{border-color:#288cff}.toggle-switch{position:relative;display:inline-block;width:50px;height:1.5rem}.toggle-switch input{display:none}.toggle-switch input:checked+.toggle-switch-slider:before{background-color:#288cff;border-color:#288cff}.toggle-switch input:checked+.toggle-switch-slider{border:.0625rem solid #288cff}.toggle-switch input:checked+.toggle-switch-slider:before{-webkit-transform:translateX(1.625rem);-ms-transform:translateX(1.625rem);transform:translateX(1.625rem)}.toggle-switch input:disabled+.toggle-switch-slider{border:.0625rem solid #e9ecef}.toggle-switch input:checked:disabled+.toggle-switch-slider{border:.0625rem solid #e9ecef}.toggle-switch input:checked:disabled+.toggle-switch-slider:before{background-color:#5ba7ff}.toggle-switch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;border:.0625rem solid #ced4da;border-radius:.25rem;background-color:transparent;-webkit-transition:0.4s;transition:0.4s}.toggle-switch-slider:before{position:absolute;content:"";height:18px;width:18px;left:.0625rem;bottom:2px;border-radius:.25rem;background-color:#ced4da;-webkit-transition:0.3s;transition:0.3s}.toggle-switch-slider.rounded-circle{border-radius:34px !important}.toggle-switch-slider.rounded-circle:before{border-radius:50% !important}.custom-input-file{width:0.1px;height:0.1px;opacity:0;outline:none;overflow:hidden;position:absolute;z-index:-1}.custom-input-file+label{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;display:block;overflow:hidden;padding:0.625rem 1.25rem;border:1px solid #ced4da;border-radius:.375rem;color:#495057;background-color:#fff;outline:none}.custom-input-file+label:hover,.custom-input-file.has-focus+label,.custom-input-file:focus+label{background-color:#f8f9fa}.no-js .custom-input-file+label{display:none}.custom-input-file.has-focus+label,.custom-input-file:focus+label{outline:1px dotted #000;outline:-webkit-focus-ring-color auto 5px}.custom-input-file+label i{width:1em;height:1em;vertical-align:middle;fill:currentColor;margin-top:-0.25em;margin-right:.5em}.custom-input-file--2+label{color:#fff;border-color:#288cff;background:#288cff}.custom-input-file--2+label:hover,.custom-input-file--2.has-focus+label,.custom-input-file--2:focus+label{color:#fff;border-color:#0071f4;background:#0071f4}[data-delimiter="1"]::before{content:'';display:block;width:80%;position:absolute;bottom:0;left:50%;margin-left:-40%;height:1px;background:radial-gradient(ellipse at center, rgba(0,0,0,0.2) 0, rgba(255,255,255,0) 75%)}.dropdown,.dropup,.dropright,.dropleft{display:inline-block}.dropdown-menu{min-width:12rem}.dropdown-menu .dropdown-item{padding:0.5rem 1rem;font-size:.765625rem}.dropdown-menu .dropdown-item>i,.dropdown-menu .dropdown-item>svg{margin-right:1rem;font-size:1rem;vertical-align:-17%}.dropdown-header{padding-left:1rem;padding-right:1rem}.dropdown-menu-inverse{background:#282f37;border-color:#242a31}.dropdown-menu-inverse .dropdown-item{color:#dadada}.dropdown-menu-inverse .dropdown-item:active,.dropdown-menu-inverse .dropdown-item:focus,.dropdown-menu-inverse .dropdown-item:hover{color:#fff;background:#31353e}.dropdown-menu-inverse .dropdown-divider{background:#191e23}.dropdown-menu.dropdown-menu-sm{min-width:100px;border:.25rem}.dropdown-menu.dropdown-menu-lg{min-width:260px;border-radius:.375rem}.dropdown-menu.dropdown-menu-xl{min-width:320px;border-radius:.375rem}.footer{background:#fff;color:#6c757d}.footer .nav .nav-item .nav-link,.footer .footer-link{color:#6c757d !important}.footer .nav .nav-item .nav-link:hover,.footer .footer-link:hover{color:#288cff !important}.footer .list-unstyled li a{display:inline-block;padding:.125rem 0}.footer .list-unstyled li a:hover{color:#288cff !important}.footer-dark .heading{color:#fff}textarea[resize="none"]{resize:none !important}textarea[resize="both"]{resize:both !important}textarea[resize="vertical"]{resize:vertical !important}textarea[resize="horizontal"]{resize:horizontal !important}.form-control-xl{padding:1.15rem 1rem;font-size:1.3125rem;line-height:1.5;border-radius:.375rem}.has-floating-label{position:relative}.has-floating-label .control-label{font-size:.875rem;pointer-events:none;position:absolute;top:50%;padding:0 .5rem;margin:0 .5rem;color:#6c757d;transform:translateY(-50%) scale(1);transform-origin:left top;transition:0.3s;z-index:1}.has-floating-label .input-group .control-label{left:2rem}.has-floating-label.focused .control-label{padding:0;margin:0;top:-1.25rem;left:0;transform:translateY(0) scale(0.85)}.has-floating-label .control-label-xl{font-size:1.3125rem;padding:0 .5rem;margin:0 .5rem}.has-floating-label .control-label-lg{font-size:1.09375rem;padding:0 .5rem;margin:0 .5rem}.has-floating-label .control-label-sm{font-size:.765625rem;padding:0 .5rem;margin:0 .5rem}.form-primary .form-control{color:#fff;background-color:#006dea;border:.0625rem solid #006dea}.form-primary .form-control:focus{background-color:#0063d5;border:.0625rem solid #0063d5}.form-primary .form-control::placeholder{color:rgba(255,255,255,0.8)}.icon{width:3rem;height:3rem}.icon i,.icon svg{font-size:2.25rem}.icon+.icon-text{padding-left:1rem;width:calc(100% - $icon-size - 1)}.icon-xl{width:5rem;height:5rem i,svg;height-font-size:4.25rem}.icon-xl+.icon-text{width:calc(100% - $icon-size-xl - 1)}.icon-lg{width:4rem;height:4rem i,svg;height-font-size:3.25rem}.icon-lg+.icon-text{width:calc(100% - $icon-size-lg - 1)}.icon-sm{width:2rem;height:2rem i,svg;height-font-size:1.25rem}.icon-sm+.icon-text{width:calc(100% - $icon-size-sm - 1)}.input-group-text{transition:all 0.2s ease-in-out}.focused .input-group-text{color:#288cff;background-color:#e9ecef;border-color:#ced4da}.input-group-transparent .input-group-text{color:#6c757d;background-color:transparent;border:.0625rem solid #ced4da}.focused .input-group-transparent .input-group-text{background-color:#f8f9fa}.input-group-transparent .form-control:not(:first-child){border-left:0;padding-left:0}.input-group-transparent .form-control:not(:last-child){border-right:0;padding-right:0}.list-group{border-left:0;border-right:0}.list-group-item{padding:1rem 1rem;border:0;border-bottom:1px solid #e9ecef;color:#adb5bd;font-size:.765625rem;margin-bottom:0}.list-group-item-sm{padding:0.75rem 1rem}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0;border-top:1px solid #e9ecef}.list-group-item:last-child{border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{background-color:#adb5bd;color:#343a40;border-color:#adb5bd}.list-group-item .label{margin-left:1rem}.card .list-group .list-group-item:first-child{border-top:0 !important}.card .list-group .list-group-item:last-child{border-bottom:0 !important}.list-group-img{width:3rem;height:3rem;border-radius:50%;vertical-align:top;margin:-.1rem 1.2rem 0 -.2rem}.list-group-content{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.list-group-content>p{color:#adb5bd;line-height:1.5;margin:.2rem 0 0}.list-group-heading{font-size:.875rem;color:#343a40}.list-group-heading>small{float:right;color:#adb5bd;font-weight:500}.mask{position:absolute;top:0;left:0;width:100%;height:100%;transition:all 0.3s ease-in-out;-webkit-transition:all 0.3s ease-in-out}.modal-content{border:0;border-radius:.375rem}.modal-fluid .modal-dialog{margin-top:0;margin-bottom:0}.modal-fluid .modal-content{border-radius:0}.modal-primary .modal-title{color:#fff}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-primary .modal-content{background-color:#288cff;color:#fff}.modal-primary .modal-content .heading{color:#fff}.modal-primary .close>span:not(.sr-only){color:#fff}.modal-secondary .modal-title{color:#212529}.modal-secondary .modal-header,.modal-secondary .modal-footer{border-color:rgba(33,37,41,0.075)}.modal-secondary .modal-content{background-color:#e8f2ff;color:#212529}.modal-secondary .modal-content .heading{color:#212529}.modal-secondary .close>span:not(.sr-only){color:#fff}.modal-success .modal-title{color:#fff}.modal-success .modal-header,.modal-success .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-success .modal-content{background-color:#00c759;color:#fff}.modal-success .modal-content .heading{color:#fff}.modal-success .close>span:not(.sr-only){color:#fff}.modal-info .modal-title{color:#212529}.modal-info .modal-header,.modal-info .modal-footer{border-color:rgba(33,37,41,0.075)}.modal-info .modal-content{background-color:#73e9ef;color:#212529}.modal-info .modal-content .heading{color:#212529}.modal-info .close>span:not(.sr-only){color:#fff}.modal-warning .modal-title{color:#fff}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-warning .modal-content{background-color:#ff3b00;color:#fff}.modal-warning .modal-content .heading{color:#fff}.modal-warning .close>span:not(.sr-only){color:#fff}.modal-danger .modal-title{color:#fff}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-danger .modal-content{background-color:#f03;color:#fff}.modal-danger .modal-content .heading{color:#fff}.modal-danger .close>span:not(.sr-only){color:#fff}.modal-light .modal-title{color:#212529}.modal-light .modal-header,.modal-light .modal-footer{border-color:rgba(33,37,41,0.075)}.modal-light .modal-content{background-color:#e9ecef;color:#212529}.modal-light .modal-content .heading{color:#212529}.modal-light .close>span:not(.sr-only){color:#fff}.modal-dark .modal-title{color:#fff}.modal-dark .modal-header,.modal-dark .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-dark .modal-content{background-color:#343a40;color:#fff}.modal-dark .modal-content .heading{color:#fff}.modal-dark .close>span:not(.sr-only){color:#fff}.modal-tertiary .modal-title{color:#fff}.modal-tertiary .modal-header,.modal-tertiary .modal-footer{border-color:rgba(255,255,255,0.075)}.modal-tertiary .modal-content{background-color:#192b3f;color:#fff}.modal-tertiary .modal-content .heading{color:#fff}.modal-tertiary .close>span:not(.sr-only){color:#fff}.nav-pills .nav-link{padding:1rem 1rem;border:1px solid #dee2e6;border-radius:0;color:#6c757d;font-weight:500}.nav-pills .nav-link:hover{color:#343a40}.nav-pills .nav-item:not(:first-child) .nav-link{border-left:0}.nav-pills .nav-item:first-child .nav-link{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.nav-pills .nav-item:last-child .nav-link{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#288cff;background-color:transparent}@media (max-width: 576px){.nav-pills .nav-item{margin-bottom:1rem}}.navbar-nav .nav-link{font-size:.875rem;font-family:"Nunito",sans-serif;font-weight:500;text-transform:normal;letter-spacing:0;-webkit-transition:all 0.15s linear;transition:all 0.15s linear}@media (min-width: 992px){.navbar-nav .nav-item{margin-right:0.5rem}.navbar-nav .nav-link{padding-top:.75rem;padding-bottom:.75rem;border-radius:.375rem}.navbar-nav .nav-link-icon{border-radius:.375rem}}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-nav .nav-link{background-color:transparent}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{background-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{background-color:rgba(255,255,255,0.1)}@media (min-width: 992px){.navbar-transparent{position:absolute;top:0;width:100%;z-index:100;background-color:transparent !important;border:0;box-shadow:none}.navbar-transparent.border-bottom{border-color:rgba(0,0,0,0.1)}}@media (max-width: 767.98px){.offcanvas-collapse{width:270px;position:fixed;top:0;bottom:0;right:0;z-index:1050;padding:1.5rem;overflow-y:auto;transition:transform 300ms, opacity 300ms;transform:translate3d(100%, 0, 0);opacity:0}.offcanvas-collapse .navbar-nav .nav-item{margin-bottom:0.2rem}.offcanvas-collapse .navbar-nav .nav-link{padding-left:1rem;padding-right:1rem;border-radius:.375rem}.offcanvas-collapse.open{box-shadow:-5px 0px 10px 0px rgba(0,0,0,0.15);opacity:1;transform:translate3d(0, 0, 0)}.navbar-light .offcanvas-collapse{background-color:#fff}.navbar-light .dropdown-divider{border-color:rgba(0,0,0,0.1)}.navbar-dark .offcanvas-collapse{background-color:#343a40}.navbar-dark .dropdown-divider{border-color:rgba(255,255,255,0.1)}}.page-item .page-link,.page-item>span{margin:0 3px;border-radius:.25rem;text-align:center}.pagination-circle .page-item .page-link,.pagination-circle .page-item>span{border-radius:50% !important;margin:0 5px;display:block;width:36px;height:36px}.pagination-circle.pagination-lg .page-item .page-link,.pagination-circle.pagination-lg .page-item>span{border-radius:50% !important;margin:0 5px;display:block;width:52px;height:52px}.popover{border:0}.popover-header{font-weight:600}.popover-primary{background-color:#288cff}.popover-primary .popover-header,.popover-primary .popover-body{background-color:#288cff;color:#fff}.popover-primary .popover-header{border-color:rgba(255,255,255,0.2)}.popover-primary.bs-popover-top .arrow::after,.popover-primary.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#288cff}.popover-primary.bs-popover-right .arrow::after,.popover-primary.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#288cff}.popover-primary.bs-popover-bottom .arrow::after,.popover-primary.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#288cff}.popover-primary.bs-popover-left .arrow::after,.popover-primary.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#288cff}.popover-secondary{background-color:#e8f2ff}.popover-secondary .popover-header,.popover-secondary .popover-body{background-color:#e8f2ff;color:#212529}.popover-secondary .popover-header{border-color:rgba(33,37,41,0.2)}.popover-secondary.bs-popover-top .arrow::after,.popover-secondary.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#e8f2ff}.popover-secondary.bs-popover-right .arrow::after,.popover-secondary.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#e8f2ff}.popover-secondary.bs-popover-bottom .arrow::after,.popover-secondary.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#e8f2ff}.popover-secondary.bs-popover-left .arrow::after,.popover-secondary.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#e8f2ff}.popover-success{background-color:#00c759}.popover-success .popover-header,.popover-success .popover-body{background-color:#00c759;color:#fff}.popover-success .popover-header{border-color:rgba(255,255,255,0.2)}.popover-success.bs-popover-top .arrow::after,.popover-success.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#00c759}.popover-success.bs-popover-right .arrow::after,.popover-success.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#00c759}.popover-success.bs-popover-bottom .arrow::after,.popover-success.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#00c759}.popover-success.bs-popover-left .arrow::after,.popover-success.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#00c759}.popover-info{background-color:#73e9ef}.popover-info .popover-header,.popover-info .popover-body{background-color:#73e9ef;color:#212529}.popover-info .popover-header{border-color:rgba(33,37,41,0.2)}.popover-info.bs-popover-top .arrow::after,.popover-info.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#73e9ef}.popover-info.bs-popover-right .arrow::after,.popover-info.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#73e9ef}.popover-info.bs-popover-bottom .arrow::after,.popover-info.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#73e9ef}.popover-info.bs-popover-left .arrow::after,.popover-info.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#73e9ef}.popover-warning{background-color:#ff3b00}.popover-warning .popover-header,.popover-warning .popover-body{background-color:#ff3b00;color:#fff}.popover-warning .popover-header{border-color:rgba(255,255,255,0.2)}.popover-warning.bs-popover-top .arrow::after,.popover-warning.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#ff3b00}.popover-warning.bs-popover-right .arrow::after,.popover-warning.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#ff3b00}.popover-warning.bs-popover-bottom .arrow::after,.popover-warning.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#ff3b00}.popover-warning.bs-popover-left .arrow::after,.popover-warning.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#ff3b00}.popover-danger{background-color:#f03}.popover-danger .popover-header,.popover-danger .popover-body{background-color:#f03;color:#fff}.popover-danger .popover-header{border-color:rgba(255,255,255,0.2)}.popover-danger.bs-popover-top .arrow::after,.popover-danger.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#f03}.popover-danger.bs-popover-right .arrow::after,.popover-danger.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#f03}.popover-danger.bs-popover-bottom .arrow::after,.popover-danger.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#f03}.popover-danger.bs-popover-left .arrow::after,.popover-danger.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#f03}.popover-light{background-color:#e9ecef}.popover-light .popover-header,.popover-light .popover-body{background-color:#e9ecef;color:#212529}.popover-light .popover-header{border-color:rgba(33,37,41,0.2)}.popover-light.bs-popover-top .arrow::after,.popover-light.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#e9ecef}.popover-light.bs-popover-right .arrow::after,.popover-light.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#e9ecef}.popover-light.bs-popover-bottom .arrow::after,.popover-light.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#e9ecef}.popover-light.bs-popover-left .arrow::after,.popover-light.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#e9ecef}.popover-dark{background-color:#343a40}.popover-dark .popover-header,.popover-dark .popover-body{background-color:#343a40;color:#fff}.popover-dark .popover-header{border-color:rgba(255,255,255,0.2)}.popover-dark.bs-popover-top .arrow::after,.popover-dark.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#343a40}.popover-dark.bs-popover-right .arrow::after,.popover-dark.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#343a40}.popover-dark.bs-popover-bottom .arrow::after,.popover-dark.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#343a40}.popover-dark.bs-popover-left .arrow::after,.popover-dark.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#343a40}.popover-tertiary{background-color:#192b3f}.popover-tertiary .popover-header,.popover-tertiary .popover-body{background-color:#192b3f;color:#fff}.popover-tertiary .popover-header{border-color:rgba(255,255,255,0.2)}.popover-tertiary.bs-popover-top .arrow::after,.popover-tertiary.bs-popover-auto[x-placement^="top"] .arrow::after{border-top-color:#192b3f}.popover-tertiary.bs-popover-right .arrow::after,.popover-tertiary.bs-popover-auto[x-placement^="right"] .arrow::after{border-right-color:#192b3f}.popover-tertiary.bs-popover-bottom .arrow::after,.popover-tertiary.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-bottom-color:#192b3f}.popover-tertiary.bs-popover-left .arrow::after,.popover-tertiary.bs-popover-auto[x-placement^="left"] .arrow::after{border-left-color:#192b3f}.progress-wrapper{position:relative;padding-top:1.5rem}.progress{height:1rem;margin-bottom:1rem;overflow:hidden;border-radius:.25rem;background-color:#e9ecef;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-inverse{background-color:#343a40}.progress.progress-lg{height:1.5rem}.progress.progress-md{height:1rem}.progress.progress-sm{height:0.625rem}.progress.progress-xs{height:0.25rem}.progress .sr-only{width:auto;height:20px;margin:0 0 0 30px;left:0;clip:auto;line-height:20px;font-size:13px}.progress-heading{font-size:14px;font-weight:500;margin:0 0 2px;padding:0}.progress-bar{-webkit-box-shadow:none;box-shadow:none;border-radius:0;height:auto}.progress-text{margin-bottom:0}.progress-text .mark{float:left;width:50%;background:transparent}.progress-text .mark.right{text-align:right}.progress-tooltip{display:inline-block;background:rgba(0,0,0,0.8);color:#fff;padding:.25rem .375rem;line-height:1;font-size:0.7rem;position:relative;bottom:8px;border-radius:3px;margin-left:-15px}.progress-tooltip:after{top:100%;left:10px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(51,51,51,0);border-top-color:rgba(0,0,0,0.8);border-width:5px}.progress-label{display:inline-block;color:#6c757d;position:absolute;top:0;left:0;font-size:.65625rem}.progress-percentage{display:inline-block;color:#6c757d;font-size:1rem;position:absolute;right:0;top:0}.main{position:relative}.slice{position:relative;padding-top:4rem;padding-bottom:4rem}.slice-xl{padding-top:8rem;padding-bottom:8rem}.slice-lg{padding-top:6rem;padding-bottom:6rem}.slice-sm{padding-top:2rem;padding-bottom:2rem}.offset-top{padding-top:4rem}.offset-top-xl{padding-top:8rem}.offset-top-lg{padding-top:6rem}.offset-top-sm{padding-top:2rem}.sidebar-sticky.is_stuck{padding-top:1.5rem}.spotlight{position:relative}.spotlight .container{height:100%}@media (min-height: 600px) and (min-width: 767px){[data-spotlight="fullscreen"]{height:100vh}}.table .table.align-items-center th,.table .table.align-items-center td,.table.align-items-center th,.table.align-items-center td{vertical-align:middle}.table-hover tr{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.table.table-cards{border-collapse:collapse}.table.table-cards th,.table.table-cards td{border:none}.table-cards tr.bg-white>th,.table-cards tr.bg-white>td{padding:1rem;position:relative}.table-cards tr.bg-white>th:after,.table-cards tr.bg-white>td:after{content:'';position:absolute;width:100%;height:100%;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6;left:0;top:0;pointer-events:none}.table-cards tr.bg-white>th{border-radius:.375rem 0 0 .375rem}.table-cards tr.bg-white>th:after{border-radius:.375rem 0 0 .375rem;border-left:1px solid #dee2e6}.table-cards tr.bg-white>td:last-child{border-radius:0 .375rem .375rem 0}.table-cards tr.bg-white>td:last-child:after{border-radius:0 .375rem .375rem 0;border-right:1px solid #dee2e6}.table-hover tr.bg-white:hover{background-color:rgba(0,0,0,0.075) !important}tr.table-divider{height:0.75rem}body{font-family:"Nunito",sans-serif;font-size:.875rem;line-height:1.6}.heading{font-family:"Nunito",sans-serif}.fluid-paragraph{width:680px;margin:auto;padding:0 1.5rem;position:relative}@media (max-width: 767px){.fluid-paragraph{width:100%}}select.bs-select-hidden,select.selectpicker{display:none !important}.bootstrap-select{width:220px\9}.bootstrap-select>.dropdown-toggle{width:100%;padding-right:25px;z-index:1}.bootstrap-select>select{position:absolute !important;bottom:0;left:50%;display:block !important;width:0.5px !important;height:100% !important;padding:0 !important;opacity:0 !important;border:none}.bootstrap-select>select.mobile-device{top:0;left:0;display:block !important;width:100% !important;z-index:2}.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select.fit-width{width:auto !important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus{outline:thin dotted #333 !important;outline:5px auto -webkit-focus-ring-color !important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none}.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{z-index:auto}.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child)>.btn{border-radius:0}.bootstrap-select.btn-group:not(.input-group-btn),.bootstrap-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.btn-group.dropdown-menu-right,.bootstrap-select.btn-group[class*=col-].dropdown-menu-right,.row .bootstrap-select.btn-group[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group{margin-bottom:0}.form-group-lg .bootstrap-select.btn-group.form-control,.form-group-sm .bootstrap-select.btn-group.form-control{padding:0}.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.form-inline .bootstrap-select.btn-group .form-control{width:100%}.bootstrap-select.btn-group.disabled,.bootstrap-select.btn-group>.disabled{cursor:not-allowed}.bootstrap-select.btn-group.disabled:focus,.bootstrap-select.btn-group>.disabled:focus{outline:0 !important}.bootstrap-select.btn-group.bs-container{position:absolute;height:0 !important;padding:0 !important}.bootstrap-select.btn-group.bs-container .dropdown-menu{z-index:1060}.bootstrap-select.btn-group .dropdown-toggle .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.bootstrap-select.btn-group .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{display:block;position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li.active small{color:#fff}.bootstrap-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select.btn-group .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select.btn-group .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select.btn-group .dropdown-menu li a span.check-mark{display:none}.bootstrap-select.btn-group .dropdown-menu li a span.text{display:inline-block}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:0.5em}.bootstrap-select.btn-group .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option{position:static}.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,0.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid rgba(204,204,204,0.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none;padding:1rem}.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn){width:100%}.bootstrap-select .dropdown-toggle{text-align:left}.bootstrap-select .btn-default.bs-placeholder{color:#6c757d;font-weight:normal}.bootstrap-select .dropdown-toggle.btn-default{color:#495057;background-color:#fff;border-color:#ced4da;text-align:left}.bootstrap-select .bs-placeholder{font-weight:normal}.bootstrap-select .btn-default.bs-placeholder{color:#6c757d}.bootstrap-select .dropdown-toggle.btn-default:active,.bootstrap-select.show>.btn-default.dropdown-toggle{background-color:#f8f9fa;color:#6c757d;border-color:#ced4da;box-shadow:none}.bootstrap-select .btn svg,.bootstrap-select .btn i{margin-right:0.5rem;color:#6c757d}.input-group>.input-group-prepend>.bootstrap-select,.input-group>.input-group-append>.bootstrap-select{max-width:100%}.input-group .bootstrap-select .btn{display:flex;align-items:center;padding:.75rem 2rem .75rem 1rem;margin-bottom:0;font-size:.875rem;font-weight:400;line-height:1.6;color:#6c757d;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:.0625rem solid #ced4da;border-radius:.375rem}.input-group>.input-group-prepend>.bootstrap-select>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.bootstrap-select>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.focused .bootstrap-select .btn{color:#288cff;background-color:#e9ecef;border-color:#ced4da}.bootstrap-select.show>.dropdown-menu>.dropdown-menu{display:block}.bootstrap-select .dropdown-menu .selected .dropdown-item{color:#288cff}.bootstrap-select>.dropdown-menu>.dropdown-menu li.hidden{display:none}.bootstrap-select.btn-group .dropdown-menu li small{display:block;padding:0}.bootstrap-select .dropdown-menu .dropdown-item svg,.bootstrap-select .dropdown-menu .selected i{margin-right:0.5rem;color:#6c757d}.bootstrap-select>.dropdown-toggle:after{position:absolute;right:1rem;top:50%;transform:translateY(-50%)}.bs-searchbox{padding:0;margin-bottom:.5rem;margin-top:-.5rem}.bootstrap-select .form-control{background-color:transparent;border:0;border-bottom:1px solid #e9ecef;border-radius:0}.bootstrap-select .check-mark{font-size:.65625rem}.bootstrap-select button{overflow:hidden;text-overflow:ellipsis}.bootstrap-select.btn-group .dropdown-toggle .filter-option{display:inline !important}.bootstrap-tagsinput{background-color:#fff;border:.0625rem solid #ced4da;display:inline-block;padding:.3em .3em;color:#ced4da;vertical-align:middle;border-radius:.375rem;max-width:100%;cursor:text}.bootstrap-tagsinput input{border:none;box-shadow:none;outline:none;background-color:transparent;padding:0 6px;margin:0;width:auto;max-width:inherit}.bootstrap-tagsinput.form-control input::-moz-placeholder{color:#6c757d;opacity:1}.bootstrap-tagsinput.form-control input:-ms-input-placeholder{color:#6c757d}.bootstrap-tagsinput.form-control input::-webkit-input-placeholder{color:#6c757d}.bootstrap-tagsinput input:focus{border:none;box-shadow:none}.bootstrap-tagsinput .badge{padding:1em .8em;margin-right:0.125rem;border-radius:.375rem}.bootstrap-tagsinput [data-role="remove"]{margin-left:8px;cursor:pointer;color:rgba(255,255,255,0.6)}.bootstrap-tagsinput [data-role="remove"]:after{content:"x";padding:0px 2px}.bootstrap-tagsinput [data-role="remove"]:hover{color:#fff}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative;direction:ltr}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;left:0;height:100%;width:100%;-webkit-transform-origin:0 0;transform-origin:0 0}html:not([dir="rtl"]) .noUi-horizontal .noUi-origin{left:auto;right:0}.noUi-vertical .noUi-origin{width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{position:absolute}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform 0.3s;transition:transform 0.3s}.noUi-state-drag *{cursor:inherit !important}.noUi-horizontal{height:.0625rem}.noUi-horizontal .noUi-handle{width:34px;height:28px;left:-17px;top:-6px}.noUi-vertical{width:.0625rem}.noUi-vertical .noUi-handle{width:28px;height:34px;left:-6px;top:-17px}html:not([dir="rtl"]) .noUi-horizontal .noUi-handle{right:-17px;left:auto}.noUi-target{background:#dee2e6;border-radius:4px;border:0;box-shadow:inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#288cff}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB}[disabled] .noUi-connect{background:#B8B8B8}[disabled].noUi-target,[disabled].noUi-handle,[disabled] .noUi-handle{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%, 50%);transform:translate(-50%, 50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%, 50%);transform:translate(50%, 50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0, -50%);transform:translate(0, -50%, 0);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0, 50%);transform:translate(0, 50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%, 0);transform:translate(-50%, 0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0, -50%);transform:translate(0, -50%);top:50%;right:120%}.noUi-target{border-radius:0;box-shadow:none;border:0;background:#dee2e6;margin:15px 0}.noUi-horizontal{height:.0625rem}html:not([dir="rtl"]) .noUi-horizontal .noUi-handle{right:-10px}.noUi-vertical{width:.0625rem}.noUi-connect{background:#288cff;box-shadow:none}.noUi-horizontal .noUi-handle,.noUi-vertical .noUi-handle{top:-7px;width:15px;height:15px;border:0;border-radius:100%;box-shadow:none;cursor:pointer;background-color:#288cff;transition:box-shadow 0.2s,-webkit-transform 0.2s;transition:box-shadow 0.2s,transform 0.2s;transition:box-shadow 0.2s,transform 0.2s,-webkit-transform 0.2s}.noUi-horizontal .noUi-handle:after,.noUi-horizontal .noUi-handle:before,.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{display:none}.noUi-horizontal .noUi-handle.noUi-active,.noUi-vertical .noUi-handle.noUi-active{-webkit-transform:scale(1.3);transform:scale(1.3)}.noUi-horizontal .noUi-active,.noUi-vertical .noUi-active{box-shadow:0 0 0 3px rgba(0,0,0,0.1)}.input-slider--cyan .noUi-connect{background:#2bffc6}.input-slider--cyan.noUi-horizontal .noUi-handle,.input-slider--cyan.noUi-vertical .noUi-handle{background-color:#2bffc6}.input-slider--red .noUi-connect{background:#f03}.input-slider--red.noUi-horizontal .noUi-handle,.input-slider--red.noUi-vertical .noUi-handle{background-color:#f03}.input-slider--green .noUi-connect{background:#00c759}.input-slider--green.noUi-horizontal .noUi-handle,.input-slider--green.noUi-vertical .noUi-handle{background-color:#00c759}.input-slider--yellow .noUi-connect{background:#ffd600}.input-slider--yellow.noUi-horizontal .noUi-handle,.input-slider--yellow.noUi-vertical .noUi-handle{background-color:#ffd600}.input-slider--pink .noUi-connect{background:#e36397}.input-slider--pink.noUi-horizontal .noUi-handle,.input-slider--pink.noUi-vertical .noUi-handle{background-color:#e36397}[disabled] .noUi-connect,[disabled].noUi-connect{background:#b2b2b2}[disabled] .noUi-handle,[disabled].noUi-origin{cursor:not-allowed}.range-slider-value{font-size:.65625rem;font-weight:500;background-color:rgba(52,58,64,0.7);color:#fff;border-radius:10px;padding:.4em .8em .3em .85em}.range-slider-wrapper .upper-info{font-weight:400;margin-bottom:5px}.input-slider-value-output{background:#333;color:#fff;padding:4px 8px;position:relative;top:12px;font-size:11px;border-radius:2px}.input-slider-value-output:after{bottom:100%;left:10px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(136,183,213,0);border-bottom-color:#333;border-width:4px;margin-left:-4px}.input-slider-value-output.left:after{left:10px;right:auto}.input-slider-value-output.right:after{right:10px;left:auto} diff --git a/connector/static/js/app.js b/connector/static/js/app.js new file mode 100644 index 0000000..2b45d28 --- /dev/null +++ b/connector/static/js/app.js @@ -0,0 +1,47 @@ +function changeTab(tabName = 'source') { + const selectTab = document.getElementById(`${tabName}-tab`); + selectTab.click(); +} + + +$(document).ready(function(){ + $( "#consumer_name" ).change(function() { + destination_name = $("#consumer_name").val() + $('#destination_name').html(destination_name); + }); + + $( "#provider_name" ).change(function() { + source_name = $("#provider_name").val() + $('#source_name').html(source_name); + }); + + $( "#submit" ).click(function() { + var data = JSON.stringify([ + { + "name": $("#provider_name").val(), + "connector_type": "provider", + "status": "active" + }, + { + "name": $("#consumer_name").val(), + "connector_type": "consumer", + "status": "active" + } + ]); + + var xhr = new XMLHttpRequest(); + xhr.withCredentials = true; + + xhr.addEventListener("readystatechange", function() { + if(this.readyState === 4) { + console.log(this.responseText); + } + }); + + xhr.open("POST", "http://127.0.0.1:8000/connector_api/run_local/"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.setRequestHeader("Cookie", "csrftoken=VDCAygOx52igW4LXYI2RtlrMlKTo3084NuirzSR0qxn0oKscJCguCaqnLlZdUKBU"); + + xhr.send(data); + }); +}) \ No newline at end of file diff --git a/connector/static/js/bootstrap.js b/connector/static/js/bootstrap.js new file mode 100644 index 0000000..534d533 --- /dev/null +++ b/connector/static/js/bootstrap.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0 (https://getbootstrap.com) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method named "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/connector/static/js/fontawesome.js b/connector/static/js/fontawesome.js new file mode 100644 index 0000000..21daa56 --- /dev/null +++ b/connector/static/js/fontawesome.js @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.6 by @fontawesome - http://fontawesome.com + * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +!function(){"use strict";var c={};try{"undefined"!=typeof window&&(c=window)}catch(c){}var l=(c.navigator||{}).userAgent,h=void 0===l?"":l,v=c,z=(~h.indexOf("MSIE")||h.indexOf("Trident/"),"___FONT_AWESOME___"),e=function(){try{return!0}catch(c){return!1}}(),a=[1,2,3,4,5,6,7,8,9,10],m=a.concat([11,12,13,14,15,16,17,18,19,20]);["xs","sm","lg","fw","ul","li","border","pull-left","pull-right","spin","pulse","rotate-90","rotate-180","rotate-270","flip-horizontal","flip-vertical","stack","stack-1x","stack-2x","inverse","layers","layers-text","layers-counter"].concat(a.map(function(c){return c+"x"})).concat(m.map(function(c){return"w-"+c}));var t=v||{};t[z]||(t[z]={}),t[z].styles||(t[z].styles={}),t[z].hooks||(t[z].hooks={}),t[z].shims||(t[z].shims=[]);var s=t[z],r=Object.assign||function(c){for(var l=1;l1&&void 0!==arguments[1]?arguments[1]:{}).asNewDefault,h=void 0!==l&&l,v=Object.keys(O),z=h?function(c){return~v.indexOf(c)&&!~A.indexOf(c)}:function(c){return~v.indexOf(c)};Object.keys(c).forEach(function(l){z(l)&&(O[l]=c[l])})}m.FontAwesomeConfig=O;var N=m||{};N[n]||(N[n]={}),N[n].styles||(N[n].styles={}),N[n].hooks||(N[n].hooks={}),N[n].shims||(N[n].shims=[]);var E=N[n],P=[],_=!1;M&&((_=(t.documentElement.doScroll?/^loaded|^c/:/^loaded|^i|^c/).test(t.readyState))||t.addEventListener("DOMContentLoaded",function c(){t.removeEventListener("DOMContentLoaded",c),_=1,P.map(function(c){return c()})}));var T=function(c){M&&(_?setTimeout(c,0):P.push(c))},F=H,I={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};function R(c){if(c&&M){var l=t.createElement("style");l.setAttribute("type","text/css"),l.innerHTML=c;for(var h=t.head.childNodes,v=null,z=h.length-1;z>-1;z--){var e=h[z],a=(e.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(a)>-1&&(v=e)}return t.head.insertBefore(l,v),c}}var W=0;function B(){return++W}function D(c){for(var l=[],h=(c||[]).length>>>0;h--;)l[h]=c[h];return l}function X(c){return c.classList?D(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function Y(c,l){var h,v=l.split("-"),z=v[0],e=v.slice(1).join("-");return z!==c||""===e||(h=e,~g.indexOf(h))?null:e}function U(c){return(""+c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function K(c){return Object.keys(c||{}).reduce(function(l,h){return l+(h+": ")+c[h]+";"},"")}function G(c){return c.size!==I.size||c.x!==I.x||c.y!==I.y||c.rotate!==I.rotate||c.flipX||c.flipY}function J(c){var l=c.transform,h=c.containerWidth,v=c.iconWidth;return{outer:{transform:"translate("+h/2+" 256)"},inner:{transform:"translate("+32*l.x+", "+32*l.y+") "+" "+("scale("+l.size/16*(l.flipX?-1:1)+", "+l.size/16*(l.flipY?-1:1)+") ")+" "+("rotate("+l.rotate+" 0 0)")},path:{transform:"translate("+v/2*-1+" -256)"}}}var Q={x:0,y:0,width:"100%",height:"100%"},Z=function(c){var l=c.children,h=c.attributes,v=c.main,z=c.mask,e=c.transform,a=v.width,m=v.icon,t=z.width,s=z.icon,r=J({transform:e,containerWidth:t,iconWidth:a}),f={tag:"rect",attributes:k({},Q,{fill:"white"})},M={tag:"g",attributes:k({},r.inner),children:[{tag:"path",attributes:k({},m.attributes,r.path,{fill:"black"})}]},i={tag:"g",attributes:k({},r.outer),children:[M]},n="mask-"+B(),H="clip-"+B(),o={tag:"defs",children:[{tag:"clipPath",attributes:{id:H},children:[s]},{tag:"mask",attributes:k({},Q,{id:n,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse"}),children:[f,i]}]};return l.push(o,{tag:"rect",attributes:k({fill:"currentColor","clip-path":"url(#"+H+")",mask:"url(#"+n+")"},Q)}),{children:l,attributes:h}},$=function(c){var l=c.children,h=c.attributes,v=c.main,z=c.transform,e=K(c.styles);if(e.length>0&&(h.style=e),G(z)){var a=J({transform:z,containerWidth:v.width,iconWidth:v.width});l.push({tag:"g",attributes:k({},a.outer),children:[{tag:"g",attributes:k({},a.inner),children:[{tag:v.icon.tag,children:v.icon.children,attributes:k({},v.icon.attributes,a.path)}]}]})}else l.push(v.icon);return{children:l,attributes:h}},cc=function(c){var l=c.children,h=c.main,v=c.mask,z=c.attributes,e=c.styles,a=c.transform;if(G(a)&&h.found&&!v.found){var m=h.width/h.height/2,t=.5;z.style=K(k({},e,{"transform-origin":m+a.x/16+"em "+(t+a.y/16)+"em"}))}return[{tag:"svg",attributes:z,children:l}]},lc=function(c){var l=c.prefix,h=c.iconName,v=c.children,z=c.attributes,e=c.symbol,a=!0===e?l+"-"+O.familyPrefix+"-"+h:e;return[{tag:"svg",attributes:{style:"display: none;"},children:[{tag:"symbol",attributes:k({},z,{id:a}),children:v}]}]};function hc(c){var l=c.icons,h=l.main,v=l.mask,z=c.prefix,e=c.iconName,a=c.transform,m=c.symbol,t=c.title,s=c.extra,r=c.watchable,f=void 0!==r&&r,M=v.found?v:h,i=M.width,n=M.height,H="fa-w-"+Math.ceil(i/n*16),o=[O.replacementClass,e?O.familyPrefix+"-"+e:"",H].concat(s.classes).join(" "),C={children:[],attributes:k({},s.attributes,{"data-prefix":z,"data-icon":e,class:o,role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 "+i+" "+n})};f&&(C.attributes[V]=""),t&&C.children.push({tag:"title",attributes:{id:C.attributes["aria-labelledby"]||"title-"+B()},children:[t]});var L=k({},C,{prefix:z,iconName:e,main:h,mask:v,transform:a,symbol:m,styles:s.styles}),u=v.found&&h.found?Z(L):$(L),d=u.children,p=u.attributes;return L.children=d,L.attributes=p,m?lc(L):cc(L)}function vc(c){var l=c.content,h=c.width,v=c.height,z=c.transform,e=c.title,a=c.extra,m=c.watchable,t=void 0!==m&&m,s=k({},a.attributes,e?{title:e}:{},{class:a.classes.join(" ")});t&&(s[V]="");var r,f,M,n,o,C,L,u,d,p=k({},a.styles);G(z)&&(p.transform=(f=(r={transform:z,startCentered:!0,width:h,height:v}).transform,M=r.width,n=void 0===M?H:M,o=r.height,C=void 0===o?H:o,L=r.startCentered,d="",d+=(u=void 0!==L&&L)&&i?"translate("+(f.x/F-n/2)+"em, "+(f.y/F-C/2)+"em) ":u?"translate(calc(-50% + "+f.x/F+"em), calc(-50% + "+f.y/F+"em)) ":"translate("+f.x/F+"em, "+f.y/F+"em) ",d+="scale("+f.size/F*(f.flipX?-1:1)+", "+f.size/F*(f.flipY?-1:1)+") ",d+="rotate("+f.rotate+"deg) "),p["-webkit-transform"]=p.transform);var b=K(p);b.length>0&&(s.style=b);var g=[];return g.push({tag:"span",attributes:s,children:[l]}),e&&g.push({tag:"span",attributes:{class:"sr-only"},children:[e]}),g}var zc=function(){},ec=O.measurePerformance&&r&&r.mark&&r.measure?r:{mark:zc,measure:zc},ac='FA "5.0.6"',mc=function(c){ec.mark(ac+" "+c+" ends"),ec.measure(ac+" "+c,ac+" "+c+" begins",ac+" "+c+" ends")},tc={begin:function(c){return ec.mark(ac+" "+c+" begins"),function(){return mc(c)}},end:mc},sc=function(c,l,h,v){var z,e,a,m,t,s=Object.keys(c),r=s.length,f=void 0!==v?(m=l,t=v,function(c,l,h,v){return m.call(t,c,l,h,v)}):l;for(void 0===h?(z=1,a=c[s[0]]):(z=0,a=h);z"+a.map(uc).join("")+""}var dc=function(){};function pc(c){return"string"==typeof(c.getAttribute?c.getAttribute(V):null)}var bc={replace:function(c){var l=c[0],h=c[1].map(function(c){return uc(c)}).join("\n");if(l.parentNode&&l.outerHTML)l.outerHTML=h+(O.keepOriginalSource&&"svg"!==l.tagName.toLowerCase()?"\x3c!-- "+l.outerHTML+" --\x3e":"");else if(l.parentNode){var v=document.createElement("span");l.parentNode.replaceChild(v,l),v.outerHTML=h}},nest:function(c){var l=c[0],h=c[1];if(~X(l).indexOf(O.replacementClass))return bc.replace(c);var v=new RegExp(O.familyPrefix+"-.*");delete h[0].attributes.style;var z=h[0].attributes.class.split(" ").reduce(function(c,l){return l===O.replacementClass||l.match(v)?c.toSvg.push(l):c.toNode.push(l),c},{toNode:[],toSvg:[]});h[0].attributes.class=z.toSvg.join(" ");var e=h.map(function(c){return uc(c)}).join("\n");l.setAttribute("class",z.toNode.join(" ")),l.setAttribute(V,""),l.innerHTML=e}};function gc(c,l){var h="function"==typeof l?l:dc;0===c.length?h():(m.requestAnimationFrame||function(c){return c()})(function(){var l=!0===O.autoReplaceSvg?bc.replace:bc[O.autoReplaceSvg]||bc.replace,v=tc.begin("mutate");c.map(l),v(),h()})}var yc=!1;var wc=function(c){var l=c.getAttribute("style"),h=[];return l&&(h=l.split(";").reduce(function(c,l){var h=l.split(":"),v=h[0],z=h.slice(1);return v&&z.length>0&&(c[v]=z.join(":").trim()),c},{})),h};var kc=function(c){var l,h,v,z,e=c.getAttribute("data-prefix"),a=c.getAttribute("data-icon"),m=void 0!==c.innerText?c.innerText.trim():"",t=Cc(X(c));return e&&a&&(t.prefix=e,t.iconName=a),t.prefix&&m.length>1?t.iconName=(v=t.prefix,z=c.innerText,ic[v][z]):t.prefix&&1===m.length&&(t.iconName=(l=t.prefix,h=function(c){for(var l="",h=0;h-1&&Xc(z.nextSibling),Xc(z),z=null),v&&!z){var e=h.getPropertyValue("content"),a=t.createElement("i");a.setAttribute("class",""+Wc[v[1]]),a.setAttribute(C,l),a.innerText=3===e.length?e.substr(1,1):e,":before"===l?c.insertBefore(a,c.firstChild):c.appendChild(a)}})})}(),yc=!1,l()}}function Uc(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(M){var h=t.documentElement.classList,v=function(c){return h.add(L+"-"+c)},z=function(c){return h.remove(L+"-"+c)},e=Object.keys(Fc),a=["."+Ic+":not(["+V+"])"].concat(e.map(function(c){return"."+c+":not(["+V+"])"})).join(", ");if(0!==a.length){var m=D(c.querySelectorAll(a));if(m.length>0){v("pending"),z("complete");var s=tc.begin("onTree"),r=m.reduce(function(c,l){try{var h=Dc(l);h&&c.push(h)}catch(c){u||c instanceof jc&&console.error(c)}return c},[]);s(),gc(r,function(){v("active"),v("complete"),z("pending"),"function"==typeof l&&l()})}}}}function Kc(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,h=Dc(c);h&&gc([h],l)}var Gc=function(){var c=o,l=O.familyPrefix,h=O.replacementClass,v="svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}";if("fa"!==l||h!==c){var z=new RegExp("\\.fa\\-","g"),e=new RegExp("\\."+c,"g");v=v.replace(z,"."+l+"-").replace(e,"."+h)}return v};function Jc(c){return{found:!0,width:c[0],height:c[1],icon:{tag:"path",attributes:{fill:"currentColor",d:c.slice(4)[0]}}}}var Qc=!1;function Zc(){O.autoAddCss&&(Qc||R(Gc()),Qc=!0)}function $c(c,l){return Object.defineProperty(c,"abstract",{get:l}),Object.defineProperty(c,"html",{get:function(){return c.abstract.map(function(c){return uc(c)})}}),Object.defineProperty(c,"node",{get:function(){if(M){var l=t.createElement("div");return l.innerHTML=c.html,l.children}}}),c}function cl(c){var l=c.prefix,h=void 0===l?"fa":l,v=c.iconName;if(v)return Lc(hl.definitions,h,v)||Lc(E.styles,h,v)}var ll,hl=new(function(){function c(){y(this,c),this.definitions={}}return w(c,[{key:"add",value:function(){for(var c=this,l=arguments.length,h=Array(l),v=0;v1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,v=void 0===h?I:h,z=l.symbol,e=void 0!==z&&z,a=l.mask,m=void 0===a?null:a,t=l.title,s=void 0===t?null:t,r=l.classes,f=void 0===r?[]:r,M=l.attributes,i=void 0===M?{}:M,n=l.styles,H=void 0===n?{}:n;if(c){var o=c.prefix,V=c.iconName,C=c.icon;return $c(k({type:"icon"},c),function(){return Zc(),O.autoA11y&&(s?i["aria-labelledby"]=O.replacementClass+"-title-"+B():i["aria-hidden"]="true"),hc({icons:{main:Jc(C),mask:m?Jc(m.icon):{found:!1,width:null,height:null,icon:{}}},prefix:o,iconName:V,transform:k({},I,v),symbol:e,title:s,extra:{attributes:i,styles:H,classes:f}})})}},function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=(c||{}).icon?c:cl(c||{}),v=l.mask;return v&&(v=(v||{}).icon?v:cl(v||{})),ll(h,k({},l,{mask:v}))}),zl={noAuto:function(){var c;j({autoReplaceSvg:c=!1,observeMutations:c})},dom:{i2svg:function(){var c=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(M){Zc();var l=c.node,h=void 0===l?t:l,v=c.callback,z=void 0===v?function(){}:v;O.searchPseudoElements&&Yc(h),Uc(h,z)}},css:Gc,insertCss:function(){R(Gc())}},library:hl,parse:{transform:function(c){return Sc(c)}},findIconDefinition:cl,icon:vl,text:function(c){var l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=l.transform,v=void 0===h?I:h,z=l.title,e=void 0===z?null:z,a=l.classes,m=void 0===a?[]:a,t=l.attributes,s=void 0===t?{}:t,r=l.styles,f=void 0===r?{}:r;return $c({type:"text",content:c},function(){return Zc(),vc({content:c,transform:k({},I,v),title:e,extra:{attributes:s,styles:f,classes:[O.familyPrefix+"-layers-text"].concat(S(m))}})})},layer:function(c){return $c({type:"layer"},function(){Zc();var l=[];return c(function(c){l=Array.isArray(c)?c.map(function(c){l=l.concat(c.abstract)}):l.concat(c.abstract)}),[{tag:"span",attributes:{class:O.familyPrefix+"-layers"},children:l}]})}},el=function(){M&&O.autoReplaceSvg&&zl.dom.i2svg({node:t})};Object.defineProperty(zl,"config",{get:function(){return O},set:function(c){j(c)}}),function(c){try{c()}catch(c){if(!u)throw c}}(function(){f&&(m.FontAwesome||(m.FontAwesome=zl),T(function(){Object.keys(E.styles).length>0&&el(),O.observeMutations&&"function"==typeof MutationObserver&&function(c){if(s){var l=c.treeCallback,h=c.nodeCallback,v=c.pseudoElementsCallback,z=new s(function(c){yc||D(c).forEach(function(c){if("childList"===c.type&&c.addedNodes.length>0&&!pc(c.addedNodes[0])&&(O.searchPseudoElements&&v(c.target),l(c.target)),"attributes"===c.type&&c.target.parentNode&&O.searchPseudoElements&&v(c.target.parentNode),"attributes"===c.type&&pc(c.target)&&~b.indexOf(c.attributeName))if("class"===c.attributeName){var z=Cc(X(c.target)),e=z.prefix,a=z.iconName;e&&c.target.setAttribute("data-prefix",e),a&&c.target.setAttribute("data-icon",a)}else h(c.target)})});M&&z.observe(t.getElementsByTagName("body")[0],{childList:!0,attributes:!0,characterData:!0,subtree:!0})}}({treeCallback:Uc,nodeCallback:Kc,pseudoElementsCallback:Yc})})),E.hooks=k({},E.hooks,{addPack:function(c,l){E.styles[c]=k({},E.styles[c]||{},l),Hc(),el()},addShims:function(c){var l;(l=E.shims).push.apply(l,S(c)),Hc(),el()}})})}(); \ No newline at end of file diff --git a/connector/static/js/jquery.js b/connector/static/js/jquery.js new file mode 100644 index 0000000..196710e --- /dev/null +++ b/connector/static/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a); +}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d); +});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="
",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r}); \ No newline at end of file diff --git a/connector/static/js/popper.js b/connector/static/js/popper.js new file mode 100644 index 0000000..888299b --- /dev/null +++ b/connector/static/js/popper.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2017 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var f=a.commonAncestorContainer;if(e!==f&&t!==f||i.contains(n))return p(f)?f:r(f);var l=s(e);return l.host?d(l.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),f=0i[e]&&!t.escapeWithReference&&(n=z(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=V,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var o=t.element;if('string'==typeof o){if(o=e.instance.popper.querySelector(o),!o)return e;}else if(!e.instance.popper.contains(o))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var i=e.placement.split('-')[0],n=e.offsets,r=n.popper,p=n.reference,s=-1!==['left','right'].indexOf(i),d=s?'height':'width',a=s?'top':'left',f=s?'left':'top',l=s?'bottom':'right',m=O(o)[d];p[l]-mr[l]&&(e.offsets.popper[a]+=p[a]+m-r[l]);var h=p[a]+p[d]/2-m/2,g=h-c(e.offsets.popper)[a];return g=_(z(r[d]-m,g),0),e.arrowElement=o,e.offsets.arrow={},e.offsets.arrow[a]=Math.round(g),e.offsets.arrow[f]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,f=e.offsets.reference,l=V,m='left'===i&&l(a.right)>l(f.left)||'right'===i&&l(a.left)l(f.top)||'bottom'===i&&l(a.top)l(o.right),g=l(a.top)l(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[t]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right + + + + + + Farmstack UI 3 + + + + + + + + + +
+ +
+
+
+
+
Set up source.
+
+
+
+
+
+ + + {% comment %} + {% endcomment %} +
+
+ +
+
+
+
+
+
+
+
Set up destination.
+
+
+
+
+
+ + + {% comment %} + {% endcomment %} +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
Set up connection.
+
+
+
+
+
+
Source:
+
+
Name:
+
+
+
+
+
Destination:
+
+
Name:
+
+
+
+
Port:
+
8081
+
+
+
Git Repo:
+
https://github.com/digitalgreenorg/farmstack-open
+
+
+
+ + +
+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/connector/templates/home.html b/connector/templates/home.html new file mode 100644 index 0000000..e69de29 diff --git a/connector/templates/logs.html b/connector/templates/logs.html new file mode 100644 index 0000000..2cbcd90 --- /dev/null +++ b/connector/templates/logs.html @@ -0,0 +1,55 @@ + + + + + + + Farmstack UI 3 + + + + + + + + + +
+
+
+
+
Sync History
+ +
+
+
+
+
+
+
+
+
Last Sync:
+
23-06-2021
+
+
+
+
+

Log file: /tmp/usr/somefile.log

+
+

+ {"results":[{"gender":"female","name":{"title":"Miss","first":"Ceyhan","last":"Eliçin"},"location":{"street":{"number":7652,"name":"Istiklal Cd"},"city":"Çorum","state":"Bursa","country":"Turkey","postcode":81549,"coordinates":{"latitude":"76.9892","longitude":"87.5197"},"timezone":{"offset":"-8:00","description":"Pacific Time (US & Canada)"}},"email":"ceyhan.elicin@example.com","login":{"uuid":"2502c733-cee4-4a6b-910f-f4b1de98f7ea","username":"yellowwolf327","password":"427900","salt":"43rPARvg","md5":"e7e4aa869c429c37c9906e8521a65e8f","sha1":"4b74398c2e1ccac3efbf55c8d0edfbcecefd19f6","sha256":"2fd5880849d329f7738733548b8b364dab5b8e10a96053bad3b185472bbe5904"},"dob":{"date":"1984-07-29T14:28:51.827Z","age":37},"registered":{"date":"2003-11-26T20:49:21.670Z","age":18},"phone":"(855)-949-6927","cell":"(820)-738-7214","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/women/79.jpg","medium":"https://randomuser.me/api/portraits/med/women/79.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/79.jpg"},"nat":"TR"},{"gender":"male","name":{"title":"Mr","first":"Aurelino","last":"Monteiro"},"location":{"street":{"number":4100,"name":"Rua Maranhão "},"city":"Salvador","state":"Rio de Janeiro","country":"Brazil","postcode":26347,"coordinates":{"latitude":"88.4027","longitude":"-78.0147"},"timezone":{"offset":"-3:00","description":"Brazil, Buenos Aires, Georgetown"}},"email":"aurelino.monteiro@example.com","login":{"uuid":"be40b4eb-3271-4629-966c-a2d8f97bb9ae","username":"whitelion468","password":"niang","salt":"2F0KCRRJ","md5":"4123e858218c7c2d93f0fae753b70d57","sha1":"bb4dcd01fc7c426ab904d074158652fb0883f2bd","sha256":"7b3c5f7960ffd28fa987c934c27e4534fe23833c9b1bd0862d7a8a8655918dcf"},"dob":{"date":"1971-06-27T04:58:45.237Z","age":50},"registered":{"date":"2006-12-22T02:35:24.899Z","age":15},"phone":"(61) 5678-0668","cell":"(39) 4994-3174","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/men/41.jpg","medium":"https://randomuser.me/api/portraits/med/men/41.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/41.jpg"},"nat":"BR"},{"gender":"male","name":{"title":"Mr","first":"Emile","last":"Sirko"},"location":{"street":{"number":8780,"name":"Elgin St"},"city":"Tecumseh","state":"Newfoundland and Labrador","country":"Canada","postcode":"L4R 4C4","coordinates":{"latitude":"7.9770","longitude":"-32.6996"},"timezone":{"offset":"+1:00","description":"Brussels, Copenhagen, Madrid, Paris"}},"email":"emile.sirko@example.com","login":{"uuid":"7469289b-e0ba-4d5f-bff7-53b7264d7e7e","username":"happyzebra427","password":"yyyy","salt":"4klc3SDa","md5":"2713b48ab06187d4a488b7c7a3450a89","sha1":"a8cb435065c1224a8916d03dd5d7245cb157eec9","sha256":"387942c656f26517063df75da9a47c5cda0919074b4c104093ed3df9fdaa6e53"},"dob":{"date":"1953-07-08T19:16:44.116Z","age":68},"registered":{"date":"2014-10-20T09:03:03.355Z","age":7},"phone":"823-463-4720","cell":"777-399-3050","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/men/12.jpg","medium":"https://randomuser.me/api/portraits/med/men/12.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/12.jpg"},"nat":"CA"},{"gender":"female","name":{"title":"Miss","first":"Alette","last":"Syrstad"},"location":{"street":{"number":7875,"name":"Sponstuveien"},"city":"Malvik","state":"Telemark","country":"Norway","postcode":"4123","coordinates":{"latitude":"-28.4475","longitude":"-29.2719"},"timezone":{"offset":"+9:00","description":"Tokyo, Seoul, Osaka, Sapporo, Yakutsk"}},"email":"alette.syrstad@example.com","login":{"uuid":"e220eb70-f6f5-42b1-9456-b46b31bcc5ff","username":"whiterabbit394","password":"deskjet","salt":"xWODfOVg","md5":"1a5d09ba0ff233d621b36c2e6b67cc7f","sha1":"87e3d71720a1df906c9a9ace93d1870d54302ccc","sha256":"9228eb78340ef1ad2b9e28b54f26541857521abfcc5b2bb51a5338e5f8abc7f1"},"dob":{"date":"1953-07-14T10:29:35.379Z","age":68},"registered":{"date":"2014-12-23T14:59:32.323Z","age":7},"phone":"63803579","cell":"40871327","id":{"name":"FN","value":"14075344024"},"picture":{"large":"https://randomuser.me/api/portraits/women/63.jpg","medium":"https://randomuser.me/api/portraits/med/women/63.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/63.jpg"},"nat":"NO"},{"gender":"male","name":{"title":"Mr","first":"Andre","last":"Thomas"},"location":{"street":{"number":7856,"name":"Wheeler Ridge Dr"},"city":"Nowra","state":"New South Wales","country":"Australia","postcode":7222,"coordinates":{"latitude":"-32.1941","longitude":"-179.3658"},"timezone":{"offset":"-12:00","description":"Eniwetok, Kwajalein"}},"email":"andre.thomas@example.com","login":{"uuid":"8076a716-c80d-41ec-87c3-6ca71ac14fc5","username":"orangeostrich910","password":"student","salt":"YKKFPuhp","md5":"e70dfc98b9c82c5000eb01965aca5882","sha1":"2a989e4441da7bcf7cdb2d0f7983338603e51237","sha256":"3e3caf4acb987215e47a27d06f663a6464f527e4520383be792ef804811171fa"},"dob":{"date":"1973-12-31T23:04:51.065Z","age":48},"registered":{"date":"2013-06-09T04:48:57.949Z","age":8},"phone":"07-7239-9164","cell":"0466-174-405","id":{"name":"TFN","value":"984143216"},"picture":{"large":"https://randomuser.me/api/portraits/men/52.jpg","medium":"https://randomuser.me/api/portraits/med/men/52.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/52.jpg"},"nat":"AU"},{"gender":"female","name":{"title":"Ms","first":"Mestan","last":"Eliçin"},"location":{"street":{"number":4588,"name":"Filistin Cd"},"city":"Kastamonu","state":"Sinop","country":"Turkey","postcode":44552,"coordinates":{"latitude":"-60.4419","longitude":"82.2417"},"timezone":{"offset":"+1:00","description":"Brussels, Copenhagen, Madrid, Paris"}},"email":"mestan.elicin@example.com","login":{"uuid":"aa4d168c-f40d-4b25-bb17-040e0cf93fd9","username":"redladybug571","password":"4321","salt":"vdJhXr3c","md5":"0cfa3104e276f62a93097e04274e4ebc","sha1":"a39ee2e1064fb343cd8ec79b4c7cf3f5d939f976","sha256":"49258b7b3a60370e5f1b5011e9dee007ef7f993e962279075f3c2eb11693d28d"},"dob":{"date":"1988-08-03T00:44:59.981Z","age":33},"registered":{"date":"2011-06-19T17:57:18.579Z","age":10},"phone":"(487)-963-5247","cell":"(297)-040-9002","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/women/41.jpg","medium":"https://randomuser.me/api/portraits/med/women/41.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/41.jpg"},"nat":"TR"},{"gender":"female","name":{"title":"Ms","first":"Ilona","last":"Lauri"},"location":{"street":{"number":4338,"name":"Bulevardi"},"city":"Kitee","state":"Päijät-Häme","country":"Finland","postcode":26490,"coordinates":{"latitude":"15.0629","longitude":"5.7224"},"timezone":{"offset":"+5:30","description":"Bombay, Calcutta, Madras, New Delhi"}},"email":"ilona.lauri@example.com","login":{"uuid":"a513d9ae-8a8c-4c45-bf2b-6a91b7719fe7","username":"heavysnake281","password":"savannah","salt":"WTGZcxjN","md5":"d575fffccea8fb3e7e12ac0586b81c5e","sha1":"0b3a29d80173939336d019d3912981c9f1ddf955","sha256":"418b3188164655210cc44fa397b5c23be6cad97ad80f242ed448202adf4bd101"},"dob":{"date":"1970-09-08T17:05:21.221Z","age":51},"registered":{"date":"2005-07-25T08:08:00.314Z","age":16},"phone":"08-546-740","cell":"041-042-81-05","id":{"name":"HETU","value":"NaNNA018undefined"},"picture":{"large":"https://randomuser.me/api/portraits/women/84.jpg","medium":"https://randomuser.me/api/portraits/med/women/84.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/84.jpg"},"nat":"FI"},{"gender":"male","name":{"title":"Mr","first":"Esteban","last":"Gil"},"location":{"street":{"number":3307,"name":"Calle Mota"},"city":"Gijón","state":"Islas Baleares","country":"Spain","postcode":46935,"coordinates":{"latitude":"-68.9111","longitude":"-10.6146"},"timezone":{"offset":"+2:00","description":"Kaliningrad, South Africa"}},"email":"esteban.gil@example.com","login":{"uuid":"542abed9-5c77-497b-a509-1c4e00a78c86","username":"beautifulrabbit868","password":"kermit","salt":"PB3wHFpR","md5":"be9e63407b4a11abc22357371957e80f","sha1":"c738d9080093672ba3105c3c558afab3b6376e47","sha256":"8a1f21a23e223dc472852446f590a607d2ebc02b0e87b75a277b5163b9c46834"},"dob":{"date":"1975-02-13T01:53:12.105Z","age":46},"registered":{"date":"2002-10-30T02:54:29.868Z","age":19},"phone":"952-822-469","cell":"621-112-932","id":{"name":"DNI","value":"38372631-R"},"picture":{"large":"https://randomuser.me/api/portraits/men/77.jpg","medium":"https://randomuser.me/api/portraits/med/men/77.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/77.jpg"},"nat":"ES"},{"gender":"female","name":{"title":"Mrs","first":"Silke","last":"Madsen"},"location":{"street":{"number":7950,"name":"Vesterbyvej"},"city":"København Ø","state":"Hovedstaden","country":"Denmark","postcode":92609,"coordinates":{"latitude":"-0.8793","longitude":"126.5242"},"timezone":{"offset":"+10:00","description":"Eastern Australia, Guam, Vladivostok"}},"email":"silke.madsen@example.com","login":{"uuid":"cfb5836c-3eb0-461f-8047-c67bb615a2cb","username":"organiczebra676","password":"killers","salt":"O8kD3AvF","md5":"b66d80dff691ad5adae5da0a4d9a88df","sha1":"c032a6dbdd4284bdbb24a3496d292be591f15e9b","sha256":"839a690b9c788939919cd2e86d5e30b06769b78339533a8ee2ff6692cb716a91"},"dob":{"date":"1951-10-05T20:52:32.343Z","age":70},"registered":{"date":"2016-11-05T18:34:35.300Z","age":5},"phone":"97869354","cell":"66450231","id":{"name":"CPR","value":"051051-1593"},"picture":{"large":"https://randomuser.me/api/portraits/women/11.jpg","medium":"https://randomuser.me/api/portraits/med/women/11.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/11.jpg"},"nat":"DK"},{"gender":"male","name":{"title":"Mr","first":"Austin","last":"Banks"},"location":{"street":{"number":7403,"name":"Mcgowen St"},"city":"Anchorage","state":"Connecticut","country":"United States","postcode":49295,"coordinates":{"latitude":"4.4138","longitude":"121.1423"},"timezone":{"offset":"-3:30","description":"Newfoundland"}},"email":"austin.banks@example.com","login":{"uuid":"062ac7d3-73dd-4979-b613-173d21801c57","username":"brownostrich504","password":"159357","salt":"JeoqlyuU","md5":"37ff0b1fbef96fbcfd412d3fc3cc693d","sha1":"6ef6419d0db4ee4bf2b10be134d6900f22beede1","sha256":"6a8ccbcae69d8bec0b77fcb3c6d6e2a7c72d90231cfc9bb45a80e147be3451ef"},"dob":{"date":"1988-10-22T16:23:53.761Z","age":33},"registered":{"date":"2012-03-26T21:39:00.210Z","age":9},"phone":"(872)-566-7071","cell":"(265)-975-6415","id":{"name":"SSN","value":"180-94-3180"},"picture":{"large":"https://randomuser.me/api/portraits/men/61.jpg","medium":"https://randomuser.me/api/portraits/med/men/61.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/61.jpg"},"nat":"US"}],"info":{"seed":"1f2a2aae2395fc7b","results":10,"page":1,"version":"1.3"}} +

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/connector/templates/status.html b/connector/templates/status.html new file mode 100644 index 0000000..b240d81 --- /dev/null +++ b/connector/templates/status.html @@ -0,0 +1,71 @@ + + + + + + + Farmstack UI 3 + + + + + + + + + +
+

Sources

+ +
+ +
+
+
+
+ + + + + + + + + + + {% for connector in connectors %} + + + + + + + + {% endfor %} + +
NameStatusConnector TypeDelete
+
+ {% comment %} {% endcomment %} +
+
{{connector.name}}
+
+
+
{{connector.status}}{{connector.connector_type}} + +
+
+
+
+ +
+ + + + + + + + \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..a17b3e8 --- /dev/null +++ b/setup.py @@ -0,0 +1,32 @@ +import os +import subprocess + +def start_setup(): + + # install virtualenv + subprocess.call(["pip3", "install", "virtualenv"]) + + init_command = "python3 -m venv venv" + + activator_string = '''source venv/bin/activate ;''' + + requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", + "chardet", "cryptography", "Django==2.2", "python_on_whales", + "django-rest-swagger==2.2.0", "djangorestframework==3.12.2", + "idna==2.10", "paramiko==2.7.2", "pycparser", + "PyNaCl", "pytz", "PyYAML", "requests==2.25.1", "six", + "sqlparse", "uritemplate==3.0.1", "urllib3==1.26.4", + ] + + os.system(init_command) + + for req in requirements: + activator_string += "pip install %s;" % (req) + + os.system(activator_string) + + #start server + os.system("source venv/bin/activate;cd connector/connector/;python manage.py runserver 0.0.0.0:8000;") + +if __name__ == "__main__": + start_setup() \ No newline at end of file From c173c079d3e1c076774780713fb92342d733f341 Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Wed, 23 Jun 2021 19:40:02 +0530 Subject: [PATCH 033/163] add logs --- connector/connector/settings.py | 6 ++++- connector/connector_api/views.py | 40 +++++++++++++++--------------- connector/connector_views/views.py | 25 +++++++++++++------ connector/requirements.txt | 7 +++--- connector/static/js/app.js | 1 + connector/templates/logs.html | 20 +++++++++++++-- connector/templates/status.html | 3 +++ setup.py | 8 +++--- stop_consumer.sh | 4 +++ stop_provider.sh | 4 +++ 10 files changed, 81 insertions(+), 37 deletions(-) create mode 100755 stop_consumer.sh create mode 100755 stop_provider.sh diff --git a/connector/connector/settings.py b/connector/connector/settings.py index b2a3fac..a6a95fc 100644 --- a/connector/connector/settings.py +++ b/connector/connector/settings.py @@ -14,7 +14,7 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - +FILES_DIR = os.path.abspath(os.path.join(BASE_DIR, '../fs-configs/usage-control-example/logs/')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ @@ -39,6 +39,7 @@ 'connector_views', 'rest_framework', 'connector_api', + 'corsheaders', ] MIDDLEWARE = [ @@ -46,11 +47,14 @@ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', + 'corsheaders.middleware.CorsMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] +CORS_ORIGIN_ALLOW_ALL = True + ROOT_URLCONF = 'connector.urls' TEMPLATES = [ diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py index fa6cecc..9a06add 100644 --- a/connector/connector_api/views.py +++ b/connector/connector_api/views.py @@ -24,6 +24,8 @@ def enforce_csrf(self, request): class RunLocal(generics.RetrieveUpdateDestroyAPIView): authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication) + queryset = Connector.objects.all() + serializer_class = ConnectorSerializer def get(self, request, *args, **kwargs): return Response(status=status.HTTP_404_NOT_FOUND) @@ -31,6 +33,7 @@ def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs): try: # create connector instance + print(request.data) create_connector = ConnectorSerializer(data=request.data, many=isinstance(request.data, list)) if create_connector.is_valid(): create_connector.save() @@ -40,30 +43,28 @@ def post(self, request, *args, **kwargs): errors = create_connector.error # check if docker for connectors alreay running - docker_outout = check_output(["docker", "container", "ls", "-a"]) - output_string = docker_outout.decode('utf-8') - # check for consumer and provider core - if "provider-core" in output_string and "consumer-core" in output_string: - # redirect to status page as connectors already running - return redirect("http://localhost:%s/status/" % (8000)) - else: - try: - pid = os.fork() - except Exception as e: - print(e) + try: + pid = os.fork() + except Exception as e: + print(e) - # create a background process - if pid == 0: - subprocess.call(["./run.sh"]) - os._exit(0) - return redirect("http://localhost:%s/status/" % (8000)) + # create a background process + if pid == 0: + subprocess.call(["./run.sh"]) + print(os.getpid()) + os._exit(0) + + time.sleep(5) + return Response(data={"message": "Connectors saved"}, status=status.HTTP_201_CREATED) except Exception as e: print(e) - return Response(data={"message": "message not saved"}, status=status.HTTP_304_NOT_MODIFIED) + return Response(data={"message": "Connectors not saved"}, status=status.HTTP_304_NOT_MODIFIED) class StopConnector(generics.RetrieveUpdateDestroyAPIView): authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication) + queryset = Connector.objects.all() + serializer_class = ConnectorSerializer def post(self, request, *args, **kwargs): return Response(status=status.HTTP_404_NOT_FOUND) @@ -119,8 +120,7 @@ def get(self, request, con_type, connector_uuid, *args, **kwargs): except: pass - time.sleep(5) - return redirect("http://localhost:8000/home/status/") + return redirect("http://127.0.0.1:8000/home/status/") except Exception as e: print(e) - return Response(data={"message": "message not saved"}, status=status.HTTP_304_NOT_MODIFIED) \ No newline at end of file + return Response(data={"message": "Connectors not deletd"}, status=status.HTTP_304_NOT_MODIFIED) \ No newline at end of file diff --git a/connector/connector_views/views.py b/connector/connector_views/views.py index ea59b45..95b0d23 100644 --- a/connector/connector_views/views.py +++ b/connector/connector_views/views.py @@ -1,7 +1,9 @@ -from django.shortcuts import render import json -import requests +import subprocess from connector_api.models import Connector +from django.conf import settings +from django.shortcuts import render +import os def home(request): return render(request, "connection.html") @@ -14,8 +16,17 @@ def con_status(request): return render(request, "status.html", context={"connectors": connectors}) def log(request): - log_json = requests.get('http://localhost:3100/loki/api/v1/query_range?direction=BACKWARD&limit=1000&query=%7Bjob%3D%22varlogs%22%7D&start=1623317555000000000&end=1623321156000000000') - log_json = json.loads(log_json.text)["data"]["result"][0]["values"][:100] - for i, log in enumerate(log_json): - log_json[i] = json.loads(log[-1]) - return render(request, "logs.html", context={"logs": log_json}) + provider_logs_top_100 = [] + consumer_logs_top_100 = [] + + print(settings.BASE_DIR) + + consumer_log_path = file_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") + provider_log_path = file_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") + with open(consumer_log_path, "r") as ofs: + consumer_logs_top_100 = ofs.readlines()[:100] + + with open(provider_log_path, "r") as ofs: + provider_logs_top_100 = ofs.readlines()[:100] + + return render(request, "logs.html", context={"provider_logs_top_100": provider_logs_top_100, "consumer_logs_top_100": consumer_logs_top_100}) diff --git a/connector/requirements.txt b/connector/requirements.txt index 85bae54..5216c72 100644 --- a/connector/requirements.txt +++ b/connector/requirements.txt @@ -4,13 +4,14 @@ cffi chardet cryptography Django==2.2 -djangorestframework==3.12.2 +djangorestframework==3.12.4 idna pycparser PyNaCl pytz PyYAML -requests==2.25.1 +requests six sqlparse -urllib3==1.26.3 \ No newline at end of file +urllib3==1.26.3 +django-cors-headers \ No newline at end of file diff --git a/connector/static/js/app.js b/connector/static/js/app.js index 2b45d28..313e1b6 100644 --- a/connector/static/js/app.js +++ b/connector/static/js/app.js @@ -35,6 +35,7 @@ $(document).ready(function(){ xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { console.log(this.responseText); + window.location.href = '/status'; } }); diff --git a/connector/templates/logs.html b/connector/templates/logs.html index 2cbcd90..789b459 100644 --- a/connector/templates/logs.html +++ b/connector/templates/logs.html @@ -37,10 +37,26 @@
Sync History
-

Log file: /tmp/usr/somefile.log

+

Log file: fs-configs/usage-control-example/provider/logs/karaf.log

+
Provider Logs:

- {"results":[{"gender":"female","name":{"title":"Miss","first":"Ceyhan","last":"Eliçin"},"location":{"street":{"number":7652,"name":"Istiklal Cd"},"city":"Çorum","state":"Bursa","country":"Turkey","postcode":81549,"coordinates":{"latitude":"76.9892","longitude":"87.5197"},"timezone":{"offset":"-8:00","description":"Pacific Time (US & Canada)"}},"email":"ceyhan.elicin@example.com","login":{"uuid":"2502c733-cee4-4a6b-910f-f4b1de98f7ea","username":"yellowwolf327","password":"427900","salt":"43rPARvg","md5":"e7e4aa869c429c37c9906e8521a65e8f","sha1":"4b74398c2e1ccac3efbf55c8d0edfbcecefd19f6","sha256":"2fd5880849d329f7738733548b8b364dab5b8e10a96053bad3b185472bbe5904"},"dob":{"date":"1984-07-29T14:28:51.827Z","age":37},"registered":{"date":"2003-11-26T20:49:21.670Z","age":18},"phone":"(855)-949-6927","cell":"(820)-738-7214","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/women/79.jpg","medium":"https://randomuser.me/api/portraits/med/women/79.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/79.jpg"},"nat":"TR"},{"gender":"male","name":{"title":"Mr","first":"Aurelino","last":"Monteiro"},"location":{"street":{"number":4100,"name":"Rua Maranhão "},"city":"Salvador","state":"Rio de Janeiro","country":"Brazil","postcode":26347,"coordinates":{"latitude":"88.4027","longitude":"-78.0147"},"timezone":{"offset":"-3:00","description":"Brazil, Buenos Aires, Georgetown"}},"email":"aurelino.monteiro@example.com","login":{"uuid":"be40b4eb-3271-4629-966c-a2d8f97bb9ae","username":"whitelion468","password":"niang","salt":"2F0KCRRJ","md5":"4123e858218c7c2d93f0fae753b70d57","sha1":"bb4dcd01fc7c426ab904d074158652fb0883f2bd","sha256":"7b3c5f7960ffd28fa987c934c27e4534fe23833c9b1bd0862d7a8a8655918dcf"},"dob":{"date":"1971-06-27T04:58:45.237Z","age":50},"registered":{"date":"2006-12-22T02:35:24.899Z","age":15},"phone":"(61) 5678-0668","cell":"(39) 4994-3174","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/men/41.jpg","medium":"https://randomuser.me/api/portraits/med/men/41.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/41.jpg"},"nat":"BR"},{"gender":"male","name":{"title":"Mr","first":"Emile","last":"Sirko"},"location":{"street":{"number":8780,"name":"Elgin St"},"city":"Tecumseh","state":"Newfoundland and Labrador","country":"Canada","postcode":"L4R 4C4","coordinates":{"latitude":"7.9770","longitude":"-32.6996"},"timezone":{"offset":"+1:00","description":"Brussels, Copenhagen, Madrid, Paris"}},"email":"emile.sirko@example.com","login":{"uuid":"7469289b-e0ba-4d5f-bff7-53b7264d7e7e","username":"happyzebra427","password":"yyyy","salt":"4klc3SDa","md5":"2713b48ab06187d4a488b7c7a3450a89","sha1":"a8cb435065c1224a8916d03dd5d7245cb157eec9","sha256":"387942c656f26517063df75da9a47c5cda0919074b4c104093ed3df9fdaa6e53"},"dob":{"date":"1953-07-08T19:16:44.116Z","age":68},"registered":{"date":"2014-10-20T09:03:03.355Z","age":7},"phone":"823-463-4720","cell":"777-399-3050","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/men/12.jpg","medium":"https://randomuser.me/api/portraits/med/men/12.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/12.jpg"},"nat":"CA"},{"gender":"female","name":{"title":"Miss","first":"Alette","last":"Syrstad"},"location":{"street":{"number":7875,"name":"Sponstuveien"},"city":"Malvik","state":"Telemark","country":"Norway","postcode":"4123","coordinates":{"latitude":"-28.4475","longitude":"-29.2719"},"timezone":{"offset":"+9:00","description":"Tokyo, Seoul, Osaka, Sapporo, Yakutsk"}},"email":"alette.syrstad@example.com","login":{"uuid":"e220eb70-f6f5-42b1-9456-b46b31bcc5ff","username":"whiterabbit394","password":"deskjet","salt":"xWODfOVg","md5":"1a5d09ba0ff233d621b36c2e6b67cc7f","sha1":"87e3d71720a1df906c9a9ace93d1870d54302ccc","sha256":"9228eb78340ef1ad2b9e28b54f26541857521abfcc5b2bb51a5338e5f8abc7f1"},"dob":{"date":"1953-07-14T10:29:35.379Z","age":68},"registered":{"date":"2014-12-23T14:59:32.323Z","age":7},"phone":"63803579","cell":"40871327","id":{"name":"FN","value":"14075344024"},"picture":{"large":"https://randomuser.me/api/portraits/women/63.jpg","medium":"https://randomuser.me/api/portraits/med/women/63.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/63.jpg"},"nat":"NO"},{"gender":"male","name":{"title":"Mr","first":"Andre","last":"Thomas"},"location":{"street":{"number":7856,"name":"Wheeler Ridge Dr"},"city":"Nowra","state":"New South Wales","country":"Australia","postcode":7222,"coordinates":{"latitude":"-32.1941","longitude":"-179.3658"},"timezone":{"offset":"-12:00","description":"Eniwetok, Kwajalein"}},"email":"andre.thomas@example.com","login":{"uuid":"8076a716-c80d-41ec-87c3-6ca71ac14fc5","username":"orangeostrich910","password":"student","salt":"YKKFPuhp","md5":"e70dfc98b9c82c5000eb01965aca5882","sha1":"2a989e4441da7bcf7cdb2d0f7983338603e51237","sha256":"3e3caf4acb987215e47a27d06f663a6464f527e4520383be792ef804811171fa"},"dob":{"date":"1973-12-31T23:04:51.065Z","age":48},"registered":{"date":"2013-06-09T04:48:57.949Z","age":8},"phone":"07-7239-9164","cell":"0466-174-405","id":{"name":"TFN","value":"984143216"},"picture":{"large":"https://randomuser.me/api/portraits/men/52.jpg","medium":"https://randomuser.me/api/portraits/med/men/52.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/52.jpg"},"nat":"AU"},{"gender":"female","name":{"title":"Ms","first":"Mestan","last":"Eliçin"},"location":{"street":{"number":4588,"name":"Filistin Cd"},"city":"Kastamonu","state":"Sinop","country":"Turkey","postcode":44552,"coordinates":{"latitude":"-60.4419","longitude":"82.2417"},"timezone":{"offset":"+1:00","description":"Brussels, Copenhagen, Madrid, Paris"}},"email":"mestan.elicin@example.com","login":{"uuid":"aa4d168c-f40d-4b25-bb17-040e0cf93fd9","username":"redladybug571","password":"4321","salt":"vdJhXr3c","md5":"0cfa3104e276f62a93097e04274e4ebc","sha1":"a39ee2e1064fb343cd8ec79b4c7cf3f5d939f976","sha256":"49258b7b3a60370e5f1b5011e9dee007ef7f993e962279075f3c2eb11693d28d"},"dob":{"date":"1988-08-03T00:44:59.981Z","age":33},"registered":{"date":"2011-06-19T17:57:18.579Z","age":10},"phone":"(487)-963-5247","cell":"(297)-040-9002","id":{"name":"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/women/41.jpg","medium":"https://randomuser.me/api/portraits/med/women/41.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/41.jpg"},"nat":"TR"},{"gender":"female","name":{"title":"Ms","first":"Ilona","last":"Lauri"},"location":{"street":{"number":4338,"name":"Bulevardi"},"city":"Kitee","state":"Päijät-Häme","country":"Finland","postcode":26490,"coordinates":{"latitude":"15.0629","longitude":"5.7224"},"timezone":{"offset":"+5:30","description":"Bombay, Calcutta, Madras, New Delhi"}},"email":"ilona.lauri@example.com","login":{"uuid":"a513d9ae-8a8c-4c45-bf2b-6a91b7719fe7","username":"heavysnake281","password":"savannah","salt":"WTGZcxjN","md5":"d575fffccea8fb3e7e12ac0586b81c5e","sha1":"0b3a29d80173939336d019d3912981c9f1ddf955","sha256":"418b3188164655210cc44fa397b5c23be6cad97ad80f242ed448202adf4bd101"},"dob":{"date":"1970-09-08T17:05:21.221Z","age":51},"registered":{"date":"2005-07-25T08:08:00.314Z","age":16},"phone":"08-546-740","cell":"041-042-81-05","id":{"name":"HETU","value":"NaNNA018undefined"},"picture":{"large":"https://randomuser.me/api/portraits/women/84.jpg","medium":"https://randomuser.me/api/portraits/med/women/84.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/84.jpg"},"nat":"FI"},{"gender":"male","name":{"title":"Mr","first":"Esteban","last":"Gil"},"location":{"street":{"number":3307,"name":"Calle Mota"},"city":"Gijón","state":"Islas Baleares","country":"Spain","postcode":46935,"coordinates":{"latitude":"-68.9111","longitude":"-10.6146"},"timezone":{"offset":"+2:00","description":"Kaliningrad, South Africa"}},"email":"esteban.gil@example.com","login":{"uuid":"542abed9-5c77-497b-a509-1c4e00a78c86","username":"beautifulrabbit868","password":"kermit","salt":"PB3wHFpR","md5":"be9e63407b4a11abc22357371957e80f","sha1":"c738d9080093672ba3105c3c558afab3b6376e47","sha256":"8a1f21a23e223dc472852446f590a607d2ebc02b0e87b75a277b5163b9c46834"},"dob":{"date":"1975-02-13T01:53:12.105Z","age":46},"registered":{"date":"2002-10-30T02:54:29.868Z","age":19},"phone":"952-822-469","cell":"621-112-932","id":{"name":"DNI","value":"38372631-R"},"picture":{"large":"https://randomuser.me/api/portraits/men/77.jpg","medium":"https://randomuser.me/api/portraits/med/men/77.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/77.jpg"},"nat":"ES"},{"gender":"female","name":{"title":"Mrs","first":"Silke","last":"Madsen"},"location":{"street":{"number":7950,"name":"Vesterbyvej"},"city":"København Ø","state":"Hovedstaden","country":"Denmark","postcode":92609,"coordinates":{"latitude":"-0.8793","longitude":"126.5242"},"timezone":{"offset":"+10:00","description":"Eastern Australia, Guam, Vladivostok"}},"email":"silke.madsen@example.com","login":{"uuid":"cfb5836c-3eb0-461f-8047-c67bb615a2cb","username":"organiczebra676","password":"killers","salt":"O8kD3AvF","md5":"b66d80dff691ad5adae5da0a4d9a88df","sha1":"c032a6dbdd4284bdbb24a3496d292be591f15e9b","sha256":"839a690b9c788939919cd2e86d5e30b06769b78339533a8ee2ff6692cb716a91"},"dob":{"date":"1951-10-05T20:52:32.343Z","age":70},"registered":{"date":"2016-11-05T18:34:35.300Z","age":5},"phone":"97869354","cell":"66450231","id":{"name":"CPR","value":"051051-1593"},"picture":{"large":"https://randomuser.me/api/portraits/women/11.jpg","medium":"https://randomuser.me/api/portraits/med/women/11.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/women/11.jpg"},"nat":"DK"},{"gender":"male","name":{"title":"Mr","first":"Austin","last":"Banks"},"location":{"street":{"number":7403,"name":"Mcgowen St"},"city":"Anchorage","state":"Connecticut","country":"United States","postcode":49295,"coordinates":{"latitude":"4.4138","longitude":"121.1423"},"timezone":{"offset":"-3:30","description":"Newfoundland"}},"email":"austin.banks@example.com","login":{"uuid":"062ac7d3-73dd-4979-b613-173d21801c57","username":"brownostrich504","password":"159357","salt":"JeoqlyuU","md5":"37ff0b1fbef96fbcfd412d3fc3cc693d","sha1":"6ef6419d0db4ee4bf2b10be134d6900f22beede1","sha256":"6a8ccbcae69d8bec0b77fcb3c6d6e2a7c72d90231cfc9bb45a80e147be3451ef"},"dob":{"date":"1988-10-22T16:23:53.761Z","age":33},"registered":{"date":"2012-03-26T21:39:00.210Z","age":9},"phone":"(872)-566-7071","cell":"(265)-975-6415","id":{"name":"SSN","value":"180-94-3180"},"picture":{"large":"https://randomuser.me/api/portraits/men/61.jpg","medium":"https://randomuser.me/api/portraits/med/men/61.jpg","thumbnail":"https://randomuser.me/api/portraits/thumb/men/61.jpg"},"nat":"US"}],"info":{"seed":"1f2a2aae2395fc7b","results":10,"page":1,"version":"1.3"}} + {% for log in provider_logs_top_100 %} + {{log}} +
+
+ {% endfor %} +

+
+

Log file: fs-configs/usage-control-example/consumer/logs/karaf.log

+
+
Consumer Logs:
+

+ {% for log in consumer_logs_top_100 %} + {{log}} +
+
+ {% endfor %}

diff --git a/connector/templates/status.html b/connector/templates/status.html index b240d81..d3cfc48 100644 --- a/connector/templates/status.html +++ b/connector/templates/status.html @@ -56,6 +56,9 @@
{{connector.name}}
{% endfor %} + diff --git a/setup.py b/setup.py index a17b3e8..babc84c 100644 --- a/setup.py +++ b/setup.py @@ -12,11 +12,11 @@ def start_setup(): requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", "chardet", "cryptography", "Django==2.2", "python_on_whales", - "django-rest-swagger==2.2.0", "djangorestframework==3.12.2", + "django-rest-swagger==2.2.0", "djangorestframework==3.12.4", "idna==2.10", "paramiko==2.7.2", "pycparser", - "PyNaCl", "pytz", "PyYAML", "requests==2.25.1", "six", + "PyNaCl", "pytz", "PyYAML", "requests", "six", "sqlparse", "uritemplate==3.0.1", "urllib3==1.26.4", - ] + "django-cors-headers"] os.system(init_command) @@ -26,7 +26,7 @@ def start_setup(): os.system(activator_string) #start server - os.system("source venv/bin/activate;cd connector/connector/;python manage.py runserver 0.0.0.0:8000;") + os.system("source venv/bin/activate;cd connector/;python manage.py makemigrations;python manage.py migrate;python manage.py runserver 127.0.0.1:8000;") if __name__ == "__main__": start_setup() \ No newline at end of file diff --git a/stop_consumer.sh b/stop_consumer.sh new file mode 100755 index 0000000..4670f1d --- /dev/null +++ b/stop_consumer.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cd fs-configs/usage-control-example/ +docker-compose -f docker-compose-consumer.yaml down \ No newline at end of file diff --git a/stop_provider.sh b/stop_provider.sh new file mode 100755 index 0000000..481d51d --- /dev/null +++ b/stop_provider.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +cd fs-configs/usage-control-example/ +docker-compose -f docker-compose-provider.yaml down \ No newline at end of file From 568d27cdc8f32136e74603de2644f07ffc04ce93 Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Wed, 23 Jun 2021 19:50:06 +0530 Subject: [PATCH 034/163] make sh executable --- setup.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/setup.py b/setup.py index babc84c..7ea6051 100644 --- a/setup.py +++ b/setup.py @@ -6,6 +6,12 @@ def start_setup(): # install virtualenv subprocess.call(["pip3", "install", "virtualenv"]) + # create executbale sh + subprocess.call["chmod", "+x", "run.sh"] + subprocess.call["chmod", "+x", "stop_consumer.sh"] + subprocess.call["chmod", "+x", "stop_provider.sh"] + subprocess.call["chmod", "+x", "stop.sh"] + init_command = "python3 -m venv venv" activator_string = '''source venv/bin/activate ;''' From 544f4ebb9e8c93d4179090ef2b1f125873f1246a Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Wed, 23 Jun 2021 19:53:30 +0530 Subject: [PATCH 035/163] make sh executable --- setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 7ea6051..a201828 100644 --- a/setup.py +++ b/setup.py @@ -7,10 +7,10 @@ def start_setup(): subprocess.call(["pip3", "install", "virtualenv"]) # create executbale sh - subprocess.call["chmod", "+x", "run.sh"] - subprocess.call["chmod", "+x", "stop_consumer.sh"] - subprocess.call["chmod", "+x", "stop_provider.sh"] - subprocess.call["chmod", "+x", "stop.sh"] + subprocess.call(["chmod", "+x", "run.sh"]) + subprocess.call(["chmod", "+x", "stop_consumer.sh"]) + subprocess.call(["chmod", "+x", "stop_provider.sh"]) + subprocess.call(["chmod", "+x", "stop.sh"]) init_command = "python3 -m venv venv" From 8512379ca2e676e6e6bab8b35456422101a683c9 Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Wed, 23 Jun 2021 20:06:56 +0530 Subject: [PATCH 036/163] fix setup path --- connector/connector_api/views.py | 6 ++++-- setup.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py index 9a06add..f6f7580 100644 --- a/connector/connector_api/views.py +++ b/connector/connector_api/views.py @@ -39,9 +39,11 @@ def post(self, request, *args, **kwargs): create_connector.save() messagae = "Created connectors successfully." else: - messagae = "Created connectors successfully." - errors = create_connector.error + messagae = "Could not create connectors successfully." + errors = create_connector.errors + print(errors) + print(messagae) # check if docker for connectors alreay running try: pid = os.fork() diff --git a/setup.py b/setup.py index a201828..ab42b4d 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def start_setup(): os.system(activator_string) #start server - os.system("source venv/bin/activate;cd connector/;python manage.py makemigrations;python manage.py migrate;python manage.py runserver 127.0.0.1:8000;") + os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") if __name__ == "__main__": start_setup() \ No newline at end of file From d8f1cd753fafcc72ba1b533583dae9915782202e Mon Sep 17 00:00:00 2001 From: sagardg Date: Thu, 24 Jun 2021 16:19:17 +0530 Subject: [PATCH 037/163] modify setup --- setup.py | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/setup.py b/setup.py index ab42b4d..4a49c7d 100644 --- a/setup.py +++ b/setup.py @@ -1,20 +1,43 @@ import os import subprocess +import sys def start_setup(): + python_version = None + pip_version = None + # get os + os_name = sys.platform + print("os is %s" % (os_name)) + if os_name.startswith("win"): + raise Exception("Try on linux system") + else: + try: + python_version = subprocess.check_output(["python3", "-V"]).decode("utf-8") + except: + python_version = "" + if python_version.startswith('Python'): + python_version = "python3" + pip_version = "pip3" + else: + try: + python_version = subprocess.check_output(["python", "-V"]).decode("utf-8") + except: + print("No python found please install Python3.5 or greater") + if python_version.startswith('Python 3'): + python_version = "python" + else: + raise Exception("Required Python 3, found %s" % (sys.version_info)) + + print("Proceeding with python - %s and pip - %s" % (python_version, pip_version)) + # install virtualenv - subprocess.call(["pip3", "install", "virtualenv"]) - - # create executbale sh - subprocess.call(["chmod", "+x", "run.sh"]) - subprocess.call(["chmod", "+x", "stop_consumer.sh"]) - subprocess.call(["chmod", "+x", "stop_provider.sh"]) - subprocess.call(["chmod", "+x", "stop.sh"]) + subprocess.call(["%s" % (pip_version), "install", "virtualenv"]) - init_command = "python3 -m venv venv" + init_command = "%s -m venv venv" % (python_version) - activator_string = '''source venv/bin/activate ;''' + if not os_name.startswith('win'): + activator_string = '''source venv/bin/activate ;''' requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", "chardet", "cryptography", "Django==2.2", "python_on_whales", @@ -23,16 +46,18 @@ def start_setup(): "PyNaCl", "pytz", "PyYAML", "requests", "six", "sqlparse", "uritemplate==3.0.1", "urllib3==1.26.4", "django-cors-headers"] - + os.system(init_command) for req in requirements: - activator_string += "pip install %s;" % (req) + if not os_name.startswith('win'): + activator_string += "pip install %s;" % (req) os.system(activator_string) #start server - os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") + if not os.name.startswith('win'): + os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") if __name__ == "__main__": start_setup() \ No newline at end of file From f520f74735c36ea9c29baf93a5137439eb7a3207 Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Thu, 24 Jun 2021 16:38:59 +0530 Subject: [PATCH 038/163] add installer script --- install.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 install.sh diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..ba31a73 --- /dev/null +++ b/install.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +echo "$OSTYPE" +if [[ "$OSTYPE" =~ "darwin".* ]] +then + DOCKER_VERSION=$(docker-compose --version) + if [[ "$DOCKER_VERSION" =~ .*"dokcer-compose".* ]] + then + echo "docker compose found" + else + echo "install docker for mac then proceed" + exit 1 +else + DOCKER_VERSION=$(docker-compose --version) + if [[ "$DOCKER_VERSION" =~ .*"dokcer-compose".* ]] + then + echo "docker compose found" + else + echo "installing docker" + sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose +fi + +git clone -b UI_backend_integration https://github.com/digitalgreenorg/farmstack-open.git + +cd farmstack-open + +PYTHON_VERSION=$(python -V) + +if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] +then + python setup.py +else + PYTHON_VERSION=$(python3 -V) + if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] + then + python3 setup.py + else + echo "Invalid python versions found install python3.0 or greater and try again" +fi \ No newline at end of file From 4af3867abe3271cbda6884cd9d63fcccafb6c356 Mon Sep 17 00:00:00 2001 From: waseem Date: Thu, 24 Jun 2021 16:42:58 +0530 Subject: [PATCH 039/163] Sidebar integration --- connector/static/css/style.css | 75 ++++++++- connector/static/images/logo.png | Bin 0 -> 1433 bytes connector/static/js/app.js | 10 ++ connector/templates/connection.html | 235 ++++++++++++++++------------ connector/templates/logs.html | 43 ++++- connector/templates/status.html | 39 ++++- 6 files changed, 298 insertions(+), 104 deletions(-) create mode 100644 connector/static/images/logo.png diff --git a/connector/static/css/style.css b/connector/static/css/style.css index 82e6a23..12ff46e 100644 --- a/connector/static/css/style.css +++ b/connector/static/css/style.css @@ -5,10 +5,19 @@ .page-title { display: flex; justify-content: space-between; + align-items: center; } .page-title .title { margin-bottom: 0; } +.fs-main-content{ + margin-left:5%; + margin-right: 5%; +} + +.fs-tab { + margin-top : 2% +} /* Source List Page CSS Starts */ .source-title .page-title .title { @@ -50,9 +59,6 @@ /* Connection Page CSS Ends */ /* Logs Page CSS Starts */ -.logs-container .page-title .title { - line-height: 2.5; -} .logs-container .card-body { padding: 1rem 1.2rem; } @@ -64,6 +70,69 @@ } /* Logs Page CSS Ends */ +/* Layout CSS Starts */ +.fs-navbar { + padding: 1rem; + background-color: var(--primary); + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: -1; + min-height: 3.5rem; +} +.fs-sidebar { + background-color: var(--primary); + width: 15rem; + color: #fff; +} +.fs-sidebar-top-left-container { + display: flex; + justify-content: space-between; + padding: .5rem; + align-items: center; +} +.logo-data { + display: flex; + align-items: center; +} +.logo-data h5 { + margin-bottom: 0; + color: #fff; + text-transform: uppercase; + font-size: 1.2rem; +} +.fs-sidebar-list { + padding: .5rem 0 .5rem .5rem; +} +.fs-sidebar-list-item { + list-style: none; + padding: .5rem 0; + font-size: 1rem; +} +.fs-sidebar-list-item.active { + background-color: #fff; + border-radius: 20px 0 0 20px; +} +.fs-sidebar-list-item.active a { + color: var(--primary); +} +.fs-sidebar-list-item a { + color: #fff; + text-decoration: none; +} +.list-item-icon { + margin: 0 10px; +} +.fs-main-content { + padding-top: 3.5rem; + width: calc(100% - 15rem); +} +.main-wrapper { + min-height: 100vh; +} +/* Layout CSS Ends */ + @media screen and (max-width: 640px) { .page-title { diff --git a/connector/static/images/logo.png b/connector/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7b74b81989000a512ba424970a7c4ccabecec051 GIT binary patch literal 1433 zcmV;K1!nq*P)P})_r0hxHOt&=?H*J!7;EUa`a>(z%)Fo97em+ ziB6>l4dNL%lprg%FmKI3*vbeqvfoc+%d7n>_7Y}|DJ+R~x*V*af->=_z=Md=fKI6k zJ)UETun0oD4jF7BVJ;zVE?~uqBPTMDg@TY2K{Ic~>)ta7c5dmcn6_?#XoKGkqTADh zKD8gMY6mnrjipMFf)m)_k1$`F#;WrWvLrzjDms)d992&srguTIII->^Wv^4(H8{4& zv2Ql62$d^DDo57JVAWm5-O_C&2}E!r$YHegD2`~y(JZ$?cYRPK1qGJJnw`Ym@-3_q z{|@;IOQ2D1#!^|n~DLiu5 zuw|!eY6%d>9cq+x)rA(?L0ArQv2|x?|n4! z76hdb(pCy9b{q-&0k}t+WT||9AekxMFkFFr*+QWrkSiHj&lZp_*~sK8$P~&XPnlFq zTCNSn3hK20>Vq1Jd>zaD4l3#vTweyzw$bGE;e*(Fr)tOl{FNK=WZsGDq?pD!Kf;=X zrjQRIU4}|}Z=`#_MolNa8Ku}ZY;5L=qz;*q8%XVxkSUu;ZPN*G1p3?kiO=3W8LNR` z`|ZI%Q^a>8y;CG-69v;jzG5R=wvo!_v12$?u|x+<5VSy@?uCa2M@U!cUPfckgLdvJ{9!!YCL9 zHgaX8sp@pG0*92gRW^{J;!gKAk9>Ig=+N#2`qRGqeQ6?Hs`PKt_Od0DDmP(RAh0UH z<4MCwo&lBB5{GmR0gnW~D&ZNQf>-)lCL;mg{&~Jm+iAI5rfHd;a8!rs~ZFcUrvFZ5WFZVVt&8}@n9Zuv5clQIw zYa>>nze7PCEg=PGo^MO^wujGo74JCq59WjI+RgaDqwLP$VybZ5rz-t|+$)Zgt5fA% nUC?vAuQmL`tG(^x2gUyZ=CW0u;hVMd00000NkvXXu0mjfT+^M< literal 0 HcmV?d00001 diff --git a/connector/static/js/app.js b/connector/static/js/app.js index 313e1b6..2acf243 100644 --- a/connector/static/js/app.js +++ b/connector/static/js/app.js @@ -3,6 +3,16 @@ function changeTab(tabName = 'source') { selectTab.click(); } +function observeRoute() { + const currentLocation = window.location.href; + const links = document.querySelectorAll('.fs-sidebar-list-item a'); + + links.forEach((link) => { + (link.href == currentLocation) ? link.parentElement.classList.add('active') : link.parentElement.classList.remove('active') ; + }); +} + +document.addEventListener('load', observeRoute()) $(document).ready(function(){ $( "#consumer_name" ).change(function() { diff --git a/connector/templates/connection.html b/connector/templates/connection.html index 4e665ea..55a30bf 100644 --- a/connector/templates/connection.html +++ b/connector/templates/connection.html @@ -4,7 +4,7 @@ - Farmstack UI 3 + Farmstack @@ -13,118 +13,159 @@ - -
- -
-
-
-
-
Set up source.
-
-
-
-
-
- - - {% comment %} - {% endcomment %} -
-
- -
+ +
+
+
+
+ +
Farmstack
-
-
-
-
Set up destination.
-
-
-
-
-
- - - {% comment %} - {% endcomment %} -
-
- - -
-
- - + +
+ + +
+
+ +
+
+
+
+
Set up source.
+
-
- - +
+
+
+ + + {% comment %} + {% endcomment %} +
+
+ +
+
-
-
-
-
-
-
Set up connection.
-
-
-
-
-
-
Source:
-
-
Name:
-
+ + + +
+
+
+
Set up destination.
-
-
Destination:
-
-
Name:
-
+
+
+
+ + + {% comment %} + {% endcomment %} +
+
+ + +
+
+ + +
+
+ + +
-
-
Port:
-
8081
-
-
-
Git Repo:
-
https://github.com/digitalgreenorg/farmstack-open
+
+
+ +
+
+
+
Set up connection.
-
- - +
+
+
+
Source:
+
+
Name:
+
+
+
+
+
Destination:
+
+
Name:
+
+
+
+
Port:
+
8081
+
+
+
Git Repo:
+
https://github.com/digitalgreenorg/farmstack-open
+
+
+
+ + +
+
-
+
+
- + diff --git a/connector/templates/logs.html b/connector/templates/logs.html index 789b459..1f36616 100644 --- a/connector/templates/logs.html +++ b/connector/templates/logs.html @@ -13,8 +13,42 @@ - -
+ +
+
+
+
+ +
Farmstack
+
+
+ +
+ + +
+
@@ -61,7 +95,10 @@
Sync History
- +
+ +
+ diff --git a/connector/templates/status.html b/connector/templates/status.html index d3cfc48..0a773cd 100644 --- a/connector/templates/status.html +++ b/connector/templates/status.html @@ -14,7 +14,42 @@ -
+ +
+
+
+
+ +
Farmstack
+
+
+ +
+ + +
+

Sources

+
+
From 8607406cda2f3485e4dd3e3efd1eed441119c05c Mon Sep 17 00:00:00 2001 From: sagardg Date: Thu, 24 Jun 2021 17:02:27 +0530 Subject: [PATCH 040/163] installer shell script --- install.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index ba31a73..ddb1076 100644 --- a/install.sh +++ b/install.sh @@ -1,24 +1,30 @@ #!/bin/sh echo "$OSTYPE" + if [[ "$OSTYPE" =~ "darwin".* ]] then DOCKER_VERSION=$(docker-compose --version) - if [[ "$DOCKER_VERSION" =~ .*"dokcer-compose".* ]] + + echo "$DOCKER_VERSION" + if [[ "$DOCKER_VERSION" =~ .*"docker-compose".* ]] then echo "docker compose found" else echo "install docker for mac then proceed" exit 1 + fi else - DOCKER_VERSION=$(docker-compose --version) - if [[ "$DOCKER_VERSION" =~ .*"dokcer-compose".* ]] + DOCKER_VERSION=$(docker-compose --version)\ + + if [[ "$DOCKER_VERSION" =~ .*"docker-compose".* ]] then echo "docker compose found" else echo "installing docker" sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose + fi fi git clone -b UI_backend_integration https://github.com/digitalgreenorg/farmstack-open.git @@ -37,4 +43,5 @@ else python3 setup.py else echo "Invalid python versions found install python3.0 or greater and try again" + fi fi \ No newline at end of file From 8cb75a75ab1b3c4ab6cb9dcc182d6631f376b4ef Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 11:43:14 +0530 Subject: [PATCH 041/163] linux setup bug fix --- install.sh | 9 ++++++--- setup.py | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index ddb1076..53d3b95 100644 --- a/install.sh +++ b/install.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash echo "$OSTYPE" @@ -17,6 +17,7 @@ then else DOCKER_VERSION=$(docker-compose --version)\ + echo "$DOCKER_VERSION" if [[ "$DOCKER_VERSION" =~ .*"docker-compose".* ]] then echo "docker compose found" @@ -35,12 +36,14 @@ PYTHON_VERSION=$(python -V) if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] then - python setup.py + python farmstack-open/setup.py else + PYTHON_VERSION=$(python3 -V) + echo "$PYTHON_VERSION" if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] then - python3 setup.py + python3 farmstack-open/setup.py else echo "Invalid python versions found install python3.0 or greater and try again" fi diff --git a/setup.py b/setup.py index 4a49c7d..8f7c9a5 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +#!/bin/bash import os import subprocess import sys @@ -51,7 +52,7 @@ def start_setup(): for req in requirements: if not os_name.startswith('win'): - activator_string += "pip install %s;" % (req) + activator_string += "%s install %s;" % (pip_version, req) os.system(activator_string) From 96f97873081caf4adc576cd7fd9ff73fd334cb1c Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:04:23 +0530 Subject: [PATCH 042/163] Debug linux install issue --- install.sh | 4 ++-- setup.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index 53d3b95..dd5f1cf 100644 --- a/install.sh +++ b/install.sh @@ -36,14 +36,14 @@ PYTHON_VERSION=$(python -V) if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] then - python farmstack-open/setup.py + python setup.py else PYTHON_VERSION=$(python3 -V) echo "$PYTHON_VERSION" if [[ "$PYTHON_VERSION" =~ .*"Python 3".* ]] then - python3 farmstack-open/setup.py + python3 setup.py else echo "Invalid python versions found install python3.0 or greater and try again" fi diff --git a/setup.py b/setup.py index 8f7c9a5..7151f3c 100644 --- a/setup.py +++ b/setup.py @@ -48,6 +48,8 @@ def start_setup(): "sqlparse", "uritemplate==3.0.1", "urllib3==1.26.4", "django-cors-headers"] + subprocess.call(["pwd"]) + os.system(init_command) for req in requirements: From 5ef89e7bbd684ff70e6ea6325e7413e6a42a3fef Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:06:47 +0530 Subject: [PATCH 043/163] debug linux script --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 7151f3c..4536e0e 100644 --- a/setup.py +++ b/setup.py @@ -49,6 +49,7 @@ def start_setup(): "django-cors-headers"] subprocess.call(["pwd"]) + print("path is above") os.system(init_command) From cceb708998c993a78dbded1e92cfd64e1e3c505d Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:18:30 +0530 Subject: [PATCH 044/163] debug linux script --- setup.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 4536e0e..0dab22a 100644 --- a/setup.py +++ b/setup.py @@ -38,7 +38,10 @@ def start_setup(): init_command = "%s -m venv venv" % (python_version) if not os_name.startswith('win'): - activator_string = '''source venv/bin/activate ;''' + if not os_name.startswith('linux'): + activator_string = '''source venv/bin/activate ;''' + else: + activator_string = '''venv/bin/pip ;''' requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", "chardet", "cryptography", "Django==2.2", "python_on_whales", @@ -48,20 +51,23 @@ def start_setup(): "sqlparse", "uritemplate==3.0.1", "urllib3==1.26.4", "django-cors-headers"] - subprocess.call(["pwd"]) - print("path is above") - os.system(init_command) for req in requirements: if not os_name.startswith('win'): - activator_string += "%s install %s;" % (pip_version, req) + if not os_name.startswith('linux'): + activator_string += "pip install %s;" % (req) + else: + activator_string = '''venv/bin/pip install %s;''' % (req) os.system(activator_string) #start server if not os.name.startswith('win'): - os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") + if not os_name.startswith('linux'): + os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") + else: + os.system("venv/bin/python connector/manage.py makemigrations;venv/bin/python connector/manage.py migrate;venv/bin/python connector/manage.py runserver 127.0.0.1:8000;") if __name__ == "__main__": start_setup() \ No newline at end of file From d9d3aa675528455eabb0ddb72422eab47e83c4d3 Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:27:34 +0530 Subject: [PATCH 045/163] debug linux script --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0dab22a..64640ff 100644 --- a/setup.py +++ b/setup.py @@ -58,8 +58,9 @@ def start_setup(): if not os_name.startswith('linux'): activator_string += "pip install %s;" % (req) else: - activator_string = '''venv/bin/pip install %s;''' % (req) + activator_string += '''venv/bin/pip install %s;''' % (req) + print(activator_string) os.system(activator_string) #start server From 8e537fdb5a3ac572f4a2fde0b8dff9f609738014 Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:32:25 +0530 Subject: [PATCH 046/163] fix for linux machines --- .../connector_api/migrations/0001_initial.py | 29 ------------------ connector/db.sqlite3 | Bin 143360 -> 0 bytes setup.py | 2 -- 3 files changed, 31 deletions(-) delete mode 100644 connector/connector_api/migrations/0001_initial.py delete mode 100644 connector/db.sqlite3 diff --git a/connector/connector_api/migrations/0001_initial.py b/connector/connector_api/migrations/0001_initial.py deleted file mode 100644 index 239ba12..0000000 --- a/connector/connector_api/migrations/0001_initial.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 2.2 on 2021-06-23 08:03 - -from django.db import migrations, models -import uuid - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Connector', - fields=[ - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('name', models.CharField(max_length=120, unique=True)), - ('status', models.CharField(default='active', max_length=10)), - ('connector_type', models.CharField(blank=True, max_length=60, null=True)), - ], - options={ - 'abstract': False, - }, - ), - ] diff --git a/connector/db.sqlite3 b/connector/db.sqlite3 deleted file mode 100644 index 13f2deba0580ef56647e3e7cbc4088c9fcbf455b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 zcmeI5eQX=&eaCs?n`ntVS+>F?wj+wNW3vjad*Sg#Zq_gs?Z~mHSe9eUSim01qjWM~ zWRjAt6x%?>X@~9wScewafUU!T0U5RdT{|Gyy8f{aL)#5oi=iE`tsSrcL(vXthoWu% zXbbFl9v*qeH%W2R#I3)CbGdt--}8IE&*ypWxqF`Hba(a2WxcKi3YBU}tp{Y=n2qCX z&jbQCn{Af-H%SePxiNgN8RgFz)u>3UiH`Ue0TG)vfw^W~-)EGi%k# z)@H4_ujiYG8M2dz$cm5?a+$5Ne!JWJ$ob_|awQeGmR`7WEfrWu&!=t#g56g8I1L7t z(!Gg-fipoSOwR|O3Iv%vq9+(?%pG?7*AiSqHA~Qp-PEcjy;jpJ#1bm$=BXU5$Amx%bqy~H;?5#3o)5^~u>qQCCL2h!c+ zY(L4Z1VrryKkRSV6Ws3ff#h}+HY4QnvZQ1Mv*q*<8XMexdTh-mxkok!E*oi59d1Zr zPx?sJ%yd+Z#UxiL*R^szQ{UOtXp@o(kyuoVWLedic6^^YF=I1>yjXOb*0lX}B_J}d zdfon=8E%(1tHeywlR>VM*UD;1%Lt;Hm1Bx()`pqNH@F&1qXW7=a7joFw8RBNyEjJN z{$!H7cdo8xi_Pr6+^QqN9^4iMMLYlZ-Or=+dROX~_s^!#$)N(3)K6TZSsgXx0Fi&Hb znWTmE!pcJO^5s<{Fg4%P2zxd4csE%bERWExFyi)y!`!_iU1-@EW&zqf9vy_S8T~-P zYxWTbs}*K@KxD7H&*Sz_PI4cf?nKsZe1`@=x-UALYOQvsQY9^NTdn5S)#@2hiig_G zk~ET{TB~P@l{LK_4CK|iR@Y0KHD0e}YFngX&_)^zWGj`THI|0bF2M9J3#NPH+D&pP z=v9)I=N4`Ar zabkoY2!H?xfB*=900@8p2!Ozz1mtn2?Zl~MO>3^(2!bGH^s-*p)uJRwVpxcVB{?9( z=LC696wgMbNK}c$4?AtAPbJAfxUA*sl`0tv>ieb?l&B&;Gv>5STujmtJjqGSY;CgH zrOj&P?v7=Jr`9iTB_T#5iSs=1u-Nh-WYl84wR*bA2}YEmFGu^pO;#GVuqh> zwWt$5l`5H>%jYv%wMtl*NL8t8T7N{67?-2T5#ns2o@Wmc7tgm`DAsbBlcAaNR}5LVi+k! z!nah}ZsTpPP|+6D4{t;wp2P*G)8;3d@+G}YT*!2CnYgU(uzIEwv6XVBP*m44x%G-p z<^}q>k`uA0m`FN^D?-_DC7G@aS>#-+P`7;U9QJdu!RhX_-W zf}O^D_ZYGiPefudj-X>bh85l3ISFzi68G}2*<3ss|9^}BApco@oBw_OH}>q%5D5Yx z00JNY0w4eaAOHd&00JNY0wB;s;Hcdm=8Ojb*c<|#KX4pz*=M+}$83&!z4obL7RVmf z86CAxde|YI&EdalJJO77&#d^JcDd!+`pk@*h?wwn=Q+XIXIs|hlM3U9h_Rcm*!b`8 z|HS_X|2e+G{}E;Yda4ltAOHd&00JNY0w4eaAOHd&00JQJb_g7EoSx)5p6h8JxQ{wc z9OGIK3K{=*9e13XrU}~1`j&mC*D*1{rV;22fy3vR@UtT}ePBQ0n3!UR?FobO&|!!F zgojN-v>u3{&;PsmvW2q$$yj_;s*jC00JNY0w4eaAOHd&00JNY0w8eT z1Ri%gY^NvNLw@>qJ?(=dE{E;Jv99s|F{i_JYT7d9uUYm-9S+;X1bsw+j{m)Oa^$B+ zZ2UhyL=LCup*j9P%sFiS6CLA!y8eIM`$Zf7U9$TB5B#V3Kj2^GOZ;{IA|K(W_%WXI zeb@I5-#`0a_x+*oRbScn%f5>~$v5d6@qXX?4U!N)5C8!X009sH0T2KI5C8!X0D*Uv zz)=Sm;@sQ1c89)(p!wQ}P@5wIIRSkOo_$Z*1f4zZl=)C)WIFnvSJjXC@t_B*&)ZpiRuhP#{L zhC?&l#i$NZuV$cg+~GORG0&|ve8*9TXNEJ}wgT-e(D2y`92#?YPLT%y^6j@6(Di@v z(tjI2!B4!a4HlV!00@8p2!H?xfB*=900@8p2!Ox?K;VCqi>DtuVR@&YD9n+!bV`x4 ziV%-U^57Viynv9r8BvZTB2q-lN~)9>;@Lu8%1bhNHKCl>YIVKLz8nyin%{&W^DVWl zl2#?w^v{>PHZmqD{qk+ai20lx>vbc783n4gN#? z7GL3YK1UMb2Ld1f0w4eaAOHd&00JNY0w4ea4?6*;o#Wic+4dOQKF+p}(XH!Iw)L~^ zBWycCx6Y$%dxUMr+4eBqI>y+RXImfJdg<0a%C;kHdx&j4bUQT6wr;j{v8~f#_izrn zvD3|v-R|*V{r_Qaq$ocKfB*=900@8p2!H?xfB*=9z{5a*z4UMFVJIoe2m&Ag0w4ea zAOHd&00JNY0w4ea4=(|X{~zAEN6A3|1V8`;KmY_l00ck)1V8`;9v%W1|35r+jgo=@ z2!H?xfB*=900@8p2!H?xJiG)j{(pGu9wi3>5C8!X009sH0T2KI5C8!Xcz6h4{QvOO zHA)HsAOHd&00JNY0w4eaAOHd&@bD7wx_@Bfxi8rGlfHlTe9iTF@14<)x{f-pJ3c=0 zmgfV*sgd{FzsP-IXo>rn?JKsYyEu(}$MvdzDaUv2F2J&iMqkHY7#GsPh&~kMmHyEgEck9ff8C=yitHHpwTFtGi)iaVH zgsf>vV0lf;l(bq+T_gUR4h&huNv=Yqmg|}N&Zfq4XiKNEms1x~%c=DF)YW!btqF|c zh63}{ZkaJzNH44`BrjiHH3C!fB$rkz>jh)Yq1}iM?AJh7D5`70K&_+}i$s24t6bC9 z%38k7A#nb=)cNO0-E`Rh($fJU6lz@ZyZx0U*SKxA8YY)*%+}J~a>PP5s}!VMTXgfJ zvm|(Y&`Ekg&)v9W=AXUVLgc>IVG2nG*%ToXZ(1dYUnZQ?iLJ>mMZ8;(hvX4 znA`sn>46r_w$ziZ*~in)Co4)qE?Y?S*M0avx|{AT&i0esN)Qa~3L~uRyLW_jeP%;u zCbjP4QA3Z>^>s%Z=WOp8zE{`Bnsna|^QY?<+J)?u)8m-g9<0X+jXY_4!9O|4eR#SP zSsTWo0gwjJY229@_BT99ZgHQWEMf{ms|ombd#Ry$Wgcd3c1}-x(eQGeCA1#h$%`!iA36njeDd=`kWpt zyFm`R^)~IOO18)P&)xK}+n-2q_hM%KHe*fs%@d<1)YGTtdyED&gT3z$+VbAn#@tgU z2XJpvFiNt|r9VXOdmr&nO>vD|R-ldeBW{0=Tys~uDt}-*R1=D(=0(emaJT7WgW5y4 zVY_X&e0DdC?gZ9`9BPamaX)Bx?i)PmMC=J}ciP0+)AYFs2OTG5Pa6&G-WYZJlS%I0IkQ2r3hS;lv%lz$@%A}W`?|QVvz2-J z8C=pjYOT)*qvyJ2COF`^`ofUQKQqIvGO)GVMZKgJ|pe55EH<0Gnda4bn$ z)HO2h>KT@Wu>RjQr-4Hd009sH0T2KI5C8!X009sH0TB2FB;d7Qv>mp+W;^tL&z}x| zV|d*4ZL<1bvj3g^w}(DsU$y4M*MnbLY5MZnFs-vi4ghE76r|M%~mi?W6WiXRy0-GG~Al zozlrwHL~oTi2Gc9!ac$3b*434MMZEW>hmdwc=>zX_9(K*pWR^BX@&1Df{RI97? zt(rL>BwDOUv{?kYTyC00sTo->4=u)Be)ZfS*kLs#L|`#?Kkmc)$er1Ldb0u8t43QO=|KijjhNhy7 zXzovnvdf>E+%plIm~Ez^yCbiJBsW{jn=)z82q!k! ziknT4G_ImrtJ6nL^s@CNAgzkT>9tI4i%jTJS;0WIQYp5dZ6L8Ubbr*uu%K5-9-XGL zrBaBAR#Nq%DN<4*9U`fax>_joiXbuc>56S~T6F89CvRqh^f-NIQc0$)=$*1eYhwvD zPM#(U>oXk->*oA6?TM@pv1Ft|Bo@^o&DA2)&Sx}k>r+!^>_9J;)e6&^bz7a;l10s{ zPrCg(Gu$q3F2tBgdNRmW@)|95MiAAk98*+t4aQ96GDP=Tx;2ds==#7VA$8IcN1hWn zb;?Z_2JUg@iDG8WP8aj=i9Q{O8GB#7NLTIdv-V+J!K{glT=!Y4w3gXCNxL4W>TINv zbul5-c-Tn-D_~DARrL=8( z&*n%rr^U5wcizYLk!C#!=vr^i@H1FqSBfB6z_))1&qw0<$X}4>BY%z`Jozaf6>A(l z=k{L>agBtv&uI<(w7Z*nRm-qDHC4$)rD#+(dK<%Jx^G{zSNe`##xSJapd~MIrHLlo z{!ob9J#D?x7}lK%rutrAERI`ZZfQH_9c;vMf7>-AY}u1itG!P~TV-PX|Gk;KK&~JF z0w4eaAOHd&00JNY0w4eaAn+a&!1Mp_aRnfI5C8!X009sH0T2KI5C8!X009tq7YJbd z|1LmA79aouAOHd&00JNY0w4eaAOHd&@E#MO<9`SLEgSzM{s;Vb$qs%X00JNY0w4ea zAOHd&00JNY0w4eaKfeT=c8+s9*w)UrLk>IVaW}{RZ`$}D^KbFrlXhI8XaU~(-l_>f6lakkJb-k?C$tUC7_9Z*@`q)6PQ6UnQ6-|@X zh>{P-WHBEmUuROn2`#ULV=+Nc;)R$bsJU8YtD4i?_A5iw;fXGXLSjyd%_-5dLLw$5 z#B3p|#0rsIIHn|s%(#*Z$0KnqoE2126{Ct2E6AJG%C?@@s>CI?w@Xs$grr4OO;!?F z;xZzJBXV91C*+74E+{!oEeN6@X<71pl-gE_x}@X(<0F4#-n*Vh^%g^znzW?(5 zmG2Y2sxR$3>l^p}pZ8z9pYp!yUGYwj{&4iGqklenZ}fwsbECeIH%LPKKmY_l00ck) z1V8`;KmY{Z1p-eVciOm+=-$?~JM>eF%}-jNSIYq!5@?6K?-;QQD{k_kPK|uPwjE9_ zn_(8)$D6j~E7aw+F5709X?yZ9Vtablt>(!W8Lioq0Mjb?D6u*fb}^O4m&)22jpHZ% z#3m%V422deLto48k*1xY&SGb1GeQCr#BO@VMU`2Ms4nAh<|wfU$DA#8^s~G4Ti9)7 zq(C$*Km%uw5M%M2(*$TWHxZf%#+wODiq-@s$996yVUl1*aT+MC)&|VB>G3gQI(gc` zl+!P9wk6Yp08e74XB>vqR=lB+S@@b3hPIZ4A&MS8?j;r{PC2NURy0*X_n#OgaZ@2X z%bk5`yPZ8d3XYKYQ(?Q2f7`+k(6l+!v@sO4Z43$Q__&AIOrEw=4Q&G|f*qV0Cb2W} z5L01(mA5U$40_5alVhDfWWA+c>47??Lv+ z5(Gd11V8`;KmY_l00ck)1V8`;K;WGs@Py?r9m3KOaXZ@lD}}H~pa184pSO{J_<;Zj zfB*=900@8p2!H?xfB*=9zynNR_Z;V3yyr|t%86P|EXNBk3pu$IuZ!{c_RDu}7u8r) zFY2Z2&G}2En;W-w(ibmnq_3y$tgbw}zA7!st1A~aZf@k)(<`?~SbiftUtCYWd`nuq zxT>V*H)9LM#Crb5a^;5n;>$O0Tq>y7ujotq!rcY^j($VBAm%Tw7xFjK#auC=uU=1A zZ(dh!Eo@Zun-@3Nv!(p@VmYO3TG;>JrgXFJ?C(pP%geWJUR)KINO_j# z*EiA|3-Zm4qJDFJQAuCFP+Xi(i3?@n>E?S9VqqZ`ATJ<@kQWd{&I*DYkBfBupX0wy z{{H^~u3|_70T2KI5C8!X009sH0T2KI5C8!X7)W5+zUbL+R-`%pf5XPVG0+VnKmY_l g00ck)1V8`;KmY_l00ck)1Ri(-C+tbj;PwCi2M>;W?f?J) diff --git a/setup.py b/setup.py index 64640ff..a4c4033 100644 --- a/setup.py +++ b/setup.py @@ -40,8 +40,6 @@ def start_setup(): if not os_name.startswith('win'): if not os_name.startswith('linux'): activator_string = '''source venv/bin/activate ;''' - else: - activator_string = '''venv/bin/pip ;''' requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", "chardet", "cryptography", "Django==2.2", "python_on_whales", From da44a0194bee25b3e65244d22e417b51fb99a083 Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 12:33:28 +0530 Subject: [PATCH 047/163] fix for linux machines --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index a4c4033..6b03e01 100644 --- a/setup.py +++ b/setup.py @@ -40,6 +40,8 @@ def start_setup(): if not os_name.startswith('win'): if not os_name.startswith('linux'): activator_string = '''source venv/bin/activate ;''' + else: + activator_string = "" requirements = [" --upgrade pip","bcrypt", "certifi", "cffi", "chardet", "cryptography", "Django==2.2", "python_on_whales", From 137adbb4a00cfe33364a645745923c40dba658be Mon Sep 17 00:00:00 2001 From: waseem Date: Fri, 25 Jun 2021 14:08:03 +0530 Subject: [PATCH 048/163] Integration of loader and changes in merge-csv app --- connector/connector_api/views.py | 2 +- connector/static/css/style.css | 92 +- connector/static/js/app.js | 36 +- connector/templates/connection.html | 12 +- connector/templates/logs.html | 8 + connector/templates/status.html | 8 + .../example-provider-routes.xml | 2 +- fs-consumer-apps/merge-csv-nodejs/app.js | 34 +- .../merge-csv-nodejs/package-lock.json | 4967 +++++++++++++++++ .../merge-csv-nodejs/package.json | 2 +- .../merge-csv-nodejs/public/css/home.css | 22 + .../merge-csv-nodejs/views/home.ejs | 28 + 12 files changed, 5179 insertions(+), 34 deletions(-) create mode 100644 fs-consumer-apps/merge-csv-nodejs/package-lock.json create mode 100644 fs-consumer-apps/merge-csv-nodejs/public/css/home.css create mode 100644 fs-consumer-apps/merge-csv-nodejs/views/home.ejs diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py index f6f7580..0916319 100644 --- a/connector/connector_api/views.py +++ b/connector/connector_api/views.py @@ -56,7 +56,7 @@ def post(self, request, *args, **kwargs): print(os.getpid()) os._exit(0) - time.sleep(5) + time.sleep(60) return Response(data={"message": "Connectors saved"}, status=status.HTTP_201_CREATED) except Exception as e: print(e) diff --git a/connector/static/css/style.css b/connector/static/css/style.css index 12ff46e..7f11601 100644 --- a/connector/static/css/style.css +++ b/connector/static/css/style.css @@ -10,13 +10,40 @@ .page-title .title { margin-bottom: 0; } -.fs-main-content{ - margin-left:5%; - margin-right: 5%; +.loader-container { + z-index: 4; + color: #fff; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,.5); + display: none; } - -.fs-tab { - margin-top : 2% +.loader-container svg { + font-size: 5rem; +} +.loader-itself { + position: absolute; + width: 100%; + height: 100%; + transform: translateY(50%); +} +.loader-message { + font-size: 2rem; + position: absolute; + width: 100%; + height: 100%; + transform: translateY(60%); +} +.loader-message p { + animation: blinker 1s linear infinite; +} + +@keyframes blinker { + 50% { + opacity: 0; + } } /* Source List Page CSS Starts */ @@ -78,19 +105,22 @@ top: 0; left: 0; width: 100%; - z-index: -1; + z-index: 2; min-height: 3.5rem; } .fs-sidebar { background-color: var(--primary); width: 15rem; color: #fff; + transition: all 0.5s ease; + z-index: 3; } .fs-sidebar-top-left-container { display: flex; justify-content: space-between; - padding: .5rem; + padding: .55rem .5rem; align-items: center; + min-height: 3.5rem; } .logo-data { display: flex; @@ -102,13 +132,18 @@ text-transform: uppercase; font-size: 1.2rem; } +.fs-hamburger { + cursor: pointer; +} .fs-sidebar-list { padding: .5rem 0 .5rem .5rem; } .fs-sidebar-list-item { list-style: none; - padding: .5rem 0; + padding: .5rem; font-size: 1rem; + position: relative; + margin: 5px 0; } .fs-sidebar-list-item.active { background-color: #fff; @@ -120,17 +155,52 @@ .fs-sidebar-list-item a { color: #fff; text-decoration: none; + display: block; } -.list-item-icon { - margin: 0 10px; +.fs-icon-view-info { + position: absolute; + left: 3.5rem; + background-color: var(--primary); + padding: .2rem .4rem; + top: .3rem; + border-radius: 20px; + display: none; } .fs-main-content { padding-top: 3.5rem; width: calc(100% - 15rem); + transition: all 0.5s ease; + max-height: 100vh; + overflow-y: auto; } .main-wrapper { min-height: 100vh; } +.fs-sidebar-icon-view.fs-sidebar { + width: 3.5rem; +} +.fs-sidebar-icon-view.fs-sidebar .fs-sidebar-top-left-container { + justify-content: center; +} +.fs-sidebar-icon-view.fs-sidebar .fs-sidebar-top-left-container .logo-data { + display: none; +} +.fs-sidebar-icon-view.fs-sidebar .fs-sidebar-list-item:not(.active):hover { + background-color: #fff; + border-radius: 10px; + padding: .5rem; + margin-right: 10px; +} +.fs-sidebar-icon-view.fs-sidebar .fs-sidebar-list-item:hover .list-item-icon { + color: var(--primary); +} +.fs-sidebar-icon-view.fs-sidebar .fs-sidebar-list-item:hover .fs-icon-view-info { + display: block; + transition: all 0.5s ease; +} +.fs-sidebar-icon-view.fs-sidebar .list-item-name { + display: none; +} /* Layout CSS Ends */ diff --git a/connector/static/js/app.js b/connector/static/js/app.js index 2acf243..5884ce5 100644 --- a/connector/static/js/app.js +++ b/connector/static/js/app.js @@ -12,7 +12,41 @@ function observeRoute() { }); } -document.addEventListener('load', observeRoute()) +function sidebarIconView() { + const sidebar = document.querySelector('.fs-sidebar'); + const mainContent = document.querySelector('.fs-main-content'); + let list = sidebar.classList; + sidebar.classList.toggle('fs-sidebar-icon-view'); + if (sidebar.classList.contains('fs-sidebar-icon-view')) { + mainContent.style.width = 'calc(100% - 3.5rem)'; + } else { + mainContent.style.width = 'calc(100% - 15rem)'; + } +} + +const resizeObserver = new ResizeObserver(() => { + const sidebar = document.querySelector('.fs-sidebar'); + const mainContent = document.querySelector('.fs-main-content'); + if (window.innerWidth <= 990) { + sidebar.classList.add('fs-sidebar-icon-view'); + mainContent.style.width = 'calc(100% - 3.5rem)'; + } else { + sidebar.classList.remove('fs-sidebar-icon-view'); + mainContent.style.width = 'calc(100% - 15rem)'; + } +}); + +function loaderDemo() { + const loaderContainer = document.querySelector('.loader-container'); + loaderContainer.style.display = 'block'; + // setTimeout(() => { + // loaderContainer.style.display = 'none'; + // }, 3000); +} + +const domBody = document.querySelector('body'); +document.addEventListener('load', observeRoute()); +resizeObserver.observe(domBody); $(document).ready(function(){ $( "#consumer_name" ).change(function() { diff --git a/connector/templates/connection.html b/connector/templates/connection.html index 55a30bf..67e6ebe 100644 --- a/connector/templates/connection.html +++ b/connector/templates/connection.html @@ -13,6 +13,16 @@ + +
+
+ +
+
+

Setting up connectors...

+
+
+
@@ -155,7 +165,7 @@
Destination:
- +
diff --git a/connector/templates/logs.html b/connector/templates/logs.html index 1f36616..5a25c32 100644 --- a/connector/templates/logs.html +++ b/connector/templates/logs.html @@ -13,6 +13,14 @@ +
+
+ +
+
+

Loading

+
+
diff --git a/connector/templates/status.html b/connector/templates/status.html index 0a773cd..979eabe 100644 --- a/connector/templates/status.html +++ b/connector/templates/status.html @@ -14,6 +14,14 @@ +
+
+ +
+
+

Setting up connectors...

+
+
diff --git a/fs-configs/usage-control-example/example-provider-routes.xml b/fs-configs/usage-control-example/example-provider-routes.xml index 7c462c4..49f9314 100644 --- a/fs-configs/usage-control-example/example-provider-routes.xml +++ b/fs-configs/usage-control-example/example-provider-routes.xml @@ -60,7 +60,7 @@ The specification describes how the components get instantiated and wired togeth https://farmstack.digitalgreen.org/usageControlExample - https://hub.docker.com/layers/farmstack/merge-csv-nodejs/latest/images/sha256-1b903795a3d3f02967f864ed8f7b0074e283b9b08ce5a02000ce948a3e33bd03#8081 + https://hub.docker.com/layers/farmstack/merge-csv-nodejs/latest/images/sha256-ad7988908b021d9474e4cb0888cf78dc52d22b881c7477a50b842e2c13c47faa#8081 diff --git a/fs-consumer-apps/merge-csv-nodejs/app.js b/fs-consumer-apps/merge-csv-nodejs/app.js index bc551b1..9d0270e 100644 --- a/fs-consumer-apps/merge-csv-nodejs/app.js +++ b/fs-consumer-apps/merge-csv-nodejs/app.js @@ -1,11 +1,10 @@ // Start REST server const express = require('express'); const bodyParser = require('body-parser'); -const request = require('request'); const app = express(); -var data = {} -var data_count = 0; +var data = [] +// var data_count = 0; // just use JSON body data app.use(bodyParser.json({ @@ -13,29 +12,28 @@ app.use(bodyParser.json({ limit: '100mb' })); +app.use(express.static('public')) +app.set('view engine', 'ejs'); + // Start web page / app.get('/', function (req, res) { - - try { - var html = 'CSV Data : '+ JSON.stringify(data) + - '' - res.send(html) - } catch (e) { - next(e) - } - + if(data.length > 0) + res.render('home', {data:data}) + else + res.send("Waiting for producer to send data.") }); // Receive Message app.post('/post_data', function (req, res) { - try { var req_body = req.body; - console.log('req_body ', JSON.stringify(req_body)); - data[data_count] = (JSON.stringify(req_body)); - data_count ++; + req_body = JSON.parse(req.body); + // console.log('req_body ', JSON.stringify(req_body)); + req_body.forEach(item => { + data.push(item) + }); + // data[data_count] = (JSON.stringify(req_body)); + // data_count ++; res.end('OK'); } catch (e) { diff --git a/fs-consumer-apps/merge-csv-nodejs/package-lock.json b/fs-consumer-apps/merge-csv-nodejs/package-lock.json new file mode 100644 index 0000000..164cf48 --- /dev/null +++ b/fs-consumer-apps/merge-csv-nodejs/package-lock.json @@ -0,0 +1,4967 @@ +{ + "name": "@farmstack/merge-csv-nodejs", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@farmstack/merge-csv-nodejs", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "body-parser": "^1.18.3", + "ejs": "^3.1.6", + "express": "^4.16.4" + }, + "devDependencies": { + "standard": "^12.0.1" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "node_modules/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "dependencies": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + } + }, + "node_modules/deglob/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "dependencies": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-import": ">=2.13.0", + "eslint-plugin-node": ">=7.0.0", + "eslint-plugin-promise": ">=4.0.0", + "eslint-plugin-standard": ">=4.0.0" + } + }, + "node_modules/eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-react": ">=7.11.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/eslint-plugin-es": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "dev": true, + "dependencies": { + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" + }, + "engines": { + "node": ">=6.5.0" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "dependencies": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "2.x - 5.x" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "dependencies": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", + "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "dependencies": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "dependencies": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "dependencies": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "dependencies": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "dependencies": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + }, + "bin": { + "standard": "bin/cmd.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "dependencies": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "dependencies": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "requires": { + "jake": "^10.6.1" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true, + "requires": {} + }, + "eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "dev": true, + "requires": { + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-plugin-standard": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", + "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "requires": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + } + }, + "standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "requires": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } +} diff --git a/fs-consumer-apps/merge-csv-nodejs/package.json b/fs-consumer-apps/merge-csv-nodejs/package.json index 21efd08..8214746 100644 --- a/fs-consumer-apps/merge-csv-nodejs/package.json +++ b/fs-consumer-apps/merge-csv-nodejs/package.json @@ -20,7 +20,7 @@ "dependencies": { "express": "^4.16.4", "body-parser": "^1.18.3", - "request": "^2.88.2" + "ejs": "^3.1.6" }, "devDependencies": { "standard": "^12.0.1" diff --git a/fs-consumer-apps/merge-csv-nodejs/public/css/home.css b/fs-consumer-apps/merge-csv-nodejs/public/css/home.css new file mode 100644 index 0000000..2881005 --- /dev/null +++ b/fs-consumer-apps/merge-csv-nodejs/public/css/home.css @@ -0,0 +1,22 @@ +#data { + font-family: Arial, Helvetica, sans-serif; + border-collapse: collapse; + width: 100%; + } + + #data td, #data thead { + border: 1px solid #ddd; + padding: 8px; + } + + #data tr:nth-child(even){background-color: #f2f2f2;} + + #data tr:hover {background-color: #ddd;} + + #data thead { + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background-color: #d8af28; + color: white; + } \ No newline at end of file diff --git a/fs-consumer-apps/merge-csv-nodejs/views/home.ejs b/fs-consumer-apps/merge-csv-nodejs/views/home.ejs new file mode 100644 index 0000000..9339a76 --- /dev/null +++ b/fs-consumer-apps/merge-csv-nodejs/views/home.ejs @@ -0,0 +1,28 @@ + + + + Home Page + + + + + + <% var keys = Object.keys(data[0]) %> + <%keys.forEach((item) => { %> + + <%})%> + + + <% data.forEach((item, index) => { + var counter = 0 %> + + <% while (counter < keys.length) { %> + + <%counter += 1%> + <% } %> + + <% }) %> + +
<%= item %>
<%=item[keys[counter]]%>
+ + From d10e033911e7335850f50681627643478b474b69 Mon Sep 17 00:00:00 2001 From: sagardg Date: Fri, 25 Jun 2021 14:19:24 +0530 Subject: [PATCH 049/163] clear existing logs and get top 100 log details --- connector/connector_api/views.py | 8 ++++++++ connector/connector_views/views.py | 10 ++++++---- connector/templates/logs.html | 2 -- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py index 0916319..0d031e8 100644 --- a/connector/connector_api/views.py +++ b/connector/connector_api/views.py @@ -15,6 +15,7 @@ from django.views.decorators.csrf import csrf_exempt from subprocess import check_output from .serializers import ConnectorSerializer +from django.conf import settings class CsrfExemptSessionAuthentication(SessionAuthentication): @@ -38,6 +39,13 @@ def post(self, request, *args, **kwargs): if create_connector.is_valid(): create_connector.save() messagae = "Created connectors successfully." + + # clear log files + consumer_log_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") + provider_log_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") + + open(consumer_log_path, 'w').close() + open(provider_log_path, 'w').close() else: messagae = "Could not create connectors successfully." errors = create_connector.errors diff --git a/connector/connector_views/views.py b/connector/connector_views/views.py index 95b0d23..ea63d2d 100644 --- a/connector/connector_views/views.py +++ b/connector/connector_views/views.py @@ -21,12 +21,14 @@ def log(request): print(settings.BASE_DIR) - consumer_log_path = file_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") - provider_log_path = file_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") + consumer_log_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") + provider_log_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") with open(consumer_log_path, "r") as ofs: - consumer_logs_top_100 = ofs.readlines()[:100] + file_length = len(ofs.readlines()) + consumer_logs_top_100 = ofs.readlines()[file_length-100:] with open(provider_log_path, "r") as ofs: - provider_logs_top_100 = ofs.readlines()[:100] + file_length = len(ofs.readlines()) + provider_logs_top_100 = ofs.readlines()[file_length-100:] return render(request, "logs.html", context={"provider_logs_top_100": provider_logs_top_100, "consumer_logs_top_100": consumer_logs_top_100}) diff --git a/connector/templates/logs.html b/connector/templates/logs.html index 5a25c32..9b904c3 100644 --- a/connector/templates/logs.html +++ b/connector/templates/logs.html @@ -86,7 +86,6 @@
Sync History
{% for log in provider_logs_top_100 %} {{log}}
-
{% endfor %}

@@ -97,7 +96,6 @@
Sync History
{% for log in consumer_logs_top_100 %} {{log}}
-
{% endfor %}

From 2b761225afdb4604e496a3bc177f1879377079fc Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Fri, 25 Jun 2021 16:27:58 +0530 Subject: [PATCH 050/163] create dynamic routes and add pip3 in install script --- connector/connector_api/views.py | 11 ++++++++--- connector/connector_views/urls.py | 7 +++++++ connector/connector_views/views.py | 13 ++++++++----- connector/static/js/app.js | 2 +- fs-consumer-apps/merge-csv-nodejs/app.js | 2 +- install.sh | 7 +++++-- setup.py | 4 ++-- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/connector/connector_api/views.py b/connector/connector_api/views.py index 0d031e8..8ae603a 100644 --- a/connector/connector_api/views.py +++ b/connector/connector_api/views.py @@ -16,6 +16,8 @@ from subprocess import check_output from .serializers import ConnectorSerializer from django.conf import settings +from django.urls import reverse, reverse_lazy +from django.http import HttpResponseRedirect class CsrfExemptSessionAuthentication(SessionAuthentication): @@ -44,8 +46,11 @@ def post(self, request, *args, **kwargs): consumer_log_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") provider_log_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") - open(consumer_log_path, 'w').close() - open(provider_log_path, 'w').close() + try: + open(consumer_log_path, 'w+').close() + open(provider_log_path, 'w+').close() + except Exception as e: + print(e) else: messagae = "Could not create connectors successfully." errors = create_connector.errors @@ -130,7 +135,7 @@ def get(self, request, con_type, connector_uuid, *args, **kwargs): except: pass - return redirect("http://127.0.0.1:8000/home/status/") + return HttpResponseRedirect(reverse('status')) except Exception as e: print(e) return Response(data={"message": "Connectors not deletd"}, status=status.HTTP_304_NOT_MODIFIED) \ No newline at end of file diff --git a/connector/connector_views/urls.py b/connector/connector_views/urls.py index b34f244..988a25c 100644 --- a/connector/connector_views/urls.py +++ b/connector/connector_views/urls.py @@ -2,6 +2,13 @@ from .views import home, start_connector, con_status, log urlpatterns = [ + + path( + "", + home, + name="default_home" + ), + path( "home/", home, diff --git a/connector/connector_views/views.py b/connector/connector_views/views.py index ea63d2d..f8286d2 100644 --- a/connector/connector_views/views.py +++ b/connector/connector_views/views.py @@ -23,12 +23,15 @@ def log(request): consumer_log_path = os.path.join(settings.FILES_DIR, "consumer/karaf.log") provider_log_path = os.path.join(settings.FILES_DIR, "provider/karaf.log") + with open(consumer_log_path, "r") as ofs: - file_length = len(ofs.readlines()) - consumer_logs_top_100 = ofs.readlines()[file_length-100:] + consumer_logs_top_100 = ofs.readlines() + file_length = len(consumer_logs_top_100) + consumer_logs_top_100 = consumer_logs_top_100[file_length-100:] with open(provider_log_path, "r") as ofs: - file_length = len(ofs.readlines()) - provider_logs_top_100 = ofs.readlines()[file_length-100:] - + provider_logs_top_100 = ofs.readlines() + file_length = len(provider_logs_top_100) + provider_logs_top_100 = provider_logs_top_100[file_length-100:] + return render(request, "logs.html", context={"provider_logs_top_100": provider_logs_top_100, "consumer_logs_top_100": consumer_logs_top_100}) diff --git a/connector/static/js/app.js b/connector/static/js/app.js index 5884ce5..5569857 100644 --- a/connector/static/js/app.js +++ b/connector/static/js/app.js @@ -83,7 +83,7 @@ $(document).ready(function(){ } }); - xhr.open("POST", "http://127.0.0.1:8000/connector_api/run_local/"); + xhr.open("POST", "/connector_api/run_local/"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.setRequestHeader("Cookie", "csrftoken=VDCAygOx52igW4LXYI2RtlrMlKTo3084NuirzSR0qxn0oKscJCguCaqnLlZdUKBU"); diff --git a/fs-consumer-apps/merge-csv-nodejs/app.js b/fs-consumer-apps/merge-csv-nodejs/app.js index 9d0270e..d0b5f25 100644 --- a/fs-consumer-apps/merge-csv-nodejs/app.js +++ b/fs-consumer-apps/merge-csv-nodejs/app.js @@ -27,7 +27,7 @@ app.get('/', function (req, res) { app.post('/post_data', function (req, res) { try { var req_body = req.body; - req_body = JSON.parse(req.body); + // req_body = JSON.parse(req.body); // console.log('req_body ', JSON.stringify(req_body)); req_body.forEach(item => { data.push(item) diff --git a/install.sh b/install.sh index dd5f1cf..43f8ec9 100644 --- a/install.sh +++ b/install.sh @@ -15,7 +15,10 @@ then exit 1 fi else - DOCKER_VERSION=$(docker-compose --version)\ + echo "installing/upgrading pip" + sudo apt install python3-pip -y + + DOCKER_VERSION=$(docker-compose --version) echo "$DOCKER_VERSION" if [[ "$DOCKER_VERSION" =~ .*"docker-compose".* ]] @@ -47,4 +50,4 @@ else else echo "Invalid python versions found install python3.0 or greater and try again" fi -fi \ No newline at end of file +fi diff --git a/setup.py b/setup.py index 6b03e01..b7f5fd1 100644 --- a/setup.py +++ b/setup.py @@ -66,9 +66,9 @@ def start_setup(): #start server if not os.name.startswith('win'): if not os_name.startswith('linux'): - os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 127.0.0.1:8000;") + os.system("source venv/bin/activate;python connector/manage.py makemigrations;python connector/manage.py migrate;python connector/manage.py runserver 0.0.0.0:8000;") else: - os.system("venv/bin/python connector/manage.py makemigrations;venv/bin/python connector/manage.py migrate;venv/bin/python connector/manage.py runserver 127.0.0.1:8000;") + os.system("venv/bin/python connector/manage.py makemigrations;venv/bin/python connector/manage.py migrate;venv/bin/python connector/manage.py runserver 0.0.0.0:8000;") if __name__ == "__main__": start_setup() \ No newline at end of file From 8a88dc703dfa9e34b44b8a24ba33d7ba18e4a997 Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Fri, 25 Jun 2021 17:06:28 +0530 Subject: [PATCH 051/163] install docker in linux system --- install.sh | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 43f8ec9..907ef18 100644 --- a/install.sh +++ b/install.sh @@ -6,6 +6,8 @@ if [[ "$OSTYPE" =~ "darwin".* ]] then DOCKER_VERSION=$(docker-compose --version) + DOCKER_V = $(docker version) + echo "$DOCKER_VERSION" if [[ "$DOCKER_VERSION" =~ .*"docker-compose".* ]] then @@ -17,6 +19,21 @@ then else echo "installing/upgrading pip" sudo apt install python3-pip -y + + echo "$DOCKER_V" + if [[ "$DOCKER_V" =~ .*"not found".* ]] + then + echo "installing docker" + curl -fsSL https://get.docker.com -o get-docker.sh + sudo sh get-docker.sh + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + echo "docker installation done" + else + echo "docker found" + fi + DOCKER_VERSION=$(docker-compose --version) @@ -25,7 +42,7 @@ else then echo "docker compose found" else - echo "installing docker" + echo "installing docker compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose fi From 7f0234b8b1d1407274408a0079c98dff8301162d Mon Sep 17 00:00:00 2001 From: Sagar Singh Date: Fri, 25 Jun 2021 17:42:25 +0530 Subject: [PATCH 052/163] fix consumer app css --- .../example-provider-routes.xml | 2 +- fs-consumer-apps/merge-csv-nodejs/Dockerfile | 6 +- fs-consumer-apps/merge-csv-nodejs/README.md | 3 +- fs-consumer-apps/merge-csv-nodejs/app.js | 5 +- .../merge-csv-nodejs/package-lock.json | 644 +++++++++++++++++- .../merge-csv-nodejs/package.json | 19 +- .../merge-csv-nodejs/public/css/home.css | 2 +- 7 files changed, 641 insertions(+), 40 deletions(-) diff --git a/fs-configs/usage-control-example/example-provider-routes.xml b/fs-configs/usage-control-example/example-provider-routes.xml index 49f9314..308cd51 100644 --- a/fs-configs/usage-control-example/example-provider-routes.xml +++ b/fs-configs/usage-control-example/example-provider-routes.xml @@ -60,7 +60,7 @@ The specification describes how the components get instantiated and wired togeth https://farmstack.digitalgreen.org/usageControlExample - https://hub.docker.com/layers/farmstack/merge-csv-nodejs/latest/images/sha256-ad7988908b021d9474e4cb0888cf78dc52d22b881c7477a50b842e2c13c47faa#8081 + https://hub.docker.com/layers/farmstack/merge-csv-nodejs/latest/images/sha256-809b11c7454ba8e659e54d67138b76c39212605a7a9b5b3b6cbe2d1efe5fba4e#8081 diff --git a/fs-consumer-apps/merge-csv-nodejs/Dockerfile b/fs-consumer-apps/merge-csv-nodejs/Dockerfile index 234c285..97d42a0 100644 --- a/fs-consumer-apps/merge-csv-nodejs/Dockerfile +++ b/fs-consumer-apps/merge-csv-nodejs/Dockerfile @@ -2,10 +2,12 @@ FROM node:alpine WORKDIR /app -ADD package.json /app +ADD package.json . RUN npm install -ADD app.js /app +ADD app.js . +ADD views ./views +ADD public ./public EXPOSE 8081 diff --git a/fs-consumer-apps/merge-csv-nodejs/README.md b/fs-consumer-apps/merge-csv-nodejs/README.md index add1531..29235c9 100644 --- a/fs-consumer-apps/merge-csv-nodejs/README.md +++ b/fs-consumer-apps/merge-csv-nodejs/README.md @@ -1,2 +1 @@ -# merge-csv-nodejs - +This is demo nodejs app that displays the data received by the consumer connector. This app runs in the consumer-app container defined in the file: docker-compose-consumer.yaml. diff --git a/fs-consumer-apps/merge-csv-nodejs/app.js b/fs-consumer-apps/merge-csv-nodejs/app.js index d0b5f25..ea75af4 100644 --- a/fs-consumer-apps/merge-csv-nodejs/app.js +++ b/fs-consumer-apps/merge-csv-nodejs/app.js @@ -1,6 +1,7 @@ // Start REST server const express = require('express'); const bodyParser = require('body-parser'); +const request = require('request'); const app = express(); var data = [] @@ -25,10 +26,10 @@ app.get('/', function (req, res) { // Receive Message app.post('/post_data', function (req, res) { + try { var req_body = req.body; - // req_body = JSON.parse(req.body); - // console.log('req_body ', JSON.stringify(req_body)); + console.log('req_body ', JSON.stringify(req_body)); req_body.forEach(item => { data.push(item) }); diff --git a/fs-consumer-apps/merge-csv-nodejs/package-lock.json b/fs-consumer-apps/merge-csv-nodejs/package-lock.json index 164cf48..674dfd6 100644 --- a/fs-consumer-apps/merge-csv-nodejs/package-lock.json +++ b/fs-consumer-apps/merge-csv-nodejs/package-lock.json @@ -1,17 +1,18 @@ { - "name": "@farmstack/merge-csv-nodejs", + "name": "@fraunhoferaisec/ids-example-010-client", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@farmstack/merge-csv-nodejs", + "name": "@fraunhoferaisec/ids-example-010-client", "version": "1.0.0", - "license": "MIT", + "license": "ISC", "dependencies": { "body-parser": "^1.18.3", "ejs": "^3.1.6", - "express": "^4.16.4" + "express": "^4.16.4", + "request": "^2.88.2" }, "devDependencies": { "standard": "^12.0.1" @@ -54,7 +55,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -137,11 +137,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, "node_modules/async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -213,6 +247,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -284,6 +326,11 @@ "node": ">=0.10.0" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -341,6 +388,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -387,6 +445,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -403,6 +466,17 @@ "node": ">=4.8" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -458,6 +532,14 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -483,6 +565,15 @@ "node": ">=0.10.0" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1000,6 +1091,11 @@ "node": ">= 0.10.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -1014,17 +1110,23 @@ "node": ">=0.12" } }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -1115,6 +1217,27 @@ "node": ">=0.10.0" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1172,6 +1295,14 @@ "node": ">=4" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -1207,6 +1338,27 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1290,6 +1442,20 @@ "node": ">= 0.6" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1514,6 +1680,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1526,6 +1697,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "node_modules/jake": { "version": "10.8.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", @@ -1562,17 +1738,26 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -1580,6 +1765,25 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", @@ -1784,6 +1988,14 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1996,6 +2208,11 @@ "node": ">=4" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2131,11 +2348,15 @@ "node": ">= 0.10" } }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "engines": { "node": ">=6" } @@ -2232,6 +2453,45 @@ "node": ">=6.5.0" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -2479,6 +2739,30 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/standard": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", @@ -2660,6 +2944,34 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -2717,7 +3029,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -2730,6 +3041,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -2748,6 +3068,19 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2840,7 +3173,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2902,11 +3234,39 @@ "is-string": "^1.0.5" } }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -2965,6 +3325,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -3021,6 +3389,11 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3071,6 +3444,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3105,6 +3486,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3118,6 +3504,14 @@ "which": "^1.2.9" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3169,6 +3563,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3188,6 +3587,15 @@ "esutils": "^2.0.2" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3584,6 +3992,11 @@ "vary": "~1.1.2" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -3595,17 +4008,20 @@ "tmp": "^0.0.33" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -3681,6 +4097,21 @@ "write": "^0.2.1" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3726,6 +4157,14 @@ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -3752,6 +4191,20 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3813,6 +4266,16 @@ "toidentifier": "1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3965,6 +4428,11 @@ "has-symbols": "^1.0.2" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3977,6 +4445,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "jake": { "version": "10.8.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", @@ -4004,17 +4477,26 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -4022,6 +4504,22 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", @@ -4181,6 +4679,11 @@ "validate-npm-package-license": "^3.0.1" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4339,6 +4842,11 @@ "pify": "^2.0.0" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4443,11 +4951,15 @@ "ipaddr.js": "1.9.1" } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.7.0", @@ -4509,6 +5021,40 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -4705,6 +5251,22 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "standard": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", @@ -4844,6 +5406,28 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4889,7 +5473,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -4899,6 +5482,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -4914,6 +5502,16 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/fs-consumer-apps/merge-csv-nodejs/package.json b/fs-consumer-apps/merge-csv-nodejs/package.json index 8214746..c7c605a 100644 --- a/fs-consumer-apps/merge-csv-nodejs/package.json +++ b/fs-consumer-apps/merge-csv-nodejs/package.json @@ -1,26 +1,27 @@ { - "name": "@farmstack/merge-csv-nodejs", + "name": "@fraunhoferaisec/ids-example-010-client", "version": "1.0.0", - "description": "A sample application receiving json data and displaying it iin tabular format", - "main": "app.js", + "description": "A sample application retrieving MQTT data and providing it as REST service", + "main": "controller.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "style": "standard" }, "repository": { "type": "git", - "url": "git+https://github.com/digitalgreen/farmstack-open.git" + "url": "git+https://github.com/industrial-data-space/trusted-connector.git" }, "author": "", - "license": "MIT", + "license": "ISC", "bugs": { - "url": "https://github.com/FarmstackDG" + "url": "https://github.com/FraunhoferAISEC" }, - "homepage": "https://github.com/FarmstackDG", + "homepage": "https://github.com/FraunhoferAISEC", "dependencies": { - "express": "^4.16.4", "body-parser": "^1.18.3", - "ejs": "^3.1.6" + "ejs": "^3.1.6", + "express": "^4.16.4", + "request": "^2.88.2" }, "devDependencies": { "standard": "^12.0.1" diff --git a/fs-consumer-apps/merge-csv-nodejs/public/css/home.css b/fs-consumer-apps/merge-csv-nodejs/public/css/home.css index 2881005..8dc1f2f 100644 --- a/fs-consumer-apps/merge-csv-nodejs/public/css/home.css +++ b/fs-consumer-apps/merge-csv-nodejs/public/css/home.css @@ -17,6 +17,6 @@ padding-top: 12px; padding-bottom: 12px; text-align: left; - background-color: #d8af28; + background-color: #D9B128; color: white; } \ No newline at end of file From cd21d20b1bac25f81ffb184543e170e4b4f20c55 Mon Sep 17 00:00:00 2001 From: Mahesh Pradhan Date: Fri, 25 Jun 2021 18:00:25 +0530 Subject: [PATCH 053/163] Color changes --- connector/static/css/external-styles.css | 10 ++++++++-- connector/static/css/style.css | 17 +++++++++++++---- connector/static/js/app.js | 2 +- connector/templates/connection.html | 13 +++++-------- connector/templates/logs.html | 9 +++------ connector/templates/status.html | 5 +---- 6 files changed, 31 insertions(+), 25 deletions(-) diff --git a/connector/static/css/external-styles.css b/connector/static/css/external-styles.css index 26ba728..ca81d6c 100644 --- a/connector/static/css/external-styles.css +++ b/connector/static/css/external-styles.css @@ -1,9 +1,15 @@ :root { - --primary: #f7b733; - --primary-hover: #fbaf11; + /* --primary: #f7b733; */ + --primary: #d9b128; + /* --primary-hover: #fbaf11; */ + --primary-hover: #3d3d3f; --primary-light: #f4c769; } +a, a:hover { + color: #fff; +} + .content-wrapper { padding: 1rem; } diff --git a/connector/static/css/style.css b/connector/static/css/style.css index 7f11601..fd08ff4 100644 --- a/connector/static/css/style.css +++ b/connector/static/css/style.css @@ -100,7 +100,8 @@ /* Layout CSS Starts */ .fs-navbar { padding: 1rem; - background-color: var(--primary); + /* background-color: #242A31; */ + background-color: #3d3d3f; position: absolute; top: 0; left: 0; @@ -109,7 +110,7 @@ min-height: 3.5rem; } .fs-sidebar { - background-color: var(--primary); + background-color: #F5F7F9; width: 15rem; color: #fff; transition: all 0.5s ease; @@ -121,11 +122,15 @@ padding: .55rem .5rem; align-items: center; min-height: 3.5rem; + background-color: #3d3d3f; } .logo-data { display: flex; align-items: center; } +.logo-data img { + width: 14rem; +} .logo-data h5 { margin-bottom: 0; color: #fff; @@ -145,15 +150,19 @@ position: relative; margin: 5px 0; } +.fs-sidebar-list-item:hover { + background-color: #E6ECF1; +} .fs-sidebar-list-item.active { background-color: #fff; border-radius: 20px 0 0 20px; } .fs-sidebar-list-item.active a { - color: var(--primary); + /* color: var(--primary); */ + color: rgb(217, 177, 40); } .fs-sidebar-list-item a { - color: #fff; + color: black; text-decoration: none; display: block; } diff --git a/connector/static/js/app.js b/connector/static/js/app.js index 5569857..3e8c900 100644 --- a/connector/static/js/app.js +++ b/connector/static/js/app.js @@ -8,7 +8,7 @@ function observeRoute() { const links = document.querySelectorAll('.fs-sidebar-list-item a'); links.forEach((link) => { - (link.href == currentLocation) ? link.parentElement.classList.add('active') : link.parentElement.classList.remove('active') ; + (currentLocation.startsWith(link.href)) ? link.parentElement.classList.add('active') : link.parentElement.classList.remove('active') ; }); } diff --git a/connector/templates/connection.html b/connector/templates/connection.html index 67e6ebe..b47294e 100644 --- a/connector/templates/connection.html +++ b/connector/templates/connection.html @@ -28,28 +28,25 @@
- -
Farmstack
+
diff --git a/install.sh b/install.sh index 7d880ea..b24cfc8 100644 --- a/install.sh +++ b/install.sh @@ -17,8 +17,11 @@ then exit 1 fi else + echo "install time module" + sudo apt install ntpdate + sudo ntpdate -s time.nist.gov + DOCKER_VERSION=$(docker-compose --version; echo $?) - DOCKER_V=$(docker version; echo $?) echo "installing/upgrading pip" From 757c9a107f85b6d4323f3934352356446948ddb6 Mon Sep 17 00:00:00 2001 From: Mayank Gautam Date: Sat, 26 Jun 2021 01:34:26 +0530 Subject: [PATCH 061/163] Code cleanup --- .github/workflows/example_uc.yml | 6 ++-- .gitignore | 4 ++- .../.vscode/settings.json | 0 .../connector/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 150 bytes .../__pycache__/base_models.cpython-36.pyc | Bin 0 -> 617 bytes .../__pycache__/settings.cpython-36.pyc | Bin 0 -> 2700 bytes .../connector/__pycache__/urls.cpython-36.pyc | Bin 0 -> 1053 bytes .../connector/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 557 bytes .../connector/base_models.py | 0 .../connector/settings.py | 0 {connector => fs-server}/connector/urls.py | 0 {connector => fs-server}/connector/wsgi.py | 0 .../connector_api/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 154 bytes .../__pycache__/admin.cpython-36.pyc | Bin 0 -> 270 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 782 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 0 -> 657 bytes .../__pycache__/urls.cpython-36.pyc | Bin 0 -> 470 bytes .../__pycache__/views.cpython-36.pyc | Bin 0 -> 4327 bytes .../connector_api/admin.py | 0 .../connector_api/apps.py | 0 .../connector_api/migrations/0001_initial.py | 29 ++++++++++++++++++ .../connector_api/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 902 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 165 bytes .../connector_api/models.py | 0 .../connector_api/serializers.py | 0 .../connector_api/tests.py | 0 .../connector_api/urls.py | 0 .../connector_api/views.py | 0 .../connector_views/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/admin.cpython-36.pyc | Bin 0 -> 197 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 154 bytes .../__pycache__/urls.cpython-36.pyc | Bin 0 -> 496 bytes .../__pycache__/views.cpython-36.pyc | Bin 0 -> 1443 bytes .../connector_views/admin.py | 0 .../connector_views/apps.py | 0 .../connector_views/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 167 bytes .../connector_views/models.py | 0 .../connector_views/tests.py | 0 .../connector_views/urls.py | 0 .../connector_views/views.py | 0 fs-server/db.sqlite3 | Bin 0 -> 143360 bytes {connector => fs-server}/manage.py | 0 {connector => fs-server}/requirements.txt | 0 .../static/css/external-styles.css | 0 {connector => fs-server}/static/css/style.css | 0 {connector => fs-server}/static/css/theme.css | 0 .../static/images/logo.png | Bin {connector => fs-server}/static/js/app.js | 0 .../static/js/bootstrap.js | 0 .../static/js/fontawesome.js | 0 {connector => fs-server}/static/js/jquery.js | 0 {connector => fs-server}/static/js/popper.js | 0 .../templates/connection.html | 0 {connector => fs-server}/templates/home.html | 0 {connector => fs-server}/templates/logs.html | 0 .../templates/status.html | 0 scripts/{ => examples}/checkData.sh | 0 run.sh => scripts/examples/run-uc.sh | 2 +- stop.sh => scripts/examples/stop-uc.sh | 2 +- install.sh => scripts/install.sh | 0 setup.py | 23 ++++++++++---- 66 files changed, 54 insertions(+), 12 deletions(-) rename {connector => fs-server}/.vscode/settings.json (100%) rename {connector => fs-server}/connector/__init__.py (100%) create mode 100644 fs-server/connector/__pycache__/__init__.cpython-36.pyc create mode 100644 fs-server/connector/__pycache__/base_models.cpython-36.pyc create mode 100644 fs-server/connector/__pycache__/settings.cpython-36.pyc create mode 100644 fs-server/connector/__pycache__/urls.cpython-36.pyc create mode 100644 fs-server/connector/__pycache__/wsgi.cpython-36.pyc rename {connector => fs-server}/connector/base_models.py (100%) rename {connector => fs-server}/connector/settings.py (100%) rename {connector => fs-server}/connector/urls.py (100%) rename {connector => fs-server}/connector/wsgi.py (100%) rename {connector => fs-server}/connector_api/__init__.py (100%) create mode 100644 fs-server/connector_api/__pycache__/__init__.cpython-36.pyc create mode 100644 fs-server/connector_api/__pycache__/admin.cpython-36.pyc create mode 100644 fs-server/connector_api/__pycache__/models.cpython-36.pyc create mode 100644 fs-server/connector_api/__pycache__/serializers.cpython-36.pyc create mode 100644 fs-server/connector_api/__pycache__/urls.cpython-36.pyc create mode 100644 fs-server/connector_api/__pycache__/views.cpython-36.pyc rename {connector => fs-server}/connector_api/admin.py (100%) rename {connector => fs-server}/connector_api/apps.py (100%) create mode 100644 fs-server/connector_api/migrations/0001_initial.py rename {connector => fs-server}/connector_api/migrations/__init__.py (100%) create mode 100644 fs-server/connector_api/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 fs-server/connector_api/migrations/__pycache__/__init__.cpython-36.pyc rename {connector => fs-server}/connector_api/models.py (100%) rename {connector => fs-server}/connector_api/serializers.py (100%) rename {connector => fs-server}/connector_api/tests.py (100%) rename {connector => fs-server}/connector_api/urls.py (100%) rename {connector => fs-server}/connector_api/views.py (100%) rename {connector => fs-server}/connector_views/__init__.py (100%) create mode 100644 fs-server/connector_views/__pycache__/__init__.cpython-36.pyc create mode 100644 fs-server/connector_views/__pycache__/admin.cpython-36.pyc create mode 100644 fs-server/connector_views/__pycache__/models.cpython-36.pyc create mode 100644 fs-server/connector_views/__pycache__/urls.cpython-36.pyc create mode 100644 fs-server/connector_views/__pycache__/views.cpython-36.pyc rename {connector => fs-server}/connector_views/admin.py (100%) rename {connector => fs-server}/connector_views/apps.py (100%) rename {connector => fs-server}/connector_views/migrations/__init__.py (100%) create mode 100644 fs-server/connector_views/migrations/__pycache__/__init__.cpython-36.pyc rename {connector => fs-server}/connector_views/models.py (100%) rename {connector => fs-server}/connector_views/tests.py (100%) rename {connector => fs-server}/connector_views/urls.py (100%) rename {connector => fs-server}/connector_views/views.py (100%) create mode 100644 fs-server/db.sqlite3 rename {connector => fs-server}/manage.py (100%) rename {connector => fs-server}/requirements.txt (100%) rename {connector => fs-server}/static/css/external-styles.css (100%) rename {connector => fs-server}/static/css/style.css (100%) rename {connector => fs-server}/static/css/theme.css (100%) rename {connector => fs-server}/static/images/logo.png (100%) rename {connector => fs-server}/static/js/app.js (100%) rename {connector => fs-server}/static/js/bootstrap.js (100%) rename {connector => fs-server}/static/js/fontawesome.js (100%) rename {connector => fs-server}/static/js/jquery.js (100%) rename {connector => fs-server}/static/js/popper.js (100%) rename {connector => fs-server}/templates/connection.html (100%) rename {connector => fs-server}/templates/home.html (100%) rename {connector => fs-server}/templates/logs.html (100%) rename {connector => fs-server}/templates/status.html (100%) rename scripts/{ => examples}/checkData.sh (100%) rename run.sh => scripts/examples/run-uc.sh (84%) rename stop.sh => scripts/examples/stop-uc.sh (74%) rename install.sh => scripts/install.sh (100%) diff --git a/.github/workflows/example_uc.yml b/.github/workflows/example_uc.yml index 48cb064..62be997 100644 --- a/.github/workflows/example_uc.yml +++ b/.github/workflows/example_uc.yml @@ -18,14 +18,14 @@ jobs: - uses: actions/checkout@v2 - name: Running setup script - run: ./run.sh + run: ./scripts/examples/run.sh # Runs a set of commands using the runners shell - name: Wait for connector to come online run: sleep 60 - name: Checking for data transfer - run: ./scripts/checkData.sh + run: ./scripts/examples/checkData.sh - name: Stopping containers - run: ./stop.sh + run: ./scripts/examples/stop.sh diff --git a/.gitignore b/.gitignore index 872e8c2..7060d9c 100644 --- a/.gitignore +++ b/.gitignore @@ -107,4 +107,6 @@ dist .DS_Store -venv +venv/ +.venv/ +.setup_complete diff --git a/connector/.vscode/settings.json b/fs-server/.vscode/settings.json similarity index 100% rename from connector/.vscode/settings.json rename to fs-server/.vscode/settings.json diff --git a/connector/connector/__init__.py b/fs-server/connector/__init__.py similarity index 100% rename from connector/connector/__init__.py rename to fs-server/connector/__init__.py diff --git a/fs-server/connector/__pycache__/__init__.cpython-36.pyc b/fs-server/connector/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a131d6f9e0b985cd2ec793c7ee349eaddd468928 GIT binary patch literal 150 zcmXr!<>lJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU(Wg&`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_k$!x9W?p7Ve7s&kHWI7|bwDt+OFLyTZq9|4{1n@T!bn+p5T1d@U_n`# zcm*cTX-lburThGy&-%Xe`MA*t-k#nsKL{b87{AL!*1^z+2ta_QB%?8<4Ytu*a5dsn%)=QBTZV?vI1nP6PvD=gQSC@j}Rn@DUg^+XW{|{_CjNC#U11|G;qN~ z18>3NI@D0SUhWOXnd}>pO}pdyI3J)-|60K(T9v!p`Ht zws5;EjTrQrZs~KLi%fD}2At!YW~t>N=eIMFt}4D5YNJGAUWp1&zk=`c=(@;cl!^H~ z8VQwYBa)j9YZX(OMot8< zvsSjCd<(W(HqL~R_ATdQnL->SO5y=;c>Y4Gu&iNe5_$p$J<^Jb1}iPSW0os*2CGEk_%=QWiZn ze}g~J-_W1YH@)_$f1yu3k{!o2%rv#EtD|$z`OdDpF*hgt{_7vVyqQm>{!ESi1f<{L z&0eQdDM*nNq=7TjBu&$Ou0J)l@^tzv9bY7qaQS4-(hN+UamdX9Px3HL1juyLWCpU3 zgFFZ@1G6v(^Kb(n{W$mcXMP8wdUatxdL}bnD@@OZW^Xx3GTxK zcnF0qZ=~U?Pds8Tz}Ms|Jc7p~=_h9#eDjGj(&QQ}!&8)8hGMd=B*6}H2yf}W;n)TI`#l2<8YX>?_NmbGeV2VNN#L}ZIIwVT zzwKBOwIzg;e8)A~OgeX18o>KKTId9(SuhRe7o5&TK)MZRh#FquNH+t@{*Nt>cE$|- z75890EQ+GkVXK&=j?raO!1OMS-+a$8SLumvxh9oN2e-m?Pg{BAJ$tA3S6+N~RNVL& zT8|&IcHq9Wp!@U7N4jR5u62)HcU=enG&t-XZ?vNHO1LI${ZzJ&bNl^vPHpvLUoF5fQ3_O#C(h$d| z*tj_0;sF9s8_q{iEGM(x8g8>Fe=f<$wWQlld=2NcjUHk`!l#pXpUa3q4}xyEatTR~ ze#Dve!)HU;7|e?&B2MlXkYj$hF(Euk=ob{u_lkU!eJ__jDD^Vo%ax`Y<>Z|mEupfF zomQn$SHrsqFqi=Gm~{6KN=x8xJV`YXc|7<2nA#g=^__pl=@bs zu0(uYt|?v~zb@hSgzHJ1uFe<^7-;wfGaxZ1?lS7hew>TIr>bEYrXJ7I-ax|f!nc=2 zsu{Ln1y+^XUB7ps|HEbV2cxw!^zj1V-DLslfki!|{W-!kwO0cc&dSWtr4NpIsQY@D zlkmL3DU!mhWKqB!k{NKw%;2ecj^h&{*-Yr-!zin1c&unz#5pYDUES|t!3@vF5s9+; z0ZTYJO^d&DnnrT(WmSobAMt(1ut|QiQdQK1A*f2JskF2Y%1_aBS$V&^70t=jYGYq1 zYugRArAG6Wy4pe(GO&fzNT^lH<*KqTHx+WD)M%<&qglbiYl&LCMzhUEqowUOtEEPL zGs?G=+D=t&DQdK^uWnUhm};dY$4waJ%W_MO-BY96@@{Ke+mTguztJpfdvdjcn`j`K ztIGAQU3p8fhFjaw%upu|03%J5V*0m~_XHa{S^h3bJ;$PwrJtNg9o@6APVK`B zYSnS^aK|$hd-{la(rC&?hp*_KM!7eZ1A$53&LA%9fsipMI3_rzlnQ1OPd1d&2 mb22E$^BgzN;cqBCpXIYLy(na+;!DV(%;3t#&joH4<^KUQ=!Xjc literal 0 HcmV?d00001 diff --git a/fs-server/connector/__pycache__/urls.cpython-36.pyc b/fs-server/connector/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06255915fa33b90b422a8ccf48f42945dc596ac1 GIT binary patch literal 1053 zcma)5%We}f6!lCdO*=^oLVSRC=}75VlwDL_s;H=hSn!ZgHmN&y5{I!p*iLD)q`$yV z@C|$hyVPTbVxjH^R=lIUU-QD!t=kI48&3!7r|{bMurM@2 zEMjpP$#@h;zHXH*nT!(I9XIBxw0i=D<7 zf`76(KG6nCZ8#QcqKym`xGFid99zzZDTZg}TxExZFkRT3&8eDd5HRP3%L^?DSL851 zBu-bNu*8E29B)bb{E|xGvcvRbp$e~Vb!;GgkmF~JVXCl@l{RjO@x*9}<<*#0Rny$S zA2#@484PSVgsot9w%_j$8ecOl`2Z^_`J=wC`&oKiQfm*+!5G_M{htc$X54roc?fDP z=LK*D^|w^x@j10)PqLr=qv%u><$?({g%HAd-dX{dxz6V_1cN~eT#v`{{R~f>z}4YqjU4o)QRfeNx{y0&hRd(w{KXD2wVgWm2dtt`nbl-D%LvtHy~=j#&Ug&7HXe`m8hZeAMw}ZMeN=Zh zJRA56kx6_zvBL2>@k!L(jp_J`OxJ__^6Lo+0wuk?Bok_+b+q_!Qyu6Erg>ryEH@Y2 jkUs*$MCa92y?rD#Ta^6q9iX#4Sdyq0-EH+??M1%-#B?^M{kRqg9cHQ;t#=$=;+fCCR>5(Vl z8F&m%?3EL*z==sBAeKBHdpz@f-^|maqwL$~@8y?-ke_64rRcxH9iE_(WKLuvsZQnz zo~foLou>(bWZ7FD$euj7rFctk$^1~#85thl{K!7e#uHXKTdRiE&NC^(;=&0pS?k>r zs+eclBr;gHEfU8$zbTqCXeisB9C4{jOgWNTMh@>OyyaMV|)yE}WBUy0A~ zlJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU+(%D`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_QG8-Srha^UW?p7Ve7s&k V8nu5GJV~OY%>X76tkW9%2p67!(1Vw&>8HK$1lZOY7)ZHuV!q3hbg&n>7#8 zy;~on8`n;Lg-$)nO=1#vyyM5?eRt&R;V}C3?f2)Ol#oAUZ@6fmqSVKzfB;n_rwOIj zW{M>YS4TOyo4Ay`C*Xp2N5GTrcPH_HU68TA#Yi%y#?MQTsy;_^beZMyq7ixZFZQ10>Q4%J@wq~**|B0L2Y{-&;vTc zdBD2;v2Q|HisHJQz^vnTd(nW&{DkAF=&h;?y$Ic#gSO=NMJmDm#9BOE!~&PUGBT@&be+jYhUl*k3WQvU$Fh*;Pt>v7eEq86Oz)1QX(D65+`L5 zqvW1QF5M3zT}7YyhDEOQh9szLp@sz1){WAWIGL=KHd|W8s(0CJrbczO>x7iJJJ?E$N@XDoo?$G91S`g?6Lq!RusmH4De40}FjsIy|V0=acYg%ia0P za-0JN8tm#*PW2f$gMjNQJarABj)38Vh|+6g%mqL*4uJ0z?*kaMrIpFWSi`t)nVxD) hTdx?)lry&bIOE}Fiqca(tbbGP>K1>DLTZCH*gua#pO*jt literal 0 HcmV?d00001 diff --git a/fs-server/connector_api/__pycache__/urls.cpython-36.pyc b/fs-server/connector_api/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3588389f3ea9a7c6213c2ddc14b2cae363ef2747 GIT binary patch literal 470 zcmYjN%Sr<=6iqUZKC~i!MF*Kia3z!~bkl{1*xiVXp}BqNBpH&K+KMY(`yqaVpW!ZB zSN?)46N`^PPR>0!x%cKCb~^3X$G2;R5qd}eR_yqR+h*i|BaRCsaE1lR2u7Unpa?{m zg(Au#i~#cx!khRB@rcLI0TAAR=sRxuct)}YZ;esX{&3k)LTp&FYHk}Ea!)>7b+0xr zYI&+AtgxMNrOKg_5+;?>_ibIvyzncD}GmJ7HuI`V=amTfSTd(Cb+r~6d}TACN6x4px|=a9~o04msOMW;*)Q?beIA4^pU tl1@!(Krcbl-!5`iE~qcxE7!K!7mC*f4E)T@o`YSy8xl-#jN@Q)egWg}hkgJ6 literal 0 HcmV?d00001 diff --git a/fs-server/connector_api/__pycache__/views.cpython-36.pyc b/fs-server/connector_api/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a5b2945461997ce0042edba4ee821c2247f286db GIT binary patch literal 4327 zcmb_fOLH5?5#ASo#gicT6!oHI$u?{WR4gTN5+x;>q%2k`luMK&c`uvQ&X5GS4`^mV z2`JDP_^K*ben1XBq~co+IizyTe@G5{%}IYC2c7cuEC7-!#i>e6aC>@sdS-gMXTF}f zQLUE#zW9&dzFyR{e`+WGEbzDS$?LkNF^%bg7V3_!6K@1YXga3i&A@Uj$jl(;-3uic?Yjb3rw%Ikj-cnNjt8P!DIFS;ZHEMmXopDc%m| z!v$wS@x@>Q%{TQaTIYsi3KVa^Af(@G}3|}M~P@ZO|6~?Bm{ZE zBgRE)3(ndC`p~w6*!P0=fD`|a%WfP=;`1``k{+%;o?9!waf1mpYZrn?{z2p@_Pm7qFE@B6h zD4S?GHl|M6(H>1&5d4q}$h&9Pu`jQ8DMVXlk*^4b9AOT z2Gg1GwdR=0n^t;p9ae5CBj36@p9Y~nD#_|~e3JGs(-01Q`#TLrT9OC5Wa_gXmx)+L zvm&oI*7oC&uZ7-=7i+to2;pJ>;F!A>cX_n7E3Zi|u*x+=FN>+`b=zwy2(4~Et?+0! z7Cv{$r8KxyR_TMQ|Hb;&$&TAiE45uW@ZSqMj!<>1Xcwqq~4 zPrGyKcXG9f?*UC*0ZFt(?;wmXb@VW{o4P1L+B8KGh2qo3y+@BecW++5>25!GMN@#Gz7O?+ILnAAeU)T}Zz-ovNN8e(I7qxWwm z+EDN4BVbu#5SN&WS|c*oII@OTCpXf>A5i8;*iFnh$|Z10r;XStElsZt-*3dgm_+Oxk{T2ebGiEnl7$kw$%4OZA>!(;7B!c<7VvY$Zji54|j z{wRmpXO4={Dk@90VUEgv1vA%2+EMAT7JWD#^IzXTW@J3kh9y=wFuu{nx`k?52r;d<#|QN( z+`$^}kh7*Cu0TWW+QIyZR+=i)IGg6Wq76`2iVYgC)RyfCND}!xwSu-xQoAkPL%=5k z5@Fobh-GSZy<|VNI&nJ^bJVSPckBM3!irtl;^n+u|QwI z%|Tj{y{GU9IW4ttCWADOBhbYxIpBIbNv)(E@-!y{&b!CQ ~9_wn@~x$6%%?>ySv zNEejk#`r+~`oYH5-L1`yX8HI`ic92&cR`$b=3{pnI>*i&=<#%R5;Yg`a@7iFCqX+F z>0JDnR&2u7H;=c~jb(Bft&(D+>6TH_7j+vy%dG2l!_aGbL$B-S3`@`JwqZk3L4Cz6 zp{(d7=r{1Q^+9!t3^e9;vnI}CL~()0MIr>4q6U&KdZ%)x>j$2cTnfVRv=Be-AT!I< zBp=(zA)=2AC{(cPNDbr6nDr85y!e#JG|yz50_jyW5Q0lWMOsz~OSDZv@*fzit2;^D zoo?DGH2x2WEeLQ=LiF)=II&2zK3e!Ad=q$XoHC+Ck?_d^`Xi90Kq!#@YX;JTA;9>+ z5P$3c9+0O2uC=5581f9j=my}YpkUM-D$tt3XyK~@AQX_3Sj?cj#d3SrNI$ZNb|=U3 z;EJp;EFR>=9|71l=J;KLoX3h|NHj4U@?QqJogz~pO~Bu&3{6&gsUMYwr3~a@4=%Cv z`!bu+WM%3X{i*-$TdjWme_352s{y@FGrPgvSC&_Q0LyF146BWh6coh6!x;U~V{2EC zAhX0!XEUr0h^G`XOX&a*KlQhQ_{O$lPfj}C0kMC8TWt|=ka%s}P#q(X1LK-E$n}!l zYo83N6WwcmEO-XXjnslr`6{7n9BM&xrh-2%&`7 zAVO!KR53CabQcqJw>`#Q@k>-s;;LiASU2f+xl;o-zFqcu0LDwylMq+jA#xi8_b}yH zx~Ajbsb<%87k64*$AQe#5i-bn^Kg=RkMYTE5W-fV=M+Edz)s+4hN3{(3h*_rm(0@| zgs%!`CmKd2L)+QY2OXK{`w&;G!+;Zx+obAUB7~~qGa?E@$>bBuP>`yC<{lapaJ&Je zByV1I=8t`WyLtwm!4kgSs=6E|AHo@C?hw^IC4y19wMY2FWQTR zMU6RXtY;Ezu~;O2FOecoZ3SwZAGh_Ab|72G)uD%W8%@rVzyrkH6}aR-M-FeHs-Aah zi#YRdw5k_Ic4w}gZW4r@g6`YS`O__})2U2UNl_)ab7QlzcMI)j;o*HMTl8!ZGo+`s zdigk|$t=m0$35ZG-R!b5k87hpK`2o?jh1;8xO@Vy5#!}dW6OO zJD+d;2Jcvv`UHjTZE;TRTiHA4S9EogS3zj|QRbu{t_1jzgf0OSj`)gE&o^%T8_NkS AcmMzZ literal 0 HcmV?d00001 diff --git a/connector/connector_api/admin.py b/fs-server/connector_api/admin.py similarity index 100% rename from connector/connector_api/admin.py rename to fs-server/connector_api/admin.py diff --git a/connector/connector_api/apps.py b/fs-server/connector_api/apps.py similarity index 100% rename from connector/connector_api/apps.py rename to fs-server/connector_api/apps.py diff --git a/fs-server/connector_api/migrations/0001_initial.py b/fs-server/connector_api/migrations/0001_initial.py new file mode 100644 index 0000000..3b93a07 --- /dev/null +++ b/fs-server/connector_api/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2 on 2021-06-25 19:42 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Connector', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=120, unique=True)), + ('status', models.CharField(default='active', max_length=10)), + ('connector_type', models.CharField(blank=True, max_length=60, null=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/connector/connector_api/migrations/__init__.py b/fs-server/connector_api/migrations/__init__.py similarity index 100% rename from connector/connector_api/migrations/__init__.py rename to fs-server/connector_api/migrations/__init__.py diff --git a/fs-server/connector_api/migrations/__pycache__/0001_initial.cpython-36.pyc b/fs-server/connector_api/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c5e4de77a307237c4510672929c80a9a6ecbc0c GIT binary patch literal 902 zcmYjPy>in)5Z2wvwj}>xAcPm7Kt-Ztpv*9tNhSbB_LUl7dYOC7$6m zcp-{wsr(95?8){RX>PUO{%QBSeKQ;eKaYQZE|}x|asGQ;)KBqLhbX`Sk~$fQNk(Hz zET$=o*?R{VxZfRcC7HS3SnLA*=!BgW<~SiWL8hi!)T+oU)6EKyX?2xY-}V`za*C(= zfkHYl0Vk$FVm5VRS9WGypul8r<^chBNhTCJ8`N!450Ni}Ss(o#_)CTn0on#&ErTUR zJZ$j@p1`=pPg_jj8Ad#}8PhK8fu{((Sh6XJhp>+`yfpshw)t!0pA~s7le*9*NVF8S z1TN~3n1N{Og6G8-E&xo>l(6%8Tc4o{E<$E{ASa?pYtt{a%7k958+#|+PrpKF!L3;Q?Y-`spSU#o7@ zC@>u>-y+|4La*&XQOeB@{c`kcEYga}3bsiNIpMn^|S$9yxxVY$$D@q2ixeH0#bsq4Cg(h(VvJu=33kF_yj$M`T4`LsBM h+jiV`LjB5iXp8K6U27rQjCZo8@ttL(vSDN5v45Ja02TlM literal 0 HcmV?d00001 diff --git a/fs-server/connector_api/migrations/__pycache__/__init__.cpython-36.pyc b/fs-server/connector_api/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a1bb5de3a408e0c777ab79d90590fa5169a735d GIT binary patch literal 165 zcmXr!<>lJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUqSjA`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_QG8-SrhaZ_dQoCYW`16= getdjpUS>&ryk0@&Ee@O9{FKt1R6CGe#X!se09IKn@c;k- literal 0 HcmV?d00001 diff --git a/connector/connector_api/models.py b/fs-server/connector_api/models.py similarity index 100% rename from connector/connector_api/models.py rename to fs-server/connector_api/models.py diff --git a/connector/connector_api/serializers.py b/fs-server/connector_api/serializers.py similarity index 100% rename from connector/connector_api/serializers.py rename to fs-server/connector_api/serializers.py diff --git a/connector/connector_api/tests.py b/fs-server/connector_api/tests.py similarity index 100% rename from connector/connector_api/tests.py rename to fs-server/connector_api/tests.py diff --git a/connector/connector_api/urls.py b/fs-server/connector_api/urls.py similarity index 100% rename from connector/connector_api/urls.py rename to fs-server/connector_api/urls.py diff --git a/connector/connector_api/views.py b/fs-server/connector_api/views.py similarity index 100% rename from connector/connector_api/views.py rename to fs-server/connector_api/views.py diff --git a/connector/connector_views/__init__.py b/fs-server/connector_views/__init__.py similarity index 100% rename from connector/connector_views/__init__.py rename to fs-server/connector_views/__init__.py diff --git a/fs-server/connector_views/__pycache__/__init__.cpython-36.pyc b/fs-server/connector_views/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f28e40afda4088405612a3a4735728bf02888d80 GIT binary patch literal 156 zcmXr!<>lJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU!M9I`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_QG8iuYI(7Ke0*kJW=VX! XUP0w84x8Nkl+v73JCGH{K+FIDvUe$P literal 0 HcmV?d00001 diff --git a/fs-server/connector_views/__pycache__/admin.cpython-36.pyc b/fs-server/connector_views/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28786cfff444b1d71918e55677d20589691e0b8e GIT binary patch literal 197 zcmXr!<>lJlbU8tRfq~&M5W@izkmUfx#R5Pgg&~D8has0Sijk2ag(;Xplldi3ltGj6 z7HeWkZf2gJCQ}q&N>*ZCdcIzAeqKpYW>OKzfRzkI%s>iE{BqOJ$j?pH&rPhT&`(P& z$}KKQOwLBIbn^>R^Yqh-b&FGr%2JE;f#&3;CYR(F#g}EKmKW=TEz&Efyv1RYo1ape NlWNBZG`bjw830A2G@Aeb literal 0 HcmV?d00001 diff --git a/fs-server/connector_views/__pycache__/models.cpython-36.pyc b/fs-server/connector_views/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3be17038c65ccff83751a4b3f39d2bb2ec72c68e GIT binary patch literal 154 zcmXr!<>lJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU+(%D`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_QG8iuYI(7KZhlH?PO)A= UKobPQo%&+m8RJ z2+M;z-RlUS>|x7LP}me>*ICE+)xE41X4=@&*$ADUukYZ|wVJJhP0-us`#xr2`!(3g zy%2j80>OM-iMA0fHybgRR%5Bz!w*f&3Mw&o69;w;R(!v-Xlsd3e7bt_opWteQ^G~~ R9(RgnKu=gi!%X7;_b+r>fVKbt literal 0 HcmV?d00001 diff --git a/fs-server/connector_views/__pycache__/views.cpython-36.pyc b/fs-server/connector_views/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c3ab40fe3d5508cdfdb9180b2d271657c17165e GIT binary patch literal 1443 zcmbtU&2HQ_5GJXAt)19LT%>4G_*8Tc*-g+}Q4~qj1PD+VNPI}Di=r&KyV^+NmgKt5 zLO!`Y7JY%fKp&uwk{)y|5FoFRQ$A9$z44`oN+3BilD_%)aYkQnZ>O(6`RDoH0U`gA zjf=s)i=m%m;)K(RWc^Ar3ZGT1_A-y!m{<9AkOj{6tFVr;$l0`tvzP}w{FP)0k9dqV z#qP zonkVi1@rxe2d9-}h`4%R&Y^-*KDr^65x(Wx=6LoA= z1h=~mj>_a0R0as1XH7Po|TKUmX?%zzk86)KU@!hY*yMy z)};XjZj5skvUs>2Lk}noGDBXEQRrTVso~=ENo~;$Qr);tE9{d`D+8zd>DOJ|H zP|5D@0K@Tp17ilJ7|al3c~eS^x9}GMywD!@skh-X`2MSJOw@YZJ7a%*c^b6ABF1i+ zNm_h;8n&zrxqlN?`y2Zd@u#pJlPBaEc}kia6jg-`gaMe&b>(8dL z!jpqWnuCcFg@HYl>Hy#AbzT z*&gfS@9!Nw$bWeBq+?Qd{<1Lh&R@u~>5_+!etdA`9{ILYx&&N!RW<^JQHiE6jHoY+ zU0|s_Oxf;c^4#KOyPGuokSC`)8%)be zFK9@wUGbD{gyA+epk>pgdi4UCCqnD&23Yk!pS)O>qgrxN>Au!Lr%AT+ zA)@C}naRp%w^g+daM$|EcA_h9mvDpnWmm-CBFCx{-`T&JwmY$;x7;1G*u(9=2dl7F AYybcN literal 0 HcmV?d00001 diff --git a/connector/connector_views/admin.py b/fs-server/connector_views/admin.py similarity index 100% rename from connector/connector_views/admin.py rename to fs-server/connector_views/admin.py diff --git a/connector/connector_views/apps.py b/fs-server/connector_views/apps.py similarity index 100% rename from connector/connector_views/apps.py rename to fs-server/connector_views/apps.py diff --git a/connector/connector_views/migrations/__init__.py b/fs-server/connector_views/migrations/__init__.py similarity index 100% rename from connector/connector_views/migrations/__init__.py rename to fs-server/connector_views/migrations/__init__.py diff --git a/fs-server/connector_views/migrations/__pycache__/__init__.cpython-36.pyc b/fs-server/connector_views/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c447d423014dd9d854922dc567b6a1457d322266 GIT binary patch literal 167 zcmXr!<>lJlbUA?m2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUm^M#`MIh3xrr4O z`e}(pxy2=k$=L{&Zhk>(o_<=fZgFZ+S!$7fa(-T3YH~?_QG8iuYI(7KZf1H>Vo7Fx iUa@|Bd}dx|NqoFsLFFwDo80`A(wtN~kZr|4%m4tuMJ?w5 literal 0 HcmV?d00001 diff --git a/connector/connector_views/models.py b/fs-server/connector_views/models.py similarity index 100% rename from connector/connector_views/models.py rename to fs-server/connector_views/models.py diff --git a/connector/connector_views/tests.py b/fs-server/connector_views/tests.py similarity index 100% rename from connector/connector_views/tests.py rename to fs-server/connector_views/tests.py diff --git a/connector/connector_views/urls.py b/fs-server/connector_views/urls.py similarity index 100% rename from connector/connector_views/urls.py rename to fs-server/connector_views/urls.py diff --git a/connector/connector_views/views.py b/fs-server/connector_views/views.py similarity index 100% rename from connector/connector_views/views.py rename to fs-server/connector_views/views.py diff --git a/fs-server/db.sqlite3 b/fs-server/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..ce4da998ca71587bc592e887a5a94584a17769bf GIT binary patch literal 143360 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 Date: Sat, 26 Jun 2021 20:08:58 +0530 Subject: [PATCH 062/163] Various style related changes --- fs-server/db.sqlite3 | Bin 143360 -> 143360 bytes fs-server/static/css/style.css | 32 +++++++-- fs-server/static/images/favicon.ico | Bin 0 -> 4286 bytes fs-server/static/js/app.js | 45 +++++++++--- fs-server/templates/base.html | 65 +++++++++++++++++ fs-server/templates/connection.html | 106 +++++++--------------------- fs-server/templates/logs.html | 70 ++---------------- fs-server/templates/status.html | 75 +++----------------- 8 files changed, 168 insertions(+), 225 deletions(-) create mode 100644 fs-server/static/images/favicon.ico create mode 100644 fs-server/templates/base.html diff --git a/fs-server/db.sqlite3 b/fs-server/db.sqlite3 index ce4da998ca71587bc592e887a5a94584a17769bf..29007bfe757aa4489e45f248c96318597ba8aa01 100644 GIT binary patch delta 439 zcmZp8z|ru4V}dlJ{6raNR(S?J=ffLQ7Q}Nf@ryC=ck_#FY~s3nDcZE7bPexDi8nwf3kCG delta 52 zcmZp8z|ru4V}dlJ>_i!7R#^r;nGG9L7Q`=Rnc%RQrQwhKrU@(p%`6v|vs_?Q014~G{}nw~x!PTHBS|T5L^l0yOR>jDR2pf2lv1c@Bf(?lie~h{w-)8`E;P zn4{5*xdV#PQZVDfJcs$ODE?Z!-5TV65OWD*;crxvkEv`&j4?+*G1wN2*EiqmuVVcu zttgvCt$^~-66$aLgZ|!f>Mu$s$|fE5T_5`S@B*|S7J;$Sk^Uc}W=6s25)9(KNoDT+ zBpb}Dyt?@~&%;-8n_80AJzMek#E+YQ#c=xyjPkFx~ICI=K*3d>R1hqZ@`xICW zC*dx<2kCwU7iPzwG*BZuveP zUc(oVpOc}#)si>Px$k}!^?vOm^vgPbb(f$cwuAh>LOs^2CM#*x>Z^w8uLb(LSERpH zwiNYPNvl?0{_A{4cXz12XTqh&+IKzVZT30$yv{%BFJJTHm}>P$UeH+|_&=Ba13ZDL zO=ll;uOY=fs&$eR?aL)_6&5+1+u8?e5&Ab6v#Jc%Fh*yZ?w})}9B5x|1l_T!L-i{_ z`=NLa96&oBp}&(cnxhgfGfzLh84mlQxc9a1rKeu=X>UA)P0*kkb;3N!e{7-|bT8>{ zC2C|=l^N@ypupGv4?s5DR9KQwmwk=7EoGKIeQS>vc4 zT1%e;RZ8}L)*FHUIs$$~^Zd@F=WnU=e3S6H;&HDldEN7y!57 + + + + + + Farmstack + + + + + + + + + + + + + + + + +
+
+ +
+
+

Setting up connectors...

+
+
+
+
+
+
+ +
+
+ +
+ + {% block content %}{% endblock content %} +
+ + + \ No newline at end of file diff --git a/fs-server/templates/connection.html b/fs-server/templates/connection.html index 3608e9d..cb5e380 100644 --- a/fs-server/templates/connection.html +++ b/fs-server/templates/connection.html @@ -1,78 +1,29 @@ - - - - - - - Farmstack +{% extends "base.html" %} - - - - - - - - -
-
- -
-
-

Setting up connectors...

-
-
- - -
-
-
-
- -
-
- -
- +{% block content %} -
-
-