[roll] Update third-party dart packages
Updated:
Change-Id: I26781179843be628cd3f7a8268cf6e172179c067
diff --git a/grpc/.github/ISSUE_TEMPLATE b/grpc/.github/ISSUE_TEMPLATE
deleted file mode 100644
index f9478b2..0000000
--- a/grpc/.github/ISSUE_TEMPLATE
+++ /dev/null
@@ -1,17 +0,0 @@
-<short description>
-
-<version of the grpc-dart packages used; see your `pubspec.lock` file>
-
-## Repro steps
-
-1. step1
-1. step2
-1. step3
-
-Expected result: <describe what should have happened>
-
-Actual result: <describe what actually happened>
-
-## Details
-
-<Include any other relevant details, logs, etc.>
diff --git a/grpc/.gitignore b/grpc/.gitignore
deleted file mode 100644
index e851cc5..0000000
--- a/grpc/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-# Files and directories created by pub
-.dart_tool/
-.packages
-.pub/
-build/
-
-# Remove the following pattern if you wish to check in your lock file
-pubspec.lock
-
-# Directory created by dartdoc
-doc/api/
-
diff --git a/grpc/.travis.yml b/grpc/.travis.yml
deleted file mode 100644
index 24dde5c..0000000
--- a/grpc/.travis.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-language: dart
-sudo: false
-
-# Run against both the dev and channel.
-dart:
- - stable
- - dev
-
-# Define test tasks to run.
-dart_task:
- - test: --platform vm
-
-# Only run one instance of the formatter and the analyzer, rather than running
-# them against each Dart version.
-matrix:
- include:
- # Wish we could exclude `example` in `analysis_options.yaml` but it seems
- # blocked by https://github.com/dart-lang/sdk/issues/26212
- - dart: dev
- dart_task: dartfmt
- script:
- - dartanalyzer lib test
- - for example in example/*; do (cd $example; echo [Analyzing $example]; pub get; dartanalyzer .); done
- - (cd interop; echo [Analyzing interop]; pub get; dartanalyzer .)
-
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
- only: [master]
-
-os:
- - linux
- - osx
- - windows
-
-cache:
- directories:
- - $HOME/.pub-cache
diff --git a/grpc/AUTHORS b/grpc/AUTHORS
deleted file mode 100644
index 7a6111c..0000000
--- a/grpc/AUTHORS
+++ /dev/null
@@ -1,8 +0,0 @@
-# Below is a list of people and organizations that have contributed
-# to the project. Names should be added to the list like so:
-#
-# Name/Organization <email address>
-
-Google Inc.
-German Saprykin <saprykin.h@gmail.com>
-Alexandre Ardhuin <alexandre.ardhuin@gmail.com>
diff --git a/grpc/BUILD.gn b/grpc/BUILD.gn
deleted file mode 100644
index 96f2fa0..0000000
--- a/grpc/BUILD.gn
+++ /dev/null
@@ -1,21 +0,0 @@
-# This file is generated by importer.py for grpc-1.0.3
-
-import("//build/dart/dart_library.gni")
-
-dart_library("grpc") {
- package_name = "grpc"
-
- # This parameter is left empty as we don't care about analysis or exporting
- # these sources outside of the tree.
- sources = []
-
- disable_analysis = true
-
- deps = [
- "//third_party/dart-pkg/pub/async",
- "//third_party/dart-pkg/pub/meta",
- "//third_party/dart-pkg/pub/googleapis_auth",
- "//third_party/dart-pkg/pub/http",
- "//third_party/dart-pkg/pub/http2",
- ]
-}
diff --git a/grpc/CHANGELOG.md b/grpc/CHANGELOG.md
deleted file mode 100644
index 361870f..0000000
--- a/grpc/CHANGELOG.md
+++ /dev/null
@@ -1,122 +0,0 @@
-## 1.0.3
-
-* Allow custom user agent with a `userAgent` argument for `ChannelOptions()`.
-* Allow specifying `authority` for `ChannelCredentials.insecure()`.
-* Add `userAgent` as an optional named argument for `clientConnection.createCallHeaders()`.
-
-## 1.0.2
-
-* Fix bug where the server would crash if the client would break the connection.
-
-## 1.0.1
-
-* Add `service_api.dart` that only contains the minimal imports needed by the code generated by
- protoc_plugin.
-
-## 1.0.0+1
-
-* Support package:http2 1.0.0.
-
-## 1.0.0
-
-* Graduate package to 1.0.
-
-## 0.6.8+1
-
-* Removes stray files that where published by accident in version 0.6.8.
-
-## 0.6.8
-
-* Calling `terminate()` or `shutdown()` on a channel doesn't throw error if the
-channel is not yet open.
-
-## 0.6.7
-
-* Support package:test 1.5.
-
-## 0.6.6
-
-* Support `package:http` `>=0.11.3+17 <0.13.0`.
-* Update `package:googleapis_auth` to `^0.2.5+3`.
-
-## 0.6.5
-
-* Interceptors are now async.
-
-## 0.6.4
-
-* Update dependencies to be compatible with Dart 2.
-
-## 0.6.3
-
-* Make fields of `StatusCode` const rather than final.
-
-## 0.6.2
-
-* Allow for non-ascii header values.
-
-## 0.6.1
-
-* More fixes to update to Dart 2 core library APIs.
-
-## 0.6.0+1
-
-* Updated implementation to use new Dart 2 APIs using
-[dart2_fix](https://github.com/dart-lang/dart2_fix).
-
-## 0.6.0
-
-* Dart SDK upper constraint raised to declare compatability with Dart 2.0 stable.
-
-## 0.5.0
-
-* Breaking change: The package now exclusively supports Dart 2.
-* Fixed tests to pass in Dart 2.
-* Added support for Interceptors ([issue #79](https://github.com/grpc/grpc-dart/issues/79)); thanks to [@mogol](https://github.com/mogol) for contributing!
-
-## 0.4.1
-
-* Fixes for supporting Dart 2.
-
-## 0.4.0
-
-* Moved TLS credentials for server into a separate class.
-* Added support for specifying the address for the server, and support for
- serving on an ephemeral port.
-
-## 0.3.1
-
-* Split out TLS credentials to a separate class.
-
-## 0.3.0
-
-* Added authentication metadata providers, optimized for use with Google Cloud.
-* Added service URI to metadata provider API, needed for Json Web Token generation.
-* Added authenticated cloud-to-prod interoperability tests.
-* Refactored connection logic to throw initial connection errors early.
-
-## 0.2.1
-
-* Updated generated code in examples using latest protoc compiler plugin.
-* Dart 2.0 fixes.
-* Changed license to Apache 2.0.
-
-## 0.2.0
-
-* Implemented support for per-RPC metadata providers. This can be used for
- authentication providers which may need to obtain or refresh a token before
- the RPC is sent.
-
-## 0.1.0
-
-* Core gRPC functionality is implemented and passes
-[gRPC compliance tests](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md).
-
-The API is shaping up, but may still change as more advanced features are implemented.
-
-## 0.0.1
-
-* Initial version.
-
-This package is in a very early and experimental state. We do not recommend
-using it for anything but experiments.
diff --git a/grpc/CODE-OF-CONDUCT.md b/grpc/CODE-OF-CONDUCT.md
deleted file mode 100644
index 9d4213e..0000000
--- a/grpc/CODE-OF-CONDUCT.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Community Code of Conduct
-
-gRPC follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).
diff --git a/grpc/CONTRIBUTING.md b/grpc/CONTRIBUTING.md
deleted file mode 100644
index b87c68f..0000000
--- a/grpc/CONTRIBUTING.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# How to contribute
-
-We definitely welcome your patches and contributions to gRPC!
-
-If you are new to github, please start by reading [Pull Request
-howto](https://help.github.com/articles/about-pull-requests/)
-
-## Legal requirements
-
-In order to protect both you and ourselves, you will need to sign the
-[Contributor License
-Agreement](https://identity.linuxfoundation.org/projects/cncf).
-
-## Code style
-
-We follow the [Effective
-Dart](https://www.dartlang.org/guides/language/effective-dart/style) code style.
-We rely on auto-formatting all whitespace -- this avoids having to discuss
-formatting during reviews. To format your code, run `dartfmt` from the root, or
-use the similar action in your [favorite Dart
-editor](https://www.dartlang.org/tools).
-
-All code must pass Dart analysis. If you are using an IDE or Dart-enabled editor
-it should raise analysis issues as you edit; alternatively validate from the
-Terminal:
-
-```
-dartanalyzer lib test
-```
-
-All analysis warnings and errors must be fixed; hints should be considered.
-
-## Running tests
-
-```
-pub get
-pub run test
-```
-
-## Guidelines for Pull Requests
-
-How to get your contributions merged smoothly and quickly.
-
-- Create **small PRs** that are narrowly focused on **addressing a single
-concern**.
-
-- For speculative changes, consider opening an issue and discussing it first.
-
-- Provide a good **PR description** as a record of **what** change is being made
-and **why** it was made. Link to a github issue if it exists.
-
-- Unless your PR is trivial, you should expect there will be review comments
-that you'll need to address before merging. We expect you to be reasonably
-responsive to those comments, otherwise the PR will be closed after 2-3 weeks of
-inactivity.
-
-- Keep your PR up to date with upstream/master (if there are merge conflicts, we
-can't really merge your change).
-
-- **All tests need to be passing** before your change can be merged. We
-recommend you **run tests locally** before creating your PR to catch breakages
-early on.
-
-- Exceptions to the rules can be made if there's a compelling reason for doing
-so.
diff --git a/grpc/LICENSE b/grpc/LICENSE
deleted file mode 100644
index c11903c..0000000
--- a/grpc/LICENSE
+++ /dev/null
@@ -1,176 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
diff --git a/grpc/README.md b/grpc/README.md
deleted file mode 100644
index 1700aa8..0000000
--- a/grpc/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-The [Dart](https://www.dart.dev/) implementation of
-[gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first.
-
-[![Build Status](https://travis-ci.org/grpc/grpc-dart.svg?branch=master)](https://travis-ci.org/grpc/grpc-dart)
-[![pub package](https://img.shields.io/pub/v/grpc.svg)](https://pub.dev/packages/grpc)
-
-# Usage
-
-See the [Dart gRPC Quickstart](https://grpc.io/docs/quickstart/dart.html).
-
-# Status
-
-If you experience issues, or if you have feature requests,
-please [open an issue](https://github.com/dart-lang/grpc-dart/issues).
-
-# Notes
-
-This library requires Dart SDK version 2.0 or later.
-
-It currently supports the the [Flutter](https://flutter.dev/) and
-[Dart native](https://dart.dev/platforms) platforms. The potential
-addition of gRPC-Web is tracked in [issue 43](https://github.com/grpc/grpc-dart/issues/43).
diff --git a/grpc/analysis_options.yaml b/grpc/analysis_options.yaml
deleted file mode 100644
index b2d4046..0000000
--- a/grpc/analysis_options.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-# Lint rules and documentation, see http://dart-lang.github.io/linter/lints
-linter:
- rules:
- - avoid_init_to_null
- - cancel_subscriptions
- - close_sinks
- - directives_ordering
- - hash_and_equals
- - iterable_contains_unrelated_type
- - list_remove_unrelated_type
- - prefer_final_fields
- - prefer_final_locals
- - prefer_is_not_empty
- - test_types_in_equals
- - unrelated_type_equality_checks
- - valid_regexps
diff --git a/grpc/example/README.md b/grpc/example/README.md
deleted file mode 100644
index 963d131..0000000
--- a/grpc/example/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Four code examples are available:
-
-1. [`/helloworld/`](https://github.com/grpc/grpc-dart/tree/master/example/helloworld):
- A demonstration of using the Dart gRPC library to perform unary RPs.
-
-1. [`/googleapis/`](https://github.com/grpc/grpc-dart/tree/master/example/googleapis):
- A demonstration of using the Dart gRPC library to communicate with Google APIs.
-
-1. [`/metadata/`](https://github.com/grpc/grpc-dart/tree/master/example/metadata):
- A demonstration of how to handle custom metadata, cancellation, and timeouts in Dart gRPC.
-
-1. [`/route_guide/`](https://github.com/grpc/grpc-dart/tree/master/example/route_guide):
- A demonstration of how to perform unary, client streaming, server streaming and full duplex RPCs.
-
-For a complete, step-wise working example, see the [Dart gRPC Quickstart](https://grpc.io/docs/quickstart/dart.html).
diff --git a/grpc/example/googleapis/.gitignore b/grpc/example/googleapis/.gitignore
deleted file mode 100644
index f67f1c8..0000000
--- a/grpc/example/googleapis/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-logging-service-account.json
diff --git a/grpc/example/googleapis/README.md b/grpc/example/googleapis/README.md
deleted file mode 100644
index d78b5af..0000000
--- a/grpc/example/googleapis/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Description
-The googleapis client demonstrates how to use Dart gRPC libraries to communicate
-with Google APIs.
-
-# Set up Google Cloud Platform project
-This example uses the Stackdriver Logging API. Please follow the documentation on
-[Stackdriver Logging Documentation](https://cloud.google.com/logging/docs/) to create
-a project and enable the logging API.
-
-Then follow the documentation to
-[create a service account](https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount).
-This example uses the Logging/Logs Writer role.
-
-Create a new service key, download the JSON file for it, and save it as
-`logging-service-account.json`.
-
-# Run the sample code
-To run the example, assuming you are in the root of the googleapis folder, i.e.,
-.../example/googleapis/, first get the dependencies by running:
-
-```sh
-$ pub get
-```
-
-Then, to run the logging client sample:
-
-```sh
-$ pub run googleapis:logging
-```
-
-# Regenerate the stubs
-The Dart gRPC stubs and message classes are generated based on protobuf definition
-files from [googleapis/googleapis](https://github.com/googleapis/googleapis).
-
-To regenerate them, you will need to check out both
-[googleapis/googleapis](https://github.com/googleapis/googleapis) and
-[google/protobuf](https://github.com/google/protobuf).
-
-You will also need to have protoc version 3.0.0 or higher and the Dart protoc
-plugin version 0.7.9 or higher on your PATH.
-
-To install protoc, see the instructions on
-[the Protocol Buffers website](https://developers.google.com/protocol-buffers/).
-
-The easiest way to get the Dart protoc plugin is by running
-
-```sh
-$ pub global activate protoc_plugin
-```
-
-and follow the directions to add `~/.pub-cache/bin` to your PATH, if you haven't
-already done so.
-
-You can now regenerate the Dart files. Set the `PROTOBUF` and `GOOGLEAPIS`
-environment variables to point to your clone of
-[google/protobuf](https://github.com/google/protobuf) and
-[googleapis/googleapis](https://github.com/googleapis/googleapis), respectively,
-and then run
-
-```sh
-$ tool/regenerate.sh
-```
diff --git a/grpc/example/googleapis/bin/logging.dart b/grpc/example/googleapis/bin/logging.dart
deleted file mode 100644
index f505713..0000000
--- a/grpc/example/googleapis/bin/logging.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:grpc/grpc.dart';
-
-import 'package:googleapis/src/generated/google/api/monitored_resource.pb.dart';
-import 'package:googleapis/src/generated/google/logging/type/log_severity.pb.dart';
-import 'package:googleapis/src/generated/google/logging/v2/log_entry.pb.dart';
-import 'package:googleapis/src/generated/google/logging/v2/logging.pbgrpc.dart';
-
-Future<void> main() async {
- final serviceAccountFile = new File('logging-service-account.json');
- if (!serviceAccountFile.existsSync()) {
- print('File logging-service-account.json not found. Please follow the '
- 'steps in README.md to create it.');
- exit(-1);
- }
-
- final scopes = [
- 'https://www.googleapis.com/auth/cloud-platform',
- 'https://www.googleapis.com/auth/logging.write',
- ];
-
- final authenticator = new ServiceAccountAuthenticator(
- serviceAccountFile.readAsStringSync(), scopes);
- final projectId = authenticator.projectId;
-
- final channel = new ClientChannel('logging.googleapis.com');
- final logging =
- new LoggingServiceV2Client(channel, options: authenticator.toCallOptions);
-
- final request = new WriteLogEntriesRequest()
- ..entries.add(new LogEntry()
- ..logName = 'projects/$projectId/logs/example'
- ..severity = LogSeverity.INFO
- ..resource = (new MonitoredResource()..type = 'global')
- ..textPayload = 'This is a log entry!');
- await logging.writeLogEntries(request);
-
- await channel.shutdown();
-}
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/label.pb.dart b/grpc/example/googleapis/lib/src/generated/google/api/label.pb.dart
deleted file mode 100644
index de8c072..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/label.pb.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_label;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import 'label.pbenum.dart';
-
-export 'label.pbenum.dart';
-
-class LabelDescriptor extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('LabelDescriptor')
- ..aOS(1, 'key')
- ..e<LabelDescriptor_ValueType>(
- 2,
- 'valueType',
- PbFieldType.OE,
- LabelDescriptor_ValueType.STRING,
- LabelDescriptor_ValueType.valueOf,
- LabelDescriptor_ValueType.values)
- ..aOS(3, 'description')
- ..hasRequiredFields = false;
-
- LabelDescriptor() : super();
- LabelDescriptor.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- LabelDescriptor.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- LabelDescriptor clone() => new LabelDescriptor()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static LabelDescriptor create() => new LabelDescriptor();
- static PbList<LabelDescriptor> createRepeated() =>
- new PbList<LabelDescriptor>();
- static LabelDescriptor getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyLabelDescriptor();
- return _defaultInstance;
- }
-
- static LabelDescriptor _defaultInstance;
- static void $checkItem(LabelDescriptor v) {
- if (v is! LabelDescriptor) checkItemFailed(v, 'LabelDescriptor');
- }
-
- String get key => $_getS(0, '');
- set key(String v) {
- $_setString(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- LabelDescriptor_ValueType get valueType => $_getN(1);
- set valueType(LabelDescriptor_ValueType v) {
- setField(2, v);
- }
-
- bool hasValueType() => $_has(1);
- void clearValueType() => clearField(2);
-
- String get description => $_getS(2, '');
- set description(String v) {
- $_setString(2, v);
- }
-
- bool hasDescription() => $_has(2);
- void clearDescription() => clearField(3);
-}
-
-class _ReadonlyLabelDescriptor extends LabelDescriptor
- with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/label.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/api/label.pbenum.dart
deleted file mode 100644
index 3badf8c..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/label.pbenum.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_label_pbenum;
-
-// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
-import 'dart:core' show int, dynamic, String, List, Map;
-import 'package:protobuf/protobuf.dart';
-
-class LabelDescriptor_ValueType extends ProtobufEnum {
- static const LabelDescriptor_ValueType STRING =
- const LabelDescriptor_ValueType._(0, 'STRING');
- static const LabelDescriptor_ValueType BOOL =
- const LabelDescriptor_ValueType._(1, 'BOOL');
- static const LabelDescriptor_ValueType INT64 =
- const LabelDescriptor_ValueType._(2, 'INT64');
-
- static const List<LabelDescriptor_ValueType> values =
- const <LabelDescriptor_ValueType>[
- STRING,
- BOOL,
- INT64,
- ];
-
- static final Map<int, dynamic> _byValue = ProtobufEnum.initByValue(values);
- static LabelDescriptor_ValueType valueOf(int value) =>
- _byValue[value] as LabelDescriptor_ValueType;
- static void $checkItem(LabelDescriptor_ValueType v) {
- if (v is! LabelDescriptor_ValueType)
- checkItemFailed(v, 'LabelDescriptor_ValueType');
- }
-
- const LabelDescriptor_ValueType._(int v, String n) : super(v, n);
-}
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/label.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/api/label.pbjson.dart
deleted file mode 100644
index 36cc915..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/label.pbjson.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_label_pbjson;
-
-const LabelDescriptor$json = const {
- '1': 'LabelDescriptor',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
- const {
- '1': 'value_type',
- '3': 2,
- '4': 1,
- '5': 14,
- '6': '.google.api.LabelDescriptor.ValueType',
- '10': 'valueType'
- },
- const {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},
- ],
- '4': const [LabelDescriptor_ValueType$json],
-};
-
-const LabelDescriptor_ValueType$json = const {
- '1': 'ValueType',
- '2': const [
- const {'1': 'STRING', '2': 0},
- const {'1': 'BOOL', '2': 1},
- const {'1': 'INT64', '2': 2},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pb.dart b/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pb.dart
deleted file mode 100644
index c75ee71..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pb.dart
+++ /dev/null
@@ -1,186 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_monitored_resource;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import 'label.pb.dart';
-
-class MonitoredResourceDescriptor extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('MonitoredResourceDescriptor')
- ..aOS(1, 'type')
- ..aOS(2, 'displayName')
- ..aOS(3, 'description')
- ..pp<LabelDescriptor>(4, 'labels', PbFieldType.PM,
- LabelDescriptor.$checkItem, LabelDescriptor.create)
- ..aOS(5, 'name')
- ..hasRequiredFields = false;
-
- MonitoredResourceDescriptor() : super();
- MonitoredResourceDescriptor.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- MonitoredResourceDescriptor.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- MonitoredResourceDescriptor clone() =>
- new MonitoredResourceDescriptor()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static MonitoredResourceDescriptor create() =>
- new MonitoredResourceDescriptor();
- static PbList<MonitoredResourceDescriptor> createRepeated() =>
- new PbList<MonitoredResourceDescriptor>();
- static MonitoredResourceDescriptor getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyMonitoredResourceDescriptor();
- return _defaultInstance;
- }
-
- static MonitoredResourceDescriptor _defaultInstance;
- static void $checkItem(MonitoredResourceDescriptor v) {
- if (v is! MonitoredResourceDescriptor)
- checkItemFailed(v, 'MonitoredResourceDescriptor');
- }
-
- String get type => $_getS(0, '');
- set type(String v) {
- $_setString(0, v);
- }
-
- bool hasType() => $_has(0);
- void clearType() => clearField(1);
-
- String get displayName => $_getS(1, '');
- set displayName(String v) {
- $_setString(1, v);
- }
-
- bool hasDisplayName() => $_has(1);
- void clearDisplayName() => clearField(2);
-
- String get description => $_getS(2, '');
- set description(String v) {
- $_setString(2, v);
- }
-
- bool hasDescription() => $_has(2);
- void clearDescription() => clearField(3);
-
- List<LabelDescriptor> get labels => $_getList(3);
-
- String get name => $_getS(4, '');
- set name(String v) {
- $_setString(4, v);
- }
-
- bool hasName() => $_has(4);
- void clearName() => clearField(5);
-}
-
-class _ReadonlyMonitoredResourceDescriptor extends MonitoredResourceDescriptor
- with ReadonlyMessageMixin {}
-
-class MonitoredResource_LabelsEntry extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('MonitoredResource_LabelsEntry')
- ..aOS(1, 'key')
- ..aOS(2, 'value')
- ..hasRequiredFields = false;
-
- MonitoredResource_LabelsEntry() : super();
- MonitoredResource_LabelsEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- MonitoredResource_LabelsEntry.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- MonitoredResource_LabelsEntry clone() =>
- new MonitoredResource_LabelsEntry()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static MonitoredResource_LabelsEntry create() =>
- new MonitoredResource_LabelsEntry();
- static PbList<MonitoredResource_LabelsEntry> createRepeated() =>
- new PbList<MonitoredResource_LabelsEntry>();
- static MonitoredResource_LabelsEntry getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyMonitoredResource_LabelsEntry();
- return _defaultInstance;
- }
-
- static MonitoredResource_LabelsEntry _defaultInstance;
- static void $checkItem(MonitoredResource_LabelsEntry v) {
- if (v is! MonitoredResource_LabelsEntry)
- checkItemFailed(v, 'MonitoredResource_LabelsEntry');
- }
-
- String get key => $_getS(0, '');
- set key(String v) {
- $_setString(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- String get value => $_getS(1, '');
- set value(String v) {
- $_setString(1, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyMonitoredResource_LabelsEntry
- extends MonitoredResource_LabelsEntry with ReadonlyMessageMixin {}
-
-class MonitoredResource extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('MonitoredResource')
- ..aOS(1, 'type')
- ..pp<MonitoredResource_LabelsEntry>(
- 2,
- 'labels',
- PbFieldType.PM,
- MonitoredResource_LabelsEntry.$checkItem,
- MonitoredResource_LabelsEntry.create)
- ..hasRequiredFields = false;
-
- MonitoredResource() : super();
- MonitoredResource.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- MonitoredResource.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- MonitoredResource clone() => new MonitoredResource()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static MonitoredResource create() => new MonitoredResource();
- static PbList<MonitoredResource> createRepeated() =>
- new PbList<MonitoredResource>();
- static MonitoredResource getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyMonitoredResource();
- return _defaultInstance;
- }
-
- static MonitoredResource _defaultInstance;
- static void $checkItem(MonitoredResource v) {
- if (v is! MonitoredResource) checkItemFailed(v, 'MonitoredResource');
- }
-
- String get type => $_getS(0, '');
- set type(String v) {
- $_setString(0, v);
- }
-
- bool hasType() => $_has(0);
- void clearType() => clearField(1);
-
- List<MonitoredResource_LabelsEntry> get labels => $_getList(1);
-}
-
-class _ReadonlyMonitoredResource extends MonitoredResource
- with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbenum.dart
deleted file mode 100644
index ab8bdc9..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_monitored_resource_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbjson.dart
deleted file mode 100644
index 746965b..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/api/monitored_resource.pbjson.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.api_monitored_resource_pbjson;
-
-const MonitoredResourceDescriptor$json = const {
- '1': 'MonitoredResourceDescriptor',
- '2': const [
- const {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'},
- const {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},
- const {'1': 'display_name', '3': 2, '4': 1, '5': 9, '10': 'displayName'},
- const {'1': 'description', '3': 3, '4': 1, '5': 9, '10': 'description'},
- const {
- '1': 'labels',
- '3': 4,
- '4': 3,
- '5': 11,
- '6': '.google.api.LabelDescriptor',
- '10': 'labels'
- },
- ],
-};
-
-const MonitoredResource$json = const {
- '1': 'MonitoredResource',
- '2': const [
- const {'1': 'type', '3': 1, '4': 1, '5': 9, '10': 'type'},
- const {
- '1': 'labels',
- '3': 2,
- '4': 3,
- '5': 11,
- '6': '.google.api.MonitoredResource.LabelsEntry',
- '10': 'labels'
- },
- ],
- '3': const [MonitoredResource_LabelsEntry$json],
-};
-
-const MonitoredResource_LabelsEntry$json = const {
- '1': 'LabelsEntry',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
- const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
- ],
- '7': const {'7': true},
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pb.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pb.dart
deleted file mode 100644
index b90c01a..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pb.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_http_request;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:fixnum/fixnum.dart';
-import 'package:protobuf/protobuf.dart';
-
-import '../../protobuf/duration.pb.dart' as $google$protobuf;
-
-class HttpRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('HttpRequest')
- ..aOS(1, 'requestMethod')
- ..aOS(2, 'requestUrl')
- ..aInt64(3, 'requestSize')
- ..a<int>(4, 'status', PbFieldType.O3)
- ..aInt64(5, 'responseSize')
- ..aOS(6, 'userAgent')
- ..aOS(7, 'remoteIp')
- ..aOS(8, 'referer')
- ..aOB(9, 'cacheHit')
- ..aOB(10, 'cacheValidatedWithOriginServer')
- ..aOB(11, 'cacheLookup')
- ..aInt64(12, 'cacheFillBytes')
- ..aOS(13, 'serverIp')
- ..a<$google$protobuf.Duration>(14, 'latency', PbFieldType.OM,
- $google$protobuf.Duration.getDefault, $google$protobuf.Duration.create)
- ..aOS(15, 'protocol')
- ..hasRequiredFields = false;
-
- HttpRequest() : super();
- HttpRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- HttpRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- HttpRequest clone() => new HttpRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static HttpRequest create() => new HttpRequest();
- static PbList<HttpRequest> createRepeated() => new PbList<HttpRequest>();
- static HttpRequest getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyHttpRequest();
- return _defaultInstance;
- }
-
- static HttpRequest _defaultInstance;
- static void $checkItem(HttpRequest v) {
- if (v is! HttpRequest) checkItemFailed(v, 'HttpRequest');
- }
-
- String get requestMethod => $_getS(0, '');
- set requestMethod(String v) {
- $_setString(0, v);
- }
-
- bool hasRequestMethod() => $_has(0);
- void clearRequestMethod() => clearField(1);
-
- String get requestUrl => $_getS(1, '');
- set requestUrl(String v) {
- $_setString(1, v);
- }
-
- bool hasRequestUrl() => $_has(1);
- void clearRequestUrl() => clearField(2);
-
- Int64 get requestSize => $_getI64(2);
- set requestSize(Int64 v) {
- $_setInt64(2, v);
- }
-
- bool hasRequestSize() => $_has(2);
- void clearRequestSize() => clearField(3);
-
- int get status => $_get(3, 0);
- set status(int v) {
- $_setUnsignedInt32(3, v);
- }
-
- bool hasStatus() => $_has(3);
- void clearStatus() => clearField(4);
-
- Int64 get responseSize => $_getI64(4);
- set responseSize(Int64 v) {
- $_setInt64(4, v);
- }
-
- bool hasResponseSize() => $_has(4);
- void clearResponseSize() => clearField(5);
-
- String get userAgent => $_getS(5, '');
- set userAgent(String v) {
- $_setString(5, v);
- }
-
- bool hasUserAgent() => $_has(5);
- void clearUserAgent() => clearField(6);
-
- String get remoteIp => $_getS(6, '');
- set remoteIp(String v) {
- $_setString(6, v);
- }
-
- bool hasRemoteIp() => $_has(6);
- void clearRemoteIp() => clearField(7);
-
- String get referer => $_getS(7, '');
- set referer(String v) {
- $_setString(7, v);
- }
-
- bool hasReferer() => $_has(7);
- void clearReferer() => clearField(8);
-
- bool get cacheHit => $_get(8, false);
- set cacheHit(bool v) {
- $_setBool(8, v);
- }
-
- bool hasCacheHit() => $_has(8);
- void clearCacheHit() => clearField(9);
-
- bool get cacheValidatedWithOriginServer => $_get(9, false);
- set cacheValidatedWithOriginServer(bool v) {
- $_setBool(9, v);
- }
-
- bool hasCacheValidatedWithOriginServer() => $_has(9);
- void clearCacheValidatedWithOriginServer() => clearField(10);
-
- bool get cacheLookup => $_get(10, false);
- set cacheLookup(bool v) {
- $_setBool(10, v);
- }
-
- bool hasCacheLookup() => $_has(10);
- void clearCacheLookup() => clearField(11);
-
- Int64 get cacheFillBytes => $_getI64(11);
- set cacheFillBytes(Int64 v) {
- $_setInt64(11, v);
- }
-
- bool hasCacheFillBytes() => $_has(11);
- void clearCacheFillBytes() => clearField(12);
-
- String get serverIp => $_getS(12, '');
- set serverIp(String v) {
- $_setString(12, v);
- }
-
- bool hasServerIp() => $_has(12);
- void clearServerIp() => clearField(13);
-
- $google$protobuf.Duration get latency => $_getN(13);
- set latency($google$protobuf.Duration v) {
- setField(14, v);
- }
-
- bool hasLatency() => $_has(13);
- void clearLatency() => clearField(14);
-
- String get protocol => $_getS(14, '');
- set protocol(String v) {
- $_setString(14, v);
- }
-
- bool hasProtocol() => $_has(14);
- void clearProtocol() => clearField(15);
-}
-
-class _ReadonlyHttpRequest extends HttpRequest with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbenum.dart
deleted file mode 100644
index cb196dc..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_http_request_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbjson.dart
deleted file mode 100644
index b9c176c..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/http_request.pbjson.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_http_request_pbjson;
-
-const HttpRequest$json = const {
- '1': 'HttpRequest',
- '2': const [
- const {
- '1': 'request_method',
- '3': 1,
- '4': 1,
- '5': 9,
- '10': 'requestMethod'
- },
- const {'1': 'request_url', '3': 2, '4': 1, '5': 9, '10': 'requestUrl'},
- const {'1': 'request_size', '3': 3, '4': 1, '5': 3, '10': 'requestSize'},
- const {'1': 'status', '3': 4, '4': 1, '5': 5, '10': 'status'},
- const {'1': 'response_size', '3': 5, '4': 1, '5': 3, '10': 'responseSize'},
- const {'1': 'user_agent', '3': 6, '4': 1, '5': 9, '10': 'userAgent'},
- const {'1': 'remote_ip', '3': 7, '4': 1, '5': 9, '10': 'remoteIp'},
- const {'1': 'server_ip', '3': 13, '4': 1, '5': 9, '10': 'serverIp'},
- const {'1': 'referer', '3': 8, '4': 1, '5': 9, '10': 'referer'},
- const {
- '1': 'latency',
- '3': 14,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Duration',
- '10': 'latency'
- },
- const {'1': 'cache_lookup', '3': 11, '4': 1, '5': 8, '10': 'cacheLookup'},
- const {'1': 'cache_hit', '3': 9, '4': 1, '5': 8, '10': 'cacheHit'},
- const {
- '1': 'cache_validated_with_origin_server',
- '3': 10,
- '4': 1,
- '5': 8,
- '10': 'cacheValidatedWithOriginServer'
- },
- const {
- '1': 'cache_fill_bytes',
- '3': 12,
- '4': 1,
- '5': 3,
- '10': 'cacheFillBytes'
- },
- const {'1': 'protocol', '3': 15, '4': 1, '5': 9, '10': 'protocol'},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pb.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pb.dart
deleted file mode 100644
index e215075..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pb.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_log_severity;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-export 'log_severity.pbenum.dart';
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbenum.dart
deleted file mode 100644
index 1141dd7..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbenum.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_log_severity_pbenum;
-
-// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
-import 'dart:core' show int, dynamic, String, List, Map;
-import 'package:protobuf/protobuf.dart';
-
-class LogSeverity extends ProtobufEnum {
- static const LogSeverity DEFAULT = const LogSeverity._(0, 'DEFAULT');
- static const LogSeverity DEBUG = const LogSeverity._(100, 'DEBUG');
- static const LogSeverity INFO = const LogSeverity._(200, 'INFO');
- static const LogSeverity NOTICE = const LogSeverity._(300, 'NOTICE');
- static const LogSeverity WARNING = const LogSeverity._(400, 'WARNING');
- static const LogSeverity ERROR = const LogSeverity._(500, 'ERROR');
- static const LogSeverity CRITICAL = const LogSeverity._(600, 'CRITICAL');
- static const LogSeverity ALERT = const LogSeverity._(700, 'ALERT');
- static const LogSeverity EMERGENCY = const LogSeverity._(800, 'EMERGENCY');
-
- static const List<LogSeverity> values = const <LogSeverity>[
- DEFAULT,
- DEBUG,
- INFO,
- NOTICE,
- WARNING,
- ERROR,
- CRITICAL,
- ALERT,
- EMERGENCY,
- ];
-
- static final Map<int, dynamic> _byValue = ProtobufEnum.initByValue(values);
- static LogSeverity valueOf(int value) => _byValue[value] as LogSeverity;
- static void $checkItem(LogSeverity v) {
- if (v is! LogSeverity) checkItemFailed(v, 'LogSeverity');
- }
-
- const LogSeverity._(int v, String n) : super(v, n);
-}
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbjson.dart
deleted file mode 100644
index 45b2646..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/type/log_severity.pbjson.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.type_log_severity_pbjson;
-
-const LogSeverity$json = const {
- '1': 'LogSeverity',
- '2': const [
- const {'1': 'DEFAULT', '2': 0},
- const {'1': 'DEBUG', '2': 100},
- const {'1': 'INFO', '2': 200},
- const {'1': 'NOTICE', '2': 300},
- const {'1': 'WARNING', '2': 400},
- const {'1': 'ERROR', '2': 500},
- const {'1': 'CRITICAL', '2': 600},
- const {'1': 'ALERT', '2': 700},
- const {'1': 'EMERGENCY', '2': 800},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pb.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pb.dart
deleted file mode 100644
index 9b42389..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pb.dart
+++ /dev/null
@@ -1,383 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_log_entry;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:fixnum/fixnum.dart';
-import 'package:protobuf/protobuf.dart';
-
-import '../../protobuf/any.pb.dart' as $google$protobuf;
-import '../../protobuf/struct.pb.dart' as $google$protobuf;
-import '../type/http_request.pb.dart' as $google$logging$type;
-import '../../api/monitored_resource.pb.dart' as $google$api;
-import '../../protobuf/timestamp.pb.dart' as $google$protobuf;
-
-import '../type/log_severity.pbenum.dart' as $google$logging$type;
-
-class LogEntry_LabelsEntry extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('LogEntry_LabelsEntry')
- ..aOS(1, 'key')
- ..aOS(2, 'value')
- ..hasRequiredFields = false;
-
- LogEntry_LabelsEntry() : super();
- LogEntry_LabelsEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- LogEntry_LabelsEntry.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- LogEntry_LabelsEntry clone() =>
- new LogEntry_LabelsEntry()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static LogEntry_LabelsEntry create() => new LogEntry_LabelsEntry();
- static PbList<LogEntry_LabelsEntry> createRepeated() =>
- new PbList<LogEntry_LabelsEntry>();
- static LogEntry_LabelsEntry getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyLogEntry_LabelsEntry();
- return _defaultInstance;
- }
-
- static LogEntry_LabelsEntry _defaultInstance;
- static void $checkItem(LogEntry_LabelsEntry v) {
- if (v is! LogEntry_LabelsEntry) checkItemFailed(v, 'LogEntry_LabelsEntry');
- }
-
- String get key => $_getS(0, '');
- set key(String v) {
- $_setString(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- String get value => $_getS(1, '');
- set value(String v) {
- $_setString(1, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyLogEntry_LabelsEntry extends LogEntry_LabelsEntry
- with ReadonlyMessageMixin {}
-
-class LogEntry extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('LogEntry')
- ..a<$google$protobuf.Any>(2, 'protoPayload', PbFieldType.OM,
- $google$protobuf.Any.getDefault, $google$protobuf.Any.create)
- ..aOS(3, 'textPayload')
- ..aOS(4, 'insertId')
- ..a<$google$protobuf.Struct>(6, 'jsonPayload', PbFieldType.OM,
- $google$protobuf.Struct.getDefault, $google$protobuf.Struct.create)
- ..a<$google$logging$type.HttpRequest>(
- 7,
- 'httpRequest',
- PbFieldType.OM,
- $google$logging$type.HttpRequest.getDefault,
- $google$logging$type.HttpRequest.create)
- ..a<$google$api.MonitoredResource>(
- 8,
- 'resource',
- PbFieldType.OM,
- $google$api.MonitoredResource.getDefault,
- $google$api.MonitoredResource.create)
- ..a<$google$protobuf.Timestamp>(
- 9,
- 'timestamp',
- PbFieldType.OM,
- $google$protobuf.Timestamp.getDefault,
- $google$protobuf.Timestamp.create)
- ..e<$google$logging$type.LogSeverity>(
- 10,
- 'severity',
- PbFieldType.OE,
- $google$logging$type.LogSeverity.DEFAULT,
- $google$logging$type.LogSeverity.valueOf,
- $google$logging$type.LogSeverity.values)
- ..pp<LogEntry_LabelsEntry>(11, 'labels', PbFieldType.PM,
- LogEntry_LabelsEntry.$checkItem, LogEntry_LabelsEntry.create)
- ..aOS(12, 'logName')
- ..a<LogEntryOperation>(15, 'operation', PbFieldType.OM,
- LogEntryOperation.getDefault, LogEntryOperation.create)
- ..aOS(22, 'trace')
- ..a<LogEntrySourceLocation>(23, 'sourceLocation', PbFieldType.OM,
- LogEntrySourceLocation.getDefault, LogEntrySourceLocation.create)
- ..a<$google$protobuf.Timestamp>(
- 24,
- 'receiveTimestamp',
- PbFieldType.OM,
- $google$protobuf.Timestamp.getDefault,
- $google$protobuf.Timestamp.create)
- ..aOS(27, 'spanId')
- ..hasRequiredFields = false;
-
- LogEntry() : super();
- LogEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- LogEntry.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- LogEntry clone() => new LogEntry()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static LogEntry create() => new LogEntry();
- static PbList<LogEntry> createRepeated() => new PbList<LogEntry>();
- static LogEntry getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyLogEntry();
- return _defaultInstance;
- }
-
- static LogEntry _defaultInstance;
- static void $checkItem(LogEntry v) {
- if (v is! LogEntry) checkItemFailed(v, 'LogEntry');
- }
-
- $google$protobuf.Any get protoPayload => $_getN(0);
- set protoPayload($google$protobuf.Any v) {
- setField(2, v);
- }
-
- bool hasProtoPayload() => $_has(0);
- void clearProtoPayload() => clearField(2);
-
- String get textPayload => $_getS(1, '');
- set textPayload(String v) {
- $_setString(1, v);
- }
-
- bool hasTextPayload() => $_has(1);
- void clearTextPayload() => clearField(3);
-
- String get insertId => $_getS(2, '');
- set insertId(String v) {
- $_setString(2, v);
- }
-
- bool hasInsertId() => $_has(2);
- void clearInsertId() => clearField(4);
-
- $google$protobuf.Struct get jsonPayload => $_getN(3);
- set jsonPayload($google$protobuf.Struct v) {
- setField(6, v);
- }
-
- bool hasJsonPayload() => $_has(3);
- void clearJsonPayload() => clearField(6);
-
- $google$logging$type.HttpRequest get httpRequest => $_getN(4);
- set httpRequest($google$logging$type.HttpRequest v) {
- setField(7, v);
- }
-
- bool hasHttpRequest() => $_has(4);
- void clearHttpRequest() => clearField(7);
-
- $google$api.MonitoredResource get resource => $_getN(5);
- set resource($google$api.MonitoredResource v) {
- setField(8, v);
- }
-
- bool hasResource() => $_has(5);
- void clearResource() => clearField(8);
-
- $google$protobuf.Timestamp get timestamp => $_getN(6);
- set timestamp($google$protobuf.Timestamp v) {
- setField(9, v);
- }
-
- bool hasTimestamp() => $_has(6);
- void clearTimestamp() => clearField(9);
-
- $google$logging$type.LogSeverity get severity => $_getN(7);
- set severity($google$logging$type.LogSeverity v) {
- setField(10, v);
- }
-
- bool hasSeverity() => $_has(7);
- void clearSeverity() => clearField(10);
-
- List<LogEntry_LabelsEntry> get labels => $_getList(8);
-
- String get logName => $_getS(9, '');
- set logName(String v) {
- $_setString(9, v);
- }
-
- bool hasLogName() => $_has(9);
- void clearLogName() => clearField(12);
-
- LogEntryOperation get operation => $_getN(10);
- set operation(LogEntryOperation v) {
- setField(15, v);
- }
-
- bool hasOperation() => $_has(10);
- void clearOperation() => clearField(15);
-
- String get trace => $_getS(11, '');
- set trace(String v) {
- $_setString(11, v);
- }
-
- bool hasTrace() => $_has(11);
- void clearTrace() => clearField(22);
-
- LogEntrySourceLocation get sourceLocation => $_getN(12);
- set sourceLocation(LogEntrySourceLocation v) {
- setField(23, v);
- }
-
- bool hasSourceLocation() => $_has(12);
- void clearSourceLocation() => clearField(23);
-
- $google$protobuf.Timestamp get receiveTimestamp => $_getN(13);
- set receiveTimestamp($google$protobuf.Timestamp v) {
- setField(24, v);
- }
-
- bool hasReceiveTimestamp() => $_has(13);
- void clearReceiveTimestamp() => clearField(24);
-
- String get spanId => $_getS(14, '');
- set spanId(String v) {
- $_setString(14, v);
- }
-
- bool hasSpanId() => $_has(14);
- void clearSpanId() => clearField(27);
-}
-
-class _ReadonlyLogEntry extends LogEntry with ReadonlyMessageMixin {}
-
-class LogEntryOperation extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('LogEntryOperation')
- ..aOS(1, 'id')
- ..aOS(2, 'producer')
- ..aOB(3, 'first')
- ..aOB(4, 'last')
- ..hasRequiredFields = false;
-
- LogEntryOperation() : super();
- LogEntryOperation.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- LogEntryOperation.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- LogEntryOperation clone() => new LogEntryOperation()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static LogEntryOperation create() => new LogEntryOperation();
- static PbList<LogEntryOperation> createRepeated() =>
- new PbList<LogEntryOperation>();
- static LogEntryOperation getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyLogEntryOperation();
- return _defaultInstance;
- }
-
- static LogEntryOperation _defaultInstance;
- static void $checkItem(LogEntryOperation v) {
- if (v is! LogEntryOperation) checkItemFailed(v, 'LogEntryOperation');
- }
-
- String get id => $_getS(0, '');
- set id(String v) {
- $_setString(0, v);
- }
-
- bool hasId() => $_has(0);
- void clearId() => clearField(1);
-
- String get producer => $_getS(1, '');
- set producer(String v) {
- $_setString(1, v);
- }
-
- bool hasProducer() => $_has(1);
- void clearProducer() => clearField(2);
-
- bool get first => $_get(2, false);
- set first(bool v) {
- $_setBool(2, v);
- }
-
- bool hasFirst() => $_has(2);
- void clearFirst() => clearField(3);
-
- bool get last => $_get(3, false);
- set last(bool v) {
- $_setBool(3, v);
- }
-
- bool hasLast() => $_has(3);
- void clearLast() => clearField(4);
-}
-
-class _ReadonlyLogEntryOperation extends LogEntryOperation
- with ReadonlyMessageMixin {}
-
-class LogEntrySourceLocation extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('LogEntrySourceLocation')
- ..aOS(1, 'file')
- ..aInt64(2, 'line')
- ..aOS(3, 'function')
- ..hasRequiredFields = false;
-
- LogEntrySourceLocation() : super();
- LogEntrySourceLocation.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- LogEntrySourceLocation.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- LogEntrySourceLocation clone() =>
- new LogEntrySourceLocation()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static LogEntrySourceLocation create() => new LogEntrySourceLocation();
- static PbList<LogEntrySourceLocation> createRepeated() =>
- new PbList<LogEntrySourceLocation>();
- static LogEntrySourceLocation getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyLogEntrySourceLocation();
- return _defaultInstance;
- }
-
- static LogEntrySourceLocation _defaultInstance;
- static void $checkItem(LogEntrySourceLocation v) {
- if (v is! LogEntrySourceLocation)
- checkItemFailed(v, 'LogEntrySourceLocation');
- }
-
- String get file => $_getS(0, '');
- set file(String v) {
- $_setString(0, v);
- }
-
- bool hasFile() => $_has(0);
- void clearFile() => clearField(1);
-
- Int64 get line => $_getI64(1);
- set line(Int64 v) {
- $_setInt64(1, v);
- }
-
- bool hasLine() => $_has(1);
- void clearLine() => clearField(2);
-
- String get function => $_getS(2, '');
- set function(String v) {
- $_setString(2, v);
- }
-
- bool hasFunction() => $_has(2);
- void clearFunction() => clearField(3);
-}
-
-class _ReadonlyLogEntrySourceLocation extends LogEntrySourceLocation
- with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbenum.dart
deleted file mode 100644
index e8f1a7f..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_log_entry_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbjson.dart
deleted file mode 100644
index 117d400..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/log_entry.pbjson.dart
+++ /dev/null
@@ -1,137 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_log_entry_pbjson;
-
-const LogEntry$json = const {
- '1': 'LogEntry',
- '2': const [
- const {'1': 'log_name', '3': 12, '4': 1, '5': 9, '10': 'logName'},
- const {
- '1': 'resource',
- '3': 8,
- '4': 1,
- '5': 11,
- '6': '.google.api.MonitoredResource',
- '10': 'resource'
- },
- const {
- '1': 'proto_payload',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Any',
- '9': 0,
- '10': 'protoPayload'
- },
- const {
- '1': 'text_payload',
- '3': 3,
- '4': 1,
- '5': 9,
- '9': 0,
- '10': 'textPayload'
- },
- const {
- '1': 'json_payload',
- '3': 6,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Struct',
- '9': 0,
- '10': 'jsonPayload'
- },
- const {
- '1': 'timestamp',
- '3': 9,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Timestamp',
- '10': 'timestamp'
- },
- const {
- '1': 'receive_timestamp',
- '3': 24,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Timestamp',
- '10': 'receiveTimestamp'
- },
- const {
- '1': 'severity',
- '3': 10,
- '4': 1,
- '5': 14,
- '6': '.google.logging.type.LogSeverity',
- '10': 'severity'
- },
- const {'1': 'insert_id', '3': 4, '4': 1, '5': 9, '10': 'insertId'},
- const {
- '1': 'http_request',
- '3': 7,
- '4': 1,
- '5': 11,
- '6': '.google.logging.type.HttpRequest',
- '10': 'httpRequest'
- },
- const {
- '1': 'labels',
- '3': 11,
- '4': 3,
- '5': 11,
- '6': '.google.logging.v2.LogEntry.LabelsEntry',
- '10': 'labels'
- },
- const {
- '1': 'operation',
- '3': 15,
- '4': 1,
- '5': 11,
- '6': '.google.logging.v2.LogEntryOperation',
- '10': 'operation'
- },
- const {'1': 'trace', '3': 22, '4': 1, '5': 9, '10': 'trace'},
- const {'1': 'span_id', '3': 27, '4': 1, '5': 9, '10': 'spanId'},
- const {
- '1': 'source_location',
- '3': 23,
- '4': 1,
- '5': 11,
- '6': '.google.logging.v2.LogEntrySourceLocation',
- '10': 'sourceLocation'
- },
- ],
- '3': const [LogEntry_LabelsEntry$json],
- '8': const [
- const {'1': 'payload'},
- ],
-};
-
-const LogEntry_LabelsEntry$json = const {
- '1': 'LabelsEntry',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
- const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
- ],
- '7': const {'7': true},
-};
-
-const LogEntryOperation$json = const {
- '1': 'LogEntryOperation',
- '2': const [
- const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
- const {'1': 'producer', '3': 2, '4': 1, '5': 9, '10': 'producer'},
- const {'1': 'first', '3': 3, '4': 1, '5': 8, '10': 'first'},
- const {'1': 'last', '3': 4, '4': 1, '5': 8, '10': 'last'},
- ],
-};
-
-const LogEntrySourceLocation$json = const {
- '1': 'LogEntrySourceLocation',
- '2': const [
- const {'1': 'file', '3': 1, '4': 1, '5': 9, '10': 'file'},
- const {'1': 'line', '3': 2, '4': 1, '5': 3, '10': 'line'},
- const {'1': 'function', '3': 3, '4': 1, '5': 9, '10': 'function'},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pb.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pb.dart
deleted file mode 100644
index 7156969..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pb.dart
+++ /dev/null
@@ -1,649 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_logging;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import '../../api/monitored_resource.pb.dart' as $google$api;
-import 'log_entry.pb.dart';
-import '../../rpc/status.pb.dart' as $google$rpc;
-
-class DeleteLogRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('DeleteLogRequest')
- ..aOS(1, 'logName')
- ..hasRequiredFields = false;
-
- DeleteLogRequest() : super();
- DeleteLogRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- DeleteLogRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- DeleteLogRequest clone() => new DeleteLogRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static DeleteLogRequest create() => new DeleteLogRequest();
- static PbList<DeleteLogRequest> createRepeated() =>
- new PbList<DeleteLogRequest>();
- static DeleteLogRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyDeleteLogRequest();
- return _defaultInstance;
- }
-
- static DeleteLogRequest _defaultInstance;
- static void $checkItem(DeleteLogRequest v) {
- if (v is! DeleteLogRequest) checkItemFailed(v, 'DeleteLogRequest');
- }
-
- String get logName => $_getS(0, '');
- set logName(String v) {
- $_setString(0, v);
- }
-
- bool hasLogName() => $_has(0);
- void clearLogName() => clearField(1);
-}
-
-class _ReadonlyDeleteLogRequest extends DeleteLogRequest
- with ReadonlyMessageMixin {}
-
-class WriteLogEntriesRequest_LabelsEntry extends GeneratedMessage {
- static final BuilderInfo _i =
- new BuilderInfo('WriteLogEntriesRequest_LabelsEntry')
- ..aOS(1, 'key')
- ..aOS(2, 'value')
- ..hasRequiredFields = false;
-
- WriteLogEntriesRequest_LabelsEntry() : super();
- WriteLogEntriesRequest_LabelsEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- WriteLogEntriesRequest_LabelsEntry.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- WriteLogEntriesRequest_LabelsEntry clone() =>
- new WriteLogEntriesRequest_LabelsEntry()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static WriteLogEntriesRequest_LabelsEntry create() =>
- new WriteLogEntriesRequest_LabelsEntry();
- static PbList<WriteLogEntriesRequest_LabelsEntry> createRepeated() =>
- new PbList<WriteLogEntriesRequest_LabelsEntry>();
- static WriteLogEntriesRequest_LabelsEntry getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyWriteLogEntriesRequest_LabelsEntry();
- return _defaultInstance;
- }
-
- static WriteLogEntriesRequest_LabelsEntry _defaultInstance;
- static void $checkItem(WriteLogEntriesRequest_LabelsEntry v) {
- if (v is! WriteLogEntriesRequest_LabelsEntry)
- checkItemFailed(v, 'WriteLogEntriesRequest_LabelsEntry');
- }
-
- String get key => $_getS(0, '');
- set key(String v) {
- $_setString(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- String get value => $_getS(1, '');
- set value(String v) {
- $_setString(1, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyWriteLogEntriesRequest_LabelsEntry
- extends WriteLogEntriesRequest_LabelsEntry with ReadonlyMessageMixin {}
-
-class WriteLogEntriesRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('WriteLogEntriesRequest')
- ..aOS(1, 'logName')
- ..a<$google$api.MonitoredResource>(
- 2,
- 'resource',
- PbFieldType.OM,
- $google$api.MonitoredResource.getDefault,
- $google$api.MonitoredResource.create)
- ..pp<WriteLogEntriesRequest_LabelsEntry>(
- 3,
- 'labels',
- PbFieldType.PM,
- WriteLogEntriesRequest_LabelsEntry.$checkItem,
- WriteLogEntriesRequest_LabelsEntry.create)
- ..pp<LogEntry>(
- 4, 'entries', PbFieldType.PM, LogEntry.$checkItem, LogEntry.create)
- ..aOB(5, 'partialSuccess')
- ..hasRequiredFields = false;
-
- WriteLogEntriesRequest() : super();
- WriteLogEntriesRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- WriteLogEntriesRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- WriteLogEntriesRequest clone() =>
- new WriteLogEntriesRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static WriteLogEntriesRequest create() => new WriteLogEntriesRequest();
- static PbList<WriteLogEntriesRequest> createRepeated() =>
- new PbList<WriteLogEntriesRequest>();
- static WriteLogEntriesRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyWriteLogEntriesRequest();
- return _defaultInstance;
- }
-
- static WriteLogEntriesRequest _defaultInstance;
- static void $checkItem(WriteLogEntriesRequest v) {
- if (v is! WriteLogEntriesRequest)
- checkItemFailed(v, 'WriteLogEntriesRequest');
- }
-
- String get logName => $_getS(0, '');
- set logName(String v) {
- $_setString(0, v);
- }
-
- bool hasLogName() => $_has(0);
- void clearLogName() => clearField(1);
-
- $google$api.MonitoredResource get resource => $_getN(1);
- set resource($google$api.MonitoredResource v) {
- setField(2, v);
- }
-
- bool hasResource() => $_has(1);
- void clearResource() => clearField(2);
-
- List<WriteLogEntriesRequest_LabelsEntry> get labels => $_getList(2);
-
- List<LogEntry> get entries => $_getList(3);
-
- bool get partialSuccess => $_get(4, false);
- set partialSuccess(bool v) {
- $_setBool(4, v);
- }
-
- bool hasPartialSuccess() => $_has(4);
- void clearPartialSuccess() => clearField(5);
-}
-
-class _ReadonlyWriteLogEntriesRequest extends WriteLogEntriesRequest
- with ReadonlyMessageMixin {}
-
-class WriteLogEntriesResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('WriteLogEntriesResponse')
- ..hasRequiredFields = false;
-
- WriteLogEntriesResponse() : super();
- WriteLogEntriesResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- WriteLogEntriesResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- WriteLogEntriesResponse clone() =>
- new WriteLogEntriesResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static WriteLogEntriesResponse create() => new WriteLogEntriesResponse();
- static PbList<WriteLogEntriesResponse> createRepeated() =>
- new PbList<WriteLogEntriesResponse>();
- static WriteLogEntriesResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyWriteLogEntriesResponse();
- return _defaultInstance;
- }
-
- static WriteLogEntriesResponse _defaultInstance;
- static void $checkItem(WriteLogEntriesResponse v) {
- if (v is! WriteLogEntriesResponse)
- checkItemFailed(v, 'WriteLogEntriesResponse');
- }
-}
-
-class _ReadonlyWriteLogEntriesResponse extends WriteLogEntriesResponse
- with ReadonlyMessageMixin {}
-
-class WriteLogEntriesPartialErrors_LogEntryErrorsEntry
- extends GeneratedMessage {
- static final BuilderInfo _i =
- new BuilderInfo('WriteLogEntriesPartialErrors_LogEntryErrorsEntry')
- ..a<int>(1, 'key', PbFieldType.O3)
- ..a<$google$rpc.Status>(2, 'value', PbFieldType.OM,
- $google$rpc.Status.getDefault, $google$rpc.Status.create)
- ..hasRequiredFields = false;
-
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry() : super();
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry clone() =>
- new WriteLogEntriesPartialErrors_LogEntryErrorsEntry()
- ..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static WriteLogEntriesPartialErrors_LogEntryErrorsEntry create() =>
- new WriteLogEntriesPartialErrors_LogEntryErrorsEntry();
- static PbList<WriteLogEntriesPartialErrors_LogEntryErrorsEntry>
- createRepeated() =>
- new PbList<WriteLogEntriesPartialErrors_LogEntryErrorsEntry>();
- static WriteLogEntriesPartialErrors_LogEntryErrorsEntry getDefault() {
- if (_defaultInstance == null)
- _defaultInstance =
- new _ReadonlyWriteLogEntriesPartialErrors_LogEntryErrorsEntry();
- return _defaultInstance;
- }
-
- static WriteLogEntriesPartialErrors_LogEntryErrorsEntry _defaultInstance;
- static void $checkItem(WriteLogEntriesPartialErrors_LogEntryErrorsEntry v) {
- if (v is! WriteLogEntriesPartialErrors_LogEntryErrorsEntry)
- checkItemFailed(v, 'WriteLogEntriesPartialErrors_LogEntryErrorsEntry');
- }
-
- int get key => $_get(0, 0);
- set key(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- $google$rpc.Status get value => $_getN(1);
- set value($google$rpc.Status v) {
- setField(2, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyWriteLogEntriesPartialErrors_LogEntryErrorsEntry
- extends WriteLogEntriesPartialErrors_LogEntryErrorsEntry
- with ReadonlyMessageMixin {}
-
-class WriteLogEntriesPartialErrors extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('WriteLogEntriesPartialErrors')
- ..pp<WriteLogEntriesPartialErrors_LogEntryErrorsEntry>(
- 1,
- 'logEntryErrors',
- PbFieldType.PM,
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry.$checkItem,
- WriteLogEntriesPartialErrors_LogEntryErrorsEntry.create)
- ..hasRequiredFields = false;
-
- WriteLogEntriesPartialErrors() : super();
- WriteLogEntriesPartialErrors.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- WriteLogEntriesPartialErrors.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- WriteLogEntriesPartialErrors clone() =>
- new WriteLogEntriesPartialErrors()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static WriteLogEntriesPartialErrors create() =>
- new WriteLogEntriesPartialErrors();
- static PbList<WriteLogEntriesPartialErrors> createRepeated() =>
- new PbList<WriteLogEntriesPartialErrors>();
- static WriteLogEntriesPartialErrors getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyWriteLogEntriesPartialErrors();
- return _defaultInstance;
- }
-
- static WriteLogEntriesPartialErrors _defaultInstance;
- static void $checkItem(WriteLogEntriesPartialErrors v) {
- if (v is! WriteLogEntriesPartialErrors)
- checkItemFailed(v, 'WriteLogEntriesPartialErrors');
- }
-
- List<WriteLogEntriesPartialErrors_LogEntryErrorsEntry> get logEntryErrors =>
- $_getList(0);
-}
-
-class _ReadonlyWriteLogEntriesPartialErrors extends WriteLogEntriesPartialErrors
- with ReadonlyMessageMixin {}
-
-class ListLogEntriesRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ListLogEntriesRequest')
- ..pPS(1, 'projectIds')
- ..aOS(2, 'filter')
- ..aOS(3, 'orderBy')
- ..a<int>(4, 'pageSize', PbFieldType.O3)
- ..aOS(5, 'pageToken')
- ..pPS(8, 'resourceNames')
- ..hasRequiredFields = false;
-
- ListLogEntriesRequest() : super();
- ListLogEntriesRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListLogEntriesRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListLogEntriesRequest clone() =>
- new ListLogEntriesRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListLogEntriesRequest create() => new ListLogEntriesRequest();
- static PbList<ListLogEntriesRequest> createRepeated() =>
- new PbList<ListLogEntriesRequest>();
- static ListLogEntriesRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyListLogEntriesRequest();
- return _defaultInstance;
- }
-
- static ListLogEntriesRequest _defaultInstance;
- static void $checkItem(ListLogEntriesRequest v) {
- if (v is! ListLogEntriesRequest)
- checkItemFailed(v, 'ListLogEntriesRequest');
- }
-
- List<String> get projectIds => $_getList(0);
-
- String get filter => $_getS(1, '');
- set filter(String v) {
- $_setString(1, v);
- }
-
- bool hasFilter() => $_has(1);
- void clearFilter() => clearField(2);
-
- String get orderBy => $_getS(2, '');
- set orderBy(String v) {
- $_setString(2, v);
- }
-
- bool hasOrderBy() => $_has(2);
- void clearOrderBy() => clearField(3);
-
- int get pageSize => $_get(3, 0);
- set pageSize(int v) {
- $_setUnsignedInt32(3, v);
- }
-
- bool hasPageSize() => $_has(3);
- void clearPageSize() => clearField(4);
-
- String get pageToken => $_getS(4, '');
- set pageToken(String v) {
- $_setString(4, v);
- }
-
- bool hasPageToken() => $_has(4);
- void clearPageToken() => clearField(5);
-
- List<String> get resourceNames => $_getList(5);
-}
-
-class _ReadonlyListLogEntriesRequest extends ListLogEntriesRequest
- with ReadonlyMessageMixin {}
-
-class ListLogEntriesResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ListLogEntriesResponse')
- ..pp<LogEntry>(
- 1, 'entries', PbFieldType.PM, LogEntry.$checkItem, LogEntry.create)
- ..aOS(2, 'nextPageToken')
- ..hasRequiredFields = false;
-
- ListLogEntriesResponse() : super();
- ListLogEntriesResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListLogEntriesResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListLogEntriesResponse clone() =>
- new ListLogEntriesResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListLogEntriesResponse create() => new ListLogEntriesResponse();
- static PbList<ListLogEntriesResponse> createRepeated() =>
- new PbList<ListLogEntriesResponse>();
- static ListLogEntriesResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyListLogEntriesResponse();
- return _defaultInstance;
- }
-
- static ListLogEntriesResponse _defaultInstance;
- static void $checkItem(ListLogEntriesResponse v) {
- if (v is! ListLogEntriesResponse)
- checkItemFailed(v, 'ListLogEntriesResponse');
- }
-
- List<LogEntry> get entries => $_getList(0);
-
- String get nextPageToken => $_getS(1, '');
- set nextPageToken(String v) {
- $_setString(1, v);
- }
-
- bool hasNextPageToken() => $_has(1);
- void clearNextPageToken() => clearField(2);
-}
-
-class _ReadonlyListLogEntriesResponse extends ListLogEntriesResponse
- with ReadonlyMessageMixin {}
-
-class ListMonitoredResourceDescriptorsRequest extends GeneratedMessage {
- static final BuilderInfo _i =
- new BuilderInfo('ListMonitoredResourceDescriptorsRequest')
- ..a<int>(1, 'pageSize', PbFieldType.O3)
- ..aOS(2, 'pageToken')
- ..hasRequiredFields = false;
-
- ListMonitoredResourceDescriptorsRequest() : super();
- ListMonitoredResourceDescriptorsRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListMonitoredResourceDescriptorsRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListMonitoredResourceDescriptorsRequest clone() =>
- new ListMonitoredResourceDescriptorsRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListMonitoredResourceDescriptorsRequest create() =>
- new ListMonitoredResourceDescriptorsRequest();
- static PbList<ListMonitoredResourceDescriptorsRequest> createRepeated() =>
- new PbList<ListMonitoredResourceDescriptorsRequest>();
- static ListMonitoredResourceDescriptorsRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyListMonitoredResourceDescriptorsRequest();
- return _defaultInstance;
- }
-
- static ListMonitoredResourceDescriptorsRequest _defaultInstance;
- static void $checkItem(ListMonitoredResourceDescriptorsRequest v) {
- if (v is! ListMonitoredResourceDescriptorsRequest)
- checkItemFailed(v, 'ListMonitoredResourceDescriptorsRequest');
- }
-
- int get pageSize => $_get(0, 0);
- set pageSize(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasPageSize() => $_has(0);
- void clearPageSize() => clearField(1);
-
- String get pageToken => $_getS(1, '');
- set pageToken(String v) {
- $_setString(1, v);
- }
-
- bool hasPageToken() => $_has(1);
- void clearPageToken() => clearField(2);
-}
-
-class _ReadonlyListMonitoredResourceDescriptorsRequest
- extends ListMonitoredResourceDescriptorsRequest with ReadonlyMessageMixin {}
-
-class ListMonitoredResourceDescriptorsResponse extends GeneratedMessage {
- static final BuilderInfo _i =
- new BuilderInfo('ListMonitoredResourceDescriptorsResponse')
- ..pp<$google$api.MonitoredResourceDescriptor>(
- 1,
- 'resourceDescriptors',
- PbFieldType.PM,
- $google$api.MonitoredResourceDescriptor.$checkItem,
- $google$api.MonitoredResourceDescriptor.create)
- ..aOS(2, 'nextPageToken')
- ..hasRequiredFields = false;
-
- ListMonitoredResourceDescriptorsResponse() : super();
- ListMonitoredResourceDescriptorsResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListMonitoredResourceDescriptorsResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListMonitoredResourceDescriptorsResponse clone() =>
- new ListMonitoredResourceDescriptorsResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListMonitoredResourceDescriptorsResponse create() =>
- new ListMonitoredResourceDescriptorsResponse();
- static PbList<ListMonitoredResourceDescriptorsResponse> createRepeated() =>
- new PbList<ListMonitoredResourceDescriptorsResponse>();
- static ListMonitoredResourceDescriptorsResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance =
- new _ReadonlyListMonitoredResourceDescriptorsResponse();
- return _defaultInstance;
- }
-
- static ListMonitoredResourceDescriptorsResponse _defaultInstance;
- static void $checkItem(ListMonitoredResourceDescriptorsResponse v) {
- if (v is! ListMonitoredResourceDescriptorsResponse)
- checkItemFailed(v, 'ListMonitoredResourceDescriptorsResponse');
- }
-
- List<$google$api.MonitoredResourceDescriptor> get resourceDescriptors =>
- $_getList(0);
-
- String get nextPageToken => $_getS(1, '');
- set nextPageToken(String v) {
- $_setString(1, v);
- }
-
- bool hasNextPageToken() => $_has(1);
- void clearNextPageToken() => clearField(2);
-}
-
-class _ReadonlyListMonitoredResourceDescriptorsResponse
- extends ListMonitoredResourceDescriptorsResponse with ReadonlyMessageMixin {
-}
-
-class ListLogsRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ListLogsRequest')
- ..aOS(1, 'parent')
- ..a<int>(2, 'pageSize', PbFieldType.O3)
- ..aOS(3, 'pageToken')
- ..hasRequiredFields = false;
-
- ListLogsRequest() : super();
- ListLogsRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListLogsRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListLogsRequest clone() => new ListLogsRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListLogsRequest create() => new ListLogsRequest();
- static PbList<ListLogsRequest> createRepeated() =>
- new PbList<ListLogsRequest>();
- static ListLogsRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyListLogsRequest();
- return _defaultInstance;
- }
-
- static ListLogsRequest _defaultInstance;
- static void $checkItem(ListLogsRequest v) {
- if (v is! ListLogsRequest) checkItemFailed(v, 'ListLogsRequest');
- }
-
- String get parent => $_getS(0, '');
- set parent(String v) {
- $_setString(0, v);
- }
-
- bool hasParent() => $_has(0);
- void clearParent() => clearField(1);
-
- int get pageSize => $_get(1, 0);
- set pageSize(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasPageSize() => $_has(1);
- void clearPageSize() => clearField(2);
-
- String get pageToken => $_getS(2, '');
- set pageToken(String v) {
- $_setString(2, v);
- }
-
- bool hasPageToken() => $_has(2);
- void clearPageToken() => clearField(3);
-}
-
-class _ReadonlyListLogsRequest extends ListLogsRequest
- with ReadonlyMessageMixin {}
-
-class ListLogsResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ListLogsResponse')
- ..aOS(2, 'nextPageToken')
- ..pPS(3, 'logNames')
- ..hasRequiredFields = false;
-
- ListLogsResponse() : super();
- ListLogsResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListLogsResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListLogsResponse clone() => new ListLogsResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListLogsResponse create() => new ListLogsResponse();
- static PbList<ListLogsResponse> createRepeated() =>
- new PbList<ListLogsResponse>();
- static ListLogsResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyListLogsResponse();
- return _defaultInstance;
- }
-
- static ListLogsResponse _defaultInstance;
- static void $checkItem(ListLogsResponse v) {
- if (v is! ListLogsResponse) checkItemFailed(v, 'ListLogsResponse');
- }
-
- String get nextPageToken => $_getS(0, '');
- set nextPageToken(String v) {
- $_setString(0, v);
- }
-
- bool hasNextPageToken() => $_has(0);
- void clearNextPageToken() => clearField(2);
-
- List<String> get logNames => $_getList(1);
-}
-
-class _ReadonlyListLogsResponse extends ListLogsResponse
- with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbenum.dart
deleted file mode 100644
index d7ea628..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_logging_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbgrpc.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbgrpc.dart
deleted file mode 100644
index 0e65060..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbgrpc.dart
+++ /dev/null
@@ -1,170 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_logging_pbgrpc;
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'logging.pb.dart';
-import '../../protobuf/empty.pb.dart' as $google$protobuf;
-export 'logging.pb.dart';
-
-class LoggingServiceV2Client extends Client {
- static final _$deleteLog =
- new ClientMethod<DeleteLogRequest, $google$protobuf.Empty>(
- '/google.logging.v2.LoggingServiceV2/DeleteLog',
- (DeleteLogRequest value) => value.writeToBuffer(),
- (List<int> value) => new $google$protobuf.Empty.fromBuffer(value));
- static final _$writeLogEntries =
- new ClientMethod<WriteLogEntriesRequest, WriteLogEntriesResponse>(
- '/google.logging.v2.LoggingServiceV2/WriteLogEntries',
- (WriteLogEntriesRequest value) => value.writeToBuffer(),
- (List<int> value) => new WriteLogEntriesResponse.fromBuffer(value));
- static final _$listLogEntries =
- new ClientMethod<ListLogEntriesRequest, ListLogEntriesResponse>(
- '/google.logging.v2.LoggingServiceV2/ListLogEntries',
- (ListLogEntriesRequest value) => value.writeToBuffer(),
- (List<int> value) => new ListLogEntriesResponse.fromBuffer(value));
- static final _$listMonitoredResourceDescriptors = new ClientMethod<
- ListMonitoredResourceDescriptorsRequest,
- ListMonitoredResourceDescriptorsResponse>(
- '/google.logging.v2.LoggingServiceV2/ListMonitoredResourceDescriptors',
- (ListMonitoredResourceDescriptorsRequest value) => value.writeToBuffer(),
- (List<int> value) =>
- new ListMonitoredResourceDescriptorsResponse.fromBuffer(value));
- static final _$listLogs = new ClientMethod<ListLogsRequest, ListLogsResponse>(
- '/google.logging.v2.LoggingServiceV2/ListLogs',
- (ListLogsRequest value) => value.writeToBuffer(),
- (List<int> value) => new ListLogsResponse.fromBuffer(value));
-
- LoggingServiceV2Client(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<$google$protobuf.Empty> deleteLog(DeleteLogRequest request,
- {CallOptions options}) {
- final call = $createCall(_$deleteLog, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<WriteLogEntriesResponse> writeLogEntries(
- WriteLogEntriesRequest request,
- {CallOptions options}) {
- final call = $createCall(
- _$writeLogEntries, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<ListLogEntriesResponse> listLogEntries(
- ListLogEntriesRequest request,
- {CallOptions options}) {
- final call = $createCall(
- _$listLogEntries, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<ListMonitoredResourceDescriptorsResponse>
- listMonitoredResourceDescriptors(
- ListMonitoredResourceDescriptorsRequest request,
- {CallOptions options}) {
- final call = $createCall(
- _$listMonitoredResourceDescriptors, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<ListLogsResponse> listLogs(ListLogsRequest request,
- {CallOptions options}) {
- final call = $createCall(_$listLogs, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-}
-
-abstract class LoggingServiceV2ServiceBase extends Service {
- String get $name => 'google.logging.v2.LoggingServiceV2';
-
- LoggingServiceV2ServiceBase() {
- $addMethod(new ServiceMethod<DeleteLogRequest, $google$protobuf.Empty>(
- 'DeleteLog',
- deleteLog_Pre,
- false,
- false,
- (List<int> value) => new DeleteLogRequest.fromBuffer(value),
- ($google$protobuf.Empty value) => value.writeToBuffer()));
- $addMethod(
- new ServiceMethod<WriteLogEntriesRequest, WriteLogEntriesResponse>(
- 'WriteLogEntries',
- writeLogEntries_Pre,
- false,
- false,
- (List<int> value) => new WriteLogEntriesRequest.fromBuffer(value),
- (WriteLogEntriesResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<ListLogEntriesRequest, ListLogEntriesResponse>(
- 'ListLogEntries',
- listLogEntries_Pre,
- false,
- false,
- (List<int> value) => new ListLogEntriesRequest.fromBuffer(value),
- (ListLogEntriesResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<ListMonitoredResourceDescriptorsRequest,
- ListMonitoredResourceDescriptorsResponse>(
- 'ListMonitoredResourceDescriptors',
- listMonitoredResourceDescriptors_Pre,
- false,
- false,
- (List<int> value) =>
- new ListMonitoredResourceDescriptorsRequest.fromBuffer(value),
- (ListMonitoredResourceDescriptorsResponse value) =>
- value.writeToBuffer()));
- $addMethod(new ServiceMethod<ListLogsRequest, ListLogsResponse>(
- 'ListLogs',
- listLogs_Pre,
- false,
- false,
- (List<int> value) => new ListLogsRequest.fromBuffer(value),
- (ListLogsResponse value) => value.writeToBuffer()));
- }
-
- Future<$google$protobuf.Empty> deleteLog_Pre(
- ServiceCall call, Future request) async {
- return deleteLog(call, await request);
- }
-
- Future<WriteLogEntriesResponse> writeLogEntries_Pre(
- ServiceCall call, Future request) async {
- return writeLogEntries(call, await request);
- }
-
- Future<ListLogEntriesResponse> listLogEntries_Pre(
- ServiceCall call, Future request) async {
- return listLogEntries(call, await request);
- }
-
- Future<ListMonitoredResourceDescriptorsResponse>
- listMonitoredResourceDescriptors_Pre(
- ServiceCall call, Future request) async {
- return listMonitoredResourceDescriptors(call, await request);
- }
-
- Future<ListLogsResponse> listLogs_Pre(
- ServiceCall call, Future request) async {
- return listLogs(call, await request);
- }
-
- Future<$google$protobuf.Empty> deleteLog(
- ServiceCall call, DeleteLogRequest request);
- Future<WriteLogEntriesResponse> writeLogEntries(
- ServiceCall call, WriteLogEntriesRequest request);
- Future<ListLogEntriesResponse> listLogEntries(
- ServiceCall call, ListLogEntriesRequest request);
- Future<ListMonitoredResourceDescriptorsResponse>
- listMonitoredResourceDescriptors(
- ServiceCall call, ListMonitoredResourceDescriptorsRequest request);
- Future<ListLogsResponse> listLogs(ServiceCall call, ListLogsRequest request);
-}
diff --git a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbjson.dart
deleted file mode 100644
index 9533338..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/logging/v2/logging.pbjson.dart
+++ /dev/null
@@ -1,187 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.logging.v2_logging_pbjson;
-
-const DeleteLogRequest$json = const {
- '1': 'DeleteLogRequest',
- '2': const [
- const {'1': 'log_name', '3': 1, '4': 1, '5': 9, '10': 'logName'},
- ],
-};
-
-const WriteLogEntriesRequest$json = const {
- '1': 'WriteLogEntriesRequest',
- '2': const [
- const {'1': 'log_name', '3': 1, '4': 1, '5': 9, '10': 'logName'},
- const {
- '1': 'resource',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.google.api.MonitoredResource',
- '10': 'resource'
- },
- const {
- '1': 'labels',
- '3': 3,
- '4': 3,
- '5': 11,
- '6': '.google.logging.v2.WriteLogEntriesRequest.LabelsEntry',
- '10': 'labels'
- },
- const {
- '1': 'entries',
- '3': 4,
- '4': 3,
- '5': 11,
- '6': '.google.logging.v2.LogEntry',
- '10': 'entries'
- },
- const {
- '1': 'partial_success',
- '3': 5,
- '4': 1,
- '5': 8,
- '10': 'partialSuccess'
- },
- ],
- '3': const [WriteLogEntriesRequest_LabelsEntry$json],
-};
-
-const WriteLogEntriesRequest_LabelsEntry$json = const {
- '1': 'LabelsEntry',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
- const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
- ],
- '7': const {'7': true},
-};
-
-const WriteLogEntriesResponse$json = const {
- '1': 'WriteLogEntriesResponse',
-};
-
-const WriteLogEntriesPartialErrors$json = const {
- '1': 'WriteLogEntriesPartialErrors',
- '2': const [
- const {
- '1': 'log_entry_errors',
- '3': 1,
- '4': 3,
- '5': 11,
- '6':
- '.google.logging.v2.WriteLogEntriesPartialErrors.LogEntryErrorsEntry',
- '10': 'logEntryErrors'
- },
- ],
- '3': const [WriteLogEntriesPartialErrors_LogEntryErrorsEntry$json],
-};
-
-const WriteLogEntriesPartialErrors_LogEntryErrorsEntry$json = const {
- '1': 'LogEntryErrorsEntry',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 5, '10': 'key'},
- const {
- '1': 'value',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.google.rpc.Status',
- '10': 'value'
- },
- ],
- '7': const {'7': true},
-};
-
-const ListLogEntriesRequest$json = const {
- '1': 'ListLogEntriesRequest',
- '2': const [
- const {'1': 'project_ids', '3': 1, '4': 3, '5': 9, '10': 'projectIds'},
- const {
- '1': 'resource_names',
- '3': 8,
- '4': 3,
- '5': 9,
- '10': 'resourceNames'
- },
- const {'1': 'filter', '3': 2, '4': 1, '5': 9, '10': 'filter'},
- const {'1': 'order_by', '3': 3, '4': 1, '5': 9, '10': 'orderBy'},
- const {'1': 'page_size', '3': 4, '4': 1, '5': 5, '10': 'pageSize'},
- const {'1': 'page_token', '3': 5, '4': 1, '5': 9, '10': 'pageToken'},
- ],
-};
-
-const ListLogEntriesResponse$json = const {
- '1': 'ListLogEntriesResponse',
- '2': const [
- const {
- '1': 'entries',
- '3': 1,
- '4': 3,
- '5': 11,
- '6': '.google.logging.v2.LogEntry',
- '10': 'entries'
- },
- const {
- '1': 'next_page_token',
- '3': 2,
- '4': 1,
- '5': 9,
- '10': 'nextPageToken'
- },
- ],
-};
-
-const ListMonitoredResourceDescriptorsRequest$json = const {
- '1': 'ListMonitoredResourceDescriptorsRequest',
- '2': const [
- const {'1': 'page_size', '3': 1, '4': 1, '5': 5, '10': 'pageSize'},
- const {'1': 'page_token', '3': 2, '4': 1, '5': 9, '10': 'pageToken'},
- ],
-};
-
-const ListMonitoredResourceDescriptorsResponse$json = const {
- '1': 'ListMonitoredResourceDescriptorsResponse',
- '2': const [
- const {
- '1': 'resource_descriptors',
- '3': 1,
- '4': 3,
- '5': 11,
- '6': '.google.api.MonitoredResourceDescriptor',
- '10': 'resourceDescriptors'
- },
- const {
- '1': 'next_page_token',
- '3': 2,
- '4': 1,
- '5': 9,
- '10': 'nextPageToken'
- },
- ],
-};
-
-const ListLogsRequest$json = const {
- '1': 'ListLogsRequest',
- '2': const [
- const {'1': 'parent', '3': 1, '4': 1, '5': 9, '10': 'parent'},
- const {'1': 'page_size', '3': 2, '4': 1, '5': 5, '10': 'pageSize'},
- const {'1': 'page_token', '3': 3, '4': 1, '5': 9, '10': 'pageToken'},
- ],
-};
-
-const ListLogsResponse$json = const {
- '1': 'ListLogsResponse',
- '2': const [
- const {'1': 'log_names', '3': 3, '4': 3, '5': 9, '10': 'logNames'},
- const {
- '1': 'next_page_token',
- '3': 2,
- '4': 1,
- '5': 9,
- '10': 'nextPageToken'
- },
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pb.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pb.dart
deleted file mode 100644
index 15cb7be..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pb.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_any;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class Any extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Any')
- ..aOS(1, 'typeUrl')
- ..a<List<int>>(2, 'value', PbFieldType.OY)
- ..hasRequiredFields = false;
-
- Any() : super();
- Any.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Any.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Any clone() => new Any()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Any create() => new Any();
- static PbList<Any> createRepeated() => new PbList<Any>();
- static Any getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyAny();
- return _defaultInstance;
- }
-
- static Any _defaultInstance;
- static void $checkItem(Any v) {
- if (v is! Any) checkItemFailed(v, 'Any');
- }
-
- String get typeUrl => $_getS(0, '');
- set typeUrl(String v) {
- $_setString(0, v);
- }
-
- bool hasTypeUrl() => $_has(0);
- void clearTypeUrl() => clearField(1);
-
- List<int> get value => $_getN(1);
- set value(List<int> v) {
- $_setBytes(1, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyAny extends Any with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbenum.dart
deleted file mode 100644
index 4db6beb..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_any_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbjson.dart
deleted file mode 100644
index 9784050..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/any.pbjson.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_any_pbjson;
-
-const Any$json = const {
- '1': 'Any',
- '2': const [
- const {'1': 'type_url', '3': 1, '4': 1, '5': 9, '10': 'typeUrl'},
- const {'1': 'value', '3': 2, '4': 1, '5': 12, '10': 'value'},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pb.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pb.dart
deleted file mode 100644
index 79a8602..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pb.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_duration;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:fixnum/fixnum.dart';
-import 'package:protobuf/protobuf.dart';
-
-class Duration extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Duration')
- ..aInt64(1, 'seconds')
- ..a<int>(2, 'nanos', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- Duration() : super();
- Duration.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Duration.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Duration clone() => new Duration()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Duration create() => new Duration();
- static PbList<Duration> createRepeated() => new PbList<Duration>();
- static Duration getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyDuration();
- return _defaultInstance;
- }
-
- static Duration _defaultInstance;
- static void $checkItem(Duration v) {
- if (v is! Duration) checkItemFailed(v, 'Duration');
- }
-
- Int64 get seconds => $_getI64(0);
- set seconds(Int64 v) {
- $_setInt64(0, v);
- }
-
- bool hasSeconds() => $_has(0);
- void clearSeconds() => clearField(1);
-
- int get nanos => $_get(1, 0);
- set nanos(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasNanos() => $_has(1);
- void clearNanos() => clearField(2);
-}
-
-class _ReadonlyDuration extends Duration with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbenum.dart
deleted file mode 100644
index 7a03683..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_duration_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbjson.dart
deleted file mode 100644
index 2f816fe..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/duration.pbjson.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_duration_pbjson;
-
-const Duration$json = const {
- '1': 'Duration',
- '2': const [
- const {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'},
- const {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pb.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pb.dart
deleted file mode 100644
index 8dfaa6c..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pb.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_empty;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class Empty extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Empty')
- ..hasRequiredFields = false;
-
- Empty() : super();
- Empty.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Empty.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Empty clone() => new Empty()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Empty create() => new Empty();
- static PbList<Empty> createRepeated() => new PbList<Empty>();
- static Empty getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyEmpty();
- return _defaultInstance;
- }
-
- static Empty _defaultInstance;
- static void $checkItem(Empty v) {
- if (v is! Empty) checkItemFailed(v, 'Empty');
- }
-}
-
-class _ReadonlyEmpty extends Empty with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbenum.dart
deleted file mode 100644
index bcfc3d5..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_empty_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbjson.dart
deleted file mode 100644
index e372809..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/empty.pbjson.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_empty_pbjson;
-
-const Empty$json = const {
- '1': 'Empty',
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pb.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pb.dart
deleted file mode 100644
index 817369d..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pb.dart
+++ /dev/null
@@ -1,208 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_struct;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import 'struct.pbenum.dart';
-
-export 'struct.pbenum.dart';
-
-class Struct_FieldsEntry extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Struct_FieldsEntry')
- ..aOS(1, 'key')
- ..a<Value>(2, 'value', PbFieldType.OM, Value.getDefault, Value.create)
- ..hasRequiredFields = false;
-
- Struct_FieldsEntry() : super();
- Struct_FieldsEntry.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Struct_FieldsEntry.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Struct_FieldsEntry clone() =>
- new Struct_FieldsEntry()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Struct_FieldsEntry create() => new Struct_FieldsEntry();
- static PbList<Struct_FieldsEntry> createRepeated() =>
- new PbList<Struct_FieldsEntry>();
- static Struct_FieldsEntry getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyStruct_FieldsEntry();
- return _defaultInstance;
- }
-
- static Struct_FieldsEntry _defaultInstance;
- static void $checkItem(Struct_FieldsEntry v) {
- if (v is! Struct_FieldsEntry) checkItemFailed(v, 'Struct_FieldsEntry');
- }
-
- String get key => $_getS(0, '');
- set key(String v) {
- $_setString(0, v);
- }
-
- bool hasKey() => $_has(0);
- void clearKey() => clearField(1);
-
- Value get value => $_getN(1);
- set value(Value v) {
- setField(2, v);
- }
-
- bool hasValue() => $_has(1);
- void clearValue() => clearField(2);
-}
-
-class _ReadonlyStruct_FieldsEntry extends Struct_FieldsEntry
- with ReadonlyMessageMixin {}
-
-class Struct extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Struct')
- ..pp<Struct_FieldsEntry>(1, 'fields', PbFieldType.PM,
- Struct_FieldsEntry.$checkItem, Struct_FieldsEntry.create)
- ..hasRequiredFields = false;
-
- Struct() : super();
- Struct.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Struct.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Struct clone() => new Struct()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Struct create() => new Struct();
- static PbList<Struct> createRepeated() => new PbList<Struct>();
- static Struct getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyStruct();
- return _defaultInstance;
- }
-
- static Struct _defaultInstance;
- static void $checkItem(Struct v) {
- if (v is! Struct) checkItemFailed(v, 'Struct');
- }
-
- List<Struct_FieldsEntry> get fields => $_getList(0);
-}
-
-class _ReadonlyStruct extends Struct with ReadonlyMessageMixin {}
-
-class Value extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Value')
- ..e<NullValue>(1, 'nullValue', PbFieldType.OE, NullValue.NULL_VALUE,
- NullValue.valueOf, NullValue.values)
- ..a<double>(2, 'numberValue', PbFieldType.OD)
- ..aOS(3, 'stringValue')
- ..aOB(4, 'boolValue')
- ..a<Struct>(
- 5, 'structValue', PbFieldType.OM, Struct.getDefault, Struct.create)
- ..a<ListValue>(
- 6, 'listValue', PbFieldType.OM, ListValue.getDefault, ListValue.create)
- ..hasRequiredFields = false;
-
- Value() : super();
- Value.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Value.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Value clone() => new Value()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Value create() => new Value();
- static PbList<Value> createRepeated() => new PbList<Value>();
- static Value getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyValue();
- return _defaultInstance;
- }
-
- static Value _defaultInstance;
- static void $checkItem(Value v) {
- if (v is! Value) checkItemFailed(v, 'Value');
- }
-
- NullValue get nullValue => $_getN(0);
- set nullValue(NullValue v) {
- setField(1, v);
- }
-
- bool hasNullValue() => $_has(0);
- void clearNullValue() => clearField(1);
-
- double get numberValue => $_getN(1);
- set numberValue(double v) {
- $_setDouble(1, v);
- }
-
- bool hasNumberValue() => $_has(1);
- void clearNumberValue() => clearField(2);
-
- String get stringValue => $_getS(2, '');
- set stringValue(String v) {
- $_setString(2, v);
- }
-
- bool hasStringValue() => $_has(2);
- void clearStringValue() => clearField(3);
-
- bool get boolValue => $_get(3, false);
- set boolValue(bool v) {
- $_setBool(3, v);
- }
-
- bool hasBoolValue() => $_has(3);
- void clearBoolValue() => clearField(4);
-
- Struct get structValue => $_getN(4);
- set structValue(Struct v) {
- setField(5, v);
- }
-
- bool hasStructValue() => $_has(4);
- void clearStructValue() => clearField(5);
-
- ListValue get listValue => $_getN(5);
- set listValue(ListValue v) {
- setField(6, v);
- }
-
- bool hasListValue() => $_has(5);
- void clearListValue() => clearField(6);
-}
-
-class _ReadonlyValue extends Value with ReadonlyMessageMixin {}
-
-class ListValue extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ListValue')
- ..pp<Value>(1, 'values', PbFieldType.PM, Value.$checkItem, Value.create)
- ..hasRequiredFields = false;
-
- ListValue() : super();
- ListValue.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ListValue.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ListValue clone() => new ListValue()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ListValue create() => new ListValue();
- static PbList<ListValue> createRepeated() => new PbList<ListValue>();
- static ListValue getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyListValue();
- return _defaultInstance;
- }
-
- static ListValue _defaultInstance;
- static void $checkItem(ListValue v) {
- if (v is! ListValue) checkItemFailed(v, 'ListValue');
- }
-
- List<Value> get values => $_getList(0);
-}
-
-class _ReadonlyListValue extends ListValue with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbenum.dart
deleted file mode 100644
index 2f30d43..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbenum.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_struct_pbenum;
-
-// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
-import 'dart:core' show int, dynamic, String, List, Map;
-import 'package:protobuf/protobuf.dart';
-
-class NullValue extends ProtobufEnum {
- static const NullValue NULL_VALUE = const NullValue._(0, 'NULL_VALUE');
-
- static const List<NullValue> values = const <NullValue>[
- NULL_VALUE,
- ];
-
- static final Map<int, dynamic> _byValue = ProtobufEnum.initByValue(values);
- static NullValue valueOf(int value) => _byValue[value] as NullValue;
- static void $checkItem(NullValue v) {
- if (v is! NullValue) checkItemFailed(v, 'NullValue');
- }
-
- const NullValue._(int v, String n) : super(v, n);
-}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbjson.dart
deleted file mode 100644
index 9afd8b7..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/struct.pbjson.dart
+++ /dev/null
@@ -1,117 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_struct_pbjson;
-
-const NullValue$json = const {
- '1': 'NullValue',
- '2': const [
- const {'1': 'NULL_VALUE', '2': 0},
- ],
-};
-
-const Struct$json = const {
- '1': 'Struct',
- '2': const [
- const {
- '1': 'fields',
- '3': 1,
- '4': 3,
- '5': 11,
- '6': '.google.protobuf.Struct.FieldsEntry',
- '10': 'fields'
- },
- ],
- '3': const [Struct_FieldsEntry$json],
-};
-
-const Struct_FieldsEntry$json = const {
- '1': 'FieldsEntry',
- '2': const [
- const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
- const {
- '1': 'value',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Value',
- '10': 'value'
- },
- ],
- '7': const {'7': true},
-};
-
-const Value$json = const {
- '1': 'Value',
- '2': const [
- const {
- '1': 'null_value',
- '3': 1,
- '4': 1,
- '5': 14,
- '6': '.google.protobuf.NullValue',
- '9': 0,
- '10': 'nullValue'
- },
- const {
- '1': 'number_value',
- '3': 2,
- '4': 1,
- '5': 1,
- '9': 0,
- '10': 'numberValue'
- },
- const {
- '1': 'string_value',
- '3': 3,
- '4': 1,
- '5': 9,
- '9': 0,
- '10': 'stringValue'
- },
- const {
- '1': 'bool_value',
- '3': 4,
- '4': 1,
- '5': 8,
- '9': 0,
- '10': 'boolValue'
- },
- const {
- '1': 'struct_value',
- '3': 5,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.Struct',
- '9': 0,
- '10': 'structValue'
- },
- const {
- '1': 'list_value',
- '3': 6,
- '4': 1,
- '5': 11,
- '6': '.google.protobuf.ListValue',
- '9': 0,
- '10': 'listValue'
- },
- ],
- '8': const [
- const {'1': 'kind'},
- ],
-};
-
-const ListValue$json = const {
- '1': 'ListValue',
- '2': const [
- const {
- '1': 'values',
- '3': 1,
- '4': 3,
- '5': 11,
- '6': '.google.protobuf.Value',
- '10': 'values'
- },
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pb.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pb.dart
deleted file mode 100644
index 49c181f..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pb.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_timestamp;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:fixnum/fixnum.dart';
-import 'package:protobuf/protobuf.dart';
-
-class Timestamp extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Timestamp')
- ..aInt64(1, 'seconds')
- ..a<int>(2, 'nanos', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- Timestamp() : super();
- Timestamp.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Timestamp.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Timestamp clone() => new Timestamp()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Timestamp create() => new Timestamp();
- static PbList<Timestamp> createRepeated() => new PbList<Timestamp>();
- static Timestamp getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyTimestamp();
- return _defaultInstance;
- }
-
- static Timestamp _defaultInstance;
- static void $checkItem(Timestamp v) {
- if (v is! Timestamp) checkItemFailed(v, 'Timestamp');
- }
-
- Int64 get seconds => $_getI64(0);
- set seconds(Int64 v) {
- $_setInt64(0, v);
- }
-
- bool hasSeconds() => $_has(0);
- void clearSeconds() => clearField(1);
-
- int get nanos => $_get(1, 0);
- set nanos(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasNanos() => $_has(1);
- void clearNanos() => clearField(2);
-}
-
-class _ReadonlyTimestamp extends Timestamp with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbenum.dart
deleted file mode 100644
index 9c1ae44..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_timestamp_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbjson.dart
deleted file mode 100644
index b6cf119..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/protobuf/timestamp.pbjson.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.protobuf_timestamp_pbjson;
-
-const Timestamp$json = const {
- '1': 'Timestamp',
- '2': const [
- const {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'},
- const {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'},
- ],
-};
diff --git a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pb.dart b/grpc/example/googleapis/lib/src/generated/google/rpc/status.pb.dart
deleted file mode 100644
index 31e034f..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pb.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.rpc_status;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import '../protobuf/any.pb.dart' as $google$protobuf;
-
-class Status extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Status')
- ..a<int>(1, 'code', PbFieldType.O3)
- ..aOS(2, 'message')
- ..pp<$google$protobuf.Any>(3, 'details', PbFieldType.PM,
- $google$protobuf.Any.$checkItem, $google$protobuf.Any.create)
- ..hasRequiredFields = false;
-
- Status() : super();
- Status.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Status.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Status clone() => new Status()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Status create() => new Status();
- static PbList<Status> createRepeated() => new PbList<Status>();
- static Status getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyStatus();
- return _defaultInstance;
- }
-
- static Status _defaultInstance;
- static void $checkItem(Status v) {
- if (v is! Status) checkItemFailed(v, 'Status');
- }
-
- int get code => $_get(0, 0);
- set code(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasCode() => $_has(0);
- void clearCode() => clearField(1);
-
- String get message => $_getS(1, '');
- set message(String v) {
- $_setString(1, v);
- }
-
- bool hasMessage() => $_has(1);
- void clearMessage() => clearField(2);
-
- List<$google$protobuf.Any> get details => $_getList(2);
-}
-
-class _ReadonlyStatus extends Status with ReadonlyMessageMixin {}
diff --git a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbenum.dart b/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbenum.dart
deleted file mode 100644
index 7bd9759..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.rpc_status_pbenum;
diff --git a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbjson.dart b/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbjson.dart
deleted file mode 100644
index 279074d..0000000
--- a/grpc/example/googleapis/lib/src/generated/google/rpc/status.pbjson.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library google.rpc_status_pbjson;
-
-const Status$json = const {
- '1': 'Status',
- '2': const [
- const {'1': 'code', '3': 1, '4': 1, '5': 5, '10': 'code'},
- const {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},
- const {
- '1': 'details',
- '3': 3,
- '4': 3,
- '5': 11,
- '6': '.google.protobuf.Any',
- '10': 'details'
- },
- ],
-};
diff --git a/grpc/example/googleapis/pubspec.yaml b/grpc/example/googleapis/pubspec.yaml
deleted file mode 100644
index 3620b1c..0000000
--- a/grpc/example/googleapis/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: googleapis
-description: Dart gRPC client sample for Google APIs
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- async: '>=1.13.3 <3.0.0'
- grpc:
- path: ../../
- protobuf: ^0.10.1
-
-dev_dependencies:
- test: ^1.3.0
diff --git a/grpc/example/googleapis/tool/regenerate.sh b/grpc/example/googleapis/tool/regenerate.sh
deleted file mode 100755
index 6584746..0000000
--- a/grpc/example/googleapis/tool/regenerate.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-if [ ! -d "$PROTOBUF" ]; then
- echo "Please set the PROTOBUF environment variable to your clone of google/protobuf."
- exit -1
-fi
-
-if [ ! -d "$GOOGLEAPIS" ]; then
- echo "Please set the GOOGLEAPIS environment variable to your clone of googleapis/googleapis."
- exit -1
-fi
-
-PROTOC="protoc --dart_out=grpc:lib/src/generated -I$PROTOBUF/src -I$GOOGLEAPIS"
-
-$PROTOC $GOOGLEAPIS/google/logging/v2/logging.proto
-$PROTOC $GOOGLEAPIS/google/logging/v2/log_entry.proto
-$PROTOC $GOOGLEAPIS/google/logging/type/log_severity.proto
-$PROTOC $GOOGLEAPIS/google/logging/type/http_request.proto
-
-$PROTOC $GOOGLEAPIS/google/api/monitored_resource.proto
-$PROTOC $GOOGLEAPIS/google/api/label.proto
-
-$PROTOC $GOOGLEAPIS/google/rpc/status.proto
-
-$PROTOC $PROTOBUF/src/google/protobuf/any.proto
-$PROTOC $PROTOBUF/src/google/protobuf/duration.proto
-$PROTOC $PROTOBUF/src/google/protobuf/empty.proto
-$PROTOC $PROTOBUF/src/google/protobuf/struct.proto
-$PROTOC $PROTOBUF/src/google/protobuf/timestamp.proto
-
-dartfmt -w lib/src/generated
diff --git a/grpc/example/helloworld/README.md b/grpc/example/helloworld/README.md
deleted file mode 100644
index aeb4317..0000000
--- a/grpc/example/helloworld/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Description
-The hello world server and client demonstrate how to use Dart gRPC libraries to
-perform unary RPCs.
-
-See the definition of the hello world service in `protos/helloworld.proto`.
-
-# Run the sample code
-To compile and run the example, assuming you are in the root of the helloworld
-folder, i.e., .../example/helloworld/, first get the dependencies by running:
-
-```sh
-$ pub get
-```
-
-Then, to run the server:
-
-```sh
-$ dart bin/server.dart
-```
-
-Likewise, to run the client:
-
-```sh
-$ dart bin/client.dart
-```
-
-# Regenerate the stubs
-
-If you have made changes to the message or service definition in
-`protos/helloworld.proto` and need to regenerate the corresponding Dart files,
-you will need to have protoc version 3.0.0 or higher and the Dart protoc plugin
-version 0.7.9 or higher on your PATH.
-
-To install protoc, see the instructions on
-[the Protocol Buffers website](https://developers.google.com/protocol-buffers/).
-
-The easiest way to get the Dart protoc plugin is by running
-
-```sh
-$ pub global activate protoc_plugin
-```
-
-and follow the directions to add `~/.pub-cache/bin` to your PATH, if you haven't
-already done so.
-
-You can now regenerate the Dart files by running
-
-```sh
-$ protoc --dart_out=grpc:lib/src/generated -Iprotos protos/helloworld.proto
-```
diff --git a/grpc/example/helloworld/bin/client.dart b/grpc/example/helloworld/bin/client.dart
deleted file mode 100644
index 6f44dbf..0000000
--- a/grpc/example/helloworld/bin/client.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2018, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Dart implementation of the gRPC helloworld.Greeter client.
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'package:helloworld/src/generated/helloworld.pb.dart';
-import 'package:helloworld/src/generated/helloworld.pbgrpc.dart';
-
-Future<void> main(List<String> args) async {
- final channel = new ClientChannel('localhost',
- port: 50051,
- options: const ChannelOptions(
- credentials: const ChannelCredentials.insecure()));
- final stub = new GreeterClient(channel);
-
- final name = args.isNotEmpty ? args[0] : 'world';
-
- try {
- final response = await stub.sayHello(new HelloRequest()..name = name);
- print('Greeter client received: ${response.message}');
- } catch (e) {
- print('Caught error: $e');
- }
- await channel.shutdown();
-}
diff --git a/grpc/example/helloworld/bin/server.dart b/grpc/example/helloworld/bin/server.dart
deleted file mode 100644
index cfed15d..0000000
--- a/grpc/example/helloworld/bin/server.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2018, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Dart implementation of the gRPC helloworld.Greeter server.
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'package:helloworld/src/generated/helloworld.pb.dart';
-import 'package:helloworld/src/generated/helloworld.pbgrpc.dart';
-
-class GreeterService extends GreeterServiceBase {
- @override
- Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
- return new HelloReply()..message = 'Hello, ${request.name}!';
- }
-}
-
-Future<void> main(List<String> args) async {
- final server = new Server([new GreeterService()]);
- await server.serve(port: 50051);
- print('Server listening on port ${server.port}...');
-}
diff --git a/grpc/example/helloworld/lib/src/generated/helloworld.pb.dart b/grpc/example/helloworld/lib/src/generated/helloworld.pb.dart
deleted file mode 100644
index d441d8c..0000000
--- a/grpc/example/helloworld/lib/src/generated/helloworld.pb.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library helloworld_helloworld;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class HelloRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('HelloRequest')
- ..aOS(1, 'name')
- ..hasRequiredFields = false;
-
- HelloRequest() : super();
- HelloRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- HelloRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- HelloRequest clone() => new HelloRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static HelloRequest create() => new HelloRequest();
- static PbList<HelloRequest> createRepeated() => new PbList<HelloRequest>();
- static HelloRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyHelloRequest();
- return _defaultInstance;
- }
-
- static HelloRequest _defaultInstance;
- static void $checkItem(HelloRequest v) {
- if (v is! HelloRequest) checkItemFailed(v, 'HelloRequest');
- }
-
- String get name => $_getS(0, '');
- set name(String v) {
- $_setString(0, v);
- }
-
- bool hasName() => $_has(0);
- void clearName() => clearField(1);
-}
-
-class _ReadonlyHelloRequest extends HelloRequest with ReadonlyMessageMixin {}
-
-class HelloReply extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('HelloReply')
- ..aOS(1, 'message')
- ..hasRequiredFields = false;
-
- HelloReply() : super();
- HelloReply.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- HelloReply.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- HelloReply clone() => new HelloReply()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static HelloReply create() => new HelloReply();
- static PbList<HelloReply> createRepeated() => new PbList<HelloReply>();
- static HelloReply getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyHelloReply();
- return _defaultInstance;
- }
-
- static HelloReply _defaultInstance;
- static void $checkItem(HelloReply v) {
- if (v is! HelloReply) checkItemFailed(v, 'HelloReply');
- }
-
- String get message => $_getS(0, '');
- set message(String v) {
- $_setString(0, v);
- }
-
- bool hasMessage() => $_has(0);
- void clearMessage() => clearField(1);
-}
-
-class _ReadonlyHelloReply extends HelloReply with ReadonlyMessageMixin {}
diff --git a/grpc/example/helloworld/lib/src/generated/helloworld.pbenum.dart b/grpc/example/helloworld/lib/src/generated/helloworld.pbenum.dart
deleted file mode 100644
index 167efb8..0000000
--- a/grpc/example/helloworld/lib/src/generated/helloworld.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library helloworld_helloworld_pbenum;
diff --git a/grpc/example/helloworld/lib/src/generated/helloworld.pbgrpc.dart b/grpc/example/helloworld/lib/src/generated/helloworld.pbgrpc.dart
deleted file mode 100644
index c390483..0000000
--- a/grpc/example/helloworld/lib/src/generated/helloworld.pbgrpc.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library helloworld_helloworld_pbgrpc;
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'helloworld.pb.dart';
-export 'helloworld.pb.dart';
-
-class GreeterClient extends Client {
- static final _$sayHello = new ClientMethod<HelloRequest, HelloReply>(
- '/helloworld.Greeter/SayHello',
- (HelloRequest value) => value.writeToBuffer(),
- (List<int> value) => new HelloReply.fromBuffer(value));
-
- GreeterClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<HelloReply> sayHello(HelloRequest request,
- {CallOptions options}) {
- final call = $createCall(_$sayHello, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-}
-
-abstract class GreeterServiceBase extends Service {
- String get $name => 'helloworld.Greeter';
-
- GreeterServiceBase() {
- $addMethod(new ServiceMethod<HelloRequest, HelloReply>(
- 'SayHello',
- sayHello_Pre,
- false,
- false,
- (List<int> value) => new HelloRequest.fromBuffer(value),
- (HelloReply value) => value.writeToBuffer()));
- }
-
- Future<HelloReply> sayHello_Pre(ServiceCall call, Future request) async {
- return sayHello(call, await request);
- }
-
- Future<HelloReply> sayHello(ServiceCall call, HelloRequest request);
-}
diff --git a/grpc/example/helloworld/lib/src/generated/helloworld.pbjson.dart b/grpc/example/helloworld/lib/src/generated/helloworld.pbjson.dart
deleted file mode 100644
index ea6a1a4..0000000
--- a/grpc/example/helloworld/lib/src/generated/helloworld.pbjson.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library helloworld_helloworld_pbjson;
-
-const HelloRequest$json = const {
- '1': 'HelloRequest',
- '2': const [
- const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
- ],
-};
-
-const HelloReply$json = const {
- '1': 'HelloReply',
- '2': const [
- const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
- ],
-};
diff --git a/grpc/example/helloworld/protos/helloworld.proto b/grpc/example/helloworld/protos/helloworld.proto
deleted file mode 100644
index be878ce..0000000
--- a/grpc/example/helloworld/protos/helloworld.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-option java_multiple_files = true;
-option java_package = "io.grpc.examples.helloworld";
-option java_outer_classname = "HelloWorldProto";
-option objc_class_prefix = "HLW";
-
-package helloworld;
-
-// The greeting service definition.
-service Greeter {
- // Sends a greeting
- rpc SayHello (HelloRequest) returns (HelloReply) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
- string name = 1;
-}
-
-// The response message containing the greetings
-message HelloReply {
- string message = 1;
-}
diff --git a/grpc/example/helloworld/pubspec.yaml b/grpc/example/helloworld/pubspec.yaml
deleted file mode 100644
index 9f14b4a..0000000
--- a/grpc/example/helloworld/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: helloworld
-description: Dart gRPC sample client and server.
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- async: '>=1.13.3 <3.0.0'
- grpc:
- path: ../../
- protobuf: ^0.10.1
-
-dev_dependencies:
- test: ^1.3.0
diff --git a/grpc/example/metadata/README.md b/grpc/example/metadata/README.md
deleted file mode 100644
index 947605c..0000000
--- a/grpc/example/metadata/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Description
-The metadata server and client demonstrate how to handle custom metadata,
-cancellation, and timeouts in Dart gRPC.
-
-See the definition of the metadata service in `protos/metadata.proto`.
-
-# Run the sample code
-To compile and run the example, assuming you are in the root of the metadata
-folder, i.e., .../example/metadata/, first get the dependencies by running:
-
-```sh
-$ pub get
-```
-
-Then, to run the server:
-
-```sh
-$ dart bin/server.dart
-```
-
-Likewise, to run the client:
-
-```sh
-$ dart bin/client.dart
-```
diff --git a/grpc/example/metadata/bin/client.dart b/grpc/example/metadata/bin/client.dart
deleted file mode 100644
index f2febf5..0000000
--- a/grpc/example/metadata/bin/client.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:metadata/src/client.dart';
-
-main(List<String> args) {
- new Client().main(args);
-}
diff --git a/grpc/example/metadata/bin/server.dart b/grpc/example/metadata/bin/server.dart
deleted file mode 100644
index 0eb9b7d..0000000
--- a/grpc/example/metadata/bin/server.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:metadata/src/server.dart';
-
-main(List<String> args) {
- new Server().main(args);
-}
diff --git a/grpc/example/metadata/lib/src/client.dart b/grpc/example/metadata/lib/src/client.dart
deleted file mode 100644
index 7e3b79b..0000000
--- a/grpc/example/metadata/lib/src/client.dart
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'generated/metadata.pbgrpc.dart';
-
-class Client {
- ClientChannel channel;
- MetadataClient stub;
-
- Future<void> main(List<String> args) async {
- channel = new ClientChannel('127.0.0.1',
- port: 8080,
- options: const ChannelOptions(
- credentials: const ChannelCredentials.insecure()));
- stub = new MetadataClient(channel);
- // Run all of the demos in order.
- await runEcho();
- await runEchoDelayCancel();
- await runAddOneCancel();
- await runFibonacciCancel();
- await runFibonacciTimeout();
- await channel.shutdown();
- }
-
- /// Run the echo demo.
- ///
- /// Send custom metadata with a RPC, and print out the received response and
- /// metadata.
- Future<void> runEcho() async {
- final request = new Record()..value = 'Kaj';
- final call = stub.echo(request,
- options: new CallOptions(metadata: {'peer': 'Verner'}));
- call.headers.then((headers) {
- print('Received header metadata: $headers');
- });
- call.trailers.then((trailers) {
- print('Received trailer metadata: $trailers');
- });
- final response = await call;
- print('Echo response: ${response.value}');
- }
-
- /// Run the echo with delay cancel demo.
- ///
- /// Same as the echo demo, but demonstrating per-client custom metadata, as
- /// well as a per-call metadata. The server will delay the response for the
- /// requested duration, during which the client will cancel the RPC.
- Future<void> runEchoDelayCancel() async {
- final stubWithCustomOptions = new MetadataClient(channel,
- options: new CallOptions(metadata: {'peer': 'Verner'}));
- final request = new Record()..value = 'Kaj';
- final call = stubWithCustomOptions.echo(request,
- options: new CallOptions(metadata: {'delay': '1'}));
- call.headers.then((headers) {
- print('Received header metadata: $headers');
- });
- call.trailers.then((trailers) {
- print('Received trailer metadata: $trailers');
- });
- await new Future.delayed(new Duration(milliseconds: 10));
- call.cancel();
- try {
- final response = await call;
- print('Unexpected echo response: ${response.value}');
- } catch (error) {
- print('Expected error: $error');
- }
- }
-
- /// Run the addOne cancel demo.
- ///
- /// Makes a bi-directional RPC, sends 4 requests, and cancels the RPC after
- /// receiving 3 responses.
- Future<void> runAddOneCancel() async {
- final numbers = new StreamController<int>();
- final call =
- stub.addOne(numbers.stream.map((value) => new Number()..value = value));
- final receivedThree = new Completer<bool>();
- final sub = call.listen((number) {
- print('AddOneCancel: Received ${number.value}');
- if (number.value == 3) {
- receivedThree.complete(true);
- }
- }, onError: (e) => print('Caught: $e'));
- numbers.add(1);
- numbers.add(2);
- numbers.add(3);
- numbers.add(4);
- await receivedThree.future;
- await call.cancel();
- await Future.wait([sub.cancel(), numbers.close()]);
- }
-
- /// Run the Fibonacci demo.
- ///
- /// Call an RPC that returns a stream of Fibonacci numbers. Cancel the call
- /// after receiving more than 5 responses.
- Future<void> runFibonacciCancel() async {
- final call = stub.fibonacci(new Empty());
- int count = 0;
- try {
- await for (var number in call) {
- count++;
- print('Received ${number.value} (count=$count)');
- if (count > 5) {
- await call.cancel();
- }
- }
- } on GrpcError catch (e) {
- print('Caught: $e');
- }
- print('Final count: $count');
- }
-
- /// Run the timeout demo.
- ///
- /// Call an RPC that returns a stream of Fibonacci numbers, and specify an RPC
- /// timeout of 2 seconds.
- Future<void> runFibonacciTimeout() async {
- final call = stub.fibonacci(new Empty(),
- options: new CallOptions(timeout: new Duration(seconds: 2)));
- int count = 0;
- try {
- await for (var number in call) {
- count++;
- print('Received ${number.value} (count=$count)');
- }
- } on GrpcError catch (e) {
- print('Caught: $e');
- }
- print('Final count: $count');
- }
-}
diff --git a/grpc/example/metadata/lib/src/generated/metadata.pb.dart b/grpc/example/metadata/lib/src/generated/metadata.pb.dart
deleted file mode 100644
index f5390b5..0000000
--- a/grpc/example/metadata/lib/src/generated/metadata.pb.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc_metadata;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class Record extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Record')
- ..aOS(1, 'value')
- ..hasRequiredFields = false;
-
- Record() : super();
- Record.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Record.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Record clone() => new Record()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Record create() => new Record();
- static PbList<Record> createRepeated() => new PbList<Record>();
- static Record getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyRecord();
- return _defaultInstance;
- }
-
- static Record _defaultInstance;
- static void $checkItem(Record v) {
- if (v is! Record) checkItemFailed(v, 'Record');
- }
-
- String get value => $_getS(0, '');
- set value(String v) {
- $_setString(0, v);
- }
-
- bool hasValue() => $_has(0);
- void clearValue() => clearField(1);
-}
-
-class _ReadonlyRecord extends Record with ReadonlyMessageMixin {}
-
-class Number extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Number')
- ..a<int>(1, 'value', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- Number() : super();
- Number.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Number.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Number clone() => new Number()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Number create() => new Number();
- static PbList<Number> createRepeated() => new PbList<Number>();
- static Number getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyNumber();
- return _defaultInstance;
- }
-
- static Number _defaultInstance;
- static void $checkItem(Number v) {
- if (v is! Number) checkItemFailed(v, 'Number');
- }
-
- int get value => $_get(0, 0);
- set value(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasValue() => $_has(0);
- void clearValue() => clearField(1);
-}
-
-class _ReadonlyNumber extends Number with ReadonlyMessageMixin {}
-
-class Empty extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Empty')
- ..hasRequiredFields = false;
-
- Empty() : super();
- Empty.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Empty.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Empty clone() => new Empty()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Empty create() => new Empty();
- static PbList<Empty> createRepeated() => new PbList<Empty>();
- static Empty getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyEmpty();
- return _defaultInstance;
- }
-
- static Empty _defaultInstance;
- static void $checkItem(Empty v) {
- if (v is! Empty) checkItemFailed(v, 'Empty');
- }
-}
-
-class _ReadonlyEmpty extends Empty with ReadonlyMessageMixin {}
diff --git a/grpc/example/metadata/lib/src/generated/metadata.pbgrpc.dart b/grpc/example/metadata/lib/src/generated/metadata.pbgrpc.dart
deleted file mode 100644
index e7de680..0000000
--- a/grpc/example/metadata/lib/src/generated/metadata.pbgrpc.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc_metadata_pbgrpc;
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'metadata.pb.dart';
-export 'metadata.pb.dart';
-
-class MetadataClient extends Client {
- static final _$echo = new ClientMethod<Record, Record>(
- '/grpc.Metadata/Echo',
- (Record value) => value.writeToBuffer(),
- (List<int> value) => new Record.fromBuffer(value));
- static final _$addOne = new ClientMethod<Number, Number>(
- '/grpc.Metadata/AddOne',
- (Number value) => value.writeToBuffer(),
- (List<int> value) => new Number.fromBuffer(value));
- static final _$fibonacci = new ClientMethod<Empty, Number>(
- '/grpc.Metadata/Fibonacci',
- (Empty value) => value.writeToBuffer(),
- (List<int> value) => new Number.fromBuffer(value));
-
- MetadataClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<Record> echo(Record request, {CallOptions options}) {
- final call = $createCall(_$echo, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseStream<Number> addOne(Stream<Number> request, {CallOptions options}) {
- final call = $createCall(_$addOne, request, options: options);
- return new ResponseStream(call);
- }
-
- ResponseStream<Number> fibonacci(Empty request, {CallOptions options}) {
- final call = $createCall(_$fibonacci, new Stream.fromIterable([request]),
- options: options);
- return new ResponseStream(call);
- }
-}
-
-abstract class MetadataServiceBase extends Service {
- String get $name => 'grpc.Metadata';
-
- MetadataServiceBase() {
- $addMethod(new ServiceMethod<Record, Record>(
- 'Echo',
- echo_Pre,
- false,
- false,
- (List<int> value) => new Record.fromBuffer(value),
- (Record value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<Number, Number>(
- 'AddOne',
- addOne,
- true,
- true,
- (List<int> value) => new Number.fromBuffer(value),
- (Number value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<Empty, Number>(
- 'Fibonacci',
- fibonacci_Pre,
- false,
- true,
- (List<int> value) => new Empty.fromBuffer(value),
- (Number value) => value.writeToBuffer()));
- }
-
- Future<Record> echo_Pre(ServiceCall call, Future request) async {
- return echo(call, await request);
- }
-
- Stream<Number> fibonacci_Pre(ServiceCall call, Future request) async* {
- yield* fibonacci(call, (await request) as Empty);
- }
-
- Future<Record> echo(ServiceCall call, Record request);
- Stream<Number> addOne(ServiceCall call, Stream<Number> request);
- Stream<Number> fibonacci(ServiceCall call, Empty request);
-}
diff --git a/grpc/example/metadata/lib/src/server.dart b/grpc/example/metadata/lib/src/server.dart
deleted file mode 100644
index 96344c9..0000000
--- a/grpc/example/metadata/lib/src/server.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart' as grpc;
-
-import 'generated/metadata.pbgrpc.dart';
-
-class MetadataService extends MetadataServiceBase {
- int callCount = 0;
-
- @override
- Future<Record> echo(grpc.ServiceCall call, Record request) async {
- final peer = call.clientMetadata['peer'];
- final count = callCount++;
- print('Echo: Call #$count: Peer: $peer, request: ${request.value}');
- call.headers['count'] = '${count}';
- call.trailers['hello'] = request.value;
-
- final delay = call.clientMetadata['delay'];
- if (delay != null) {
- await new Future.delayed(new Duration(seconds: int.parse(delay)));
- }
-
- return new Record()..value = peer;
- }
-
- @override
- Stream<Number> addOne(grpc.ServiceCall call, Stream<Number> request) async* {
- int lastNumber = -1;
- try {
- await for (var number in request) {
- lastNumber = number.value;
- yield new Number()..value = number.value + 1;
- }
- } catch (error) {
- print('Caught: $error, last number = $lastNumber');
- } finally {
- if (call.isCanceled) {
- print('AddOne: Call canceled');
- }
- }
- }
-
- /// Streams a Fibonacci number every 500ms until the call is canceled.
- Stream<Number> fibonacci(grpc.ServiceCall call, Empty request) async* {
- int previous = 0;
- int current = 1;
- try {
- while (true) {
- await new Future.delayed(new Duration(milliseconds: 500));
- yield new Number()..value = current;
- final next = current + previous;
- previous = current;
- current = next;
- }
- } finally {
- if (call.isCanceled) {
- print('Fibonacci: Canceled.');
- }
- }
- }
-}
-
-class Server {
- Future<void> main(List<String> args) async {
- final server = new grpc.Server([new MetadataService()]);
- await server.serve(port: 8080);
- print('Server listening on port ${server.port}...');
- }
-}
diff --git a/grpc/example/metadata/protos/metadata.proto b/grpc/example/metadata/protos/metadata.proto
deleted file mode 100644
index 9b6a63f..0000000
--- a/grpc/example/metadata/protos/metadata.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package grpc;
-
-// Interface exported by the server.
-service Metadata {
- // Echo metadata.
- //
- // Echoes the given input as trailer metadata. Sets a call counter as header
- // metadata, and returns the value of the 'hello' key in the client metadata
- // as the result.
- rpc Echo(Record) returns (Record) {}
-
- // Adds 1 to the numbers in the request stream.
- //
- // Uses bidirectional streaming.
- rpc AddOne(stream Number) returns (stream Number) {}
-
- // Fibonacci.
- //
- // Streams Fibonacci numbers until the call is canceled or times out.
- rpc Fibonacci(Empty) returns (stream Number) {}
-}
-
-// A message containing a single string value.
-message Record {
- string value = 1;
-}
-
-// A message containing a single number.
-message Number {
- int32 value = 1;
-}
-
-// A message containing nothing.
-message Empty {
-}
-
diff --git a/grpc/example/metadata/pubspec.yaml b/grpc/example/metadata/pubspec.yaml
deleted file mode 100644
index 7dfd33c..0000000
--- a/grpc/example/metadata/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: metadata
-description: Dart gRPC sample client and server.
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- async: '>=1.13.3 <3.0.0'
- grpc:
- path: ../../
- protobuf: ^0.10.1
-
-dev_dependencies:
- test: ^1.3.0
diff --git a/grpc/example/metadata/tool/regenerate.sh b/grpc/example/metadata/tool/regenerate.sh
deleted file mode 100755
index 65e2a27..0000000
--- a/grpc/example/metadata/tool/regenerate.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env bash
-protoc --dart_out=grpc:lib/src/generated -Iprotos protos/metadata.proto
-rm lib/src/generated/metadata.pb{enum,json}.dart
-dartfmt -w lib/src/generated
diff --git a/grpc/example/route_guide/README.md b/grpc/example/route_guide/README.md
deleted file mode 100644
index ece2692..0000000
--- a/grpc/example/route_guide/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# Description
-The route guide server and client demonstrate how to use Dart gRPC libraries to
-perform unary, client streaming, server streaming and full duplex RPCs.
-
-See the definition of the route guide service in `protos/route_guide.proto`.
-
-# Run the sample code
-To compile and run the example, assuming you are in the root of the route_guide
-folder, i.e., .../example/route_guide/, first get the dependencies by running:
-
-```sh
-$ pub get
-```
-
-Then, to run the server:
-
-```sh
-$ dart bin/server.dart
-```
-
-Likewise, to run the client:
-
-```sh
-$ dart bin/client.dart
-```
-
-# Regenerate the stubs
-
-If you have made changes to the message or service definition in
-`protos/route_guide.proto` and need to regenerate the corresponding Dart files,
-you will need to have protoc version 3.0.0 or higher and the Dart protoc plugin
-version 0.7.9 or higher on your PATH.
-
-To install protoc with Dart support, take these steps:
-
-1. Install the `protoc` matching your development operating system from
-[the Protocol Buffers releases page](https://github.com/google/protobuf/releases)
-(e.g. `protoc-3.5.1-osx-x86_64.zip` for macOS).
-
-1. Get the Dart protoc plugin by running
-
- ```sh
- $ pub global activate protoc_plugin
- ```
-
-1. Add `~/.pub-cache/bin` to your PATH, if you haven't
-already done so.
-
-You can now regenerate the Dart files by running
-
-```sh
-$ protoc --dart_out=grpc:lib/src/generated -Iprotos protos/route_guide.proto
-```
diff --git a/grpc/example/route_guide/bin/client.dart b/grpc/example/route_guide/bin/client.dart
deleted file mode 100644
index 662666e..0000000
--- a/grpc/example/route_guide/bin/client.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:route_guide/src/client.dart';
-
-main(List<String> args) async {
- await new Client().main(args);
-}
diff --git a/grpc/example/route_guide/bin/server.dart b/grpc/example/route_guide/bin/server.dart
deleted file mode 100644
index fada4af..0000000
--- a/grpc/example/route_guide/bin/server.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:route_guide/src/server.dart';
-
-main(List<String> args) async {
- await new Server().main(args);
-}
diff --git a/grpc/example/route_guide/data/route_guide_db.json b/grpc/example/route_guide/data/route_guide_db.json
deleted file mode 100644
index 9d6a980..0000000
--- a/grpc/example/route_guide/data/route_guide_db.json
+++ /dev/null
@@ -1,601 +0,0 @@
-[{
- "location": {
- "latitude": 407838351,
- "longitude": -746143763
- },
- "name": "Patriots Path, Mendham, NJ 07945, USA"
-}, {
- "location": {
- "latitude": 408122808,
- "longitude": -743999179
- },
- "name": "101 New Jersey 10, Whippany, NJ 07981, USA"
-}, {
- "location": {
- "latitude": 413628156,
- "longitude": -749015468
- },
- "name": "U.S. 6, Shohola, PA 18458, USA"
-}, {
- "location": {
- "latitude": 419999544,
- "longitude": -740371136
- },
- "name": "5 Conners Road, Kingston, NY 12401, USA"
-}, {
- "location": {
- "latitude": 414008389,
- "longitude": -743951297
- },
- "name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA"
-}, {
- "location": {
- "latitude": 419611318,
- "longitude": -746524769
- },
- "name": "287 Flugertown Road, Livingston Manor, NY 12758, USA"
-}, {
- "location": {
- "latitude": 406109563,
- "longitude": -742186778
- },
- "name": "4001 Tremley Point Road, Linden, NJ 07036, USA"
-}, {
- "location": {
- "latitude": 416802456,
- "longitude": -742370183
- },
- "name": "352 South Mountain Road, Wallkill, NY 12589, USA"
-}, {
- "location": {
- "latitude": 412950425,
- "longitude": -741077389
- },
- "name": "Bailey Turn Road, Harriman, NY 10926, USA"
-}, {
- "location": {
- "latitude": 412144655,
- "longitude": -743949739
- },
- "name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA"
-}, {
- "location": {
- "latitude": 415736605,
- "longitude": -742847522
- },
- "name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA"
-}, {
- "location": {
- "latitude": 413843930,
- "longitude": -740501726
- },
- "name": "162 Merrill Road, Highland Mills, NY 10930, USA"
-}, {
- "location": {
- "latitude": 410873075,
- "longitude": -744459023
- },
- "name": "Clinton Road, West Milford, NJ 07480, USA"
-}, {
- "location": {
- "latitude": 412346009,
- "longitude": -744026814
- },
- "name": "16 Old Brook Lane, Warwick, NY 10990, USA"
-}, {
- "location": {
- "latitude": 402948455,
- "longitude": -747903913
- },
- "name": "3 Drake Lane, Pennington, NJ 08534, USA"
-}, {
- "location": {
- "latitude": 406337092,
- "longitude": -740122226
- },
- "name": "6324 8th Avenue, Brooklyn, NY 11220, USA"
-}, {
- "location": {
- "latitude": 406421967,
- "longitude": -747727624
- },
- "name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA"
-}, {
- "location": {
- "latitude": 416318082,
- "longitude": -749677716
- },
- "name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA"
-}, {
- "location": {
- "latitude": 415301720,
- "longitude": -748416257
- },
- "name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA"
-}, {
- "location": {
- "latitude": 402647019,
- "longitude": -747071791
- },
- "name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA"
-}, {
- "location": {
- "latitude": 412567807,
- "longitude": -741058078
- },
- "name": "New York State Reference Route 987E, Southfields, NY 10975, USA"
-}, {
- "location": {
- "latitude": 416855156,
- "longitude": -744420597
- },
- "name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA"
-}, {
- "location": {
- "latitude": 404663628,
- "longitude": -744820157
- },
- "name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA"
-}, {
- "location": {
- "latitude": 407113723,
- "longitude": -749746483
- },
- "name": ""
-}, {
- "location": {
- "latitude": 402133926,
- "longitude": -743613249
- },
- "name": ""
-}, {
- "location": {
- "latitude": 400273442,
- "longitude": -741220915
- },
- "name": ""
-}, {
- "location": {
- "latitude": 411236786,
- "longitude": -744070769
- },
- "name": ""
-}, {
- "location": {
- "latitude": 411633782,
- "longitude": -746784970
- },
- "name": "211-225 Plains Road, Augusta, NJ 07822, USA"
-}, {
- "location": {
- "latitude": 415830701,
- "longitude": -742952812
- },
- "name": ""
-}, {
- "location": {
- "latitude": 413447164,
- "longitude": -748712898
- },
- "name": "165 Pedersen Ridge Road, Milford, PA 18337, USA"
-}, {
- "location": {
- "latitude": 405047245,
- "longitude": -749800722
- },
- "name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA"
-}, {
- "location": {
- "latitude": 418858923,
- "longitude": -746156790
- },
- "name": ""
-}, {
- "location": {
- "latitude": 417951888,
- "longitude": -748484944
- },
- "name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA"
-}, {
- "location": {
- "latitude": 407033786,
- "longitude": -743977337
- },
- "name": "26 East 3rd Street, New Providence, NJ 07974, USA"
-}, {
- "location": {
- "latitude": 417548014,
- "longitude": -740075041
- },
- "name": ""
-}, {
- "location": {
- "latitude": 410395868,
- "longitude": -744972325
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404615353,
- "longitude": -745129803
- },
- "name": ""
-}, {
- "location": {
- "latitude": 406589790,
- "longitude": -743560121
- },
- "name": "611 Lawrence Avenue, Westfield, NJ 07090, USA"
-}, {
- "location": {
- "latitude": 414653148,
- "longitude": -740477477
- },
- "name": "18 Lannis Avenue, New Windsor, NY 12553, USA"
-}, {
- "location": {
- "latitude": 405957808,
- "longitude": -743255336
- },
- "name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA"
-}, {
- "location": {
- "latitude": 411733589,
- "longitude": -741648093
- },
- "name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA"
-}, {
- "location": {
- "latitude": 412676291,
- "longitude": -742606606
- },
- "name": "1270 Lakes Road, Monroe, NY 10950, USA"
-}, {
- "location": {
- "latitude": 409224445,
- "longitude": -748286738
- },
- "name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA"
-}, {
- "location": {
- "latitude": 406523420,
- "longitude": -742135517
- },
- "name": "652 Garden Street, Elizabeth, NJ 07202, USA"
-}, {
- "location": {
- "latitude": 401827388,
- "longitude": -740294537
- },
- "name": "349 Sea Spray Court, Neptune City, NJ 07753, USA"
-}, {
- "location": {
- "latitude": 410564152,
- "longitude": -743685054
- },
- "name": "13-17 Stanley Street, West Milford, NJ 07480, USA"
-}, {
- "location": {
- "latitude": 408472324,
- "longitude": -740726046
- },
- "name": "47 Industrial Avenue, Teterboro, NJ 07608, USA"
-}, {
- "location": {
- "latitude": 412452168,
- "longitude": -740214052
- },
- "name": "5 White Oak Lane, Stony Point, NY 10980, USA"
-}, {
- "location": {
- "latitude": 409146138,
- "longitude": -746188906
- },
- "name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA"
-}, {
- "location": {
- "latitude": 404701380,
- "longitude": -744781745
- },
- "name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA"
-}, {
- "location": {
- "latitude": 409642566,
- "longitude": -746017679
- },
- "name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA"
-}, {
- "location": {
- "latitude": 408031728,
- "longitude": -748645385
- },
- "name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA"
-}, {
- "location": {
- "latitude": 413700272,
- "longitude": -742135189
- },
- "name": "367 Prospect Road, Chester, NY 10918, USA"
-}, {
- "location": {
- "latitude": 404310607,
- "longitude": -740282632
- },
- "name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA"
-}, {
- "location": {
- "latitude": 409319800,
- "longitude": -746201391
- },
- "name": "11 Ward Street, Mount Arlington, NJ 07856, USA"
-}, {
- "location": {
- "latitude": 406685311,
- "longitude": -742108603
- },
- "name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA"
-}, {
- "location": {
- "latitude": 419018117,
- "longitude": -749142781
- },
- "name": "43 Dreher Road, Roscoe, NY 12776, USA"
-}, {
- "location": {
- "latitude": 412856162,
- "longitude": -745148837
- },
- "name": "Swan Street, Pine Island, NY 10969, USA"
-}, {
- "location": {
- "latitude": 416560744,
- "longitude": -746721964
- },
- "name": "66 Pleasantview Avenue, Monticello, NY 12701, USA"
-}, {
- "location": {
- "latitude": 405314270,
- "longitude": -749836354
- },
- "name": ""
-}, {
- "location": {
- "latitude": 414219548,
- "longitude": -743327440
- },
- "name": ""
-}, {
- "location": {
- "latitude": 415534177,
- "longitude": -742900616
- },
- "name": "565 Winding Hills Road, Montgomery, NY 12549, USA"
-}, {
- "location": {
- "latitude": 406898530,
- "longitude": -749127080
- },
- "name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA"
-}, {
- "location": {
- "latitude": 407586880,
- "longitude": -741670168
- },
- "name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA"
-}, {
- "location": {
- "latitude": 400106455,
- "longitude": -742870190
- },
- "name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA"
-}, {
- "location": {
- "latitude": 400066188,
- "longitude": -746793294
- },
- "name": ""
-}, {
- "location": {
- "latitude": 418803880,
- "longitude": -744102673
- },
- "name": "40 Mountain Road, Napanoch, NY 12458, USA"
-}, {
- "location": {
- "latitude": 414204288,
- "longitude": -747895140
- },
- "name": ""
-}, {
- "location": {
- "latitude": 414777405,
- "longitude": -740615601
- },
- "name": ""
-}, {
- "location": {
- "latitude": 415464475,
- "longitude": -747175374
- },
- "name": "48 North Road, Forestburgh, NY 12777, USA"
-}, {
- "location": {
- "latitude": 404062378,
- "longitude": -746376177
- },
- "name": ""
-}, {
- "location": {
- "latitude": 405688272,
- "longitude": -749285130
- },
- "name": ""
-}, {
- "location": {
- "latitude": 400342070,
- "longitude": -748788996
- },
- "name": ""
-}, {
- "location": {
- "latitude": 401809022,
- "longitude": -744157964
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404226644,
- "longitude": -740517141
- },
- "name": "9 Thompson Avenue, Leonardo, NJ 07737, USA"
-}, {
- "location": {
- "latitude": 410322033,
- "longitude": -747871659
- },
- "name": ""
-}, {
- "location": {
- "latitude": 407100674,
- "longitude": -747742727
- },
- "name": ""
-}, {
- "location": {
- "latitude": 418811433,
- "longitude": -741718005
- },
- "name": "213 Bush Road, Stone Ridge, NY 12484, USA"
-}, {
- "location": {
- "latitude": 415034302,
- "longitude": -743850945
- },
- "name": ""
-}, {
- "location": {
- "latitude": 411349992,
- "longitude": -743694161
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404839914,
- "longitude": -744759616
- },
- "name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA"
-}, {
- "location": {
- "latitude": 414638017,
- "longitude": -745957854
- },
- "name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA"
-}, {
- "location": {
- "latitude": 412127800,
- "longitude": -740173578
- },
- "name": ""
-}, {
- "location": {
- "latitude": 401263460,
- "longitude": -747964303
- },
- "name": ""
-}, {
- "location": {
- "latitude": 412843391,
- "longitude": -749086026
- },
- "name": ""
-}, {
- "location": {
- "latitude": 418512773,
- "longitude": -743067823
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404318328,
- "longitude": -740835638
- },
- "name": "42-102 Main Street, Belford, NJ 07718, USA"
-}, {
- "location": {
- "latitude": 419020746,
- "longitude": -741172328
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404080723,
- "longitude": -746119569
- },
- "name": ""
-}, {
- "location": {
- "latitude": 401012643,
- "longitude": -744035134
- },
- "name": ""
-}, {
- "location": {
- "latitude": 404306372,
- "longitude": -741079661
- },
- "name": ""
-}, {
- "location": {
- "latitude": 403966326,
- "longitude": -748519297
- },
- "name": ""
-}, {
- "location": {
- "latitude": 405002031,
- "longitude": -748407866
- },
- "name": ""
-}, {
- "location": {
- "latitude": 409532885,
- "longitude": -742200683
- },
- "name": ""
-}, {
- "location": {
- "latitude": 416851321,
- "longitude": -742674555
- },
- "name": ""
-}, {
- "location": {
- "latitude": 406411633,
- "longitude": -741722051
- },
- "name": "3387 Richmond Terrace, Staten Island, NY 10303, USA"
-}, {
- "location": {
- "latitude": 413069058,
- "longitude": -744597778
- },
- "name": "261 Van Sickle Road, Goshen, NY 10924, USA"
-}, {
- "location": {
- "latitude": 418465462,
- "longitude": -746859398
- },
- "name": ""
-}, {
- "location": {
- "latitude": 411733222,
- "longitude": -744228360
- },
- "name": ""
-}, {
- "location": {
- "latitude": 410248224,
- "longitude": -747127767
- },
- "name": "3 Hasta Way, Newton, NJ 07860, USA"
-}]
diff --git a/grpc/example/route_guide/lib/src/client.dart b/grpc/example/route_guide/lib/src/client.dart
deleted file mode 100644
index b893779..0000000
--- a/grpc/example/route_guide/lib/src/client.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:math' show Random;
-
-import 'package:grpc/grpc.dart';
-
-import 'common.dart';
-import 'generated/route_guide.pb.dart';
-import 'generated/route_guide.pbgrpc.dart';
-
-class Client {
- ClientChannel channel;
- RouteGuideClient stub;
-
- Future<void> main(List<String> args) async {
- channel = new ClientChannel('127.0.0.1',
- port: 8080,
- options: const ChannelOptions(
- credentials: const ChannelCredentials.insecure()));
- stub = new RouteGuideClient(channel,
- options: new CallOptions(timeout: new Duration(seconds: 30)));
- // Run all of the demos in order.
- try {
- await runGetFeature();
- await runListFeatures();
- await runRecordRoute();
- await runRouteChat();
- } catch (e) {
- print('Caught error: $e');
- }
- await channel.shutdown();
- }
-
- void printFeature(Feature feature) {
- final latitude = feature.location.latitude;
- final longitude = feature.location.longitude;
- final name = feature.name.isEmpty
- ? 'no feature'
- : 'feature called "${feature.name}"';
- print(
- 'Found $name at ${latitude / coordFactor}, ${longitude / coordFactor}');
- }
-
- /// Run the getFeature demo. Calls getFeature with a point known to have a
- /// feature and a point known not to have a feature.
- Future<void> runGetFeature() async {
- final point1 = new Point()
- ..latitude = 409146138
- ..longitude = -746188906;
- final point2 = new Point()
- ..latitude = 0
- ..longitude = 0;
-
- printFeature(await stub.getFeature(point1));
- printFeature(await stub.getFeature(point2));
- }
-
- /// Run the listFeatures demo. Calls listFeatures with a rectangle containing
- /// all of the features in the pre-generated database. Prints each response as
- /// it comes in.
- Future<void> runListFeatures() async {
- final lo = new Point()
- ..latitude = 400000000
- ..longitude = -750000000;
- final hi = new Point()
- ..latitude = 420000000
- ..longitude = -730000000;
- final rect = new Rectangle()
- ..lo = lo
- ..hi = hi;
-
- print('Looking for features between 40, -75 and 42, -73');
- await for (var feature in stub.listFeatures(rect)) {
- printFeature(feature);
- }
- }
-
- /// Run the recordRoute demo. Sends several randomly chosen points from the
- /// pre-generated feature database with a variable delay in between. Prints
- /// the statistics when they are sent from the server.
- Future<void> runRecordRoute() async {
- Stream<Point> generateRoute(int count) async* {
- final random = new Random();
-
- for (int i = 0; i < count; i++) {
- final point = featuresDb[random.nextInt(featuresDb.length)].location;
- print(
- 'Visiting point ${point.latitude / coordFactor}, ${point.longitude /
- coordFactor}');
- yield point;
- await new Future.delayed(
- new Duration(milliseconds: 200 + random.nextInt(100)));
- }
- }
-
- final summary = await stub.recordRoute(generateRoute(10));
- print('Finished trip with ${summary.pointCount} points');
- print('Passed ${summary.featureCount} features');
- print('Travelled ${summary.distance} meters');
- print('It took ${summary.elapsedTime} seconds');
- }
-
- /// Run the routeChat demo. Send some chat messages, and print any chat
- /// messages that are sent from the server.
- Future<void> runRouteChat() async {
- RouteNote createNote(String message, int latitude, int longitude) {
- final location = new Point()
- ..latitude = latitude
- ..longitude = longitude;
- return new RouteNote()
- ..message = message
- ..location = location;
- }
-
- final notes = <RouteNote>[
- createNote('First message', 0, 0),
- createNote('Second message', 0, 1),
- createNote('Third message', 1, 0),
- createNote('Fourth message', 0, 0),
- ];
-
- Stream<RouteNote> outgoingNotes() async* {
- for (final note in notes) {
- // Short delay to simulate some other interaction.
- await new Future.delayed(new Duration(milliseconds: 10));
- print('Sending message ${note.message} at ${note.location.latitude}, '
- '${note.location.longitude}');
- yield note;
- }
- }
-
- final call = stub.routeChat(outgoingNotes());
- await for (var note in call) {
- print('Got message ${note.message} at ${note.location.latitude}, ${note
- .location.longitude}');
- }
- }
-}
diff --git a/grpc/example/route_guide/lib/src/common.dart b/grpc/example/route_guide/lib/src/common.dart
deleted file mode 100644
index f7b2992..0000000
--- a/grpc/example/route_guide/lib/src/common.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'generated/route_guide.pb.dart';
-
-const coordFactor = 1e7;
-
-final List<Feature> featuresDb = _readDatabase();
-
-List<Feature> _readDatabase() {
- final dbData = new File('data/route_guide_db.json').readAsStringSync();
- final List db = jsonDecode(dbData);
- return db.map((entry) {
- final location = new Point()
- ..latitude = entry['location']['latitude']
- ..longitude = entry['location']['longitude'];
- return new Feature()
- ..name = entry['name']
- ..location = location;
- }).toList();
-}
diff --git a/grpc/example/route_guide/lib/src/generated/route_guide.pb.dart b/grpc/example/route_guide/lib/src/generated/route_guide.pb.dart
deleted file mode 100644
index 842adf4..0000000
--- a/grpc/example/route_guide/lib/src/generated/route_guide.pb.dart
+++ /dev/null
@@ -1,254 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library routeguide_route_guide;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class Point extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Point')
- ..a<int>(1, 'latitude', PbFieldType.O3)
- ..a<int>(2, 'longitude', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- Point() : super();
- Point.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Point.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Point clone() => new Point()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Point create() => new Point();
- static PbList<Point> createRepeated() => new PbList<Point>();
- static Point getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyPoint();
- return _defaultInstance;
- }
-
- static Point _defaultInstance;
- static void $checkItem(Point v) {
- if (v is! Point) checkItemFailed(v, 'Point');
- }
-
- int get latitude => $_get(0, 0);
- set latitude(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasLatitude() => $_has(0);
- void clearLatitude() => clearField(1);
-
- int get longitude => $_get(1, 0);
- set longitude(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasLongitude() => $_has(1);
- void clearLongitude() => clearField(2);
-}
-
-class _ReadonlyPoint extends Point with ReadonlyMessageMixin {}
-
-class Rectangle extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Rectangle')
- ..a<Point>(1, 'lo', PbFieldType.OM, Point.getDefault, Point.create)
- ..a<Point>(2, 'hi', PbFieldType.OM, Point.getDefault, Point.create)
- ..hasRequiredFields = false;
-
- Rectangle() : super();
- Rectangle.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Rectangle.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Rectangle clone() => new Rectangle()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Rectangle create() => new Rectangle();
- static PbList<Rectangle> createRepeated() => new PbList<Rectangle>();
- static Rectangle getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyRectangle();
- return _defaultInstance;
- }
-
- static Rectangle _defaultInstance;
- static void $checkItem(Rectangle v) {
- if (v is! Rectangle) checkItemFailed(v, 'Rectangle');
- }
-
- Point get lo => $_getN(0);
- set lo(Point v) {
- setField(1, v);
- }
-
- bool hasLo() => $_has(0);
- void clearLo() => clearField(1);
-
- Point get hi => $_getN(1);
- set hi(Point v) {
- setField(2, v);
- }
-
- bool hasHi() => $_has(1);
- void clearHi() => clearField(2);
-}
-
-class _ReadonlyRectangle extends Rectangle with ReadonlyMessageMixin {}
-
-class Feature extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Feature')
- ..aOS(1, 'name')
- ..a<Point>(2, 'location', PbFieldType.OM, Point.getDefault, Point.create)
- ..hasRequiredFields = false;
-
- Feature() : super();
- Feature.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Feature.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Feature clone() => new Feature()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Feature create() => new Feature();
- static PbList<Feature> createRepeated() => new PbList<Feature>();
- static Feature getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyFeature();
- return _defaultInstance;
- }
-
- static Feature _defaultInstance;
- static void $checkItem(Feature v) {
- if (v is! Feature) checkItemFailed(v, 'Feature');
- }
-
- String get name => $_getS(0, '');
- set name(String v) {
- $_setString(0, v);
- }
-
- bool hasName() => $_has(0);
- void clearName() => clearField(1);
-
- Point get location => $_getN(1);
- set location(Point v) {
- setField(2, v);
- }
-
- bool hasLocation() => $_has(1);
- void clearLocation() => clearField(2);
-}
-
-class _ReadonlyFeature extends Feature with ReadonlyMessageMixin {}
-
-class RouteNote extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('RouteNote')
- ..a<Point>(1, 'location', PbFieldType.OM, Point.getDefault, Point.create)
- ..aOS(2, 'message')
- ..hasRequiredFields = false;
-
- RouteNote() : super();
- RouteNote.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- RouteNote.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- RouteNote clone() => new RouteNote()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static RouteNote create() => new RouteNote();
- static PbList<RouteNote> createRepeated() => new PbList<RouteNote>();
- static RouteNote getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyRouteNote();
- return _defaultInstance;
- }
-
- static RouteNote _defaultInstance;
- static void $checkItem(RouteNote v) {
- if (v is! RouteNote) checkItemFailed(v, 'RouteNote');
- }
-
- Point get location => $_getN(0);
- set location(Point v) {
- setField(1, v);
- }
-
- bool hasLocation() => $_has(0);
- void clearLocation() => clearField(1);
-
- String get message => $_getS(1, '');
- set message(String v) {
- $_setString(1, v);
- }
-
- bool hasMessage() => $_has(1);
- void clearMessage() => clearField(2);
-}
-
-class _ReadonlyRouteNote extends RouteNote with ReadonlyMessageMixin {}
-
-class RouteSummary extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('RouteSummary')
- ..a<int>(1, 'pointCount', PbFieldType.O3)
- ..a<int>(2, 'featureCount', PbFieldType.O3)
- ..a<int>(3, 'distance', PbFieldType.O3)
- ..a<int>(4, 'elapsedTime', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- RouteSummary() : super();
- RouteSummary.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- RouteSummary.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- RouteSummary clone() => new RouteSummary()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static RouteSummary create() => new RouteSummary();
- static PbList<RouteSummary> createRepeated() => new PbList<RouteSummary>();
- static RouteSummary getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyRouteSummary();
- return _defaultInstance;
- }
-
- static RouteSummary _defaultInstance;
- static void $checkItem(RouteSummary v) {
- if (v is! RouteSummary) checkItemFailed(v, 'RouteSummary');
- }
-
- int get pointCount => $_get(0, 0);
- set pointCount(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasPointCount() => $_has(0);
- void clearPointCount() => clearField(1);
-
- int get featureCount => $_get(1, 0);
- set featureCount(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasFeatureCount() => $_has(1);
- void clearFeatureCount() => clearField(2);
-
- int get distance => $_get(2, 0);
- set distance(int v) {
- $_setUnsignedInt32(2, v);
- }
-
- bool hasDistance() => $_has(2);
- void clearDistance() => clearField(3);
-
- int get elapsedTime => $_get(3, 0);
- set elapsedTime(int v) {
- $_setUnsignedInt32(3, v);
- }
-
- bool hasElapsedTime() => $_has(3);
- void clearElapsedTime() => clearField(4);
-}
-
-class _ReadonlyRouteSummary extends RouteSummary with ReadonlyMessageMixin {}
diff --git a/grpc/example/route_guide/lib/src/generated/route_guide.pbenum.dart b/grpc/example/route_guide/lib/src/generated/route_guide.pbenum.dart
deleted file mode 100644
index 11b7aee..0000000
--- a/grpc/example/route_guide/lib/src/generated/route_guide.pbenum.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library routeguide_route_guide_pbenum;
diff --git a/grpc/example/route_guide/lib/src/generated/route_guide.pbgrpc.dart b/grpc/example/route_guide/lib/src/generated/route_guide.pbgrpc.dart
deleted file mode 100644
index c0826b4..0000000
--- a/grpc/example/route_guide/lib/src/generated/route_guide.pbgrpc.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library routeguide_route_guide_pbgrpc;
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'route_guide.pb.dart';
-export 'route_guide.pb.dart';
-
-class RouteGuideClient extends Client {
- static final _$getFeature = new ClientMethod<Point, Feature>(
- '/routeguide.RouteGuide/GetFeature',
- (Point value) => value.writeToBuffer(),
- (List<int> value) => new Feature.fromBuffer(value));
- static final _$listFeatures = new ClientMethod<Rectangle, Feature>(
- '/routeguide.RouteGuide/ListFeatures',
- (Rectangle value) => value.writeToBuffer(),
- (List<int> value) => new Feature.fromBuffer(value));
- static final _$recordRoute = new ClientMethod<Point, RouteSummary>(
- '/routeguide.RouteGuide/RecordRoute',
- (Point value) => value.writeToBuffer(),
- (List<int> value) => new RouteSummary.fromBuffer(value));
- static final _$routeChat = new ClientMethod<RouteNote, RouteNote>(
- '/routeguide.RouteGuide/RouteChat',
- (RouteNote value) => value.writeToBuffer(),
- (List<int> value) => new RouteNote.fromBuffer(value));
-
- RouteGuideClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<Feature> getFeature(Point request, {CallOptions options}) {
- final call = $createCall(_$getFeature, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseStream<Feature> listFeatures(Rectangle request,
- {CallOptions options}) {
- final call = $createCall(_$listFeatures, new Stream.fromIterable([request]),
- options: options);
- return new ResponseStream(call);
- }
-
- ResponseFuture<RouteSummary> recordRoute(Stream<Point> request,
- {CallOptions options}) {
- final call = $createCall(_$recordRoute, request, options: options);
- return new ResponseFuture(call);
- }
-
- ResponseStream<RouteNote> routeChat(Stream<RouteNote> request,
- {CallOptions options}) {
- final call = $createCall(_$routeChat, request, options: options);
- return new ResponseStream(call);
- }
-}
-
-abstract class RouteGuideServiceBase extends Service {
- String get $name => 'routeguide.RouteGuide';
-
- RouteGuideServiceBase() {
- $addMethod(new ServiceMethod<Point, Feature>(
- 'GetFeature',
- getFeature_Pre,
- false,
- false,
- (List<int> value) => new Point.fromBuffer(value),
- (Feature value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<Rectangle, Feature>(
- 'ListFeatures',
- listFeatures_Pre,
- false,
- true,
- (List<int> value) => new Rectangle.fromBuffer(value),
- (Feature value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<Point, RouteSummary>(
- 'RecordRoute',
- recordRoute,
- true,
- false,
- (List<int> value) => new Point.fromBuffer(value),
- (RouteSummary value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<RouteNote, RouteNote>(
- 'RouteChat',
- routeChat,
- true,
- true,
- (List<int> value) => new RouteNote.fromBuffer(value),
- (RouteNote value) => value.writeToBuffer()));
- }
-
- Future<Feature> getFeature_Pre(ServiceCall call, Future request) async {
- return getFeature(call, await request);
- }
-
- Stream<Feature> listFeatures_Pre(ServiceCall call, Future request) async* {
- yield* listFeatures(call, (await request) as Rectangle);
- }
-
- Future<Feature> getFeature(ServiceCall call, Point request);
- Stream<Feature> listFeatures(ServiceCall call, Rectangle request);
- Future<RouteSummary> recordRoute(ServiceCall call, Stream<Point> request);
- Stream<RouteNote> routeChat(ServiceCall call, Stream<RouteNote> request);
-}
diff --git a/grpc/example/route_guide/lib/src/generated/route_guide.pbjson.dart b/grpc/example/route_guide/lib/src/generated/route_guide.pbjson.dart
deleted file mode 100644
index 6b93028..0000000
--- a/grpc/example/route_guide/lib/src/generated/route_guide.pbjson.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library routeguide_route_guide_pbjson;
-
-const Point$json = const {
- '1': 'Point',
- '2': const [
- const {'1': 'latitude', '3': 1, '4': 1, '5': 5, '10': 'latitude'},
- const {'1': 'longitude', '3': 2, '4': 1, '5': 5, '10': 'longitude'},
- ],
-};
-
-const Rectangle$json = const {
- '1': 'Rectangle',
- '2': const [
- const {
- '1': 'lo',
- '3': 1,
- '4': 1,
- '5': 11,
- '6': '.routeguide.Point',
- '10': 'lo'
- },
- const {
- '1': 'hi',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.routeguide.Point',
- '10': 'hi'
- },
- ],
-};
-
-const Feature$json = const {
- '1': 'Feature',
- '2': const [
- const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
- const {
- '1': 'location',
- '3': 2,
- '4': 1,
- '5': 11,
- '6': '.routeguide.Point',
- '10': 'location'
- },
- ],
-};
-
-const RouteNote$json = const {
- '1': 'RouteNote',
- '2': const [
- const {
- '1': 'location',
- '3': 1,
- '4': 1,
- '5': 11,
- '6': '.routeguide.Point',
- '10': 'location'
- },
- const {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'},
- ],
-};
-
-const RouteSummary$json = const {
- '1': 'RouteSummary',
- '2': const [
- const {'1': 'point_count', '3': 1, '4': 1, '5': 5, '10': 'pointCount'},
- const {'1': 'feature_count', '3': 2, '4': 1, '5': 5, '10': 'featureCount'},
- const {'1': 'distance', '3': 3, '4': 1, '5': 5, '10': 'distance'},
- const {'1': 'elapsed_time', '3': 4, '4': 1, '5': 5, '10': 'elapsedTime'},
- ],
-};
diff --git a/grpc/example/route_guide/lib/src/server.dart b/grpc/example/route_guide/lib/src/server.dart
deleted file mode 100644
index a8e6676..0000000
--- a/grpc/example/route_guide/lib/src/server.dart
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:math' show atan2, cos, max, min, pi, sin, sqrt;
-
-import 'package:grpc/grpc.dart' as grpc;
-
-import 'common.dart';
-import 'generated/route_guide.pb.dart';
-import 'generated/route_guide.pbgrpc.dart';
-
-class RouteGuideService extends RouteGuideServiceBase {
- final routeNotes = <Point, List<RouteNote>>{};
-
- /// GetFeature handler. Returns a feature for the given location.
- /// The [context] object provides access to client metadata, cancellation, etc.
- @override
- Future<Feature> getFeature(grpc.ServiceCall call, Point request) async {
- return featuresDb.firstWhere((f) => f.location == request,
- orElse: () => new Feature()..location = request);
- }
-
- Rectangle _normalize(Rectangle r) {
- final lo = new Point()
- ..latitude = min(r.lo.latitude, r.hi.latitude)
- ..longitude = min(r.lo.longitude, r.hi.longitude);
-
- final hi = new Point()
- ..latitude = max(r.lo.latitude, r.hi.latitude)
- ..longitude = max(r.lo.longitude, r.hi.longitude);
-
- return new Rectangle()
- ..lo = lo
- ..hi = hi;
- }
-
- bool _contains(Rectangle r, Point p) {
- return p.longitude >= r.lo.longitude &&
- p.longitude <= r.hi.longitude &&
- p.latitude >= r.lo.latitude &&
- p.latitude <= r.hi.latitude;
- }
-
- /// ListFeatures handler. Returns a stream of features within the given
- /// rectangle.
- @override
- Stream<Feature> listFeatures(
- grpc.ServiceCall call, Rectangle request) async* {
- final normalizedRectangle = _normalize(request);
- // For each feature, check if it is in the given bounding box
- for (var feature in featuresDb) {
- if (feature.name.isEmpty) continue;
- final location = feature.location;
- if (_contains(normalizedRectangle, location)) {
- yield feature;
- }
- }
- }
-
- /// RecordRoute handler. Gets a stream of points, and responds with statistics
- /// about the "trip": number of points, number of known features visited,
- /// total distance traveled, and total time spent.
- @override
- Future<RouteSummary> recordRoute(
- grpc.ServiceCall call, Stream<Point> request) async {
- int pointCount = 0;
- int featureCount = 0;
- double distance = 0.0;
- Point previous;
- final timer = new Stopwatch();
-
- await for (var location in request) {
- if (!timer.isRunning) timer.start();
- pointCount++;
- final feature = featuresDb.firstWhere((f) => f.location == location,
- orElse: () => null);
- if (feature != null) {
- featureCount++;
- }
- // For each point after the first, add the incremental distance from the
- // previous point to the total distance value.
- if (previous != null) distance += _distance(previous, location);
- previous = location;
- }
- timer.stop();
- return new RouteSummary()
- ..pointCount = pointCount
- ..featureCount = featureCount
- ..distance = distance.round()
- ..elapsedTime = timer.elapsed.inSeconds;
- }
-
- /// RouteChat handler. Receives a stream of message/location pairs, and
- /// responds with a stream of all previous messages at each of those
- /// locations.
- @override
- Stream<RouteNote> routeChat(
- grpc.ServiceCall call, Stream<RouteNote> request) async* {
- await for (var note in request) {
- final notes = routeNotes.putIfAbsent(note.location, () => <RouteNote>[]);
- for (var note in notes) yield note;
- notes.add(note);
- }
- }
-
- /// Calculate the distance between two points using the "haversine" formula.
- /// This code was taken from http://www.movable-type.co.uk/scripts/latlong.html.
- double _distance(Point start, Point end) {
- double toRadians(double num) {
- return num * pi / 180;
- }
-
- final lat1 = start.latitude / coordFactor;
- final lat2 = end.latitude / coordFactor;
- final lon1 = start.longitude / coordFactor;
- final lon2 = end.longitude / coordFactor;
- final R = 6371000; // metres
- final phi1 = toRadians(lat1);
- final phi2 = toRadians(lat2);
- final dLat = toRadians(lat2 - lat1);
- final dLon = toRadians(lon2 - lon1);
-
- final a = sin(dLat / 2) * sin(dLat / 2) +
- cos(phi1) * cos(phi2) * sin(dLon / 2) * sin(dLon / 2);
- final c = 2 * atan2(sqrt(a), sqrt(1 - a));
-
- return R * c;
- }
-}
-
-class Server {
- Future<void> main(List<String> args) async {
- final server = new grpc.Server([new RouteGuideService()]);
- await server.serve(port: 8080);
- print('Server listening on port ${server.port}...');
- }
-}
diff --git a/grpc/example/route_guide/protos/route_guide.proto b/grpc/example/route_guide/protos/route_guide.proto
deleted file mode 100644
index 12c4495..0000000
--- a/grpc/example/route_guide/protos/route_guide.proto
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-option java_multiple_files = true;
-option java_package = "io.grpc.examples.routeguide";
-option java_outer_classname = "RouteGuideProto";
-option objc_class_prefix = "RTG";
-
-package routeguide;
-
-// Interface exported by the server.
-service RouteGuide {
- // A simple RPC.
- //
- // Obtains the feature at a given position.
- //
- // A feature with an empty name is returned if there's no feature at the given
- // position.
- rpc GetFeature(Point) returns (Feature) {}
-
- // A server-to-client streaming RPC.
- //
- // Obtains the Features available within the given Rectangle. Results are
- // streamed rather than returned at once (e.g. in a response message with a
- // repeated field), as the rectangle may cover a large area and contain a
- // huge number of features.
- rpc ListFeatures(Rectangle) returns (stream Feature) {}
-
- // A client-to-server streaming RPC.
- //
- // Accepts a stream of Points on a route being traversed, returning a
- // RouteSummary when traversal is completed.
- rpc RecordRoute(stream Point) returns (RouteSummary) {}
-
- // A Bidirectional streaming RPC.
- //
- // Accepts a stream of RouteNotes sent while a route is being traversed,
- // while receiving other RouteNotes (e.g. from other users).
- rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
-}
-
-// Points are represented as latitude-longitude pairs in the E7 representation
-// (degrees multiplied by 10**7 and rounded to the nearest integer).
-// Latitudes should be in the range +/- 90 degrees and longitude should be in
-// the range +/- 180 degrees (inclusive).
-message Point {
- int32 latitude = 1;
- int32 longitude = 2;
-}
-
-// A latitude-longitude rectangle, represented as two diagonally opposite
-// points "lo" and "hi".
-message Rectangle {
- // One corner of the rectangle.
- Point lo = 1;
-
- // The other corner of the rectangle.
- Point hi = 2;
-}
-
-// A feature names something at a given point.
-//
-// If a feature could not be named, the name is empty.
-message Feature {
- // The name of the feature.
- string name = 1;
-
- // The point where the feature is detected.
- Point location = 2;
-}
-
-// A RouteNote is a message sent while at a given point.
-message RouteNote {
- // The location from which the message is sent.
- Point location = 1;
-
- // The message to be sent.
- string message = 2;
-}
-
-// A RouteSummary is received in response to a RecordRoute rpc.
-//
-// It contains the number of individual points received, the number of
-// detected features, and the total distance covered as the cumulative sum of
-// the distance between each point.
-message RouteSummary {
- // The number of points received.
- int32 point_count = 1;
-
- // The number of known features passed while traversing the route.
- int32 feature_count = 2;
-
- // The distance covered in metres.
- int32 distance = 3;
-
- // The duration of the traversal in seconds.
- int32 elapsed_time = 4;
-}
diff --git a/grpc/example/route_guide/pubspec.yaml b/grpc/example/route_guide/pubspec.yaml
deleted file mode 100644
index b247184..0000000
--- a/grpc/example/route_guide/pubspec.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: route_guide
-description: Dart gRPC sample client and server.
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- async: '>=1.13.3 <3.0.0'
- grpc:
- path: ../../
- protobuf: ^0.10.1
-
-dev_dependencies:
- test: ^1.3.0
diff --git a/grpc/interop/bin/client.dart b/grpc/interop/bin/client.dart
deleted file mode 100644
index be55d13..0000000
--- a/grpc/interop/bin/client.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:args/args.dart';
-
-import 'package:interop/src/client.dart';
-
-const _serverHostArgument = 'server_host';
-const _serverHostOverrideArgument = 'server_host_override';
-const _serverPortArgument = 'server_port';
-const _testCaseArgument = 'test_case';
-const _useTLSArgument = 'use_tls';
-const _useTestCAArgument = 'use_test_ca';
-const _defaultServiceAccountArgument = 'default_service_account';
-const _oauthScopeArgument = 'oauth_scope';
-const _serviceAccountKeyFileArgument = 'service_account_key_file';
-
-/// Clients implement test cases that test certain functionally. Each client is
-/// provided the test case it is expected to run as a command-line parameter.
-/// Names should be lowercase and without spaces.
-///
-/// Clients should accept these arguments:
-///
-/// * --server_host=HOSTNAME
-/// * The server host to connect to. For example, "localhost" or "127.0.0.1"
-/// * --server_host_override=HOSTNAME
-/// * The server host to claim to be connecting to, for use in TLS and
-/// HTTP/2 :authority header. If unspecified, the value of --server_host
-/// will be used
-/// * --server_port=PORT
-/// * The server port to connect to. For example, "8080"
-/// * --test_case=TESTCASE
-/// * The name of the test case to execute. For example, "empty_unary"
-/// * --use_tls=BOOLEAN
-/// * Whether to use a plaintext or encrypted connection
-/// * --use_test_ca=BOOLEAN
-/// * Whether to replace platform root CAs with ca.pem as the CA root
-/// * --default_service_account=ACCOUNT_EMAIL
-/// * Email of the GCE default service account.
-/// * --oauth_scope=SCOPE
-/// * OAuth scope. For example, "https://www.googleapis.com/auth/xapi.zoo"
-/// * --service_account_key_file=PATH
-/// * The path to the service account JSON key file generated from GCE
-/// developer console.
-///
-/// Clients must support TLS with ALPN. Clients must not disable certificate
-/// checking.
-Future<int> main(List<String> args) async {
- final argumentParser = new ArgParser();
- argumentParser.addOption(_serverHostArgument,
- help: 'The server host to connect to. For example, "localhost" or '
- '"127.0.0.1".');
- argumentParser.addOption(_serverHostOverrideArgument,
- help: 'The server host to claim to be connecting to, for use in TLS and '
- 'HTTP/2 :authority header. If unspecified, the value of '
- '--server_host will be used.');
- argumentParser.addOption(_serverPortArgument,
- help: 'The server port to connect to. For example, "8080".');
- argumentParser.addOption(_testCaseArgument,
- help:
- 'The name of the test case to execute. For example, "empty_unary".');
- argumentParser.addOption(_useTLSArgument,
- defaultsTo: 'false',
- help: 'Whether to use a plaintext or encrypted connection.');
- argumentParser.addOption(_useTestCAArgument,
- help: 'Whether to replace platform root CAs with ca.pem as the CA root.');
- argumentParser.addOption(_defaultServiceAccountArgument,
- help: 'Email of the GCE default service account.');
- argumentParser.addOption(_oauthScopeArgument,
- help: 'OAuth scope. For example, '
- '"https://www.googleapis.com/auth/xapi.zoo".');
- argumentParser.addOption(_serviceAccountKeyFileArgument,
- help: 'The path to the service account JSON key file generated from GCE '
- 'developer console.');
- final arguments = argumentParser.parse(args);
-
- final testClient = new Tester();
-
- testClient.serverHost = arguments[_serverHostArgument];
- testClient.serverHostOverride = arguments[_serverHostOverrideArgument];
- testClient.serverPort = arguments[_serverPortArgument];
- testClient.testCase = arguments[_testCaseArgument];
- testClient.useTls = arguments[_useTLSArgument];
- testClient.useTestCA = arguments[_useTestCAArgument];
- testClient.defaultServiceAccount = arguments[_defaultServiceAccountArgument];
- testClient.oauthScope = arguments[_oauthScopeArgument];
- testClient.serviceAccountKeyFile = arguments[_serviceAccountKeyFileArgument];
-
- if (!testClient.validate()) {
- print(argumentParser.usage);
- return -1;
- }
- await testClient.runTest();
- print('Passed.');
- return 0;
-}
diff --git a/grpc/interop/bin/server.dart b/grpc/interop/bin/server.dart
deleted file mode 100644
index 9cd7ca2..0000000
--- a/grpc/interop/bin/server.dart
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:grpc/grpc.dart';
-
-import 'package:interop/src/generated/empty.pb.dart';
-import 'package:interop/src/generated/messages.pb.dart';
-import 'package:interop/src/generated/test.pbgrpc.dart';
-
-const _headerEchoKey = 'x-grpc-test-echo-initial';
-const _trailerEchoKey = 'x-grpc-test-echo-trailing-bin';
-
-class TestService extends TestServiceBase {
- @override
- void $onMetadata(ServiceCall context) {
- final headerEcho = context.clientMetadata[_headerEchoKey];
- if (headerEcho != null) {
- context.headers[_headerEchoKey] = headerEcho;
- }
- final trailerEcho = context.clientMetadata[_trailerEchoKey];
- if (trailerEcho != null) {
- context.trailers[_trailerEchoKey] = trailerEcho;
- }
- }
-
- @override
- Future<Empty> emptyCall(ServiceCall call, Empty request) async {
- return new Empty();
- }
-
- @override
- Future<SimpleResponse> unaryCall(
- ServiceCall call, SimpleRequest request) async {
- if (request.responseStatus.code != 0) {
- throw new GrpcError.custom(
- request.responseStatus.code, request.responseStatus.message);
- }
- final payload = new Payload()
- ..body = new List.filled(request.responseSize, 0);
- return new SimpleResponse()..payload = payload;
- }
-
- @override
- Future<SimpleResponse> cacheableUnaryCall(
- ServiceCall call, SimpleRequest request) async {
- final timestamp = new DateTime.now().microsecond * 1000;
- final responsePayload = new Payload()..body = ascii.encode('$timestamp');
- return new SimpleResponse()..payload = responsePayload;
- }
-
- @override
- Future<StreamingInputCallResponse> streamingInputCall(
- ServiceCall call, Stream<StreamingInputCallRequest> request) async {
- final aggregatedPayloadSize = await request.fold(
- 0, (size, message) => size + message.payload.body.length);
- return new StreamingInputCallResponse()
- ..aggregatedPayloadSize = aggregatedPayloadSize;
- }
-
- Payload _payloadForRequest(ResponseParameters entry) =>
- new Payload()..body = new List.filled(entry.size, 0);
-
- @override
- Stream<StreamingOutputCallResponse> streamingOutputCall(
- ServiceCall call, StreamingOutputCallRequest request) async* {
- for (final entry in request.responseParameters) {
- if (entry.intervalUs > 0) {
- await new Future.delayed(new Duration(microseconds: entry.intervalUs));
- }
- yield new StreamingOutputCallResponse()
- ..payload = _payloadForRequest(entry);
- }
- }
-
- StreamingOutputCallResponse _responseForRequest(
- StreamingOutputCallRequest request) {
- if (request.responseStatus.code != 0) {
- throw new GrpcError.custom(
- request.responseStatus.code, request.responseStatus.message);
- }
- final response = new StreamingOutputCallResponse();
- if (request.responseParameters.isNotEmpty) {
- response.payload = _payloadForRequest(request.responseParameters[0]);
- }
- return response;
- }
-
- @override
- Stream<StreamingOutputCallResponse> fullDuplexCall(
- ServiceCall call, Stream<StreamingOutputCallRequest> request) async* {
- yield* request.map(_responseForRequest);
- }
-
- @override
- Stream<StreamingOutputCallResponse> halfDuplexCall(
- ServiceCall call, Stream<StreamingOutputCallRequest> request) async* {
- final bufferedResponses = await request.map(_responseForRequest).toList();
- yield* new Stream.fromIterable(bufferedResponses);
- }
-}
-
-Future<void> main(List<String> args) async {
- final argumentParser = new ArgParser();
- argumentParser.addOption('port', defaultsTo: '8080');
- argumentParser.addOption('use_tls', defaultsTo: 'false');
- argumentParser.addOption('tls_cert_file', defaultsTo: 'server1.pem');
- argumentParser.addOption('tls_key_file', defaultsTo: 'server1.key');
- final arguments = argumentParser.parse(args);
- final port = int.parse(arguments['port']);
-
- final services = [new TestService()];
-
- final server = new Server(services);
-
- ServerTlsCredentials tlsCredentials;
- if (arguments['use_tls'] == 'true') {
- final certificate = new File(arguments['tls_cert_file']).readAsBytes();
- final privateKey = new File(arguments['tls_key_file']).readAsBytes();
- tlsCredentials = new ServerTlsCredentials(
- certificate: await certificate, privateKey: await privateKey);
- }
- await server.serve(port: port, security: tlsCredentials);
- print('Server listening on port ${server.port}...');
-}
diff --git a/grpc/interop/ca.pem b/grpc/interop/ca.pem
deleted file mode 100644
index 6c8511a..0000000
--- a/grpc/interop/ca.pem
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla
-Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0
-YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT
-BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7
-+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu
-g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd
-Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau
-sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m
-oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG
-Dfcog5wrJytaQ6UA0wE=
------END CERTIFICATE-----
diff --git a/grpc/interop/lib/src/client.dart b/grpc/interop/lib/src/client.dart
deleted file mode 100644
index d47895f..0000000
--- a/grpc/interop/lib/src/client.dart
+++ /dev/null
@@ -1,1189 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:io';
-import 'dart:typed_data';
-
-import 'package:collection/collection.dart';
-import 'package:grpc/grpc.dart';
-import 'package:interop/src/generated/empty.pb.dart';
-import 'package:interop/src/generated/messages.pb.dart';
-import 'package:interop/src/generated/test.pbgrpc.dart';
-
-const _headerEchoKey = 'x-grpc-test-echo-initial';
-const _headerEchoData = 'test_initial_metadata_value';
-
-const _trailerEchoKey = 'x-grpc-test-echo-trailing-bin';
-const _trailerEchoData = 'q6ur'; // 0xababab in base64
-
-class Tester {
- String serverHost;
- String serverHostOverride;
- int _serverPort;
- String testCase;
- bool _useTls;
- bool _useTestCA;
- String defaultServiceAccount;
- String oauthScope;
- String serviceAccountKeyFile;
- String _serviceAccountJson;
-
- String get serviceAccountJson =>
- _serviceAccountJson ??= _readServiceAccountJson();
-
- String _readServiceAccountJson() {
- if (serviceAccountKeyFile?.isEmpty ?? true) {
- throw 'Service account key file not specified.';
- }
- return new File(serviceAccountKeyFile).readAsStringSync();
- }
-
- void set serverPort(String value) {
- if (value == null) {
- _serverPort = null;
- return;
- }
- try {
- _serverPort = int.parse(value);
- } catch (e) {
- print('Invalid port "$value": $e');
- }
- }
-
- void set useTls(String value) {
- _useTls = value != 'false';
- }
-
- void set useTestCA(String value) {
- _useTestCA = value == 'true';
- }
-
- ClientChannel channel;
- TestServiceClient client;
- UnimplementedServiceClient unimplementedServiceClient;
-
- bool validate() {
- if (serverHost == null) {
- print('Must specify --server_host');
- return false;
- }
- if (_serverPort == null) {
- print('Must specify --server_port');
- return false;
- }
-
- return true;
- }
-
- Future<void> runTest() async {
- ChannelCredentials credentials;
- if (_useTls) {
- List<int> trustedRoot;
- if (_useTestCA) {
- trustedRoot = new File('ca.pem').readAsBytesSync();
- }
- credentials = new ChannelCredentials.secure(
- certificates: trustedRoot, authority: serverHostOverride);
- } else {
- credentials = const ChannelCredentials.insecure();
- }
-
- final options = new ChannelOptions(credentials: credentials);
- channel =
- new ClientChannel(serverHost, port: _serverPort, options: options);
- client = new TestServiceClient(channel);
- unimplementedServiceClient = new UnimplementedServiceClient(channel);
- await runTestCase();
- await channel.shutdown();
- }
-
- Future<void> runTestCase() async {
- switch (testCase) {
- case 'empty_unary':
- return emptyUnary();
- case 'cacheable_unary':
- return cacheableUnary();
- case 'large_unary':
- return largeUnary();
- case 'client_compressed_unary':
- return clientCompressedUnary();
- case 'server_compressed_unary':
- return serverCompressedUnary();
- case 'client_streaming':
- return clientStreaming();
- case 'client_compressed_streaming':
- return clientCompressedStreaming();
- case 'server_streaming':
- return serverStreaming();
- case 'server_compressed_streaming':
- return serverCompressedStreaming();
- case 'ping_pong':
- return pingPong();
- case 'empty_stream':
- return emptyStream();
- case 'compute_engine_creds':
- return computeEngineCreds();
- case 'service_account_creds':
- return serviceAccountCreds();
- case 'jwt_token_creds':
- return jwtTokenCreds();
- case 'oauth2_auth_token':
- return oauth2AuthToken();
- case 'per_rpc_creds':
- return perRpcCreds();
- case 'custom_metadata':
- return customMetadata();
- case 'status_code_and_message':
- return statusCodeAndMessage();
- case 'unimplemented_method':
- return unimplementedMethod();
- case 'unimplemented_service':
- return unimplementedService();
- case 'cancel_after_begin':
- return cancelAfterBegin();
- case 'cancel_after_first_response':
- return cancelAfterFirstResponse();
- case 'timeout_on_sleeping_server':
- return timeoutOnSleepingServer();
- default:
- print('Unknown test case: $testCase');
- }
- }
-
- /// This test verifies that implementations support zero-size messages.
- /// Ideally, client implementations would verify that the request and response
- /// were zero bytes serialized, but this is generally prohibitive to perform,
- /// so is not required.
- ///
- /// Procedure:
- /// 1. Client calls EmptyCall with the default Empty message
- ///
- /// Client asserts:
- /// * call was successful
- /// * response is non-null
- Future<void> emptyUnary() async {
- final response = await client.emptyCall(new Empty());
- if (response == null) throw 'Expected non-null response.';
- if (response is! Empty) throw 'Expected Empty response.';
- }
-
- /// This test verifies that gRPC requests marked as cacheable use GET verb
- /// instead of POST, and that server sets appropriate cache control headers
- /// for the response to be cached by a proxy. This test requires that the
- /// server is behind a caching proxy. Use of current timestamp in the request
- /// prevents accidental cache matches left over from previous tests.
- ///
- /// Procedure:
- /// 1. Client calls CacheableUnaryCall with `SimpleRequest` request with
- /// payload set to current timestamp. Timestamp format is irrelevant, and
- /// resolution is in nanoseconds.
- /// Client adds a `x-user-ip` header with value `1.2.3.4` to the request.
- /// This is done since some proxys such as GFE will not cache requests from
- /// localhost.
- /// Client marks the request as cacheable by setting the cacheable flag in
- /// the request context. Longer term this should be driven by the method
- /// option specified in the proto file itself.
- /// 2. Client calls CacheableUnaryCall again immediately with the same request
- /// and configuration as the previous call.
- ///
- /// Client asserts:
- /// * Both calls were successful
- /// * The payload body of both responses is the same.
- Future<void> cacheableUnary() async {
- throw 'Not implemented';
- }
-
- /// This test verifies unary calls succeed in sending messages, and touches on
- /// flow control (even if compression is enabled on the channel).
- ///
- /// Procedure:
- /// 1. Client calls UnaryCall with:
- /// {
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * response payload body is 314159 bytes in size
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response message against a golden response
- Future<void> largeUnary() async {
- final payload = new Payload()..body = new Uint8List(271828);
- final request = new SimpleRequest()
- ..responseSize = 314159
- ..payload = payload;
- final response = await client.unaryCall(request);
- final receivedBytes = response.payload.body.length;
- if (receivedBytes != 314159) {
- throw 'Response payload mismatch. Expected 314159 bytes, '
- 'got ${receivedBytes}.';
- }
- }
-
- /// This test verifies the client can compress unary messages by sending two
- /// unary calls, for compressed and uncompressed payloads. It also sends an
- /// initial probing request to verify whether the server supports the
- /// CompressedRequest feature by checking if the probing call fails with an
- /// `INVALID_ARGUMENT` status.
- ///
- /// Procedure:
- /// 1. Client calls UnaryCall with the feature probe, an *uncompressed*
- /// message:
- /// {
- /// expect_compressed: {
- /// value: true
- /// }
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- /// 1. Client calls UnaryCall with the *compressed* message:
- /// {
- /// expect_compressed: {
- /// value: true
- /// }
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- /// 1. Client calls UnaryCall with the *uncompressed* message:
- /// {
- /// expect_compressed: {
- /// value: false
- /// }
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- ///
- /// Client asserts:
- /// * First call failed with `INVALID_ARGUMENT` status.
- /// * Subsequent calls were successful.
- /// * Response payload body is 314159 bytes in size.
- /// * Clients are free to assert that the response payload body contents are
- /// zeros and comparing the entire response message against a golden
- /// response.
- Future<void> clientCompressedUnary() async {
- throw 'Not implemented';
- }
-
- /// This test verifies the server can compress unary messages. It sends two
- /// unary requests, expecting the server's response to be compressed or not
- /// according to the `response_compressed` boolean.
- ///
- /// Whether compression was actually performed is determined by the
- /// compression bit in the response's message flags. *Note that some languages
- /// may not have access to the message flags, in which case the client will be
- /// unable to verify that the `response_compressed` boolean is obeyed by the
- /// server*.
- ///
- /// Procedure:
- /// 1. Client calls UnaryCall with `SimpleRequest`:
- /// {
- /// response_compressed: {
- /// value: true
- /// }
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- /// {
- /// response_compressed: {
- /// value: false
- /// }
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * if supported by the implementation, when `response_compressed` is true,
- /// the response MUST have the compressed message flag set.
- /// * if supported by the implementation, when `response_compressed` is false,
- /// the response MUST NOT have the compressed message flag set.
- /// * response payload body is 314159 bytes in size in both cases.
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response message against a golden response
- Future<void> serverCompressedUnary() async {
- throw 'Not implemented';
- }
-
- /// This test verifies that client-only streaming succeeds.
- ///
- /// Procedure:
- /// 1. Client calls StreamingInputCall
- /// 2. Client sends:
- /// {
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- /// 3. Client then sends:
- /// {
- /// payload: {
- /// body: 8 bytes of zeros
- /// }
- /// }
- /// 4. Client then sends:
- /// {
- /// payload: {
- /// body: 1828 bytes of zeros
- /// }
- /// }
- /// 5. Client then sends:
- /// {
- /// payload: {
- /// body: 45904 bytes of zeros
- /// }
- /// }
- /// 6. Client half-closes
- ///
- /// Client asserts:
- /// * call was successful
- /// * response aggregated_payload_size is 74922
- Future<void> clientStreaming() async {
- StreamingInputCallRequest createRequest(int bytes) {
- final request = new StreamingInputCallRequest()..payload = new Payload();
- request.payload.body = new Uint8List(bytes);
- return request;
- }
-
- Stream<StreamingInputCallRequest> requests() async* {
- yield createRequest(27182);
- yield createRequest(8);
- yield createRequest(1828);
- yield createRequest(45904);
- }
-
- final response = await client.streamingInputCall(requests());
- if (response.aggregatedPayloadSize != 74922) {
- throw 'Response mismatch. Expected 74922, '
- 'got ${response.aggregatedPayloadSize}';
- }
- }
-
- /// This test verifies the client can compress requests on per-message basis
- /// by performing a two-request streaming call. It also sends an initial
- /// probing request to verify whether the server supports the
- /// CompressedRequest feature by checking if the probing call fails with an
- /// `INVALID_ARGUMENT` status.
- ///
- /// Procedure:
- /// 1. Client calls `StreamingInputCall` and sends the following
- /// feature-probing *uncompressed* `StreamingInputCallRequest` message
- /// {
- /// expect_compressed: {
- /// value: true
- /// }
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- /// If the call does not fail with `INVALID_ARGUMENT`, the test fails.
- /// Otherwise, we continue.
- /// 1. Client calls `StreamingInputCall` again, sending the *compressed*
- /// message
- /// {
- /// expect_compressed: {
- /// value: true
- /// }
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- /// 1. And finally, the *uncompressed* message
- /// {
- /// expect_compressed: {
- /// value: false
- /// }
- /// payload: {
- /// body: 45904 bytes of zeros
- /// }
- /// }
- /// 1. Client half-closes
- ///
- /// Client asserts:
- /// * First call fails with `INVALID_ARGUMENT`.
- /// * Next calls succeeds.
- /// * Response aggregated payload size is 73086.
- Future<void> clientCompressedStreaming() async {
- throw 'Not implemented';
- }
-
- /// This test verifies that server-only streaming succeeds.
- ///
- /// Procedure:
- /// 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`:
- /// {
- /// response_parameters: {
- /// size: 31415
- /// }
- /// response_parameters: {
- /// size: 9
- /// }
- /// response_parameters: {
- /// size: 2653
- /// }
- /// response_parameters: {
- /// size: 58979
- /// }
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * exactly four responses
- /// * response payload bodies are sized (in order): 31415, 9, 2653, 58979
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response messages against golden responses
- Future<void> serverStreaming() async {
- final expectedResponses = [31415, 9, 2653, 58979];
-
- final request = new StreamingOutputCallRequest()
- ..responseParameters.addAll(expectedResponses
- .map((size) => new ResponseParameters()..size = size));
-
- final responses = await client.streamingOutputCall(request).toList();
- if (responses.length != 4) {
- throw 'Incorrect number of responses (${responses.length}).';
- }
- final responseLengths =
- responses.map((response) => response.payload.body.length).toList();
-
- if (!new ListEquality().equals(responseLengths, expectedResponses)) {
- throw 'Incorrect response lengths received (${responseLengths.join(
- ', ')} != ${expectedResponses.join(', ')})';
- }
- }
-
- /// This test verifies that the server can compress streaming messages and
- /// disable compression on individual messages, expecting the server's
- /// response to be compressed or not according to the `response_compressed`
- /// boolean.
- ///
- /// Whether compression was actually performed is determined by the
- /// compression bit in the response's message flags. *Note that some languages
- /// may not have access to the message flags, in which case the client will be
- /// unable to verify that the `response_compressed` boolean is obeyed by the
- /// server*.
- ///
- /// Procedure:
- /// 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`:
- /// {
- /// response_parameters: {
- /// compressed: {
- /// value: true
- /// }
- /// size: 31415
- /// }
- /// response_parameters: {
- /// compressed: {
- /// value: false
- /// }
- /// size: 92653
- /// }
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * exactly two responses
- /// * if supported by the implementation, when `response_compressed` is false,
- /// the response's messages MUST NOT have the compressed message flag set.
- /// * if supported by the implementation, when `response_compressed` is true,
- /// the response's messages MUST have the compressed message flag set.
- /// * response payload bodies are sized (in order): 31415, 92653
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response messages against golden responses
- Future<void> serverCompressedStreaming() async {
- throw 'Not implemented';
- }
-
- /// This test verifies that full duplex bidi is supported.
- ///
- /// Procedure:
- /// 1. Client calls FullDuplexCall with:
- /// {
- /// response_parameters: {
- /// size: 31415
- /// }
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- /// 2. After getting a reply, it sends:
- /// {
- /// response_parameters: {
- /// size: 9
- /// }
- /// payload: {
- /// body: 8 bytes of zeros
- /// }
- /// }
- /// 3. After getting a reply, it sends:
- /// {
- /// response_parameters: {
- /// size: 2653
- /// }
- /// payload: {
- /// body: 1828 bytes of zeros
- /// }
- /// }
- /// 4. After getting a reply, it sends:
- /// {
- /// response_parameters: {
- /// size: 58979
- /// }
- /// payload: {
- /// body: 45904 bytes of zeros
- /// }
- /// }
- /// 5. After getting a reply, client half-closes
- ///
- /// Client asserts:
- /// * call was successful
- /// * exactly four responses
- /// * response payload bodies are sized (in order): 31415, 9, 2653, 58979
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response messages against golden responses
- Future<void> pingPong() async {
- final requestSizes = [27182, 8, 1828, 45904];
- final expectedResponses = [31415, 9, 2653, 58979];
-
- StreamingOutputCallRequest createRequest(int index) {
- final payload = new Payload()..body = new Uint8List(requestSizes[index]);
- final request = new StreamingOutputCallRequest()
- ..payload = payload
- ..responseParameters
- .add(new ResponseParameters()..size = expectedResponses[index]);
- return request;
- }
-
- var index = 0;
- final requests = new StreamController<int>();
-
- final responses = client.fullDuplexCall(requests.stream.map(createRequest));
- requests.add(index);
- await for (final response in responses) {
- if (index >= expectedResponses.length) {
- throw 'Received too many responses. $index > ${expectedResponses
- .length}.';
- }
- if (response.payload.body.length != expectedResponses[index]) {
- throw 'Response mismatch for response $index: '
- '${response.payload.body.length} != ${expectedResponses[index]}.';
- }
- index++;
- if (index == requestSizes.length) {
- requests.close();
- } else {
- requests.add(index);
- }
- }
- }
-
- /// This test verifies that streams support having zero-messages in both
- /// directions.
- ///
- /// Procedure:
- /// 1. Client calls FullDuplexCall and then half-closes
- ///
- /// Client asserts:
- /// * call was successful
- /// * exactly zero responses
- Future<void> emptyStream() async {
- final requests = new StreamController<StreamingOutputCallRequest>();
- final call = client.fullDuplexCall(requests.stream);
- requests.close();
- final responses = await call.toList();
- if (responses.length != 0) {
- throw 'Received too many responses. ${responses.length} != 0';
- }
- }
-
- /// This test is only for cloud-to-prod path.
- ///
- /// This test verifies unary calls succeed in sending messages while using
- /// Service Credentials from GCE metadata server. The client instance needs to
- /// be created with desired oauth scope.
- ///
- /// The test uses `--default_service_account` with GCE service account email
- /// and `--oauth_scope` with the OAuth scope to use. For testing against
- /// grpc-test.sandbox.googleapis.com,
- /// "https://www.googleapis.com/auth/xapi.zoo" should be passed in as
- /// `--oauth_scope`.
- ///
- /// Procedure:
- /// 1. Client configures channel to use GCECredentials
- /// 2. Client calls UnaryCall on the channel with:
- /// {
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// fill_username: true
- /// fill_oauth_scope: true
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * received SimpleResponse.username equals the value of
- /// `--default_service_account` flag
- /// * received SimpleResponse.oauth_scope is in `--oauth_scope`
- /// * response payload body is 314159 bytes in size
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response message against a golden response
- Future<void> computeEngineCreds() async {
- final credentials = new ComputeEngineAuthenticator();
- final clientWithCredentials =
- new TestServiceClient(channel, options: credentials.toCallOptions);
-
- final response = await _sendSimpleRequestForAuth(clientWithCredentials,
- fillUsername: true, fillOauthScope: true);
-
- final user = response.username;
- final oauth = response.oauthScope;
-
- if (user?.isEmpty ?? true) {
- throw 'Username not received.';
- }
- if (oauth?.isEmpty ?? true) {
- throw 'OAuth scope not received.';
- }
-
- if (user != defaultServiceAccount) {
- throw 'Got user name $user, wanted $defaultServiceAccount';
- }
- if (!oauthScope.contains(oauth)) {
- throw 'Got OAuth scope $oauth, which is not a substring of $oauthScope';
- }
- }
-
- /// This test is only for cloud-to-prod path.
- ///
- /// This test verifies unary calls succeed in sending messages while using
- /// service account credentials.
- ///
- /// Test caller should set flag `--service_account_key_file` with the path to
- /// json key file downloaded from https://console.developers.google.com.
- /// Alternately, if using a usable auth implementation, she may specify the
- /// file location in the environment variable GOOGLE_APPLICATION_CREDENTIALS.
- ///
- /// Procedure:
- /// 1. Client configures the channel to use ServiceAccountCredentials
- /// 2. Client calls UnaryCall with:
- /// {
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// fill_username: true
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * received SimpleResponse.username is not empty and is in the json key
- /// file used by the auth library. The client can optionally check the
- /// username matches the email address in the key file or equals the value
- /// of `--default_service_account` flag.
- /// * response payload body is 314159 bytes in size
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response message against a golden response
- Future<void> serviceAccountCreds() async {
- throw 'Not implemented';
- }
-
- /// This test is only for cloud-to-prod path.
- ///
- /// This test verifies unary calls succeed in sending messages while using JWT
- /// token (created by the project's key file)
- ///
- /// Test caller should set flag `--service_account_key_file` with the path to
- /// json key file downloaded from https://console.developers.google.com.
- /// Alternately, if using a usable auth implementation, she may specify the
- /// file location in the environment variable GOOGLE_APPLICATION_CREDENTIALS.
- ///
- /// Procedure:
- /// 1. Client configures the channel to use JWTTokenCredentials
- /// 2. Client calls UnaryCall with:
- /// {
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// fill_username: true
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * received SimpleResponse.username is not empty and is in the json key
- /// file used by the auth library. The client can optionally check the
- /// username matches the email address in the key file or equals the value
- /// of `--default_service_account` flag.
- /// * response payload body is 314159 bytes in size
- /// * clients are free to assert that the response payload body contents are
- /// zero and comparing the entire response message against a golden response
- Future<void> jwtTokenCreds() async {
- final credentials = new JwtServiceAccountAuthenticator(serviceAccountJson);
- final clientWithCredentials =
- new TestServiceClient(channel, options: credentials.toCallOptions);
-
- final response = await _sendSimpleRequestForAuth(clientWithCredentials,
- fillUsername: true);
- final username = response.username;
- if (username?.isEmpty ?? true) {
- throw 'Username not received.';
- }
- if (!serviceAccountJson.contains(username)) {
- throw 'Got user name $username, which is not a substring of $serviceAccountJson';
- }
- }
-
- /// This test is only for cloud-to-prod path and some implementations may run
- /// in GCE only.
- ///
- /// This test verifies unary calls succeed in sending messages using an OAuth2
- /// token that is obtained out of band. For the purpose of the test, the
- /// OAuth2 token is actually obtained from a service account credentials or
- /// GCE credentials via the language-specific authorization library.
- ///
- /// The difference between this test and the other auth tests is that it first
- /// uses the authorization library to obtain an authorization token.
- ///
- /// The test
- /// * uses the flag `--service_account_key_file` with the path to a json key
- /// file downloaded from https://console.developers.google.com. Alternately,
- /// if using a usable auth implementation, it may specify the file location
- /// in the environment variable GOOGLE_APPLICATION_CREDENTIALS, *OR* if GCE
- /// credentials is used to fetch the token, `--default_service_account` can
- /// be used to pass in GCE service account email.
- /// * uses the flag `--oauth_scope` for the oauth scope. For testing against
- /// grpc-test.sandbox.googleapis.com,
- /// "https://www.googleapis.com/auth/xapi.zoo" should be passed as the
- /// `--oauth_scope`.
- ///
- /// Procedure:
- /// 1. Client uses the auth library to obtain an authorization token
- /// 2. Client configures the channel to use AccessTokenCredentials with the
- /// access token obtained in step 1
- /// 3. Client calls UnaryCall with the following message
- /// {
- /// fill_username: true
- /// fill_oauth_scope: true
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * received SimpleResponse.username is valid. Depending on whether a
- /// service account key file or GCE credentials was used, client should
- /// check against the json key file or GCE default service account email.
- /// * received SimpleResponse.oauth_scope is in `--oauth_scope`
- Future<void> oauth2AuthToken() async {
- final credentials =
- new ServiceAccountAuthenticator(serviceAccountJson, [oauthScope]);
- final clientWithCredentials =
- new TestServiceClient(channel, options: credentials.toCallOptions);
-
- final response = await _sendSimpleRequestForAuth(clientWithCredentials,
- fillUsername: true, fillOauthScope: true);
-
- final user = response.username;
- final oauth = response.oauthScope;
-
- if (user?.isEmpty ?? true) {
- throw 'Username not received.';
- }
- if (oauth?.isEmpty ?? true) {
- throw 'OAuth scope not received.';
- }
-
- if (!serviceAccountJson.contains(user)) {
- throw 'Got user name $user, which is not a substring of $serviceAccountJson';
- }
- if (!oauthScope.contains(oauth)) {
- throw 'Got OAuth scope $oauth, which is not a substring of $oauthScope';
- }
- }
-
- /// Similar to the other auth tests, this test is only for cloud-to-prod path.
- ///
- /// This test verifies unary calls succeed in sending messages using a JWT or
- /// a service account credentials set on the RPC.
- ///
- /// The test
- /// * uses the flag `--service_account_key_file` with the path to a json key
- /// file downloaded from https://console.developers.google.com. Alternately,
- /// if using a usable auth implementation, it may specify the file location
- /// in the environment variable GOOGLE_APPLICATION_CREDENTIALS
- /// * optionally uses the flag `--oauth_scope` for the oauth scope if
- /// implementator wishes to use service account credential instead of JWT
- /// credential. For testing against grpc-test.sandbox.googleapis.com, oauth
- /// scope "https://www.googleapis.com/auth/xapi.zoo" should be used.
- ///
- /// Procedure:
- /// 1. Client configures the channel with just SSL credentials
- /// 2. Client calls UnaryCall, setting per-call credentials to
- /// JWTTokenCredentials. The request is the following message
- /// {
- /// fill_username: true
- /// }
- ///
- /// Client asserts:
- /// * call was successful
- /// * received SimpleResponse.username is not empty and is in the json key
- /// file used by the auth library. The client can optionally check the
- /// username matches the email address in the key file.
- Future<void> perRpcCreds() async {
- final credentials =
- new ServiceAccountAuthenticator(serviceAccountJson, [oauthScope]);
-
- final response = await _sendSimpleRequestForAuth(client,
- fillUsername: true,
- fillOauthScope: true,
- options: credentials.toCallOptions);
-
- final user = response.username;
- final oauth = response.oauthScope;
-
- if (user?.isEmpty ?? true) {
- throw 'Username not received.';
- }
- if (oauth?.isEmpty ?? true) {
- throw 'OAuth scope not received.';
- }
-
- if (!serviceAccountJson.contains(user)) {
- throw 'Got user name $user, which is not a substring of $serviceAccountJson';
- }
- if (!oauthScope.contains(oauth)) {
- throw 'Got OAuth scope $oauth, which is not a substring of $oauthScope';
- }
- }
-
- Future<SimpleResponse> _sendSimpleRequestForAuth(TestServiceClient client,
- {bool fillUsername: false,
- bool fillOauthScope: false,
- CallOptions options}) async {
- final payload = new Payload()..body = new Uint8List(271828);
- final request = new SimpleRequest()
- ..responseSize = 314159
- ..payload = payload
- ..fillUsername = fillUsername
- ..fillOauthScope = fillOauthScope;
- final response = await client.unaryCall(request, options: options);
- final receivedBytes = response.payload.body.length;
- if (receivedBytes != 314159) {
- throw 'Response payload mismatch. Expected 314159 bytes, '
- 'got ${receivedBytes}.';
- }
- return response;
- }
-
- /// This test verifies that custom metadata in either binary or ascii format
- /// can be sent as initial-metadata by the client and as both initial- and
- /// trailing-metadata by the server.
- ///
- /// Procedure:
- /// 1. The client attaches custom metadata with the following keys and values:
- /// key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value"
- /// key: "x-grpc-test-echo-trailing-bin", value: 0xababab
- /// to a UnaryCall with request:
- /// {
- /// response_size: 314159
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- ///
- /// 2. The client attaches custom metadata with the following keys and values:
- /// key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value"
- /// key: "x-grpc-test-echo-trailing-bin", value: 0xababab
- /// to a FullDuplexCall with request:
- /// {
- /// response_parameters: {
- /// size: 314159
- /// }
- /// payload: {
- /// body: 271828 bytes of zeros
- /// }
- /// }
- /// and then half-closes
- ///
- /// Client asserts:
- /// * call was successful
- /// * metadata with key `"x-grpc-test-echo-initial"` and value
- /// `"test_initial_metadata_value"`is received in the initial metadata for
- /// calls in Procedure steps 1 and 2.
- /// * metadata with key `"x-grpc-test-echo-trailing-bin"` and value `0xababab`
- /// is received in the trailing metadata for calls in Procedure steps 1 and
- /// 2.
- Future<void> customMetadata() async {
- void validate(Map<String, String> headers, Map<String, String> trailers) {
- if (headers[_headerEchoKey] != _headerEchoData) {
- throw 'Invalid header data received.';
- }
- if (trailers[_trailerEchoKey] != _trailerEchoData) {
- throw 'Invalid trailer data received.';
- }
- }
-
- final options = new CallOptions(metadata: {
- _headerEchoKey: _headerEchoData,
- _trailerEchoKey: _trailerEchoData,
- });
- final unaryCall = client.unaryCall(
- new SimpleRequest()
- ..responseSize = 314159
- ..payload = (new Payload()..body = new Uint8List(271828)),
- options: options);
- var headers = await unaryCall.headers;
- var trailers = await unaryCall.trailers;
- await unaryCall;
- validate(headers, trailers);
-
- Stream<StreamingOutputCallRequest> requests() async* {
- yield new StreamingOutputCallRequest()
- ..responseParameters.add(new ResponseParameters()..size = 314159)
- ..payload = (new Payload()..body = new Uint8List(271828));
- }
-
- final fullDuplexCall = client.fullDuplexCall(requests(), options: options);
- final drain = fullDuplexCall.drain();
- headers = await fullDuplexCall.headers;
- trailers = await fullDuplexCall.trailers;
- await drain;
- validate(headers, trailers);
- }
-
- /// This test verifies unary calls succeed in sending messages, and propagate
- /// back status code and message sent along with the messages.
- ///
- /// Procedure:
- /// 1. Client calls UnaryCall with:
- /// {
- /// response_status: {
- /// code: 2
- /// message: "test status message"
- /// }
- /// }
- ///
- /// 2. Client calls FullDuplexCall with:
- /// {
- /// response_status: {
- /// code: 2
- /// message: "test status message"
- /// }
- /// }
- ///
- /// and then half-closes
- ///
- /// Client asserts:
- /// * received status code is the same as the sent code for both Procedure
- /// steps 1 and 2
- /// * received status message is the same as the sent message for both
- /// Procedure steps 1 and 2
- Future<void> statusCodeAndMessage() async {
- final expectedStatus = new GrpcError.custom(2, 'test status message');
- final responseStatus = new EchoStatus()
- ..code = expectedStatus.code
- ..message = expectedStatus.message;
- try {
- await client
- .unaryCall(new SimpleRequest()..responseStatus = responseStatus);
- throw 'Did not receive correct status code.';
- } on GrpcError catch (e) {
- if (e != expectedStatus) {
- throw 'Received incorrect status: $e.';
- }
- }
- Stream<StreamingOutputCallRequest> requests() async* {
- yield new StreamingOutputCallRequest()..responseStatus = responseStatus;
- }
-
- try {
- await for (final _ in client.fullDuplexCall(requests())) {
- throw 'Received unexpected response.';
- }
- throw 'Did not receive correct status code.';
- } on GrpcError catch (e) {
- if (e != expectedStatus) {
- throw 'Received incorrect status: $e.';
- }
- }
- }
-
- /// This test verifies that calling an unimplemented RPC method returns the
- /// UNIMPLEMENTED status code.
- ///
- /// Procedure:
- /// * Client calls `grpc.testing.TestService/UnimplementedCall` with an empty
- /// request (defined as `grpc.testing.Empty`):
- /// {
- /// }
- ///
- /// Client asserts:
- /// * received status code is 12 (UNIMPLEMENTED)
- Future<void> unimplementedMethod() async {
- try {
- await client.unimplementedCall(new Empty());
- throw 'Did not throw.';
- } on GrpcError catch (e) {
- if (e.code != StatusCode.unimplemented) {
- throw 'Unexpected status code ${e.code} - ${e.message}.';
- }
- }
- }
-
- /// This test verifies calling an unimplemented server returns the
- /// UNIMPLEMENTED status code.
- ///
- /// Procedure:
- /// * Client calls `grpc.testing.UnimplementedService/UnimplementedCall` with
- /// an empty request (defined as `grpc.testing.Empty`)
- ///
- /// Client asserts:
- /// * received status code is 12 (UNIMPLEMENTED)
- Future<void> unimplementedService() async {
- try {
- await unimplementedServiceClient.unimplementedCall(new Empty());
- throw 'Did not throw.';
- } on GrpcError catch (e) {
- if (e.code != StatusCode.unimplemented) {
- throw 'Unexpected status code ${e.code} - ${e.message}.';
- }
- }
- }
-
- /// This test verifies that a request can be cancelled after metadata has been
- /// sent but before payloads are sent.
- ///
- /// Procedure:
- /// 1. Client starts StreamingInputCall
- /// 2. Client immediately cancels request
- ///
- /// Client asserts:
- /// * Call completed with status CANCELLED
- Future<void> cancelAfterBegin() async {
- final requests = new StreamController<StreamingInputCallRequest>();
- final call = client.streamingInputCall(requests.stream);
- scheduleMicrotask(call.cancel);
- try {
- await call;
- throw 'Expected exception.';
- } on GrpcError catch (e) {
- if (e.code != StatusCode.cancelled) {
- throw 'Unexpected status code ${e.code} - ${e.message}';
- }
- }
- requests.close();
- }
-
- /// This test verifies that a request can be cancelled after receiving a
- /// message from the server.
- ///
- /// Procedure:
- /// 1. Client starts FullDuplexCall with
- /// {
- /// response_parameters: {
- /// size: 31415
- /// }
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- ///
- /// 2. After receiving a response, client cancels request
- ///
- /// Client asserts:
- /// * Call completed with status CANCELLED
- Future<void> cancelAfterFirstResponse() async {
- final requests = new StreamController<StreamingOutputCallRequest>();
- final call = client.fullDuplexCall(requests.stream);
- final completer = new Completer();
-
- var receivedResponse = false;
- call.listen((response) {
- if (receivedResponse) {
- completer.completeError('Received too many responses.');
- return;
- }
- receivedResponse = true;
- if (response.payload.body.length != 31415) {
- completer.completeError('Invalid response length: '
- '${response.payload.body.length} != 31415.');
- }
- call.cancel();
- }, onError: (e) {
- if (e is! GrpcError) completer.completeError('Unexpected error: $e.');
- if (e.code != StatusCode.cancelled) {
- completer
- .completeError('Unexpected status code ${e.code}: ${e.message}.');
- }
- completer.complete(true);
- }, onDone: () {
- if (!completer.isCompleted) completer.completeError('Expected error.');
- });
-
- requests.add(new StreamingOutputCallRequest()
- ..responseParameters.add(new ResponseParameters()..size = 31415)
- ..payload = (new Payload()..body = new Uint8List(27182)));
- await completer.future;
- requests.close();
- }
-
- /// This test verifies that an RPC request whose lifetime exceeds its
- /// configured timeout value will end with the DeadlineExceeded status.
- ///
- /// Procedure:
- /// 1. Client calls FullDuplexCall with the following request and sets its
- /// timeout to 1ms
- /// {
- /// payload: {
- /// body: 27182 bytes of zeros
- /// }
- /// }
- ///
- /// 2. Client waits
- ///
- /// Client asserts:
- /// * Call completed with status DEADLINE_EXCEEDED.
- Future<void> timeoutOnSleepingServer() async {
- final requests = new StreamController<StreamingOutputCallRequest>();
- final call = client.fullDuplexCall(requests.stream,
- options: new CallOptions(timeout: new Duration(milliseconds: 1)));
- requests.add(new StreamingOutputCallRequest()
- ..payload = (new Payload()..body = new Uint8List(27182)));
- try {
- await for (final _ in call) {
- throw 'Unexpected response received.';
- }
- throw 'Expected exception.';
- } on GrpcError catch (e) {
- if (e.code != StatusCode.deadlineExceeded) {
- throw 'Unexpected status code ${e.code} - ${e.message}.';
- }
- } finally {
- requests.close();
- }
- }
-}
diff --git a/grpc/interop/lib/src/generated/empty.pb.dart b/grpc/interop/lib/src/generated/empty.pb.dart
deleted file mode 100644
index 4b040c7..0000000
--- a/grpc/interop/lib/src/generated/empty.pb.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc.testing_empty;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-class Empty extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Empty')
- ..hasRequiredFields = false;
-
- Empty() : super();
- Empty.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Empty.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Empty clone() => new Empty()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Empty create() => new Empty();
- static PbList<Empty> createRepeated() => new PbList<Empty>();
- static Empty getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyEmpty();
- return _defaultInstance;
- }
-
- static Empty _defaultInstance;
- static void $checkItem(Empty v) {
- if (v is! Empty) checkItemFailed(v, 'Empty');
- }
-}
-
-class _ReadonlyEmpty extends Empty with ReadonlyMessageMixin {}
diff --git a/grpc/interop/lib/src/generated/messages.pb.dart b/grpc/interop/lib/src/generated/messages.pb.dart
deleted file mode 100644
index fe00e19..0000000
--- a/grpc/interop/lib/src/generated/messages.pb.dart
+++ /dev/null
@@ -1,655 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc.testing_messages;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
-
-import 'package:protobuf/protobuf.dart';
-
-import 'messages.pbenum.dart';
-
-export 'messages.pbenum.dart';
-
-class BoolValue extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('BoolValue')
- ..aOB(1, 'value')
- ..hasRequiredFields = false;
-
- BoolValue() : super();
- BoolValue.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- BoolValue.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- BoolValue clone() => new BoolValue()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static BoolValue create() => new BoolValue();
- static PbList<BoolValue> createRepeated() => new PbList<BoolValue>();
- static BoolValue getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyBoolValue();
- return _defaultInstance;
- }
-
- static BoolValue _defaultInstance;
- static void $checkItem(BoolValue v) {
- if (v is! BoolValue) checkItemFailed(v, 'BoolValue');
- }
-
- bool get value => $_get(0, false);
- set value(bool v) {
- $_setBool(0, v);
- }
-
- bool hasValue() => $_has(0);
- void clearValue() => clearField(1);
-}
-
-class _ReadonlyBoolValue extends BoolValue with ReadonlyMessageMixin {}
-
-class Payload extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('Payload')
- ..e<PayloadType>(1, 'type', PbFieldType.OE, PayloadType.COMPRESSABLE,
- PayloadType.valueOf, PayloadType.values)
- ..a<List<int>>(2, 'body', PbFieldType.OY)
- ..hasRequiredFields = false;
-
- Payload() : super();
- Payload.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- Payload.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- Payload clone() => new Payload()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static Payload create() => new Payload();
- static PbList<Payload> createRepeated() => new PbList<Payload>();
- static Payload getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyPayload();
- return _defaultInstance;
- }
-
- static Payload _defaultInstance;
- static void $checkItem(Payload v) {
- if (v is! Payload) checkItemFailed(v, 'Payload');
- }
-
- PayloadType get type => $_getN(0);
- set type(PayloadType v) {
- setField(1, v);
- }
-
- bool hasType() => $_has(0);
- void clearType() => clearField(1);
-
- List<int> get body => $_getN(1);
- set body(List<int> v) {
- $_setBytes(1, v);
- }
-
- bool hasBody() => $_has(1);
- void clearBody() => clearField(2);
-}
-
-class _ReadonlyPayload extends Payload with ReadonlyMessageMixin {}
-
-class EchoStatus extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('EchoStatus')
- ..a<int>(1, 'code', PbFieldType.O3)
- ..aOS(2, 'message')
- ..hasRequiredFields = false;
-
- EchoStatus() : super();
- EchoStatus.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- EchoStatus.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- EchoStatus clone() => new EchoStatus()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static EchoStatus create() => new EchoStatus();
- static PbList<EchoStatus> createRepeated() => new PbList<EchoStatus>();
- static EchoStatus getDefault() {
- if (_defaultInstance == null) _defaultInstance = new _ReadonlyEchoStatus();
- return _defaultInstance;
- }
-
- static EchoStatus _defaultInstance;
- static void $checkItem(EchoStatus v) {
- if (v is! EchoStatus) checkItemFailed(v, 'EchoStatus');
- }
-
- int get code => $_get(0, 0);
- set code(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasCode() => $_has(0);
- void clearCode() => clearField(1);
-
- String get message => $_getS(1, '');
- set message(String v) {
- $_setString(1, v);
- }
-
- bool hasMessage() => $_has(1);
- void clearMessage() => clearField(2);
-}
-
-class _ReadonlyEchoStatus extends EchoStatus with ReadonlyMessageMixin {}
-
-class SimpleRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('SimpleRequest')
- ..e<PayloadType>(1, 'responseType', PbFieldType.OE,
- PayloadType.COMPRESSABLE, PayloadType.valueOf, PayloadType.values)
- ..a<int>(2, 'responseSize', PbFieldType.O3)
- ..a<Payload>(
- 3, 'payload', PbFieldType.OM, Payload.getDefault, Payload.create)
- ..aOB(4, 'fillUsername')
- ..aOB(5, 'fillOauthScope')
- ..a<BoolValue>(6, 'responseCompressed', PbFieldType.OM,
- BoolValue.getDefault, BoolValue.create)
- ..a<EchoStatus>(7, 'responseStatus', PbFieldType.OM, EchoStatus.getDefault,
- EchoStatus.create)
- ..a<BoolValue>(8, 'expectCompressed', PbFieldType.OM, BoolValue.getDefault,
- BoolValue.create)
- ..hasRequiredFields = false;
-
- SimpleRequest() : super();
- SimpleRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- SimpleRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- SimpleRequest clone() => new SimpleRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static SimpleRequest create() => new SimpleRequest();
- static PbList<SimpleRequest> createRepeated() => new PbList<SimpleRequest>();
- static SimpleRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlySimpleRequest();
- return _defaultInstance;
- }
-
- static SimpleRequest _defaultInstance;
- static void $checkItem(SimpleRequest v) {
- if (v is! SimpleRequest) checkItemFailed(v, 'SimpleRequest');
- }
-
- PayloadType get responseType => $_getN(0);
- set responseType(PayloadType v) {
- setField(1, v);
- }
-
- bool hasResponseType() => $_has(0);
- void clearResponseType() => clearField(1);
-
- int get responseSize => $_get(1, 0);
- set responseSize(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasResponseSize() => $_has(1);
- void clearResponseSize() => clearField(2);
-
- Payload get payload => $_getN(2);
- set payload(Payload v) {
- setField(3, v);
- }
-
- bool hasPayload() => $_has(2);
- void clearPayload() => clearField(3);
-
- bool get fillUsername => $_get(3, false);
- set fillUsername(bool v) {
- $_setBool(3, v);
- }
-
- bool hasFillUsername() => $_has(3);
- void clearFillUsername() => clearField(4);
-
- bool get fillOauthScope => $_get(4, false);
- set fillOauthScope(bool v) {
- $_setBool(4, v);
- }
-
- bool hasFillOauthScope() => $_has(4);
- void clearFillOauthScope() => clearField(5);
-
- BoolValue get responseCompressed => $_getN(5);
- set responseCompressed(BoolValue v) {
- setField(6, v);
- }
-
- bool hasResponseCompressed() => $_has(5);
- void clearResponseCompressed() => clearField(6);
-
- EchoStatus get responseStatus => $_getN(6);
- set responseStatus(EchoStatus v) {
- setField(7, v);
- }
-
- bool hasResponseStatus() => $_has(6);
- void clearResponseStatus() => clearField(7);
-
- BoolValue get expectCompressed => $_getN(7);
- set expectCompressed(BoolValue v) {
- setField(8, v);
- }
-
- bool hasExpectCompressed() => $_has(7);
- void clearExpectCompressed() => clearField(8);
-}
-
-class _ReadonlySimpleRequest extends SimpleRequest with ReadonlyMessageMixin {}
-
-class SimpleResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('SimpleResponse')
- ..a<Payload>(
- 1, 'payload', PbFieldType.OM, Payload.getDefault, Payload.create)
- ..aOS(2, 'username')
- ..aOS(3, 'oauthScope')
- ..hasRequiredFields = false;
-
- SimpleResponse() : super();
- SimpleResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- SimpleResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- SimpleResponse clone() => new SimpleResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static SimpleResponse create() => new SimpleResponse();
- static PbList<SimpleResponse> createRepeated() =>
- new PbList<SimpleResponse>();
- static SimpleResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlySimpleResponse();
- return _defaultInstance;
- }
-
- static SimpleResponse _defaultInstance;
- static void $checkItem(SimpleResponse v) {
- if (v is! SimpleResponse) checkItemFailed(v, 'SimpleResponse');
- }
-
- Payload get payload => $_getN(0);
- set payload(Payload v) {
- setField(1, v);
- }
-
- bool hasPayload() => $_has(0);
- void clearPayload() => clearField(1);
-
- String get username => $_getS(1, '');
- set username(String v) {
- $_setString(1, v);
- }
-
- bool hasUsername() => $_has(1);
- void clearUsername() => clearField(2);
-
- String get oauthScope => $_getS(2, '');
- set oauthScope(String v) {
- $_setString(2, v);
- }
-
- bool hasOauthScope() => $_has(2);
- void clearOauthScope() => clearField(3);
-}
-
-class _ReadonlySimpleResponse extends SimpleResponse with ReadonlyMessageMixin {
-}
-
-class StreamingInputCallRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('StreamingInputCallRequest')
- ..a<Payload>(
- 1, 'payload', PbFieldType.OM, Payload.getDefault, Payload.create)
- ..a<BoolValue>(2, 'expectCompressed', PbFieldType.OM, BoolValue.getDefault,
- BoolValue.create)
- ..hasRequiredFields = false;
-
- StreamingInputCallRequest() : super();
- StreamingInputCallRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- StreamingInputCallRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- StreamingInputCallRequest clone() =>
- new StreamingInputCallRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static StreamingInputCallRequest create() => new StreamingInputCallRequest();
- static PbList<StreamingInputCallRequest> createRepeated() =>
- new PbList<StreamingInputCallRequest>();
- static StreamingInputCallRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyStreamingInputCallRequest();
- return _defaultInstance;
- }
-
- static StreamingInputCallRequest _defaultInstance;
- static void $checkItem(StreamingInputCallRequest v) {
- if (v is! StreamingInputCallRequest)
- checkItemFailed(v, 'StreamingInputCallRequest');
- }
-
- Payload get payload => $_getN(0);
- set payload(Payload v) {
- setField(1, v);
- }
-
- bool hasPayload() => $_has(0);
- void clearPayload() => clearField(1);
-
- BoolValue get expectCompressed => $_getN(1);
- set expectCompressed(BoolValue v) {
- setField(2, v);
- }
-
- bool hasExpectCompressed() => $_has(1);
- void clearExpectCompressed() => clearField(2);
-}
-
-class _ReadonlyStreamingInputCallRequest extends StreamingInputCallRequest
- with ReadonlyMessageMixin {}
-
-class StreamingInputCallResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('StreamingInputCallResponse')
- ..a<int>(1, 'aggregatedPayloadSize', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- StreamingInputCallResponse() : super();
- StreamingInputCallResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- StreamingInputCallResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- StreamingInputCallResponse clone() =>
- new StreamingInputCallResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static StreamingInputCallResponse create() =>
- new StreamingInputCallResponse();
- static PbList<StreamingInputCallResponse> createRepeated() =>
- new PbList<StreamingInputCallResponse>();
- static StreamingInputCallResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyStreamingInputCallResponse();
- return _defaultInstance;
- }
-
- static StreamingInputCallResponse _defaultInstance;
- static void $checkItem(StreamingInputCallResponse v) {
- if (v is! StreamingInputCallResponse)
- checkItemFailed(v, 'StreamingInputCallResponse');
- }
-
- int get aggregatedPayloadSize => $_get(0, 0);
- set aggregatedPayloadSize(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasAggregatedPayloadSize() => $_has(0);
- void clearAggregatedPayloadSize() => clearField(1);
-}
-
-class _ReadonlyStreamingInputCallResponse extends StreamingInputCallResponse
- with ReadonlyMessageMixin {}
-
-class ResponseParameters extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ResponseParameters')
- ..a<int>(1, 'size', PbFieldType.O3)
- ..a<int>(2, 'intervalUs', PbFieldType.O3)
- ..a<BoolValue>(
- 3, 'compressed', PbFieldType.OM, BoolValue.getDefault, BoolValue.create)
- ..hasRequiredFields = false;
-
- ResponseParameters() : super();
- ResponseParameters.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ResponseParameters.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ResponseParameters clone() =>
- new ResponseParameters()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ResponseParameters create() => new ResponseParameters();
- static PbList<ResponseParameters> createRepeated() =>
- new PbList<ResponseParameters>();
- static ResponseParameters getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyResponseParameters();
- return _defaultInstance;
- }
-
- static ResponseParameters _defaultInstance;
- static void $checkItem(ResponseParameters v) {
- if (v is! ResponseParameters) checkItemFailed(v, 'ResponseParameters');
- }
-
- int get size => $_get(0, 0);
- set size(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasSize() => $_has(0);
- void clearSize() => clearField(1);
-
- int get intervalUs => $_get(1, 0);
- set intervalUs(int v) {
- $_setUnsignedInt32(1, v);
- }
-
- bool hasIntervalUs() => $_has(1);
- void clearIntervalUs() => clearField(2);
-
- BoolValue get compressed => $_getN(2);
- set compressed(BoolValue v) {
- setField(3, v);
- }
-
- bool hasCompressed() => $_has(2);
- void clearCompressed() => clearField(3);
-}
-
-class _ReadonlyResponseParameters extends ResponseParameters
- with ReadonlyMessageMixin {}
-
-class StreamingOutputCallRequest extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('StreamingOutputCallRequest')
- ..e<PayloadType>(1, 'responseType', PbFieldType.OE,
- PayloadType.COMPRESSABLE, PayloadType.valueOf, PayloadType.values)
- ..pp<ResponseParameters>(2, 'responseParameters', PbFieldType.PM,
- ResponseParameters.$checkItem, ResponseParameters.create)
- ..a<Payload>(
- 3, 'payload', PbFieldType.OM, Payload.getDefault, Payload.create)
- ..a<EchoStatus>(7, 'responseStatus', PbFieldType.OM, EchoStatus.getDefault,
- EchoStatus.create)
- ..hasRequiredFields = false;
-
- StreamingOutputCallRequest() : super();
- StreamingOutputCallRequest.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- StreamingOutputCallRequest.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- StreamingOutputCallRequest clone() =>
- new StreamingOutputCallRequest()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static StreamingOutputCallRequest create() =>
- new StreamingOutputCallRequest();
- static PbList<StreamingOutputCallRequest> createRepeated() =>
- new PbList<StreamingOutputCallRequest>();
- static StreamingOutputCallRequest getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyStreamingOutputCallRequest();
- return _defaultInstance;
- }
-
- static StreamingOutputCallRequest _defaultInstance;
- static void $checkItem(StreamingOutputCallRequest v) {
- if (v is! StreamingOutputCallRequest)
- checkItemFailed(v, 'StreamingOutputCallRequest');
- }
-
- PayloadType get responseType => $_getN(0);
- set responseType(PayloadType v) {
- setField(1, v);
- }
-
- bool hasResponseType() => $_has(0);
- void clearResponseType() => clearField(1);
-
- List<ResponseParameters> get responseParameters => $_getList(1);
-
- Payload get payload => $_getN(2);
- set payload(Payload v) {
- setField(3, v);
- }
-
- bool hasPayload() => $_has(2);
- void clearPayload() => clearField(3);
-
- EchoStatus get responseStatus => $_getN(3);
- set responseStatus(EchoStatus v) {
- setField(7, v);
- }
-
- bool hasResponseStatus() => $_has(3);
- void clearResponseStatus() => clearField(7);
-}
-
-class _ReadonlyStreamingOutputCallRequest extends StreamingOutputCallRequest
- with ReadonlyMessageMixin {}
-
-class StreamingOutputCallResponse extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('StreamingOutputCallResponse')
- ..a<Payload>(
- 1, 'payload', PbFieldType.OM, Payload.getDefault, Payload.create)
- ..hasRequiredFields = false;
-
- StreamingOutputCallResponse() : super();
- StreamingOutputCallResponse.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- StreamingOutputCallResponse.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- StreamingOutputCallResponse clone() =>
- new StreamingOutputCallResponse()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static StreamingOutputCallResponse create() =>
- new StreamingOutputCallResponse();
- static PbList<StreamingOutputCallResponse> createRepeated() =>
- new PbList<StreamingOutputCallResponse>();
- static StreamingOutputCallResponse getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyStreamingOutputCallResponse();
- return _defaultInstance;
- }
-
- static StreamingOutputCallResponse _defaultInstance;
- static void $checkItem(StreamingOutputCallResponse v) {
- if (v is! StreamingOutputCallResponse)
- checkItemFailed(v, 'StreamingOutputCallResponse');
- }
-
- Payload get payload => $_getN(0);
- set payload(Payload v) {
- setField(1, v);
- }
-
- bool hasPayload() => $_has(0);
- void clearPayload() => clearField(1);
-}
-
-class _ReadonlyStreamingOutputCallResponse extends StreamingOutputCallResponse
- with ReadonlyMessageMixin {}
-
-class ReconnectParams extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ReconnectParams')
- ..a<int>(1, 'maxReconnectBackoffMs', PbFieldType.O3)
- ..hasRequiredFields = false;
-
- ReconnectParams() : super();
- ReconnectParams.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ReconnectParams.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ReconnectParams clone() => new ReconnectParams()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ReconnectParams create() => new ReconnectParams();
- static PbList<ReconnectParams> createRepeated() =>
- new PbList<ReconnectParams>();
- static ReconnectParams getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyReconnectParams();
- return _defaultInstance;
- }
-
- static ReconnectParams _defaultInstance;
- static void $checkItem(ReconnectParams v) {
- if (v is! ReconnectParams) checkItemFailed(v, 'ReconnectParams');
- }
-
- int get maxReconnectBackoffMs => $_get(0, 0);
- set maxReconnectBackoffMs(int v) {
- $_setUnsignedInt32(0, v);
- }
-
- bool hasMaxReconnectBackoffMs() => $_has(0);
- void clearMaxReconnectBackoffMs() => clearField(1);
-}
-
-class _ReadonlyReconnectParams extends ReconnectParams
- with ReadonlyMessageMixin {}
-
-class ReconnectInfo extends GeneratedMessage {
- static final BuilderInfo _i = new BuilderInfo('ReconnectInfo')
- ..aOB(1, 'passed')
- ..p<int>(2, 'backoffMs', PbFieldType.P3)
- ..hasRequiredFields = false;
-
- ReconnectInfo() : super();
- ReconnectInfo.fromBuffer(List<int> i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromBuffer(i, r);
- ReconnectInfo.fromJson(String i,
- [ExtensionRegistry r = ExtensionRegistry.EMPTY])
- : super.fromJson(i, r);
- ReconnectInfo clone() => new ReconnectInfo()..mergeFromMessage(this);
- BuilderInfo get info_ => _i;
- static ReconnectInfo create() => new ReconnectInfo();
- static PbList<ReconnectInfo> createRepeated() => new PbList<ReconnectInfo>();
- static ReconnectInfo getDefault() {
- if (_defaultInstance == null)
- _defaultInstance = new _ReadonlyReconnectInfo();
- return _defaultInstance;
- }
-
- static ReconnectInfo _defaultInstance;
- static void $checkItem(ReconnectInfo v) {
- if (v is! ReconnectInfo) checkItemFailed(v, 'ReconnectInfo');
- }
-
- bool get passed => $_get(0, false);
- set passed(bool v) {
- $_setBool(0, v);
- }
-
- bool hasPassed() => $_has(0);
- void clearPassed() => clearField(1);
-
- List<int> get backoffMs => $_getList(1);
-}
-
-class _ReadonlyReconnectInfo extends ReconnectInfo with ReadonlyMessageMixin {}
diff --git a/grpc/interop/lib/src/generated/messages.pbenum.dart b/grpc/interop/lib/src/generated/messages.pbenum.dart
deleted file mode 100644
index 964d000..0000000
--- a/grpc/interop/lib/src/generated/messages.pbenum.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc.testing_messages_pbenum;
-
-// ignore_for_file: UNDEFINED_SHOWN_NAME,UNUSED_SHOWN_NAME
-import 'dart:core' show int, dynamic, String, List, Map;
-import 'package:protobuf/protobuf.dart';
-
-class PayloadType extends ProtobufEnum {
- static const PayloadType COMPRESSABLE =
- const PayloadType._(0, 'COMPRESSABLE');
-
- static const List<PayloadType> values = const <PayloadType>[
- COMPRESSABLE,
- ];
-
- static final Map<int, dynamic> _byValue = ProtobufEnum.initByValue(values);
- static PayloadType valueOf(int value) => _byValue[value] as PayloadType;
- static void $checkItem(PayloadType v) {
- if (v is! PayloadType) checkItemFailed(v, 'PayloadType');
- }
-
- const PayloadType._(int v, String n) : super(v, n);
-}
diff --git a/grpc/interop/lib/src/generated/test.pb.dart b/grpc/interop/lib/src/generated/test.pb.dart
deleted file mode 100644
index d64b754..0000000
--- a/grpc/interop/lib/src/generated/test.pb.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc.testing_test;
-
-// ignore: UNUSED_SHOWN_NAME
-import 'dart:core' show int, bool, double, String, List, override;
diff --git a/grpc/interop/lib/src/generated/test.pbgrpc.dart b/grpc/interop/lib/src/generated/test.pbgrpc.dart
deleted file mode 100644
index f7ba4db..0000000
--- a/grpc/interop/lib/src/generated/test.pbgrpc.dart
+++ /dev/null
@@ -1,307 +0,0 @@
-///
-// Generated code. Do not modify.
-///
-// ignore_for_file: non_constant_identifier_names,library_prefixes
-library grpc.testing_test_pbgrpc;
-
-import 'dart:async';
-
-import 'package:grpc/grpc.dart';
-
-import 'empty.pb.dart';
-import 'messages.pb.dart';
-export 'test.pb.dart';
-
-class TestServiceClient extends Client {
- static final _$emptyCall = new ClientMethod<Empty, Empty>(
- '/grpc.testing.TestService/EmptyCall',
- (Empty value) => value.writeToBuffer(),
- (List<int> value) => new Empty.fromBuffer(value));
- static final _$unaryCall = new ClientMethod<SimpleRequest, SimpleResponse>(
- '/grpc.testing.TestService/UnaryCall',
- (SimpleRequest value) => value.writeToBuffer(),
- (List<int> value) => new SimpleResponse.fromBuffer(value));
- static final _$cacheableUnaryCall =
- new ClientMethod<SimpleRequest, SimpleResponse>(
- '/grpc.testing.TestService/CacheableUnaryCall',
- (SimpleRequest value) => value.writeToBuffer(),
- (List<int> value) => new SimpleResponse.fromBuffer(value));
- static final _$streamingOutputCall =
- new ClientMethod<StreamingOutputCallRequest, StreamingOutputCallResponse>(
- '/grpc.testing.TestService/StreamingOutputCall',
- (StreamingOutputCallRequest value) => value.writeToBuffer(),
- (List<int> value) =>
- new StreamingOutputCallResponse.fromBuffer(value));
- static final _$streamingInputCall =
- new ClientMethod<StreamingInputCallRequest, StreamingInputCallResponse>(
- '/grpc.testing.TestService/StreamingInputCall',
- (StreamingInputCallRequest value) => value.writeToBuffer(),
- (List<int> value) =>
- new StreamingInputCallResponse.fromBuffer(value));
- static final _$fullDuplexCall =
- new ClientMethod<StreamingOutputCallRequest, StreamingOutputCallResponse>(
- '/grpc.testing.TestService/FullDuplexCall',
- (StreamingOutputCallRequest value) => value.writeToBuffer(),
- (List<int> value) =>
- new StreamingOutputCallResponse.fromBuffer(value));
- static final _$halfDuplexCall =
- new ClientMethod<StreamingOutputCallRequest, StreamingOutputCallResponse>(
- '/grpc.testing.TestService/HalfDuplexCall',
- (StreamingOutputCallRequest value) => value.writeToBuffer(),
- (List<int> value) =>
- new StreamingOutputCallResponse.fromBuffer(value));
- static final _$unimplementedCall = new ClientMethod<Empty, Empty>(
- '/grpc.testing.TestService/UnimplementedCall',
- (Empty value) => value.writeToBuffer(),
- (List<int> value) => new Empty.fromBuffer(value));
-
- TestServiceClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<Empty> emptyCall(Empty request, {CallOptions options}) {
- final call = $createCall(_$emptyCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<SimpleResponse> unaryCall(SimpleRequest request,
- {CallOptions options}) {
- final call = $createCall(_$unaryCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<SimpleResponse> cacheableUnaryCall(SimpleRequest request,
- {CallOptions options}) {
- final call = $createCall(
- _$cacheableUnaryCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseStream<StreamingOutputCallResponse> streamingOutputCall(
- StreamingOutputCallRequest request,
- {CallOptions options}) {
- final call = $createCall(
- _$streamingOutputCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseStream(call);
- }
-
- ResponseFuture<StreamingInputCallResponse> streamingInputCall(
- Stream<StreamingInputCallRequest> request,
- {CallOptions options}) {
- final call = $createCall(_$streamingInputCall, request, options: options);
- return new ResponseFuture(call);
- }
-
- ResponseStream<StreamingOutputCallResponse> fullDuplexCall(
- Stream<StreamingOutputCallRequest> request,
- {CallOptions options}) {
- final call = $createCall(_$fullDuplexCall, request, options: options);
- return new ResponseStream(call);
- }
-
- ResponseStream<StreamingOutputCallResponse> halfDuplexCall(
- Stream<StreamingOutputCallRequest> request,
- {CallOptions options}) {
- final call = $createCall(_$halfDuplexCall, request, options: options);
- return new ResponseStream(call);
- }
-
- ResponseFuture<Empty> unimplementedCall(Empty request,
- {CallOptions options}) {
- final call = $createCall(
- _$unimplementedCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-}
-
-abstract class TestServiceBase extends Service {
- String get $name => 'grpc.testing.TestService';
-
- TestServiceBase() {
- $addMethod(new ServiceMethod<Empty, Empty>(
- 'EmptyCall',
- emptyCall_Pre,
- false,
- false,
- (List<int> value) => new Empty.fromBuffer(value),
- (Empty value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<SimpleRequest, SimpleResponse>(
- 'UnaryCall',
- unaryCall_Pre,
- false,
- false,
- (List<int> value) => new SimpleRequest.fromBuffer(value),
- (SimpleResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<SimpleRequest, SimpleResponse>(
- 'CacheableUnaryCall',
- cacheableUnaryCall_Pre,
- false,
- false,
- (List<int> value) => new SimpleRequest.fromBuffer(value),
- (SimpleResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<StreamingOutputCallRequest,
- StreamingOutputCallResponse>(
- 'StreamingOutputCall',
- streamingOutputCall_Pre,
- false,
- true,
- (List<int> value) => new StreamingOutputCallRequest.fromBuffer(value),
- (StreamingOutputCallResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<StreamingInputCallRequest,
- StreamingInputCallResponse>(
- 'StreamingInputCall',
- streamingInputCall,
- true,
- false,
- (List<int> value) => new StreamingInputCallRequest.fromBuffer(value),
- (StreamingInputCallResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<StreamingOutputCallRequest,
- StreamingOutputCallResponse>(
- 'FullDuplexCall',
- fullDuplexCall,
- true,
- true,
- (List<int> value) => new StreamingOutputCallRequest.fromBuffer(value),
- (StreamingOutputCallResponse value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<StreamingOutputCallRequest,
- StreamingOutputCallResponse>(
- 'HalfDuplexCall',
- halfDuplexCall,
- true,
- true,
- (List<int> value) => new StreamingOutputCallRequest.fromBuffer(value),
- (StreamingOutputCallResponse value) => value.writeToBuffer()));
- }
-
- Future<Empty> emptyCall_Pre(ServiceCall call, Future request) async {
- return emptyCall(call, await request);
- }
-
- Future<SimpleResponse> unaryCall_Pre(ServiceCall call, Future request) async {
- return unaryCall(call, await request);
- }
-
- Future<SimpleResponse> cacheableUnaryCall_Pre(
- ServiceCall call, Future request) async {
- return cacheableUnaryCall(call, await request);
- }
-
- Stream<StreamingOutputCallResponse> streamingOutputCall_Pre(
- ServiceCall call, Future request) async* {
- yield* streamingOutputCall(
- call, (await request) as StreamingOutputCallRequest);
- }
-
- Future<Empty> emptyCall(ServiceCall call, Empty request);
- Future<SimpleResponse> unaryCall(ServiceCall call, SimpleRequest request);
- Future<SimpleResponse> cacheableUnaryCall(
- ServiceCall call, SimpleRequest request);
- Stream<StreamingOutputCallResponse> streamingOutputCall(
- ServiceCall call, StreamingOutputCallRequest request);
- Future<StreamingInputCallResponse> streamingInputCall(
- ServiceCall call, Stream<StreamingInputCallRequest> request);
- Stream<StreamingOutputCallResponse> fullDuplexCall(
- ServiceCall call, Stream<StreamingOutputCallRequest> request);
- Stream<StreamingOutputCallResponse> halfDuplexCall(
- ServiceCall call, Stream<StreamingOutputCallRequest> request);
-}
-
-class UnimplementedServiceClient extends Client {
- static final _$unimplementedCall = new ClientMethod<Empty, Empty>(
- '/grpc.testing.UnimplementedService/UnimplementedCall',
- (Empty value) => value.writeToBuffer(),
- (List<int> value) => new Empty.fromBuffer(value));
-
- UnimplementedServiceClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<Empty> unimplementedCall(Empty request,
- {CallOptions options}) {
- final call = $createCall(
- _$unimplementedCall, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-}
-
-abstract class UnimplementedServiceBase extends Service {
- String get $name => 'grpc.testing.UnimplementedService';
-
- UnimplementedServiceBase() {
- $addMethod(new ServiceMethod<Empty, Empty>(
- 'UnimplementedCall',
- unimplementedCall_Pre,
- false,
- false,
- (List<int> value) => new Empty.fromBuffer(value),
- (Empty value) => value.writeToBuffer()));
- }
-
- Future<Empty> unimplementedCall_Pre(ServiceCall call, Future request) async {
- return unimplementedCall(call, await request);
- }
-
- Future<Empty> unimplementedCall(ServiceCall call, Empty request);
-}
-
-class ReconnectServiceClient extends Client {
- static final _$start = new ClientMethod<ReconnectParams, Empty>(
- '/grpc.testing.ReconnectService/Start',
- (ReconnectParams value) => value.writeToBuffer(),
- (List<int> value) => new Empty.fromBuffer(value));
- static final _$stop = new ClientMethod<Empty, ReconnectInfo>(
- '/grpc.testing.ReconnectService/Stop',
- (Empty value) => value.writeToBuffer(),
- (List<int> value) => new ReconnectInfo.fromBuffer(value));
-
- ReconnectServiceClient(ClientChannel channel, {CallOptions options})
- : super(channel, options: options);
-
- ResponseFuture<Empty> start(ReconnectParams request, {CallOptions options}) {
- final call = $createCall(_$start, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-
- ResponseFuture<ReconnectInfo> stop(Empty request, {CallOptions options}) {
- final call = $createCall(_$stop, new Stream.fromIterable([request]),
- options: options);
- return new ResponseFuture(call);
- }
-}
-
-abstract class ReconnectServiceBase extends Service {
- String get $name => 'grpc.testing.ReconnectService';
-
- ReconnectServiceBase() {
- $addMethod(new ServiceMethod<ReconnectParams, Empty>(
- 'Start',
- start_Pre,
- false,
- false,
- (List<int> value) => new ReconnectParams.fromBuffer(value),
- (Empty value) => value.writeToBuffer()));
- $addMethod(new ServiceMethod<Empty, ReconnectInfo>(
- 'Stop',
- stop_Pre,
- false,
- false,
- (List<int> value) => new Empty.fromBuffer(value),
- (ReconnectInfo value) => value.writeToBuffer()));
- }
-
- Future<Empty> start_Pre(ServiceCall call, Future request) async {
- return start(call, await request);
- }
-
- Future<ReconnectInfo> stop_Pre(ServiceCall call, Future request) async {
- return stop(call, await request);
- }
-
- Future<Empty> start(ServiceCall call, ReconnectParams request);
- Future<ReconnectInfo> stop(ServiceCall call, Empty request);
-}
diff --git a/grpc/interop/protos/empty.proto b/grpc/interop/protos/empty.proto
deleted file mode 100644
index 6d0eb93..0000000
--- a/grpc/interop/protos/empty.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-
-// Copyright 2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// An empty message that you can re-use to avoid defining duplicated empty
-// messages in your project. A typical example is to use it as argument or the
-// return value of a service API. For instance:
-//
-// service Foo {
-// rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
-// };
-//
-message Empty {}
diff --git a/grpc/interop/protos/messages.proto b/grpc/interop/protos/messages.proto
deleted file mode 100644
index a14922a..0000000
--- a/grpc/interop/protos/messages.proto
+++ /dev/null
@@ -1,184 +0,0 @@
-
-// Copyright 2015-2016, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Message definitions to be used by integration test service definitions.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// TODO(dgq): Go back to using well-known types once
-// https://github.com/grpc/grpc/issues/6980 has been fixed.
-// import "google/protobuf/wrappers.proto";
-message BoolValue {
- // The bool value.
- bool value = 1;
-}
-
-// DEPRECATED, don't use. To be removed shortly.
-// The type of payload that should be returned.
-enum PayloadType {
- // Compressable text format.
- COMPRESSABLE = 0;
-}
-
-// A block of data, to simply increase gRPC message size.
-message Payload {
- // DEPRECATED, don't use. To be removed shortly.
- // The type of data in body.
- PayloadType type = 1;
- // Primary contents of payload.
- bytes body = 2;
-}
-
-// A protobuf representation for grpc status. This is used by test
-// clients to specify a status that the server should attempt to return.
-message EchoStatus {
- int32 code = 1;
- string message = 2;
-}
-
-// Unary request.
-message SimpleRequest {
- // DEPRECATED, don't use. To be removed shortly.
- // Desired payload type in the response from the server.
- // If response_type is RANDOM, server randomly chooses one from other formats.
- PayloadType response_type = 1;
-
- // Desired payload size in the response from the server.
- int32 response_size = 2;
-
- // Optional input payload sent along with the request.
- Payload payload = 3;
-
- // Whether SimpleResponse should include username.
- bool fill_username = 4;
-
- // Whether SimpleResponse should include OAuth scope.
- bool fill_oauth_scope = 5;
-
- // Whether to request the server to compress the response. This field is
- // "nullable" in order to interoperate seamlessly with clients not able to
- // implement the full compression tests by introspecting the call to verify
- // the response's compression status.
- BoolValue response_compressed = 6;
-
- // Whether server should return a given status
- EchoStatus response_status = 7;
-
- // Whether the server should expect this request to be compressed.
- BoolValue expect_compressed = 8;
-}
-
-// Unary response, as configured by the request.
-message SimpleResponse {
- // Payload to increase message size.
- Payload payload = 1;
- // The user the request came from, for verifying authentication was
- // successful when the client expected it.
- string username = 2;
- // OAuth scope.
- string oauth_scope = 3;
-}
-
-// Client-streaming request.
-message StreamingInputCallRequest {
- // Optional input payload sent along with the request.
- Payload payload = 1;
-
- // Whether the server should expect this request to be compressed. This field
- // is "nullable" in order to interoperate seamlessly with servers not able to
- // implement the full compression tests by introspecting the call to verify
- // the request's compression status.
- BoolValue expect_compressed = 2;
-
- // Not expecting any payload from the response.
-}
-
-// Client-streaming response.
-message StreamingInputCallResponse {
- // Aggregated size of payloads received from the client.
- int32 aggregated_payload_size = 1;
-}
-
-// Configuration for a particular response.
-message ResponseParameters {
- // Desired payload sizes in responses from the server.
- int32 size = 1;
-
- // Desired interval between consecutive responses in the response stream in
- // microseconds.
- int32 interval_us = 2;
-
- // Whether to request the server to compress the response. This field is
- // "nullable" in order to interoperate seamlessly with clients not able to
- // implement the full compression tests by introspecting the call to verify
- // the response's compression status.
- BoolValue compressed = 3;
-}
-
-// Server-streaming request.
-message StreamingOutputCallRequest {
- // DEPRECATED, don't use. To be removed shortly.
- // Desired payload type in the response from the server.
- // If response_type is RANDOM, the payload from each response in the stream
- // might be of different types. This is to simulate a mixed type of payload
- // stream.
- PayloadType response_type = 1;
-
- // Configuration for each expected response message.
- repeated ResponseParameters response_parameters = 2;
-
- // Optional input payload sent along with the request.
- Payload payload = 3;
-
- // Whether server should return a given status.
- EchoStatus response_status = 7;
-}
-
-// Server-streaming response, as configured by the request and parameters.
-message StreamingOutputCallResponse {
- // Payload to increase response size.
- Payload payload = 1;
-}
-
-// For reconnect interop test only.
-// Client tells server what reconnection parameters it used.
-message ReconnectParams {
- int32 max_reconnect_backoff_ms = 1;
-}
-
-// For reconnect interop test only.
-// Server tells client whether its reconnects are following the spec and the
-// reconnect backoffs it saw.
-message ReconnectInfo {
- bool passed = 1;
- repeated int32 backoff_ms = 2;
-}
diff --git a/grpc/interop/protos/test.proto b/grpc/interop/protos/test.proto
deleted file mode 100644
index 202276b..0000000
--- a/grpc/interop/protos/test.proto
+++ /dev/null
@@ -1,94 +0,0 @@
-
-// Copyright 2015-2016, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// An integration test service that covers all the method signature permutations
-// of unary/streaming requests/responses.
-
-syntax = "proto3";
-
-import "empty.proto";
-import "messages.proto";
-
-package grpc.testing;
-
-// A simple service to test the various types of RPCs and experiment with
-// performance with various types of payload.
-service TestService {
- // One empty request followed by one empty response.
- rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-
- // One request followed by one response.
- rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
- // One request followed by one response. Response has cache control
- // headers set such that a caching HTTP proxy (such as GFE) can
- // satisfy subsequent requests.
- rpc CacheableUnaryCall(SimpleRequest) returns (SimpleResponse);
-
- // One request followed by a sequence of responses (streamed download).
- // The server returns the payload with client desired type and sizes.
- rpc StreamingOutputCall(StreamingOutputCallRequest)
- returns (stream StreamingOutputCallResponse);
-
- // A sequence of requests followed by one response (streamed upload).
- // The server returns the aggregated size of client payload as the result.
- rpc StreamingInputCall(stream StreamingInputCallRequest)
- returns (StreamingInputCallResponse);
-
- // A sequence of requests with each request served by the server immediately.
- // As one request could lead to multiple responses, this interface
- // demonstrates the idea of full duplexing.
- rpc FullDuplexCall(stream StreamingOutputCallRequest)
- returns (stream StreamingOutputCallResponse);
-
- // A sequence of requests followed by a sequence of responses.
- // The server buffers all the client requests and then serves them in order. A
- // stream of responses are returned to the client when the server starts with
- // first request.
- rpc HalfDuplexCall(stream StreamingOutputCallRequest)
- returns (stream StreamingOutputCallResponse);
-
- // The test server will not implement this method. It will be used
- // to test the behavior when clients call unimplemented methods.
- rpc UnimplementedCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-}
-
-// A simple service NOT implemented at servers so clients can test for
-// that case.
-service UnimplementedService {
- // A call that no server should implement
- rpc UnimplementedCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-}
-
-// A service used to control reconnect server.
-service ReconnectService {
- rpc Start(grpc.testing.ReconnectParams) returns (grpc.testing.Empty);
- rpc Stop(grpc.testing.Empty) returns (grpc.testing.ReconnectInfo);
-}
diff --git a/grpc/interop/pubspec.yaml b/grpc/interop/pubspec.yaml
deleted file mode 100644
index 9432b81..0000000
--- a/grpc/interop/pubspec.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: interop
-description: Dart gRPC interoperability test suite.
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- args: ^1.5.0
- async: '>=1.13.3 <3.0.0'
- collection: ^1.14.2
- grpc:
- path: ../
- protobuf: ^0.10.1
-
-dev_dependencies:
- test: ^1.3.0
diff --git a/grpc/interop/server1.key b/grpc/interop/server1.key
deleted file mode 100644
index 143a5b8..0000000
--- a/grpc/interop/server1.key
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD
-M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf
-3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY
-AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm
-V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY
-tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p
-dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q
-K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR
-81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff
-DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd
-aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2
-ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3
-XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe
-F98XJ7tIFfJq
------END PRIVATE KEY-----
diff --git a/grpc/interop/server1.pem b/grpc/interop/server1.pem
deleted file mode 100644
index f3d43fc..0000000
--- a/grpc/interop/server1.pem
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET
-MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ
-dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx
-MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV
-BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50
-ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco
-LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg
-zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd
-9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw
-CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy
-em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G
-CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6
-hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh
-y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8
------END CERTIFICATE-----
diff --git a/grpc/interop/tool/regenerate.sh b/grpc/interop/tool/regenerate.sh
deleted file mode 100755
index 066a0f9..0000000
--- a/grpc/interop/tool/regenerate.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-mkdir -p lib/src/generated
-protoc --dart_out=grpc:lib/src/generated -Iprotos/ protos/*.proto
-rm lib/src/generated/*.pbjson.dart
-rm lib/src/generated/{empty,test}.pbenum.dart
-dartfmt -w lib/src/generated
diff --git a/grpc/lib/grpc.dart b/grpc/lib/grpc.dart
deleted file mode 100644
index 07bdb25..0000000
--- a/grpc/lib/grpc.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-export 'src/auth/auth.dart';
-
-export 'src/client/call.dart';
-export 'src/client/channel.dart';
-export 'src/client/client.dart';
-export 'src/client/common.dart';
-export 'src/client/connection.dart';
-export 'src/client/method.dart';
-export 'src/client/options.dart';
-
-export 'src/server/call.dart';
-export 'src/server/handler.dart' show ServerHandler;
-export 'src/server/interceptor.dart';
-export 'src/server/server.dart';
-export 'src/server/service.dart';
-
-export 'src/shared/security.dart';
-export 'src/shared/status.dart';
-export 'src/shared/streams.dart';
-export 'src/shared/timeout.dart';
diff --git a/grpc/lib/service_api.dart b/grpc/lib/service_api.dart
deleted file mode 100644
index 54a455a..0000000
--- a/grpc/lib/service_api.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2019, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Exports the minimum api to define server and client stubs.
-///
-/// Mainly intended to be imported by generated code.
-library service_api;
-
-export 'src/client/channel.dart' show ClientChannel;
-export 'src/client/client.dart' show Client;
-export 'src/client/common.dart' show ResponseFuture, ResponseStream;
-export 'src/client/method.dart' show ClientMethod;
-export 'src/client/options.dart' show CallOptions;
-export 'src/server/call.dart' show ServiceCall;
-export 'src/server/server.dart' show Server;
-export 'src/server/service.dart' show Service, ServiceMethod;
diff --git a/grpc/lib/src/auth/auth.dart b/grpc/lib/src/auth/auth.dart
deleted file mode 100644
index 27aa57d..0000000
--- a/grpc/lib/src/auth/auth.dart
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (c) 2018, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:googleapis_auth/auth_io.dart' as auth;
-import 'package:googleapis_auth/src/crypto/rsa_sign.dart';
-import 'package:grpc/src/shared/status.dart';
-import 'package:http/http.dart' as http;
-
-import '../client/options.dart';
-
-const _tokenExpirationThreshold = const Duration(seconds: 30);
-
-abstract class BaseAuthenticator {
- auth.AccessToken _accessToken;
- String _lastUri;
-
- Future<void> authenticate(Map<String, String> metadata, String uri) async {
- if (uri == null) {
- throw new GrpcError.unauthenticated(
- 'Credentials require secure transport.');
- }
- if (_accessToken == null || _accessToken.hasExpired || uri != _lastUri) {
- await obtainAccessCredentials(uri);
- _lastUri = uri;
- }
-
- final auth = '${_accessToken.type} ${_accessToken.data}';
- metadata['authorization'] = auth;
-
- if (_tokenExpiresSoon) {
- // Token is about to expire. Extend it prematurely.
- obtainAccessCredentials(_lastUri).catchError((_) {});
- }
- }
-
- bool get _tokenExpiresSoon => _accessToken.expiry
- .subtract(_tokenExpirationThreshold)
- .isBefore(new DateTime.now().toUtc());
-
- CallOptions get toCallOptions => new CallOptions(providers: [authenticate]);
-
- Future<void> obtainAccessCredentials(String uri);
-}
-
-abstract class HttpBasedAuthenticator extends BaseAuthenticator {
- Future<void> _call;
-
- Future<void> obtainAccessCredentials(String uri) {
- if (_call == null) {
- final authClient = new http.Client();
- _call = obtainCredentialsWithClient(authClient, uri).then((credentials) {
- _accessToken = credentials.accessToken;
- _call = null;
- authClient.close();
- });
- }
- return _call;
- }
-
- Future<auth.AccessCredentials> obtainCredentialsWithClient(
- http.Client client, String uri);
-}
-
-class ComputeEngineAuthenticator extends HttpBasedAuthenticator {
- Future<auth.AccessCredentials> obtainCredentialsWithClient(
- http.Client client, String uri) =>
- auth.obtainAccessCredentialsViaMetadataServer(client);
-}
-
-class ServiceAccountAuthenticator extends HttpBasedAuthenticator {
- auth.ServiceAccountCredentials _serviceAccountCredentials;
- final List<String> _scopes;
- String _projectId;
-
- ServiceAccountAuthenticator(String serviceAccountJson, this._scopes) {
- final serviceAccount = jsonDecode(serviceAccountJson);
- _serviceAccountCredentials =
- new auth.ServiceAccountCredentials.fromJson(serviceAccount);
- _projectId = serviceAccount['project_id'];
- }
-
- String get projectId => _projectId;
-
- Future<auth.AccessCredentials> obtainCredentialsWithClient(
- http.Client client, String uri) =>
- auth.obtainAccessCredentialsViaServiceAccount(
- _serviceAccountCredentials, _scopes, client);
-}
-
-class JwtServiceAccountAuthenticator extends BaseAuthenticator {
- auth.ServiceAccountCredentials _serviceAccountCredentials;
- String _projectId;
- String _keyId;
-
- JwtServiceAccountAuthenticator(String serviceAccountJson) {
- final serviceAccount = jsonDecode(serviceAccountJson);
- _serviceAccountCredentials =
- new auth.ServiceAccountCredentials.fromJson(serviceAccount);
- _projectId = serviceAccount['project_id'];
- _keyId = serviceAccount['private_key_id'];
- }
-
- String get projectId => _projectId;
-
- Future<void> obtainAccessCredentials(String uri) async {
- _accessToken = _jwtTokenFor(_serviceAccountCredentials, _keyId, uri);
- }
-}
-
-// TODO(jakobr): Expose in googleapis_auth.
-auth.AccessToken _jwtTokenFor(
- auth.ServiceAccountCredentials credentials, String keyId, String uri,
- {String user, List<String> scopes}) {
- // Subtracting 20 seconds from current timestamp to allow for clock skew among
- // servers.
- final timestamp =
- (new DateTime.now().toUtc().millisecondsSinceEpoch ~/ 1000) - 20;
- final expiry = timestamp + 3600;
-
- final header = <String, String>{'alg': 'RS256', 'typ': 'JWT'};
- if (keyId != null) {
- header['kid'] = keyId;
- }
-
- final claims = <String, dynamic>{
- 'iss': credentials.email,
- 'aud': uri,
- 'exp': expiry,
- 'iat': timestamp,
- 'sub': user ?? credentials.email
- };
- if (scopes != null) {
- claims['scope'] = scopes.join(' ');
- }
-
- final headerBase64 = _base64url(ascii.encode(jsonEncode(header)));
- final claimsBase64 = _base64url(utf8.encode(jsonEncode(claims)));
-
- final data = '$headerBase64.$claimsBase64';
-
- final signer = new RS256Signer(credentials.privateRSAKey);
- final signature = signer.sign(ascii.encode(data));
-
- final jwt = '$data.${_base64url(signature)}';
-
- return new auth.AccessToken('Bearer', jwt,
- new DateTime.fromMillisecondsSinceEpoch(expiry * 1000, isUtc: true));
-}
-
-String _base64url(List<int> bytes) {
- return base64Url.encode(bytes).replaceAll('=', '');
-}
diff --git a/grpc/lib/src/client/call.dart b/grpc/lib/src/client/call.dart
deleted file mode 100644
index b1c890f..0000000
--- a/grpc/lib/src/client/call.dart
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:http2/transport.dart';
-
-import '../shared/status.dart';
-import '../shared/streams.dart';
-
-import 'common.dart';
-import 'connection.dart';
-import 'method.dart';
-import 'options.dart';
-
-const _reservedHeaders = const [
- 'content-type',
- 'te',
- 'grpc-timeout',
- 'grpc-accept-encoding',
- 'user-agent',
-];
-
-/// An active call to a gRPC endpoint.
-class ClientCall<Q, R> implements Response {
- final ClientMethod<Q, R> _method;
- final Stream<Q> _requests;
- final CallOptions options;
-
- final _headers = new Completer<Map<String, String>>();
- final _trailers = new Completer<Map<String, String>>();
- bool _hasReceivedResponses = false;
-
- Map<String, String> _headerMetadata;
-
- TransportStream _stream;
- StreamController<R> _responses;
- StreamSubscription<StreamMessage> _requestSubscription;
- StreamSubscription<GrpcMessage> _responseSubscription;
-
- bool isCancelled = false;
- Timer _timeoutTimer;
-
- ClientCall(this._method, this._requests, this.options) {
- _responses = new StreamController(onListen: _onResponseListen);
- if (options.timeout != null) {
- _timeoutTimer = new Timer(options.timeout, _onTimedOut);
- }
- }
-
- String get path => _method.path;
-
- void onConnectionError(error) {
- _terminateWithError(new GrpcError.unavailable('Error connecting: $error'));
- }
-
- void _terminateWithError(GrpcError error) {
- if (!_responses.isClosed) {
- _responses.addError(error);
- }
- _safeTerminate();
- }
-
- static Map<String, String> _sanitizeMetadata(Map<String, String> metadata) {
- final sanitizedMetadata = <String, String>{};
- metadata.forEach((String key, String value) {
- final lowerCaseKey = key.trim().toLowerCase();
- if (!lowerCaseKey.startsWith(':') &&
- !_reservedHeaders.contains(lowerCaseKey)) {
- sanitizedMetadata[lowerCaseKey] = value.trim();
- }
- });
- return sanitizedMetadata;
- }
-
- void onConnectionReady(ClientConnection connection) {
- if (isCancelled) return;
-
- if (options.metadataProviders.isEmpty) {
- _sendRequest(connection, _sanitizeMetadata(options.metadata));
- } else {
- final metadata = new Map<String, String>.from(options.metadata);
- String audience;
- if (connection.options.credentials.isSecure) {
- final port = connection.port != 443 ? ':${connection.port}' : '';
- final lastSlashPos = path.lastIndexOf('/');
- final audiencePath =
- lastSlashPos == -1 ? path : path.substring(0, lastSlashPos);
- audience = 'https://${connection.authority}$port$audiencePath';
- }
- Future.forEach(options.metadataProviders,
- (provider) => provider(metadata, audience))
- .then((_) => _sendRequest(connection, _sanitizeMetadata(metadata)))
- .catchError(_onMetadataProviderError);
- }
- }
-
- void _onMetadataProviderError(error) {
- _terminateWithError(new GrpcError.internal('Error making call: $error'));
- }
-
- void _sendRequest(ClientConnection connection, Map<String, String> metadata) {
- try {
- _stream = connection.makeRequest(path, options.timeout, metadata);
- } catch (e) {
- _terminateWithError(new GrpcError.unavailable('Error making call: $e'));
- return;
- }
- _requestSubscription = _requests
- .map(_method.requestSerializer)
- .map(GrpcHttpEncoder.frame)
- .map<StreamMessage>((bytes) => new DataStreamMessage(bytes))
- .handleError(_onRequestError)
- .listen(_stream.outgoingMessages.add,
- onError: _stream.outgoingMessages.addError,
- onDone: _stream.outgoingMessages.close,
- cancelOnError: true);
- // The response stream might have been listened to before _stream was ready,
- // so try setting up the subscription here as well.
- _onResponseListen();
- }
-
- void _onTimedOut() {
- _responses.addError(new GrpcError.deadlineExceeded('Deadline exceeded'));
- _safeTerminate();
- }
-
- /// Subscribe to incoming response messages, once [_stream] is available, and
- /// the caller has subscribed to the [_responses] stream.
- void _onResponseListen() {
- if (_stream != null &&
- _responses.hasListener &&
- _responseSubscription == null) {
- _responseSubscription = _stream.incomingMessages
- .transform(new GrpcHttpDecoder())
- .transform(grpcDecompressor())
- .listen(_onResponseData,
- onError: _onResponseError,
- onDone: _onResponseDone,
- cancelOnError: true);
- if (_responses.isPaused) {
- _responseSubscription.pause();
- }
- _responses.onPause = _responseSubscription.pause;
- _responses.onResume = _responseSubscription.resume;
- _responses.onCancel = _responseSubscription.cancel;
- }
- }
-
- /// Emit an error response to the user, and tear down this call.
- void _responseError(GrpcError error) {
- _responses.addError(error);
- _timeoutTimer?.cancel();
- _requestSubscription?.cancel();
- _responseSubscription.cancel();
- _responses.close();
- _stream.terminate();
- }
-
- /// Data handler for responses coming from the server. Handles header/trailer
- /// metadata, and forwards response objects to [_responses].
- void _onResponseData(GrpcMessage data) {
- if (data is GrpcData) {
- if (!_headers.isCompleted) {
- _responseError(
- new GrpcError.unimplemented('Received data before headers'));
- return;
- }
- if (_trailers.isCompleted) {
- _responseError(
- new GrpcError.unimplemented('Received data after trailers'));
- return;
- }
- _responses.add(_method.responseDeserializer(data.data));
- _hasReceivedResponses = true;
- } else if (data is GrpcMetadata) {
- if (!_headers.isCompleted) {
- // TODO(jakobr): Parse, and extract common headers.
- _headerMetadata = data.metadata;
- _headers.complete(_headerMetadata);
- return;
- }
- if (_trailers.isCompleted) {
- _responseError(
- new GrpcError.unimplemented('Received multiple trailers'));
- return;
- }
- final metadata = data.metadata;
- _trailers.complete(metadata);
- // TODO(jakobr): Parse more!
- if (metadata.containsKey('grpc-status')) {
- final status = int.parse(metadata['grpc-status']);
- final message = metadata['grpc-message'];
- if (status != 0) {
- _responseError(new GrpcError.custom(status, message));
- }
- }
- } else {
- _responseError(new GrpcError.unimplemented('Unexpected frame received'));
- }
- }
-
- /// Handler for response errors. Forward the error to the [_responses] stream,
- /// wrapped if necessary.
- void _onResponseError(error) {
- if (error is GrpcError) {
- _responseError(error);
- return;
- }
- _responseError(new GrpcError.unknown(error.toString()));
- }
-
- /// Handles closure of the response stream. Verifies that server has sent
- /// response messages and header/trailer metadata, as necessary.
- void _onResponseDone() {
- if (!_headers.isCompleted) {
- _responseError(new GrpcError.unavailable('Did not receive anything'));
- return;
- }
- if (!_trailers.isCompleted) {
- if (_hasReceivedResponses) {
- // Trailers are required after receiving data.
- _responseError(new GrpcError.unavailable('Missing trailers'));
- return;
- }
-
- // Only received a header frame and no data frames, so the header
- // should contain "trailers" as well (Trailers-Only).
- _trailers.complete(_headerMetadata);
- final status = _headerMetadata['grpc-status'];
- // If status code is missing, we must treat it as '0'. As in 'success'.
- final statusCode = status != null ? int.parse(status) : 0;
- if (statusCode != 0) {
- final message = _headerMetadata['grpc-message'];
- _responseError(new GrpcError.custom(statusCode, message));
- }
- }
- _timeoutTimer?.cancel();
- _responses.close();
- _responseSubscription.cancel();
- }
-
- /// Error handler for the requests stream. Something went wrong while trying
- /// to send the request to the server. Abort the request, and forward the
- /// error to the user code on the [_responses] stream.
- void _onRequestError(error) {
- if (error is! GrpcError) {
- error = new GrpcError.unknown(error.toString());
- }
-
- _responses.addError(error);
- _timeoutTimer?.cancel();
- _responses.close();
- _requestSubscription?.cancel();
- _responseSubscription?.cancel();
- _stream.terminate();
- }
-
- Stream<R> get response => _responses.stream;
-
- @override
- Future<Map<String, String>> get headers => _headers.future;
-
- @override
- Future<Map<String, String>> get trailers => _trailers.future;
-
- @override
- Future<void> cancel() {
- if (!_responses.isClosed) {
- _responses.addError(new GrpcError.cancelled('Cancelled by client.'));
- }
- return _terminate();
- }
-
- Future<void> _terminate() async {
- isCancelled = true;
- _timeoutTimer?.cancel();
- // Don't await _responses.close() here. It'll only complete once the done
- // event has been delivered, and it's the caller of this function that is
- // reading from responses as well, so we might end up deadlocked.
- _responses.close();
- _stream?.terminate();
- final futures = <Future>[];
- if (_requestSubscription != null) {
- futures.add(_requestSubscription.cancel());
- }
- if (_responseSubscription != null) {
- futures.add(_responseSubscription.cancel());
- }
- await Future.wait(futures);
- }
-
- Future<void> _safeTerminate() {
- return _terminate().catchError((_) {});
- }
-}
diff --git a/grpc/lib/src/client/channel.dart b/grpc/lib/src/client/channel.dart
deleted file mode 100644
index 68bd22f..0000000
--- a/grpc/lib/src/client/channel.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import '../shared/status.dart';
-
-import 'call.dart';
-import 'connection.dart';
-import 'method.dart';
-import 'options.dart';
-
-/// A channel to a virtual RPC endpoint.
-///
-/// For each RPC, the channel picks a [ClientConnection] to dispatch the call.
-/// RPCs on the same channel may be sent to different connections, depending on
-/// load balancing settings.
-class ClientChannel {
- final String host;
- final int port;
- final ChannelOptions options;
-
- // TODO(jakobr): Multiple connections, load balancing.
- ClientConnection _connection;
-
- bool _isShutdown = false;
-
- ClientChannel(this.host,
- {this.port = 443, this.options = const ChannelOptions()});
-
- /// Shuts down this channel.
- ///
- /// No further RPCs can be made on this channel. RPCs already in progress will
- /// be allowed to complete.
- Future<void> shutdown() async {
- if (_isShutdown) return;
- _isShutdown = true;
- if (_connection != null) await _connection.shutdown();
- }
-
- /// Terminates this channel.
- ///
- /// RPCs already in progress will be terminated. No further RPCs can be made
- /// on this channel.
- Future<void> terminate() async {
- _isShutdown = true;
- if (_connection != null) await _connection.terminate();
- }
-
- /// Returns a connection to this [Channel]'s RPC endpoint.
- ///
- /// The connection may be shared between multiple RPCs.
- Future<ClientConnection> getConnection() async {
- if (_isShutdown) throw new GrpcError.unavailable('Channel shutting down.');
- return _connection ??= new ClientConnection(host, port, options);
- }
-
- /// Initiates a new RPC on this connection.
- ClientCall<Q, R> createCall<Q, R>(
- ClientMethod<Q, R> method, Stream<Q> requests, CallOptions options) {
- final call = new ClientCall(method, requests, options);
- getConnection().then((connection) {
- if (call.isCancelled) return;
- connection.dispatchCall(call);
- }, onError: call.onConnectionError);
- return call;
- }
-}
diff --git a/grpc/lib/src/client/client.dart b/grpc/lib/src/client/client.dart
deleted file mode 100644
index cce6d1c..0000000
--- a/grpc/lib/src/client/client.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'call.dart';
-import 'channel.dart';
-import 'method.dart';
-import 'options.dart';
-
-/// Base class for client stubs.
-class Client {
- final ClientChannel _channel;
- final CallOptions _options;
-
- Client(this._channel, {CallOptions options})
- : _options = options ?? new CallOptions();
-
- ClientCall<Q, R> $createCall<Q, R>(
- ClientMethod<Q, R> method, Stream<Q> requests,
- {CallOptions options}) {
- return _channel.createCall(method, requests, _options.mergedWith(options));
- }
-}
diff --git a/grpc/lib/src/client/common.dart b/grpc/lib/src/client/common.dart
deleted file mode 100644
index 87189a7..0000000
--- a/grpc/lib/src/client/common.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:async/async.dart';
-
-import '../shared/status.dart';
-import 'call.dart';
-
-/// A gRPC response.
-abstract class Response {
- /// Header metadata returned from the server.
- ///
- /// The [headers] future will complete before any response objects become
- /// available. If [cancel] is called before the headers are available, the
- /// returned future will complete with an error.
- Future<Map<String, String>> get headers;
-
- /// Trailer metadata returned from the server.
- ///
- /// The [trailers] future will complete after all responses have been received
- /// from the server. If [cancel] is called before the trailers are available,
- /// the returned future will complete with an error.
- Future<Map<String, String>> get trailers;
-
- /// Cancel this gRPC call. Any remaining request objects will not be sent, and
- /// no further responses will be received.
- Future<void> cancel();
-}
-
-/// A gRPC response producing a single value.
-class ResponseFuture<R> extends DelegatingFuture<R>
- with _ResponseMixin<dynamic, R> {
- final ClientCall<dynamic, R> _call;
-
- static R _ensureOnlyOneResponse<R>(R previous, R element) {
- if (previous != null) {
- throw new GrpcError.unimplemented('More than one response received');
- }
- return element;
- }
-
- static R _ensureOneResponse<R>(R value) {
- if (value == null)
- throw new GrpcError.unimplemented('No responses received');
- return value;
- }
-
- ResponseFuture(this._call)
- : super(_call.response
- .fold(null, _ensureOnlyOneResponse)
- .then(_ensureOneResponse));
-}
-
-/// A gRPC response producing a stream of values.
-class ResponseStream<R> extends DelegatingStream<R>
- with _ResponseMixin<dynamic, R> {
- final ClientCall<dynamic, R> _call;
-
- ResponseStream(this._call) : super(_call.response);
-}
-
-abstract class _ResponseMixin<Q, R> implements Response {
- ClientCall<Q, R> get _call;
-
- @override
- Future<Map<String, String>> get headers => _call.headers;
-
- @override
- Future<Map<String, String>> get trailers => _call.trailers;
-
- @override
- Future<void> cancel() => _call.cancel();
-}
diff --git a/grpc/lib/src/client/connection.dart b/grpc/lib/src/client/connection.dart
deleted file mode 100644
index 371b3c0..0000000
--- a/grpc/lib/src/client/connection.dart
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:http2/transport.dart';
-import 'package:meta/meta.dart';
-
-import '../shared/timeout.dart';
-
-import 'call.dart';
-import 'options.dart';
-
-enum ConnectionState {
- /// Actively trying to connect.
- connecting,
-
- /// Connection successfully established.
- ready,
-
- /// Some transient failure occurred, waiting to re-connect.
- transientFailure,
-
- /// Not currently connected, and no pending RPCs.
- idle,
-
- /// Shutting down, no further RPCs allowed.
- shutdown
-}
-
-/// A connection to a single RPC endpoint.
-///
-/// RPCs made on a connection are always sent to the same endpoint.
-class ClientConnection {
- static final _methodPost = new Header.ascii(':method', 'POST');
- static final _schemeHttp = new Header.ascii(':scheme', 'http');
- static final _schemeHttps = new Header.ascii(':scheme', 'https');
- static final _contentTypeGrpc =
- new Header.ascii('content-type', 'application/grpc');
- static final _teTrailers = new Header.ascii('te', 'trailers');
- static final _grpcAcceptEncoding =
- new Header.ascii('grpc-accept-encoding', 'identity');
-
- final String host;
- final int port;
- final ChannelOptions options;
-
- ConnectionState _state = ConnectionState.idle;
- void Function(ClientConnection connection) onStateChanged;
- final _pendingCalls = <ClientCall>[];
-
- ClientTransportConnection _transport;
-
- /// Used for idle and reconnect timeout, depending on [_state].
- Timer _timer;
- Duration _currentReconnectDelay;
-
- ClientConnection(this.host, this.port, this.options);
-
- ConnectionState get state => _state;
-
- static List<Header> createCallHeaders(bool useTls, String authority,
- String path, Duration timeout, Map<String, String> metadata,
- {String userAgent}) {
- final headers = [
- _methodPost,
- useTls ? _schemeHttps : _schemeHttp,
- new Header(ascii.encode(':path'), utf8.encode(path)),
- new Header(ascii.encode(':authority'), utf8.encode(authority)),
- ];
- if (timeout != null) {
- headers.add(new Header.ascii('grpc-timeout', toTimeoutString(timeout)));
- }
- headers.addAll([
- _contentTypeGrpc,
- _teTrailers,
- _grpcAcceptEncoding,
- new Header.ascii('user-agent', userAgent ?? defaultUserAgent),
- ]);
- metadata?.forEach((key, value) {
- headers.add(new Header(ascii.encode(key), utf8.encode(value)));
- });
- return headers;
- }
-
- String get authority => options.credentials.authority ?? host;
-
- @visibleForTesting
- Future<ClientTransportConnection> connectTransport() async {
- final securityContext = options.credentials.securityContext;
-
- var socket = await Socket.connect(host, port);
- if (_state == ConnectionState.shutdown) {
- socket.destroy();
- throw 'Shutting down';
- }
- if (securityContext != null) {
- socket = await SecureSocket.secure(socket,
- host: authority,
- context: securityContext,
- onBadCertificate: _validateBadCertificate);
- if (_state == ConnectionState.shutdown) {
- socket.destroy();
- throw 'Shutting down';
- }
- }
- socket.done.then(_handleSocketClosed);
- return new ClientTransportConnection.viaSocket(socket);
- }
-
- bool _validateBadCertificate(X509Certificate certificate) {
- final validator = options.credentials.onBadCertificate;
- if (validator == null) return false;
- return validator(certificate, authority);
- }
-
- void _connect() {
- if (_state != ConnectionState.idle &&
- _state != ConnectionState.transientFailure) {
- return;
- }
- _setState(ConnectionState.connecting);
- connectTransport().then((transport) {
- _currentReconnectDelay = null;
- _transport = transport;
- _transport.onActiveStateChanged = _handleActiveStateChanged;
- _setState(ConnectionState.ready);
- _pendingCalls.forEach(_startCall);
- _pendingCalls.clear();
- }).catchError(_handleConnectionFailure);
- }
-
- void dispatchCall(ClientCall call) {
- switch (_state) {
- case ConnectionState.ready:
- _startCall(call);
- break;
- case ConnectionState.shutdown:
- _shutdownCall(call);
- break;
- default:
- _pendingCalls.add(call);
- if (_state == ConnectionState.idle) {
- _connect();
- }
- }
- }
-
- ClientTransportStream makeRequest(
- String path, Duration timeout, Map<String, String> metadata) {
- final headers = createCallHeaders(
- options.credentials.isSecure, authority, path, timeout, metadata,
- userAgent: options.userAgent);
- return _transport.makeRequest(headers);
- }
-
- void _startCall(ClientCall call) {
- if (call.isCancelled) return;
- call.onConnectionReady(this);
- }
-
- void _failCall(ClientCall call, dynamic error) {
- if (call.isCancelled) return;
- call.onConnectionError(error);
- }
-
- void _shutdownCall(ClientCall call) {
- _failCall(call, 'Connection shutting down.');
- }
-
- /// Shuts down this connection.
- ///
- /// No further calls may be made on this connection, but existing calls
- /// are allowed to finish.
- Future<void> shutdown() async {
- if (_state == ConnectionState.shutdown) return null;
- _setShutdownState();
- await _transport?.finish();
- }
-
- /// Terminates this connection.
- ///
- /// All open calls are terminated immediately, and no further calls may be
- /// made on this connection.
- Future<void> terminate() async {
- _setShutdownState();
- await _transport?.terminate();
- }
-
- void _setShutdownState() {
- _setState(ConnectionState.shutdown);
- _cancelTimer();
- _pendingCalls.forEach(_shutdownCall);
- _pendingCalls.clear();
- }
-
- void _setState(ConnectionState state) {
- _state = state;
- if (onStateChanged != null) {
- onStateChanged(this);
- }
- }
-
- void _handleIdleTimeout() {
- if (_timer == null || _state != ConnectionState.ready) return;
- _cancelTimer();
- _transport?.finish()?.catchError((_) => {}); // TODO(jakobr): Log error.
- _transport = null;
- _setState(ConnectionState.idle);
- }
-
- void _cancelTimer() {
- _timer?.cancel();
- _timer = null;
- }
-
- void _handleActiveStateChanged(bool isActive) {
- if (isActive) {
- _cancelTimer();
- } else {
- if (options.idleTimeout != null) {
- _timer ??= new Timer(options.idleTimeout, _handleIdleTimeout);
- }
- }
- }
-
- bool _hasPendingCalls() {
- // Get rid of pending calls that have timed out.
- _pendingCalls.removeWhere((call) => call.isCancelled);
- return _pendingCalls.isNotEmpty;
- }
-
- void _handleConnectionFailure(error) {
- _transport = null;
- if (_state == ConnectionState.shutdown || _state == ConnectionState.idle) {
- return;
- }
- // TODO(jakobr): Log error.
- _cancelTimer();
- _pendingCalls.forEach((call) => _failCall(call, error));
- _pendingCalls.clear();
- _setState(ConnectionState.idle);
- }
-
- void _handleReconnect() {
- if (_timer == null || _state != ConnectionState.transientFailure) return;
- _cancelTimer();
- _connect();
- }
-
- void _handleSocketClosed(_) {
- _cancelTimer();
- _transport = null;
-
- if (_state == ConnectionState.idle && _state == ConnectionState.shutdown) {
- // All good.
- return;
- }
-
- // We were not planning to close the socket.
- if (!_hasPendingCalls()) {
- // No pending calls. Just hop to idle, and wait for a new RPC.
- _setState(ConnectionState.idle);
- return;
- }
-
- // We have pending RPCs. Reconnect after backoff delay.
- _setState(ConnectionState.transientFailure);
- _currentReconnectDelay = options.backoffStrategy(_currentReconnectDelay);
- _timer = new Timer(_currentReconnectDelay, _handleReconnect);
- }
-}
diff --git a/grpc/lib/src/client/method.dart b/grpc/lib/src/client/method.dart
deleted file mode 100644
index dca28eb..0000000
--- a/grpc/lib/src/client/method.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Description of a gRPC method.
-class ClientMethod<Q, R> {
- final String path;
- final List<int> Function(Q value) requestSerializer;
- final R Function(List<int> value) responseDeserializer;
-
- ClientMethod(this.path, this.requestSerializer, this.responseDeserializer);
-}
diff --git a/grpc/lib/src/client/options.dart b/grpc/lib/src/client/options.dart
deleted file mode 100644
index 90e1d94..0000000
--- a/grpc/lib/src/client/options.dart
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'dart:math';
-
-import '../shared/security.dart';
-
-const defaultIdleTimeout = const Duration(minutes: 5);
-const defaultUserAgent = 'dart-grpc/1.0.3';
-
-typedef Duration BackoffStrategy(Duration lastBackoff);
-
-// Backoff algorithm from https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md
-const _minConnectTimeout = const Duration(seconds: 20);
-const _initialBackoff = const Duration(seconds: 1);
-const _maxBackoff = const Duration(seconds: 120);
-const _multiplier = 1.6;
-const _jitter = 0.2;
-final _random = new Random();
-
-Duration defaultBackoffStrategy(Duration lastBackoff) {
- if (lastBackoff == null) return _initialBackoff;
- final jitter = _random.nextDouble() * 2 * _jitter - _jitter;
- final nextBackoff = lastBackoff * (_multiplier + jitter);
- return nextBackoff < _maxBackoff ? nextBackoff : _maxBackoff;
-}
-
-/// Handler for checking certificates that fail validation. If this handler
-/// returns `true`, the bad certificate is allowed, and the TLS handshake can
-/// continue. If the handler returns `false`, the TLS handshake fails, and the
-/// connection is aborted.
-typedef bool BadCertificateHandler(X509Certificate certificate, String host);
-
-/// Bad certificate handler that disables all certificate checks.
-/// DO NOT USE IN PRODUCTION!
-/// Can be used during development and testing to accept self-signed
-/// certificates, etc.
-bool allowBadCertificates(X509Certificate certificate, String host) => true;
-
-/// Options controlling TLS security settings on a [ClientChannel].
-class ChannelCredentials {
- final bool isSecure;
- final List<int> _certificateBytes;
- final String _certificatePassword;
- final String authority;
- final BadCertificateHandler onBadCertificate;
-
- const ChannelCredentials._(this.isSecure, this._certificateBytes,
- this._certificatePassword, this.authority, this.onBadCertificate);
-
- /// Disable TLS. RPCs are sent in clear text.
- const ChannelCredentials.insecure({String authority})
- : this._(false, null, null, authority, null);
-
- /// Enable TLS and optionally specify the [certificates] to trust. If
- /// [certificates] is not provided, the default trust store is used.
- const ChannelCredentials.secure(
- {List<int> certificates,
- String password,
- String authority,
- BadCertificateHandler onBadCertificate})
- : this._(true, certificates, password, authority, onBadCertificate);
-
- SecurityContext get securityContext {
- if (!isSecure) return null;
- if (_certificateBytes != null) {
- return createSecurityContext(false)
- ..setTrustedCertificatesBytes(_certificateBytes,
- password: _certificatePassword);
- }
- final context = new SecurityContext(withTrustedRoots: true);
- if (SecurityContext.alpnSupported) {
- context.setAlpnProtocols(supportedAlpnProtocols, false);
- }
- return context;
- }
-}
-
-/// Options controlling how connections are made on a [ClientChannel].
-class ChannelOptions {
- final ChannelCredentials credentials;
- final Duration idleTimeout;
- final BackoffStrategy backoffStrategy;
- final String userAgent;
-
- const ChannelOptions({
- ChannelCredentials credentials,
- Duration idleTimeout,
- String userAgent,
- BackoffStrategy backoffStrategy,
- }) : this.credentials = credentials ?? const ChannelCredentials.secure(),
- this.idleTimeout = idleTimeout ?? defaultIdleTimeout,
- this.userAgent = userAgent ?? defaultUserAgent,
- this.backoffStrategy = backoffStrategy ?? defaultBackoffStrategy;
-}
-
-/// Provides per-RPC metadata.
-///
-/// Metadata providers will be invoked for every RPC, and can add their own
-/// metadata to the RPC. If the function returns a [Future], the RPC will await
-/// completion of the returned [Future] before transmitting the request.
-///
-/// The metadata provider is given the current [metadata] map (possibly modified
-/// by previous metadata providers) and the [uri] that is being called, and is
-/// expected to modify the map before returning or before completing the
-/// returned [Future].
-typedef FutureOr<void> MetadataProvider(
- Map<String, String> metadata, String uri);
-
-/// Runtime options for an RPC.
-class CallOptions {
- final Map<String, String> metadata;
- final Duration timeout;
- final List<MetadataProvider> metadataProviders;
-
- CallOptions._(this.metadata, this.timeout, this.metadataProviders);
-
- /// Creates a [CallOptions] object.
- ///
- /// [CallOptions] can specify static [metadata], set the [timeout], and
- /// configure per-RPC metadata [providers]. The metadata [providers] are
- /// invoked in order for every RPC, and can modify the outgoing metadata
- /// (including metadata provided by previous providers).
- factory CallOptions(
- {Map<String, String> metadata,
- Duration timeout,
- List<MetadataProvider> providers}) {
- return new CallOptions._(new Map.unmodifiable(metadata ?? {}), timeout,
- new List.unmodifiable(providers ?? []));
- }
-
- factory CallOptions.from(Iterable<CallOptions> options) =>
- options.fold(new CallOptions(), (p, o) => p.mergedWith(o));
-
- CallOptions mergedWith(CallOptions other) {
- if (other == null) return this;
- final mergedMetadata = new Map.from(metadata)..addAll(other.metadata);
- final mergedTimeout = other.timeout ?? timeout;
- final mergedProviders = new List.from(metadataProviders)
- ..addAll(other.metadataProviders);
- return new CallOptions._(new Map.unmodifiable(mergedMetadata),
- mergedTimeout, new List.unmodifiable(mergedProviders));
- }
-}
diff --git a/grpc/lib/src/server/call.dart b/grpc/lib/src/server/call.dart
deleted file mode 100644
index 656dc48..0000000
--- a/grpc/lib/src/server/call.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Server-side context for a gRPC call.
-///
-/// Gives the method handler access to custom metadata from the client, and
-/// ability to set custom metadata on the header/trailer sent to the client.
-abstract class ServiceCall {
- /// Custom metadata from the client.
- Map<String, String> get clientMetadata;
-
- /// Custom metadata to be sent to the client. Will be [null] once the headers
- /// have been sent, either when [sendHeaders] is called, or when the first
- /// response message is sent.
- Map<String, String> get headers;
-
- /// Custom metadata to be sent to the client after all response messages.
- Map<String, String> get trailers;
-
- /// Deadline for this call. If the call is still active after this time, then
- /// the client or server may cancel it.
- DateTime get deadline;
-
- /// Returns [true] if the [deadline] has been exceeded.
- bool get isTimedOut;
-
- /// Returns [true] if the client has canceled this call.
- bool get isCanceled;
-
- /// Send response headers. This is done automatically before sending the first
- /// response message, but can be done manually before the first response is
- /// ready, if necessary.
- void sendHeaders();
-
- /// Send response trailers. A trailer indicating success ([status] == 0) will
- /// be sent automatically when all responses are sent. This method can be used
- /// to send a different status code, if needed.
- ///
- /// The call will be closed after calling this method, and no further
- /// responses can be sent.
- void sendTrailers({int status, String message});
-}
diff --git a/grpc/lib/src/server/handler.dart b/grpc/lib/src/server/handler.dart
deleted file mode 100644
index 74754e4..0000000
--- a/grpc/lib/src/server/handler.dart
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:http2/transport.dart';
-
-import '../shared/status.dart';
-import '../shared/streams.dart';
-import '../shared/timeout.dart';
-
-import 'call.dart';
-import 'interceptor.dart';
-import 'service.dart';
-
-/// Handles an incoming gRPC call.
-class ServerHandler_ extends ServiceCall {
- final ServerTransportStream _stream;
- final Service Function(String service) _serviceLookup;
- final List<Interceptor> _interceptors;
-
- StreamSubscription<GrpcMessage> _incomingSubscription;
-
- Service _service;
- ServiceMethod _descriptor;
-
- Map<String, String> _clientMetadata;
-
- StreamController _requests;
- bool _hasReceivedRequest = false;
-
- Stream _responses;
- StreamSubscription _responseSubscription;
- bool _headersSent = false;
-
- Map<String, String> _customHeaders = {};
- Map<String, String> _customTrailers = {};
-
- DateTime _deadline;
- bool _isCanceled = false;
- bool _isTimedOut = false;
- Timer _timeoutTimer;
-
- ServerHandler_(this._serviceLookup, this._stream, this._interceptors);
-
- DateTime get deadline => _deadline;
-
- bool get isCanceled => _isCanceled;
-
- bool get isTimedOut => _isTimedOut;
-
- Map<String, String> get clientMetadata => _clientMetadata;
-
- Map<String, String> get headers => _customHeaders;
-
- Map<String, String> get trailers => _customTrailers;
-
- void handle() {
- _stream.onTerminated = (_) => cancel();
-
- _incomingSubscription = _stream.incomingMessages
- .transform(new GrpcHttpDecoder())
- .transform(grpcDecompressor())
- .listen(_onDataIdle,
- onError: _onError, onDone: _onDoneError, cancelOnError: true);
- }
-
- /// Cancel response subscription, if active. If the stream exits with an
- /// error, just ignore it. The client is long gone, so it doesn't care.
- /// We need the catchError() handler here, since otherwise the error would
- /// be an unhandled exception.
- void _cancelResponseSubscription() {
- _responseSubscription?.cancel()?.catchError((_) {});
- }
-
- // -- Idle state, incoming data --
-
- void _onDataIdle(GrpcMessage message) async {
- if (message is! GrpcMetadata) {
- _sendError(new GrpcError.unimplemented('Expected header frame'));
- _sinkIncoming();
- return;
- }
- _incomingSubscription.pause();
-
- final headerMessage = message
- as GrpcMetadata; // TODO(jakobr): Cast should not be necessary here.
- _clientMetadata = headerMessage.metadata;
- final path = _clientMetadata[':path'];
- final pathSegments = path.split('/');
- if (pathSegments.length < 3) {
- _sendError(new GrpcError.unimplemented('Invalid path'));
- _sinkIncoming();
- return;
- }
- final serviceName = pathSegments[1];
- final methodName = pathSegments[2];
-
- _service = _serviceLookup(serviceName);
- _descriptor = _service?.$lookupMethod(methodName);
- if (_descriptor == null) {
- _sendError(new GrpcError.unimplemented('Path $path not found'));
- _sinkIncoming();
- return;
- }
-
- final error = await _applyInterceptors();
- if (error != null) {
- _sendError(error);
- _sinkIncoming();
- return;
- }
-
- _startStreamingRequest();
- }
-
- Future<GrpcError> _applyInterceptors() async {
- try {
- for (final interceptor in _interceptors) {
- final error = await interceptor(this, this._descriptor);
- if (error != null) {
- return error;
- }
- }
- } catch (error) {
- final grpcError = new GrpcError.internal(error.toString());
- return grpcError;
- }
- return null;
- }
-
- void _startStreamingRequest() {
- _requests = _descriptor.createRequestStream(_incomingSubscription);
- _incomingSubscription.onData(_onDataActive);
-
- _service.$onMetadata(this);
- _responses = _descriptor.handle(this, _requests.stream);
-
- _responseSubscription = _responses.listen(_onResponse,
- onError: _onResponseError,
- onDone: _onResponseDone,
- cancelOnError: true);
- _incomingSubscription.onData(_onDataActive);
- _incomingSubscription.onDone(_onDoneExpected);
-
- final timeout = fromTimeoutString(_clientMetadata['grpc-timeout']);
- if (timeout != null) {
- _deadline = new DateTime.now().add(timeout);
- _timeoutTimer = new Timer(timeout, _onTimedOut);
- }
- }
-
- void _onTimedOut() {
- if (_isCanceled) return;
- _isTimedOut = true;
- _isCanceled = true;
- final error = new GrpcError.deadlineExceeded('Deadline exceeded');
- _sendError(error);
- if (!_requests.isClosed) {
- _requests
- ..addError(error)
- ..close();
- }
- }
-
- // -- Active state, incoming data --
-
- void _onDataActive(GrpcMessage message) {
- if (message is! GrpcData) {
- final error = new GrpcError.unimplemented('Expected request');
- _sendError(error);
- _requests
- ..addError(error)
- ..close();
- return;
- }
-
- if (_hasReceivedRequest && !_descriptor.streamingRequest) {
- final error = new GrpcError.unimplemented('Too many requests');
- _sendError(error);
- _requests
- ..addError(error)
- ..close();
- return;
- }
-
- // TODO(jakobr): Cast should not be necessary here.
- final data = message as GrpcData;
- var request;
- try {
- request = _descriptor.deserialize(data.data);
- } catch (error) {
- final grpcError =
- new GrpcError.internal('Error deserializing request: $error');
- _sendError(grpcError);
- _requests
- ..addError(grpcError)
- ..close();
- return;
- }
- _requests.add(request);
- _hasReceivedRequest = true;
- }
-
- // -- Active state, outgoing response data --
-
- void _onResponse(response) {
- try {
- final bytes = _descriptor.serialize(response);
- if (!_headersSent) {
- sendHeaders();
- }
- _stream.sendData(GrpcHttpEncoder.frame(bytes));
- } catch (error) {
- final grpcError =
- new GrpcError.internal('Error sending response: $error');
- if (!_requests.isClosed) {
- // If we can, alert the handler that things are going wrong.
- _requests
- ..addError(grpcError)
- ..close();
- }
- _sendError(grpcError);
- _cancelResponseSubscription();
- }
- }
-
- void _onResponseDone() {
- sendTrailers();
- }
-
- void _onResponseError(error) {
- if (error is GrpcError) {
- _sendError(error);
- } else {
- _sendError(new GrpcError.unknown(error.toString()));
- }
- }
-
- void sendHeaders() {
- if (_headersSent) throw new GrpcError.internal('Headers already sent');
-
- _customHeaders..remove(':status')..remove('content-type');
-
- // TODO(jakobr): Should come from package:http2?
- final outgoingHeadersMap = <String, String>{
- ':status': '200',
- 'content-type': 'application/grpc'
- };
-
- outgoingHeadersMap.addAll(_customHeaders);
- _customHeaders = null;
-
- final outgoingHeaders = <Header>[];
- outgoingHeadersMap.forEach((key, value) =>
- outgoingHeaders.add(new Header(ascii.encode(key), utf8.encode(value))));
- _stream.sendHeaders(outgoingHeaders);
- _headersSent = true;
- }
-
- void sendTrailers({int status = 0, String message}) {
- _timeoutTimer?.cancel();
-
- final outgoingTrailersMap = <String, String>{};
- if (!_headersSent) {
- // TODO(jakobr): Should come from package:http2?
- outgoingTrailersMap[':status'] = '200';
- outgoingTrailersMap['content-type'] = 'application/grpc';
-
- _customHeaders..remove(':status')..remove('content-type');
- outgoingTrailersMap.addAll(_customHeaders);
- _customHeaders = null;
- }
- _customTrailers..remove(':status')..remove('content-type');
- outgoingTrailersMap.addAll(_customTrailers);
- _customTrailers = null;
- outgoingTrailersMap['grpc-status'] = status.toString();
- if (message != null) {
- outgoingTrailersMap['grpc-message'] = message;
- }
-
- final outgoingTrailers = <Header>[];
- outgoingTrailersMap.forEach((key, value) => outgoingTrailers
- .add(new Header(ascii.encode(key), utf8.encode(value))));
- _stream.sendHeaders(outgoingTrailers, endStream: true);
- // We're done!
- _cancelResponseSubscription();
- _sinkIncoming();
- }
-
- // -- All states, incoming error / stream closed --
-
- void _onError(error) {
- // Exception from the incoming stream. Most likely a cancel request from the
- // client, so we treat it as such.
- _timeoutTimer?.cancel();
- _isCanceled = true;
- if (_requests != null && !_requests.isClosed) {
- _requests.addError(new GrpcError.cancelled('Cancelled'));
- }
- _cancelResponseSubscription();
- _incomingSubscription.cancel();
- _stream.terminate();
- }
-
- void _onDoneError() {
- _sendError(new GrpcError.unavailable('Request stream closed unexpectedly'));
- _onDone();
- }
-
- void _onDoneExpected() {
- if (!(_hasReceivedRequest || _descriptor.streamingRequest)) {
- final error = new GrpcError.unimplemented('No request received');
- _sendError(error);
- _requests.addError(error);
- }
- _onDone();
- }
-
- void _onDone() {
- _requests?.close();
- _incomingSubscription.cancel();
- }
-
- /// Sink incoming requests. This is used when an error has already been
- /// reported, but we still need to consume the request stream from the client.
- void _sinkIncoming() {
- _incomingSubscription
- ..onData((_) {})
- ..onDone(_onDone);
- }
-
- void _sendError(GrpcError error) {
- sendTrailers(status: error.code, message: error.message);
- }
-
- void cancel() {
- _isCanceled = true;
- _timeoutTimer?.cancel();
- _cancelResponseSubscription();
- }
-}
-
-@Deprecated(
- 'This is an internal class, and will not be part of the public interface in next major version.')
-// TODO(sigurdm): Remove this class from grpc.dart exports.
-class ServerHandler extends ServerHandler_ {
- ServerHandler(Service Function(String service) serviceLookup, stream,
- [List<Interceptor> interceptors = const <Interceptor>[]])
- : super(serviceLookup, stream, interceptors);
-}
diff --git a/grpc/lib/src/server/interceptor.dart b/grpc/lib/src/server/interceptor.dart
deleted file mode 100644
index 65426a6..0000000
--- a/grpc/lib/src/server/interceptor.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-import 'dart:async';
-
-import '../shared/status.dart';
-import 'call.dart';
-import 'service.dart';
-
-/// A gRPC Interceptor.
-///
-/// An interceptor is called before the corresponding [ServiceMethod] invocation.
-/// If the interceptor returns a [GrpcError], the error will be returned as a response and [ServiceMethod] wouldn't be called.
-/// If the interceptor throws [Exception], [GrpcError.internal] with exception.toString() will be returned.
-/// If the interceptor returns null, the corresponding [ServiceMethod] of [Service] will be called.
-typedef Interceptor = FutureOr<GrpcError> Function(
- ServiceCall call, ServiceMethod method);
diff --git a/grpc/lib/src/server/server.dart b/grpc/lib/src/server/server.dart
deleted file mode 100644
index d549f63..0000000
--- a/grpc/lib/src/server/server.dart
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:http2/transport.dart';
-import 'package:meta/meta.dart';
-
-import '../shared/security.dart';
-
-import 'handler.dart';
-import 'interceptor.dart';
-import 'service.dart';
-
-class ServerTlsCredentials {
- final List<int> certificate;
- final String certificatePassword;
- final List<int> privateKey;
- final String privateKeyPassword;
-
- /// TLS credentials for a [Server].
- ///
- /// If the [certificate] or [privateKey] is encrypted, the password must also
- /// be provided.
- ServerTlsCredentials(
- {this.certificate,
- this.certificatePassword,
- this.privateKey,
- this.privateKeyPassword});
-
- SecurityContext get securityContext {
- final context = createSecurityContext(true);
- if (privateKey != null) {
- context.usePrivateKeyBytes(privateKey, password: privateKeyPassword);
- }
- if (certificate != null) {
- context.useCertificateChainBytes(certificate,
- password: certificatePassword);
- }
- return context;
- }
-}
-
-/// A gRPC server.
-///
-/// Listens for incoming RPCs, dispatching them to the right [Service] handler.
-class Server {
- final Map<String, Service> _services = {};
- final List<Interceptor> _interceptors;
-
- ServerSocket _insecureServer;
- SecureServerSocket _secureServer;
- final _connections = <ServerTransportConnection>[];
-
- /// Create a server for the given [services].
- Server(List<Service> services,
- [List<Interceptor> interceptors = const <Interceptor>[]])
- : _interceptors = interceptors {
- for (final service in services) {
- _services[service.$name] = service;
- }
- }
-
- /// The port that the server is listening on, or `null` if the server is not
- /// active.
- int get port {
- if (_secureServer != null) return _secureServer.port;
- if (_insecureServer != null) return _insecureServer.port;
- return null;
- }
-
- Service lookupService(String service) => _services[service];
-
- Future<void> serve(
- {dynamic address, int port, ServerTlsCredentials security}) async {
- // TODO(dart-lang/grpc-dart#9): Handle HTTP/1.1 upgrade to h2c, if allowed.
- Stream<Socket> server;
- if (security != null) {
- _secureServer = await SecureServerSocket.bind(
- address ?? InternetAddress.anyIPv4,
- port ?? 443,
- security.securityContext);
- server = _secureServer;
- } else {
- _insecureServer = await ServerSocket.bind(
- address ?? InternetAddress.anyIPv4, port ?? 80);
- server = _insecureServer;
- }
- server.listen((socket) {
- final connection = new ServerTransportConnection.viaSocket(socket);
- _connections.add(connection);
- ServerHandler_ handler;
- // TODO(jakobr): Set active state handlers, close connection after idle
- // timeout.
- connection.incomingStreams.listen((stream) {
- handler = serveStream_(stream);
- }, onError: (error) {
- print('Connection error: $error');
- }, onDone: () {
- // TODO(sigurdm): This is not correct behavior in the presence of
- // half-closed tcp streams.
- // Half-closed streams seems to not be fully supported by package:http2.
- // https://github.com/dart-lang/http2/issues/42
- handler?.cancel();
- _connections.remove(connection);
- });
- }, onError: (error) {
- print('Socket error: $error');
- });
- }
-
- @visibleForTesting
- ServerHandler_ serveStream_(ServerTransportStream stream) {
- return new ServerHandler_(lookupService, stream, _interceptors)..handle();
- }
-
- @Deprecated(
- 'This is internal functionality, and will be removed in next major version.')
- void serveStream(ServerTransportStream stream) {
- serveStream_(stream);
- }
-
- Future<void> shutdown() async {
- final done = _connections.map((connection) => connection.finish()).toList();
- if (_insecureServer != null) {
- done.add(_insecureServer.close());
- }
- if (_secureServer != null) {
- done.add(_secureServer.close());
- }
- await Future.wait(done);
- _insecureServer = null;
- _secureServer = null;
- }
-}
diff --git a/grpc/lib/src/server/service.dart b/grpc/lib/src/server/service.dart
deleted file mode 100644
index 26d869c..0000000
--- a/grpc/lib/src/server/service.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import '../shared/status.dart';
-import 'call.dart';
-
-/// Definition of a gRPC service method.
-class ServiceMethod<Q, R> {
- final String name;
-
- final bool streamingRequest;
- final bool streamingResponse;
-
- final Q Function(List<int> request) requestDeserializer;
- final List<int> Function(R response) responseSerializer;
-
- final Function handler;
-
- ServiceMethod(
- this.name,
- this.handler,
- this.streamingRequest,
- this.streamingResponse,
- this.requestDeserializer,
- this.responseSerializer);
-
- StreamController<Q> createRequestStream(StreamSubscription incoming) =>
- new StreamController<Q>(
- onListen: incoming.resume,
- onPause: incoming.pause,
- onResume: incoming.resume);
-
- Q deserialize(List<int> data) => requestDeserializer(data);
-
- List<int> serialize(dynamic response) => responseSerializer(response as R);
-
- Stream<R> handle(ServiceCall call, Stream<Q> requests) {
- if (streamingResponse) {
- if (streamingRequest) {
- return handler(call, requests);
- } else {
- return handler(call, _toSingleFuture(requests));
- }
- } else {
- Future<R> response;
- if (streamingRequest) {
- response = handler(call, requests);
- } else {
- response = handler(call, _toSingleFuture(requests));
- }
- return response.asStream();
- }
- }
-
- Future<Q> _toSingleFuture(Stream<Q> stream) {
- Q _ensureOnlyOneRequest(Q previous, Q element) {
- if (previous != null) {
- throw new GrpcError.unimplemented('More than one request received');
- }
- return element;
- }
-
- Q _ensureOneRequest(Q value) {
- if (value == null)
- throw new GrpcError.unimplemented('No requests received');
- return value;
- }
-
- final future =
- stream.fold(null, _ensureOnlyOneRequest).then(_ensureOneRequest);
- // Make sure errors on the future aren't unhandled, but return the original
- // future so the request handler can also get the error.
- future.catchError((_) {});
- return future;
- }
-}
-
-/// Definition of a gRPC service.
-abstract class Service {
- final Map<String, ServiceMethod> _$methods = {};
-
- String get $name;
-
- void $addMethod(ServiceMethod method) {
- _$methods[method.name] = method;
- }
-
- /// Client metadata handler.
- ///
- /// Services can override this method to provide common handling of incoming
- /// metadata from the client.
- void $onMetadata(ServiceCall context) {}
-
- ServiceMethod $lookupMethod(String name) => _$methods[name];
-}
diff --git a/grpc/lib/src/shared/security.dart b/grpc/lib/src/shared/security.dart
deleted file mode 100644
index 2e09f37..0000000
--- a/grpc/lib/src/shared/security.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:io';
-
-const supportedAlpnProtocols = const ['grpc-exp', 'h2'];
-
-// TODO: Simplify once we have a stable Dart 1.25 release (update pubspec to
-// require SDK >=1.25.0, and remove check for alpnSupported).
-SecurityContext createSecurityContext(bool isServer) =>
- SecurityContext.alpnSupported
- ? (new SecurityContext()
- ..setAlpnProtocols(supportedAlpnProtocols, isServer))
- : new SecurityContext();
diff --git a/grpc/lib/src/shared/status.dart b/grpc/lib/src/shared/status.dart
deleted file mode 100644
index 4879cd3..0000000
--- a/grpc/lib/src/shared/status.dart
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-class StatusCode {
- /// The operation completed successfully.
- static const ok = 0;
-
- /// The operation was cancelled (typically by the caller).
- static const cancelled = 1;
-
- /// Unknown error. An example of where this error may be returned is if a
- /// Status value received from another address space belongs to an error-space
- /// that is not known in this address space. Also errors raised by APIs that
- /// do not return enough error information may be converted to this error.
- static const unknown = 2;
-
- /// Client specified an invalid argument. Note that this differs from
- /// [failedPrecondition]. [invalidArgument] indicates arguments that are
- /// problematic regardless of the state of the system (e.g., a malformed file
- /// name).
- static const invalidArgument = 3;
-
- /// Deadline expired before operation could complete. For operations that
- /// change the state of the system, this error may be returned even if the
- /// operation has completed successfully. For example, a successful response
- /// from a server could have been delayed long enough for the deadline to
- /// expire.
- static const deadlineExceeded = 4;
-
- /// Some requested entity (e.g., file or directory) was not found.
- static const notFound = 5;
-
- /// Some entity that we attempted to create (e.g., file or directory) already
- /// exists.
- static const alreadyExists = 6;
-
- /// The caller does not have permission to execute the specified operation.
- /// [permissionDenied] must not be used for rejections caused by exhausting
- /// some resource (use [resourceExhausted] instead for those errors).
- /// [permissionDenied] must not be used if the caller cannot be identified
- /// (use [unauthenticated] instead for those errors).
- static const permissionDenied = 7;
-
- /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the
- /// entire file system is out of space.
- static const resourceExhausted = 8;
-
- /// Operation was rejected because the system is not in a state required for
- /// the operation's execution. For example, directory to be deleted may be
- /// non-empty, an rmdir operation is applied to a non-directory, etc.
- ///
- /// A litmus test that may help a service implementor in deciding between
- /// [failedPrecondition], [aborted], and [unavailable]:
- /// (a) Use [unavailable] if the client can retry just the failing call.
- /// (b) Use [aborted] if the client should retry at a higher-level (e.g.,
- /// restarting a read-modify-write sequence).
- /// (c) Use [failedPrecondition] if the client should not retry until the
- /// system state has been explicitly fixed. E.g., if an "rmdir" fails
- /// because the directory is non-empty, [failedPrecondition] should be
- /// returned since the client should not retry unless they have first
- /// fixed up the directory by deleting files from it.
- static const failedPrecondition = 9;
-
- /// The operation was aborted, typically due to a concurrency issue like
- /// sequencer check failures, transaction aborts, etc.
- ///
- /// See litmus test above for deciding between [failedPrecondition],
- /// [aborted], and [unavailable].
- static const aborted = 10;
-
- /// Operation was attempted past the valid range. E.g., seeking or reading
- /// past end of file.
- ///
- /// Unlike invalidArgument, this error indicates a problem that may be fixed
- /// if the system state changes. For example, a 32-bit file system will
- /// generate invalidArgument if asked to read at an offset that is not in the
- /// range [0,2^32-1], but it will generate [outOfRange] if asked to read from
- /// an offset past the current file size.
- ///
- /// There is a fair bit of overlap between [failedPrecondition] and
- /// [outOfRange]. We recommend using [outOfRange] (the more specific error)
- /// when it applies so that callers who are iterating through a space can
- /// easily look for an [outOfRange] error to detect when they are done.
- static const outOfRange = 11;
-
- /// Operation is not implemented or not supported/enabled in this service.
- static const unimplemented = 12;
-
- /// Internal errors. Means some invariants expected by underlying system has
- /// been broken. If you see one of these errors, something is very broken.
- static const internal = 13;
-
- /// The service is currently unavailable. This is a most likely a transient
- /// condition and may be corrected by retrying with a backoff.
- ///
- /// See litmus test above for deciding between [failedPrecondition],
- /// [aborted], and [unavailable].
- static const unavailable = 14;
-
- /// Unrecoverable data loss or corruption.
- static const dataLoss = 15;
-
- /// The request does not have valid authentication credentials for the
- /// operation.
- static const unauthenticated = 16;
-}
-
-class GrpcError {
- final int code;
- final String message;
-
- /// Custom error code.
- GrpcError.custom(this.code, [this.message]);
-
- /// The operation completed successfully.
- GrpcError.ok([this.message]) : code = StatusCode.ok;
-
- /// The operation was cancelled (typically by the caller).
- GrpcError.cancelled([this.message]) : code = StatusCode.cancelled;
-
- /// Unknown error. An example of where this error may be returned is if a
- /// Status value received from another address space belongs to an error-space
- /// that is not known in this address space. Also errors raised by APIs that
- /// do not return enough error information may be converted to this error.
- GrpcError.unknown([this.message]) : code = StatusCode.unknown;
-
- /// Client specified an invalid argument. Note that this differs from
- /// [failedPrecondition]. [invalidArgument] indicates arguments that are
- /// problematic regardless of the state of the system (e.g., a malformed file
- /// name).
- GrpcError.invalidArgument([this.message]) : code = StatusCode.invalidArgument;
-
- /// Deadline expired before operation could complete. For operations that
- /// change the state of the system, this error may be returned even if the
- /// operation has completed successfully. For example, a successful response
- /// from a server could have been delayed long enough for the deadline to
- /// expire.
- GrpcError.deadlineExceeded([this.message])
- : code = StatusCode.deadlineExceeded;
-
- /// Some requested entity (e.g., file or directory) was not found.
- GrpcError.notFound([this.message]) : code = StatusCode.notFound;
-
- /// Some entity that we attempted to create (e.g., file or directory) already
- /// exists.
- GrpcError.alreadyExists([this.message]) : code = StatusCode.alreadyExists;
-
- /// The caller does not have permission to execute the specified operation.
- /// [permissionDenied] must not be used for rejections caused by exhausting
- /// some resource (use [resourceExhausted] instead for those errors).
- /// [permissionDenied] must not be used if the caller cannot be identified
- /// (use [unauthenticated] instead for those errors).
- GrpcError.permissionDenied([this.message])
- : code = StatusCode.permissionDenied;
-
- /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the
- /// entire file system is out of space.
- GrpcError.resourceExhausted([this.message])
- : code = StatusCode.resourceExhausted;
-
- /// Operation was rejected because the system is not in a state required for
- /// the operation's execution. For example, directory to be deleted may be
- /// non-empty, an rmdir operation is applied to a non-directory, etc.
- ///
- /// A litmus test that may help a service implementor in deciding between
- /// [failedPrecondition], [aborted], and [unavailable]:
- /// (a) Use [unavailable] if the client can retry just the failing call.
- /// (b) Use [aborted] if the client should retry at a higher-level (e.g.,
- /// restarting a read-modify-write sequence).
- /// (c) Use [failedPrecondition] if the client should not retry until the
- /// system state has been explicitly fixed. E.g., if an "rmdir" fails
- /// because the directory is non-empty, [failedPrecondition] should be
- /// returned since the client should not retry unless they have first
- /// fixed up the directory by deleting files from it.
- GrpcError.failedPrecondition([this.message])
- : code = StatusCode.failedPrecondition;
-
- /// The operation was aborted, typically due to a concurrency issue like
- /// sequencer check failures, transaction aborts, etc.
- ///
- /// See litmus test above for deciding between [failedPrecondition],
- /// [aborted], and [unavailable].
- GrpcError.aborted([this.message]) : code = StatusCode.aborted;
-
- /// Operation was attempted past the valid range. E.g., seeking or reading
- /// past end of file.
- ///
- /// Unlike invalidArgument, this error indicates a problem that may be fixed
- /// if the system state changes. For example, a 32-bit file system will
- /// generate invalidArgument if asked to read at an offset that is not in the
- /// range [0,2^32-1], but it will generate [outOfRange] if asked to read from
- /// an offset past the current file size.
- ///
- /// There is a fair bit of overlap between [failedPrecondition] and
- /// [outOfRange]. We recommend using [outOfRange] (the more specific error)
- /// when it applies so that callers who are iterating through a space can
- /// easily look for an [outOfRange] error to detect when they are done.
- GrpcError.outOfRange([this.message]) : code = StatusCode.outOfRange;
-
- /// Operation is not implemented or not supported/enabled in this service.
- GrpcError.unimplemented([this.message]) : code = StatusCode.unimplemented;
-
- /// Internal errors. Means some invariants expected by underlying system has
- /// been broken. If you see one of these errors, something is very broken.
- GrpcError.internal([this.message]) : code = StatusCode.internal;
-
- /// The service is currently unavailable. This is a most likely a transient
- /// condition and may be corrected by retrying with a backoff.
- ///
- /// See litmus test above for deciding between [failedPrecondition],
- /// [aborted], and [unavailable].
- GrpcError.unavailable([this.message]) : code = StatusCode.unavailable;
-
- /// Unrecoverable data loss or corruption.
- GrpcError.dataLoss([this.message]) : code = StatusCode.dataLoss;
-
- /// The request does not have valid authentication credentials for the
- /// operation.
- GrpcError.unauthenticated([this.message]) : code = StatusCode.unauthenticated;
-
- @override
- bool operator ==(other) {
- if (other is! GrpcError) return false;
- return code == other.code && message == other.message;
- }
-
- @override
- int get hashCode => code.hashCode ^ (message?.hashCode ?? 17);
-
- @override
- String toString() => 'gRPC Error ($code, $message)';
-}
diff --git a/grpc/lib/src/shared/streams.dart b/grpc/lib/src/shared/streams.dart
deleted file mode 100644
index 7e3148b..0000000
--- a/grpc/lib/src/shared/streams.dart
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:math';
-import 'dart:typed_data';
-
-import 'package:http2/transport.dart';
-
-import 'status.dart';
-
-abstract class GrpcMessage {}
-
-class GrpcMetadata extends GrpcMessage {
- final Map<String, String> metadata;
- GrpcMetadata(this.metadata);
-
- @override
- String toString() => 'gRPC Metadata ($metadata)';
-}
-
-class GrpcData extends GrpcMessage {
- final List<int> data;
- final bool isCompressed;
- GrpcData(this.data, {this.isCompressed});
-
- @override
- String toString() => 'gRPC Data (${data.length} bytes)';
-}
-
-StreamTransformer<GrpcMessage, GrpcMessage> grpcDecompressor() =>
- new StreamTransformer<GrpcMessage, GrpcMessage>.fromHandlers(
- handleData: (GrpcMessage value, EventSink<GrpcMessage> sink) {
- if (value is GrpcData) {
- if (value.isCompressed) {
- // TODO(dart-lang/grpc-dart#6): Actually handle decompression.
- sink.add(new GrpcData(value.data, isCompressed: false));
- return;
- }
- }
- sink.add(value);
- });
-
-class GrpcHttpEncoder extends Converter<GrpcMessage, StreamMessage> {
- @override
- StreamMessage convert(GrpcMessage input) {
- if (input is GrpcMetadata) {
- final headers = <Header>[];
- input.metadata.forEach((key, value) {
- headers.add(new Header(ascii.encode(key), utf8.encode(value)));
- });
- return new HeadersStreamMessage(headers);
- } else if (input is GrpcData) {
- return new DataStreamMessage(frame(input.data));
- }
- throw new GrpcError.internal('Unexpected message type');
- }
-
- static List<int> frame(List<int> payload) {
- final payloadLength = payload.length;
- final bytes = new Uint8List(payloadLength + 5);
- final header = bytes.buffer.asByteData(0, 5);
- header.setUint8(0, 0); // TODO(dart-lang/grpc-dart#6): Handle compression
- header.setUint32(1, payloadLength);
- bytes.setRange(5, bytes.length, payload);
- return bytes;
- }
-}
-
-class GrpcHttpDecoder extends Converter<StreamMessage, GrpcMessage> {
- @override
- GrpcMessage convert(StreamMessage input) {
- final sink = new _GrpcMessageSink();
- startChunkedConversion(sink)
- ..add(input)
- ..close();
- return sink.message;
- }
-
- @override
- Sink<StreamMessage> startChunkedConversion(Sink<GrpcMessage> sink) {
- return new _GrpcMessageConversionSink(sink);
- }
-}
-
-class _GrpcMessageConversionSink extends ChunkedConversionSink<StreamMessage> {
- final Sink<GrpcMessage> _out;
-
- final _dataHeader = new Uint8List(5);
- Uint8List _data;
- int _dataOffset = 0;
-
- _GrpcMessageConversionSink(this._out);
-
- void _addData(DataStreamMessage chunk) {
- final chunkData = chunk.bytes;
- final chunkLength = chunkData.length;
- var chunkReadOffset = 0;
-
- while (chunkReadOffset < chunkLength) {
- if (_data == null) {
- // Reading header.
- final headerRemaining = _dataHeader.lengthInBytes - _dataOffset;
- final chunkRemaining = chunkLength - chunkReadOffset;
- final toCopy = min(headerRemaining, chunkRemaining);
- _dataHeader.setRange(
- _dataOffset, _dataOffset + toCopy, chunkData, chunkReadOffset);
- _dataOffset += toCopy;
- chunkReadOffset += toCopy;
- if (_dataOffset == _dataHeader.lengthInBytes) {
- final dataLength = _dataHeader.buffer.asByteData().getUint32(1);
- // TODO(jakobr): Sanity check dataLength. Max size?
- _data = new Uint8List(dataLength);
- _dataOffset = 0;
- }
- }
- if (_data != null) {
- // Reading data.
- final dataRemaining = _data.lengthInBytes - _dataOffset;
- if (dataRemaining > 0) {
- final chunkRemaining = chunkLength - chunkReadOffset;
- final toCopy = min(dataRemaining, chunkRemaining);
- _data.setRange(
- _dataOffset, _dataOffset + toCopy, chunkData, chunkReadOffset);
- _dataOffset += toCopy;
- chunkReadOffset += toCopy;
- }
- if (_dataOffset == _data.lengthInBytes) {
- _out.add(new GrpcData(_data,
- isCompressed: _dataHeader.buffer.asByteData().getUint8(0) != 0));
- _data = null;
- _dataOffset = 0;
- }
- }
- }
- }
-
- void _addHeaders(HeadersStreamMessage chunk) {
- if (_data != null || _dataOffset != 0) {
- // We were in the middle of receiving data, so receiving a header frame
- // is a violation of the gRPC protocol.
- throw new GrpcError.unimplemented('Received header while reading data');
- }
- final headers = <String, String>{};
- for (var header in chunk.headers) {
- // TODO(jakobr): Handle duplicate header names correctly.
- headers[ascii.decode(header.name)] = ascii.decode(header.value);
- }
- // TODO(jakobr): Check :status, go to error mode if not 2xx.
- _out.add(new GrpcMetadata(headers));
- }
-
- @override
- void add(StreamMessage chunk) {
- if (chunk is DataStreamMessage) {
- _addData(chunk);
- } else if (chunk is HeadersStreamMessage) {
- _addHeaders(chunk);
- } else {
- // No clue what this is.
- throw new GrpcError.unimplemented('Received unknown HTTP/2 frame type');
- }
- }
-
- @override
- void close() {
- if (_data != null || _dataOffset != 0) {
- throw new GrpcError.unavailable('Closed in non-idle state');
- }
- _out.close();
- }
-}
-
-class _GrpcMessageSink extends Sink<GrpcMessage> {
- GrpcMessage message;
-
- @override
- void add(GrpcMessage data) {
- if (message != null) {
- throw 'Too many messages received!';
- }
- message = data;
- }
-
- @override
- void close() {
- if (message == null) {
- throw 'No messages received!';
- }
- }
-}
diff --git a/grpc/lib/src/shared/timeout.dart b/grpc/lib/src/shared/timeout.dart
deleted file mode 100644
index 965ab88..0000000
--- a/grpc/lib/src/shared/timeout.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2017, the gRPC project authors. Please see the AUTHORS file
-// for details. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/// Convert [timeout] to grpc-timeout header string format.
-// Mostly inspired by grpc-java implementation.
-// TODO(jakobr): Modify to match grpc/core implementation instead.
-String toTimeoutString(Duration duration) {
- if (duration == null) return null;
- const cutoff = 100000;
- final timeout = duration.inMicroseconds;
- if (timeout < 0) {
- // Smallest possible timeout.
- return '1n';
- } else if (timeout < cutoff) {
- return '${timeout}u';
- } else if (timeout < cutoff * 1000) {
- return '${timeout ~/ 1000}m';
- } else if (timeout < cutoff * 1000 * 1000) {
- return '${timeout ~/ 1000000}S';
- } else if (timeout < cutoff * 1000 * 1000 * 60) {
- return '${timeout ~/ 60000000}M';
- } else {
- return '${timeout ~/ 3600000000}H';
- }
-}
-
-/// Convert [timeout] from grpc-timeout header string format to [Duration].
-/// Returns [null] if [timeout] is not correctly formatted.
-Duration fromTimeoutString(String timeout) {
- if (timeout == null) return null;
- if (timeout.length < 2) return null;
- final value = int.tryParse(timeout.substring(0, timeout.length - 1));
- if (value == null) return null;
- switch (timeout[timeout.length - 1]) {
- case 'n':
- return new Duration(microseconds: value * 1000);
- case 'u':
- return new Duration(microseconds: value);
- case 'm':
- return new Duration(milliseconds: value);
- case 'S':
- return new Duration(seconds: value);
- case 'M':
- return new Duration(minutes: value);
- case 'H':
- return new Duration(hours: value);
- default:
- return null;
- }
-}
diff --git a/grpc/pubspec.yaml b/grpc/pubspec.yaml
deleted file mode 100644
index 341ab8f..0000000
--- a/grpc/pubspec.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: grpc
-description: Dart implementation of gRPC, a high performance, open-source universal RPC framework.
-version: 1.0.3
-author: Dart Team <misc@dartlang.org>
-homepage: https://github.com/dart-lang/grpc-dart
-
-environment:
- sdk: '>=2.0.0 <3.0.0'
-
-dependencies:
- async: '>=1.13.3 <3.0.0'
- googleapis_auth: ^0.2.5+3
- meta: ^1.0.5
- http: '>=0.11.3+17 <0.13.0'
- http2: '>=0.1.7 <2.0.0'
-
-dev_dependencies:
- mockito: ^4.0.0
- test: ^1.6.1
diff --git a/http2/.dart_tool/pub/bin/sdk-version b/http2/.dart_tool/pub/bin/sdk-version
deleted file mode 100644
index 227cea2..0000000
--- a/http2/.dart_tool/pub/bin/sdk-version
+++ /dev/null
@@ -1 +0,0 @@
-2.0.0
diff --git a/http2/.dart_tool/pub/bin/test/test.dart.snapshot.dart2 b/http2/.dart_tool/pub/bin/test/test.dart.snapshot.dart2
deleted file mode 100644
index bea517b..0000000
--- a/http2/.dart_tool/pub/bin/test/test.dart.snapshot.dart2
+++ /dev/null
Binary files differ
diff --git a/http2/.gitignore b/http2/.gitignore
deleted file mode 100644
index a19c373..0000000
--- a/http2/.gitignore
+++ /dev/null
@@ -1,16 +0,0 @@
-# Don’t commit the following directories created by pub.
-build/
-.packages
-.pub/
-packages
-.buildlog
-
-# Or the files created by dart2js.
-*.dart.js
-*.dart.precompiled.js
-*.js_
-*.js.deps
-*.js.map
-
-# Include when developing application packages.
-pubspec.lock
diff --git a/http2/.idea/codeStyles/codeStyleConfig.xml b/http2/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index c79f34c..0000000
--- a/http2/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
- <state>
- <option name="PREFERRED_PROJECT_CODE_STYLE" value="Google Configuration Checker Style" />
- </state>
-</component>
\ No newline at end of file
diff --git a/http2/.idea/http2.iml b/http2/.idea/http2.iml
deleted file mode 100644
index ae9af97..0000000
--- a/http2/.idea/http2.iml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
- <excludeFolder url="file://$MODULE_DIR$/.pub" />
- <excludeFolder url="file://$MODULE_DIR$/build" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" name="Dart SDK" level="project" />
- <orderEntry type="library" name="Dart Packages" level="project" />
- </component>
-</module>
\ No newline at end of file
diff --git a/http2/.idea/libraries/Dart_Packages.xml b/http2/.idea/libraries/Dart_Packages.xml
deleted file mode 100644
index bb6094d..0000000
--- a/http2/.idea/libraries/Dart_Packages.xml
+++ /dev/null
@@ -1,428 +0,0 @@
-<component name="libraryTable">
- <library name="Dart Packages" type="DartPackagesLibraryType">
- <properties>
- <option name="packageNameToDirsMap">
- <entry key="analyzer">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.33.3+1/lib" />
- </list>
- </value>
- </entry>
- <entry key="args">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.5.1/lib" />
- </list>
- </value>
- </entry>
- <entry key="async">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.0.8/lib" />
- </list>
- </value>
- </entry>
- <entry key="boolean_selector">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.4/lib" />
- </list>
- </value>
- </entry>
- <entry key="charcode">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib" />
- </list>
- </value>
- </entry>
- <entry key="collection">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib" />
- </list>
- </value>
- </entry>
- <entry key="convert">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.2/lib" />
- </list>
- </value>
- </entry>
- <entry key="crypto">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="csslib">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="front_end">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.6+4/lib" />
- </list>
- </value>
- </entry>
- <entry key="glob">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.7/lib" />
- </list>
- </value>
- </entry>
- <entry key="html">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.3+3/lib" />
- </list>
- </value>
- </entry>
- <entry key="http">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.12.0/lib" />
- </list>
- </value>
- </entry>
- <entry key="http_multi_server">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.5/lib" />
- </list>
- </value>
- </entry>
- <entry key="http_parser">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib" />
- </list>
- </value>
- </entry>
- <entry key="io">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/io-0.3.3/lib" />
- </list>
- </value>
- </entry>
- <entry key="js">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib" />
- </list>
- </value>
- </entry>
- <entry key="json_rpc_2">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/json_rpc_2-2.0.9/lib" />
- </list>
- </value>
- </entry>
- <entry key="kernel">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.6+4/lib" />
- </list>
- </value>
- </entry>
- <entry key="logging">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+2/lib" />
- </list>
- </value>
- </entry>
- <entry key="matcher">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.3+1/lib" />
- </list>
- </value>
- </entry>
- <entry key="meta">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="mime">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.6+2/lib" />
- </list>
- </value>
- </entry>
- <entry key="mockito">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mockito-4.0.0/lib" />
- </list>
- </value>
- </entry>
- <entry key="multi_server_socket">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/multi_server_socket-1.0.2/lib" />
- </list>
- </value>
- </entry>
- <entry key="node_preamble">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.4/lib" />
- </list>
- </value>
- </entry>
- <entry key="package_config">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.5/lib" />
- </list>
- </value>
- </entry>
- <entry key="package_resolver">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="path">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.6.2/lib" />
- </list>
- </value>
- </entry>
- <entry key="plugin">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+3/lib" />
- </list>
- </value>
- </entry>
- <entry key="pool">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pool-1.3.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="pub_semver">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.4.2/lib" />
- </list>
- </value>
- </entry>
- <entry key="shelf">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.3+3/lib" />
- </list>
- </value>
- </entry>
- <entry key="shelf_packages_handler">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.4/lib" />
- </list>
- </value>
- </entry>
- <entry key="shelf_static">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.8/lib" />
- </list>
- </value>
- </entry>
- <entry key="shelf_web_socket">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.2+4/lib" />
- </list>
- </value>
- </entry>
- <entry key="source_map_stack_trace">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.5/lib" />
- </list>
- </value>
- </entry>
- <entry key="source_maps">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.8/lib" />
- </list>
- </value>
- </entry>
- <entry key="source_span">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.1/lib" />
- </list>
- </value>
- </entry>
- <entry key="stack_trace">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib" />
- </list>
- </value>
- </entry>
- <entry key="stream_channel">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.8/lib" />
- </list>
- </value>
- </entry>
- <entry key="string_scanner">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.4/lib" />
- </list>
- </value>
- </entry>
- <entry key="term_glyph">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.1/lib" />
- </list>
- </value>
- </entry>
- <entry key="test">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-1.5.1+1/lib" />
- </list>
- </value>
- </entry>
- <entry key="test_api">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.1/lib" />
- </list>
- </value>
- </entry>
- <entry key="test_core">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_core-0.2.0+1/lib" />
- </list>
- </value>
- </entry>
- <entry key="typed_data">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="utf">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+5/lib" />
- </list>
- </value>
- </entry>
- <entry key="vm_service_client">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/vm_service_client-0.2.6/lib" />
- </list>
- </value>
- </entry>
- <entry key="watcher">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+10/lib" />
- </list>
- </value>
- </entry>
- <entry key="web_socket_channel">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.9/lib" />
- </list>
- </value>
- </entry>
- <entry key="yaml">
- <value>
- <list>
- <option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.15/lib" />
- </list>
- </value>
- </entry>
- </option>
- </properties>
- <CLASSES>
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.33.3+1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.5.1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-2.0.8/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.6+4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.7/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.3+3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.12.0/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.5/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/io-0.3.3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/json_rpc_2-2.0.9/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.6+4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.3+1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.6+2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mockito-4.0.0/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/multi_server_socket-1.0.2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.5/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.6.2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pool-1.3.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.4.2/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.3+3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.8/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.2+4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.5/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.8/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.8/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.4/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-1.5.1+1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test_core-0.2.0+1/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+5/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/vm_service_client-0.2.6/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+10/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.9/lib" />
- <root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.15/lib" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
-</component>
\ No newline at end of file
diff --git a/http2/.idea/libraries/Dart_SDK.xml b/http2/.idea/libraries/Dart_SDK.xml
deleted file mode 100644
index e2b2cff..0000000
--- a/http2/.idea/libraries/Dart_SDK.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<component name="libraryTable">
- <library name="Dart SDK">
- <CLASSES>
- <root url="file://$USER_HOME$/install/dart-sdk/lib/async" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/cli" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/collection" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/convert" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/core" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/developer" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/html" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/indexed_db" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/io" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/isolate" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/js" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/js_util" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/math" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/mirrors" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/svg" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/typed_data" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/web_audio" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/web_gl" />
- <root url="file://$USER_HOME$/install/dart-sdk/lib/web_sql" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
-</component>
\ No newline at end of file
diff --git a/http2/.idea/modules.xml b/http2/.idea/modules.xml
deleted file mode 100644
index b9f6041..0000000
--- a/http2/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/.idea/http2.iml" filepath="$PROJECT_DIR$/.idea/http2.iml" />
- </modules>
- </component>
-</project>
\ No newline at end of file
diff --git a/http2/.idea/vcs.xml b/http2/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddf..0000000
--- a/http2/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="VcsDirectoryMappings">
- <mapping directory="" vcs="Git" />
- </component>
-</project>
\ No newline at end of file
diff --git a/http2/.idea/workspace.xml b/http2/.idea/workspace.xml
deleted file mode 100644
index 4f75e60..0000000
--- a/http2/.idea/workspace.xml
+++ /dev/null
@@ -1,806 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ChangeListManager">
- <list default="true" id="ac17af96-834b-47c0-bec3-b5f93f5e3dc2" name="Default" comment="" />
- <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
- <option name="TRACKING_ENABLED" value="true" />
- <option name="SHOW_DIALOG" value="false" />
- <option name="HIGHLIGHT_CONFLICTS" value="true" />
- <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
- <option name="LAST_RESOLUTION" value="IGNORE" />
- </component>
- <component name="FileEditorManager">
- <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
- <file leaf-file-name="transport.dart" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/lib/transport.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="15">
- <caret line="1" column="12" selection-start-line="1" selection-start-column="12" selection-end-line="1" selection-end-column="12" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="multiprotocol_server.dart" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/lib/multiprotocol_server.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="75">
- <caret line="5" column="48" selection-start-line="5" selection-start-column="48" selection-end-line="5" selection-end-column="48" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="README.md" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/README.md">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="13">
- <caret line="13" column="27" selection-start-line="13" selection-start-column="27" selection-end-line="13" selection-end-column="27" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/pubspec.yaml">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="150">
- <caret line="10" column="17" selection-start-line="10" selection-start-column="17" selection-end-line="10" selection-end-column="17" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="out_of_stream_ids_test.dart" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/manual_test/out_of_stream_ids_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state>
- <folding>
- <element signature="e#0#2139#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="transport_test.dart" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/test/transport_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="333">
- <caret line="512" column="9" selection-start-line="512" selection-start-column="9" selection-end-line="512" selection-end-column="9" />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="http2.dart" pinned="false" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/lib/http2.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="720">
- <caret line="48" lean-forward="true" selection-start-line="48" selection-end-line="48" />
- <folding>
- <element signature="e#0#2418#0" expanded="true" />
- <element signature="e#2364#2388#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="codereview.settings" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/codereview.settings">
- <provider selected="true" editor-type-id="text-editor" />
- </entry>
- </file>
- <file leaf-file-name="client.dart" pinned="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/lib/src/testing/client.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </file>
- </leaf>
- </component>
- <component name="FindInProjectRecents">
- <findStrings>
- <find>therefore not be used to make new streams</find>
- <find>no longer active</find>
- <find>StreamMessageQueueIn</find>
- <find>The http/2 connection</find>
- <find>nego</find>
- <find>library</find>
- </findStrings>
- </component>
- <component name="Git.Settings">
- <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
- </component>
- <component name="IdeDocumentHistory">
- <option name="CHANGED_PATHS">
- <list>
- <option value="$PROJECT_DIR$/example/request_resource.dart" />
- <option value="$PROJECT_DIR$/example/minimal.dart" />
- <option value="$PROJECT_DIR$/example/display_headers.dart" />
- <option value="$PROJECT_DIR$/README.md" />
- <option value="$PROJECT_DIR$/lib/transport.dart" />
- <option value="$PROJECT_DIR$/lib/src/error_handler.dart" />
- <option value="$PROJECT_DIR$/lib/multiprotocol_server.dart" />
- <option value="$PROJECT_DIR$/lib/src/artificial_server_socket.dart" />
- <option value="$PROJECT_DIR$/lib/src/byte_utils.dart" />
- <option value="$PROJECT_DIR$/lib/src/connection.dart" />
- <option value="$PROJECT_DIR$/lib/src/connection_preface.dart" />
- <option value="$PROJECT_DIR$/lib/src/sync_errors.dart" />
- <option value="$PROJECT_DIR$/lib/src/async_utils/async_utils.dart" />
- <option value="$PROJECT_DIR$/lib/src/flowcontrol/connection_queues.dart" />
- <option value="$PROJECT_DIR$/lib/src/flowcontrol/stream_queues.dart" />
- <option value="$PROJECT_DIR$/lib/src/flowcontrol/window.dart" />
- <option value="$PROJECT_DIR$/lib/src/flowcontrol/window_handler.dart" />
- <option value="$PROJECT_DIR$/lib/src/frames/frame_defragmenter.dart" />
- <option value="$PROJECT_DIR$/lib/src/frames/frames.dart" />
- <option value="$PROJECT_DIR$/lib/src/hpack/hpack.dart" />
- <option value="$PROJECT_DIR$/lib/src/hpack/huffman.dart" />
- <option value="$PROJECT_DIR$/lib/src/hpack/huffman_table.dart" />
- <option value="$PROJECT_DIR$/lib/src/ping/ping_handler.dart" />
- <option value="$PROJECT_DIR$/lib/src/settings/settings.dart" />
- <option value="$PROJECT_DIR$/lib/src/streams/stream_handler.dart" />
- <option value="$PROJECT_DIR$/lib/src/testing/debug.dart" />
- <option value="$PROJECT_DIR$/test/client_test.dart" />
- <option value="$PROJECT_DIR$/test/client_websites_test.dart" />
- <option value="$PROJECT_DIR$/test/multiprotocol_server_test.dart" />
- <option value="$PROJECT_DIR$/test/server_test.dart" />
- <option value="$PROJECT_DIR$/test/src/connection_preface_test.dart" />
- <option value="$PROJECT_DIR$/test/src/error_matchers.dart" />
- <option value="$PROJECT_DIR$/test/src/streams/helper.dart" />
- <option value="$PROJECT_DIR$/test/src/streams/simple_flow_test.dart" />
- <option value="$PROJECT_DIR$/test/src/streams/simple_push_test.dart" />
- <option value="$PROJECT_DIR$/test/src/streams/streams_test.dart" />
- <option value="$PROJECT_DIR$/lib/src/testing/client.dart" />
- <option value="$PROJECT_DIR$/pubspec.yaml" />
- <option value="$PROJECT_DIR$/CHANGELOG.md" />
- <option value="$PROJECT_DIR$/lib/http2.dart" />
- </list>
- </option>
- </component>
- <component name="ProjectFrameBounds">
- <option name="x" value="447" />
- <option name="y" value="54" />
- <option name="width" value="1831" />
- <option name="height" value="1435" />
- </component>
- <component name="ProjectLevelVcsManager">
- <ConfirmationsSetting value="1" id="Add" />
- </component>
- <component name="ProjectView">
- <navigator proportions="" version="1">
- <foldersAlwaysOnTop value="true" />
- </navigator>
- <panes>
- <pane id="ProjectPane">
- <subPane>
- <expand>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="doc" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="doc" type="462c0819:PsiDirectoryNode" />
- <item name="api" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="example" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="lib" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="lib" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="manual_test" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="http2" type="b2602c69:ProjectViewProjectNode" />
- <item name="http2" type="462c0819:PsiDirectoryNode" />
- <item name="test" type="462c0819:PsiDirectoryNode" />
- </path>
- </expand>
- <select />
- </subPane>
- </pane>
- <pane id="PackagesPane" />
- <pane id="Scope" />
- <pane id="AndroidView" />
- </panes>
- </component>
- <component name="PropertiesComponent">
- <property name="dart.analysis.tool.window.force.activate" value="false" />
- <property name="last_opened_file_path" value="$PROJECT_DIR$" />
- </component>
- <component name="RunDashboard">
- <option name="ruleStates">
- <list>
- <RuleState>
- <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
- </RuleState>
- <RuleState>
- <option name="name" value="StatusDashboardGroupingRule" />
- </RuleState>
- </list>
- </option>
- </component>
- <component name="RunManager" selected="Dart Test.tests in http2">
- <configuration default="true" type="Application" factoryName="Application">
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- </configuration>
- <configuration name="display_headers.dart" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" temporary="true" nameIsGenerated="true">
- <option name="filePath" value="$PROJECT_DIR$/example/display_headers.dart" />
- <option name="workingDirectory" value="$PROJECT_DIR$" />
- </configuration>
- <configuration name="minimal.dart" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" temporary="true" nameIsGenerated="true">
- <option name="filePath" value="$PROJECT_DIR$/example/minimal.dart" />
- <option name="workingDirectory" value="$PROJECT_DIR$" />
- </configuration>
- <configuration name="request_resource.dart" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application" temporary="true" nameIsGenerated="true">
- <option name="filePath" value="$PROJECT_DIR$/example/request_resource.dart" />
- <option name="workingDirectory" value="$PROJECT_DIR$" />
- </configuration>
- <configuration name="tests in http2" type="DartTestRunConfigurationType" factoryName="Dart Test" temporary="true" nameIsGenerated="true">
- <option name="filePath" value="$PROJECT_DIR$" />
- <option name="scope" value="FOLDER" />
- </configuration>
- <configuration default="true" type="JUnit" factoryName="JUnit">
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="PACKAGE_NAME" />
- <option name="MAIN_CLASS_NAME" />
- <option name="METHOD_NAME" />
- <option name="TEST_OBJECT" value="class" />
- <option name="VM_PARAMETERS" value="-ea" />
- <option name="PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="%MODULE_WORKING_DIR%" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <option name="TEST_SEARCH_SCOPE">
- <value defaultName="singleModule" />
- </option>
- <patterns />
- </configuration>
- <configuration default="true" type="TestNG" factoryName="TestNG">
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="SUITE_NAME" />
- <option name="PACKAGE_NAME" />
- <option name="MAIN_CLASS_NAME" />
- <option name="METHOD_NAME" />
- <option name="GROUP_NAME" />
- <option name="TEST_OBJECT" value="CLASS" />
- <option name="VM_PARAMETERS" value="-ea" />
- <option name="PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="%MODULE_WORKING_DIR%" />
- <option name="OUTPUT_DIRECTORY" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <option name="TEST_SEARCH_SCOPE">
- <value defaultName="singleModule" />
- </option>
- <option name="USE_DEFAULT_REPORTERS" value="false" />
- <option name="PROPERTIES_FILE" />
- <properties />
- <listeners />
- </configuration>
- <list>
- <item itemvalue="Dart Command Line App.request_resource.dart" />
- <item itemvalue="Dart Command Line App.display_headers.dart" />
- <item itemvalue="Dart Command Line App.minimal.dart" />
- <item itemvalue="Dart Test.tests in http2" />
- </list>
- <recent_temporary>
- <list>
- <item itemvalue="Dart Test.tests in http2" />
- <item itemvalue="Dart Command Line App.minimal.dart" />
- <item itemvalue="Dart Command Line App.display_headers.dart" />
- <item itemvalue="Dart Command Line App.request_resource.dart" />
- </list>
- </recent_temporary>
- </component>
- <component name="SvnConfiguration">
- <configuration />
- </component>
- <component name="TaskManager">
- <task active="true" id="Default" summary="Default task">
- <changelist id="ac17af96-834b-47c0-bec3-b5f93f5e3dc2" name="Default" comment="" />
- <created>1540293392764</created>
- <option name="number" value="Default" />
- <option name="presentableId" value="Default" />
- <updated>1540293392764</updated>
- </task>
- <servers />
- </component>
- <component name="TestHistory">
- <history-entry file="tests_in_http2 - 2018.12.13 at 14h 57m 07s.xml">
- <configuration name="tests in http2" configurationId="DartTestRunConfigurationType" />
- </history-entry>
- </component>
- <component name="ToolWindowManager">
- <frame x="447" y="54" width="1831" height="1435" extended-state="0" />
- <layout>
- <window_info anchor="right" id="Palette" order="3" />
- <window_info anchor="bottom" id="TODO" order="6" />
- <window_info anchor="bottom" id="Messages" weight="0.32981133" />
- <window_info anchor="right" id="Palette	" order="3" />
- <window_info id="Image Layers" order="2" />
- <window_info anchor="right" id="Capture Analysis" order="3" />
- <window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
- <window_info anchor="right" id="Maven Projects" order="3" />
- <window_info anchor="bottom" id="Dart Analysis" order="7" weight="0.32981133" />
- <window_info anchor="bottom" id="Run" order="2" weight="0.35698113" />
- <window_info anchor="bottom" id="Version Control" order="7" weight="0.60075474" />
- <window_info anchor="bottom" id="Code Review" order="7" />
- <window_info active="true" anchor="bottom" id="Terminal" order="7" visible="true" weight="0.2792453" />
- <window_info id="Capture Tool" order="2" />
- <window_info id="Designer" order="2" />
- <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.24986331" />
- <window_info anchor="bottom" id="Find" order="1" weight="0.15773585" />
- <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
- <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
- <window_info id="UI Designer" order="2" />
- <window_info anchor="right" id="Theme Preview" order="3" />
- <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
- <window_info id="Favorites" order="2" side_tool="true" />
- <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
- <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
- <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
- <window_info anchor="bottom" id="Message" order="0" />
- <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
- </layout>
- </component>
- <component name="VcsContentAnnotationSettings">
- <option name="myLimit" value="2678400000" />
- </component>
- <component name="XDebuggerManager">
- <breakpoint-manager>
- <breakpoints>
- <line-breakpoint enabled="true" type="Dart">
- <url>file://$PROJECT_DIR$/lib/src/flowcontrol/connection_queues.dart</url>
- </line-breakpoint>
- </breakpoints>
- <option name="time" value="1" />
- </breakpoint-manager>
- </component>
- <component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/lib/transport.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="795">
- <caret line="156" column="33" selection-start-line="156" selection-start-column="33" selection-end-line="156" selection-end-column="33" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/streams/stream_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="2715">
- <caret line="198" column="27" selection-start-line="198" selection-start-column="27" selection-end-line="198" selection-end-column="27" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/error_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="960">
- <caret line="68" column="17" selection-start-line="68" selection-start-column="17" selection-end-line="68" selection-end-column="17" />
- <folding>
- <element signature="e#251#271#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/stream_queues.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="4020">
- <caret line="280" column="7" selection-start-line="280" selection-start-column="7" selection-end-line="280" selection-end-column="7" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/connection_queues.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="2895">
- <caret line="210" column="15" selection-start-line="210" selection-start-column="15" selection-end-line="210" selection-end-column="15" />
- <folding>
- <element signature="e#410#430#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/connection.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="5820">
- <caret line="405" column="61" selection-start-line="405" selection-start-column="61" selection-end-line="405" selection-end-column="61" />
- <folding>
- <element signature="e#0#17299#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/example/request_resource.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="90">
- <caret line="6" column="22" lean-forward="true" selection-start-line="6" selection-start-column="22" selection-end-line="6" selection-end-column="22" />
- <folding>
- <element signature="e#0#20#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$USER_HOME$/install/dart-sdk/lib/io/secure_socket.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="150">
- <caret line="12" column="15" selection-start-line="12" selection-start-column="15" selection-end-line="12" selection-end-column="15" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/example/minimal.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="495">
- <caret line="33" column="26" selection-start-line="33" selection-start-column="26" selection-end-line="33" selection-end-column="26" />
- <folding>
- <element signature="e#0#22#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/example/display_headers.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="60">
- <caret line="4" column="27" selection-start-line="4" selection-start-column="27" selection-end-line="4" selection-end-column="27" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/doc/api/index.html">
- <provider selected="true" editor-type-id="text-editor" />
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/error_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#251#271#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/connection_preface.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="60">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#0#3195#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/sync_errors.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="60">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/connection_queues.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="8" selection-start-line="8" selection-end-line="8" />
- <folding>
- <element signature="e#410#430#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/stream_queues.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/window.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" column="14" lean-forward="true" selection-start-line="4" selection-start-column="14" selection-end-line="4" selection-end-column="14" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/flowcontrol/window_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/frames/frame_defragmenter.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/frames/frames.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/hpack/hpack.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="15">
- <caret line="7" selection-start-line="7" selection-end-line="7" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/hpack/huffman.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/hpack/huffman_table.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/settings/settings.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/streams/stream_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/testing/debug.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/multiprotocol_server_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/server_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/connection_preface_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/error_matchers.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/streams/helper.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/streams/simple_flow_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/streams/simple_push_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/src/streams/streams_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/ping/ping_handler.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/artificial_server_socket.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#216#236#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/async_utils/async_utils.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/byte_utils.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/client_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/connection.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state>
- <folding>
- <element signature="e#0#17299#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/client_websites_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/src/testing/client.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- <folding>
- <element signature="e#217#237#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/pubspec.yaml">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="150">
- <caret line="10" column="17" selection-start-line="10" selection-start-column="17" selection-end-line="10" selection-end-column="17" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/test/transport_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="333">
- <caret line="512" column="9" selection-start-line="512" selection-start-column="9" selection-end-line="512" selection-end-column="9" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/manual_test/out_of_stream_ids_test.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state>
- <folding>
- <element signature="e#0#2139#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/README.md">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="13">
- <caret line="13" column="27" selection-start-line="13" selection-start-column="27" selection-end-line="13" selection-end-column="27" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/transport.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="15">
- <caret line="1" column="12" selection-start-line="1" selection-start-column="12" selection-end-line="1" selection-end-column="12" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/multiprotocol_server.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="30">
- <caret line="4" selection-start-line="4" selection-end-line="4" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/codereview.settings">
- <provider selected="true" editor-type-id="text-editor" />
- </entry>
- <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="75">
- <caret line="5" column="48" selection-start-line="5" selection-start-column="48" selection-end-line="5" selection-end-column="48" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/lib/http2.dart">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="720">
- <caret line="48" lean-forward="true" selection-start-line="48" selection-end-line="48" />
- <folding>
- <element signature="e#0#2418#0" expanded="true" />
- <element signature="e#2364#2388#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- </component>
- <component name="masterDetails">
- <states>
- <state key="ProjectJDKs.UI">
- <settings>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- </states>
- </component>
-</project>
\ No newline at end of file
diff --git a/http2/.test_config b/http2/.test_config
deleted file mode 100644
index 2fa4b96..0000000
--- a/http2/.test_config
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "test_package": {
- "platforms" : ["vm"]
- }
-}
diff --git a/http2/.travis.yml b/http2/.travis.yml
deleted file mode 100644
index 9d69cdd..0000000
--- a/http2/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: dart
-dart:
- - dev
-
-dart_task:
- - test
- - dartfmt
- - dartanalyzer
-
-# Only building master means that we don't run two builds for each pull request.
-branches:
- only: [master]
-
-cache:
- directories:
- - $HOME/.pub-cache
diff --git a/http2/AUTHORS b/http2/AUTHORS
deleted file mode 100644
index 93b7228..0000000
--- a/http2/AUTHORS
+++ /dev/null
@@ -1,8 +0,0 @@
-# Below is a list of people and organizations that have contributed
-# to the project. Names should be added to the list like so:
-#
-# Name/Organization <email address>
-
-Google Inc. <*@google.com>
-
-Alexandre Ardhuin <alexandre.ardhuin@gmail.com>
diff --git a/http2/BUILD.gn b/http2/BUILD.gn
deleted file mode 100644
index 3e07fb2..0000000
--- a/http2/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is generated by importer.py for http2-1.0.0
-
-import("//build/dart/dart_library.gni")
-
-dart_library("http2") {
- package_name = "http2"
-
- # This parameter is left empty as we don't care about analysis or exporting
- # these sources outside of the tree.
- sources = []
-
- disable_analysis = true
-
- deps = [
- ]
-}
diff --git a/http2/CHANGELOG.md b/http2/CHANGELOG.md
deleted file mode 100644
index 641a73b..0000000
--- a/http2/CHANGELOG.md
+++ /dev/null
@@ -1,80 +0,0 @@
-## 1.0
-
-* Graduate package to 1.0.
-* `package:http2/http2.dart` now reexports `package:http2/transport.dart`.
-
-## 0.1.9
-
-* Discard messages incoming after stream cancellation.
-
-## 0.1.8+2
-
-* On connection termination, try to dispatch existing messages, thereby avoiding
- terminating existing streams.
-
-* Fix `ClientTransportConnection.isOpen` to return `false` if we have exhausted
- the number of max-concurrent-streams.
-
-## 0.1.8+1
-
-* Switch all uppercase constants from `dart:convert` to lowercase.
-
-## 0.1.8
-
-* More changes required for making tests pass under Dart 2.0 runtime.
-* Modify sdk constraint to require '>=2.0.0-dev.40.0'.
-
-## 0.1.7
-
-* Fixes for Dart 2.0.
-
-## 0.1.6
-
-* Strong mode fixes and other cleanup.
-
-## 0.1.5
-
-* Removed use of new `Function` syntax, since it isn't fully supported in Dart
- 1.24.
-
-## 0.1.4
-
-* Added an `onActiveStateChanged` callback to `Connection`, which is invoked when
- the connection changes state from idle to active or from active to idle. This
- can be used to implement an idle connection timeout.
-
-## 0.1.3
-
-* Fixed a bug where a closed window would not open correctly due to an increase
- in initial window size.
-
-## 0.1.2
-
-* The endStream bit is now set on the requested frame, instead of on an empty
- data frame following it.
-* Added an `onTerminated` hook that is called when a TransportStream receives
- a RST_STREAM frame.
-
-## 0.1.1+2
-
-* Add errorCode to exception toString message.
-
-## 0.1.1+1
-
-* Fixing a performance issue in case the underlying socket is not writeable
-* Allow clients of MultiProtocolHttpServer to supply [http.ServerSettings]
-* Allow the draft version 'h2-14' in the ALPN protocol negogiation.
-
-## 0.1.1
-
-* Adding support for MultiProtocolHttpServer in the
- `package:http2/multiprotocol_server.dart` library
-
-## 0.1.0
-
-* First version of a HTTP/2 transport implementation in the
- `package:http2/transport.dart` library
-
-## 0.0.1
-
-- Initial version
diff --git a/http2/CONTRIBUTING.md b/http2/CONTRIBUTING.md
deleted file mode 100644
index 6f5e0ea..0000000
--- a/http2/CONTRIBUTING.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Want to contribute? Great! First, read this page (including the small print at
-the end).
-
-### Before you contribute
-Before we can use your code, you must sign the
-[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
-(CLA), which you can do online. The CLA is necessary mainly because you own the
-copyright to your changes, even after your contribution becomes part of our
-codebase, so we need your permission to use and distribute your code. We also
-need to be sure of various other things—for instance that you'll tell us if you
-know that your code infringes on other people's patents. You don't have to sign
-the CLA until after you've submitted your code for review and a member has
-approved it, but you must do it before we can put your code into our codebase.
-
-Before you start working on a larger contribution, you should get in touch with
-us first through the issue tracker with your idea so that we can help out and
-possibly guide you. Coordinating up front makes it much easier to avoid
-frustration later on.
-
-### Code reviews
-All submissions, including submissions by project members, require review.
-
-### File headers
-All files in the project must start with the following header.
-
- // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
- // for details. All rights reserved. Use of this source code is governed by a
- // BSD-style license that can be found in the LICENSE file.
-
-### The small print
-Contributions made by corporations are covered by a different agreement than the
-one above, the
-[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/http2/LICENSE b/http2/LICENSE
deleted file mode 100644
index de31e1a..0000000
--- a/http2/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2015, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of Google Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/http2/README.md b/http2/README.md
deleted file mode 100644
index b910282..0000000
--- a/http2/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# HTTP/2 for Dart
-
-This library provides an http/2 interface on top of a bidirectional stream of bytes.
-
-## Usage:
-
-Here is a minimal example of connecting to a http/2 capable server, requesting a resource and
-iterating over the response.
-
-```dart
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:http2/http2.dart';
-
-main() async {
- var uri = Uri.parse('https://www.google.com/');
-
- var transport = new ClientTransportConnection.viaSocket(
- await SecureSocket.connect(
- uri.host,
- uri.port,
- supportedProtocols: ['h2'],
- ),
- );
-
- var stream = transport.makeRequest(
- [
- new Header.ascii(':method', 'GET'),
- new Header.ascii(':path', uri.path),
- new Header.ascii(':scheme', uri.scheme),
- new Header.ascii(':authority', uri.host),
- ],
- endStream: true,
- );
-
- await for (var message in stream.incomingMessages) {
- if (message is HeadersStreamMessage) {
- for (var header in message.headers) {
- var name = utf8.decode(header.name);
- var value = utf8.decode(header.value);
- print('Header: $name: $value');
- }
- } else if (message is DataStreamMessage) {
- // Use [message.bytes] (but respect 'content-encoding' header)
- }
- }
- await transport.finish();
-}
-```
-
-An example with better error handling is available [here][example].
-
-See the [API docs][api] for more details.
-
-## Features and bugs
-
-Please file feature requests and bugs at the [issue tracker][tracker].
-
-[tracker]: https://github.com/dart-lang/http2/issues
-[api]: http://www.dartdocs.org/documentation/http2/latest
-[example]: https://github.com/dart-lang/http2/blob/master/example/display_headers.dart.
diff --git a/http2/analysis_options.yaml b/http2/analysis_options.yaml
deleted file mode 100644
index 7244d25..0000000
--- a/http2/analysis_options.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-analyzer:
- strong-mode: true
- errors:
- unused_element: error
- unused_import: error
- unused_local_variable: error
- dead_code: error
-linter:
- rules:
- #- annotate_overrides
- - avoid_empty_else
- - avoid_init_to_null
- - avoid_return_types_on_setters
- - await_only_futures
- - camel_case_types
- - comment_references
- - control_flow_in_finally
- - directives_ordering
- - empty_catches
- - empty_constructor_bodies
- - empty_statements
- - hash_and_equals
- - implementation_imports
- - library_names
- - library_prefixes
- - non_constant_identifier_names
- - only_throw_errors
- - prefer_final_fields
- - prefer_is_not_empty
- #- prefer_single_quotes
- - slash_for_doc_comments
- - test_types_in_equals
- - test_types_in_equals
- - throw_in_finally
- - type_init_formals
- - unrelated_type_equality_checks
- - valid_regexps
diff --git a/http2/codereview.settings b/http2/codereview.settings
deleted file mode 100644
index 69e23ea..0000000
--- a/http2/codereview.settings
+++ /dev/null
@@ -1,3 +0,0 @@
-CODE_REVIEW_SERVER: https://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/http2/commit/
-CC_LIST: reviews@dartlang.org
diff --git a/http2/doc/api/index.json b/http2/doc/api/index.json
deleted file mode 100644
index 2b4e5bf..0000000
--- a/http2/doc/api/index.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"name":"http2.http2","qualifiedName":"http2.http2","href":"http2.http2/http2.http2-library.html","type":"library","overriddenDepth":0},{"name":"Header","qualifiedName":"http2.http2.Header","href":"http2.http2/Header-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"http2.http2","type":"library"}},{"name":"Header","qualifiedName":"http2.http2.Header","href":"http2.http2/Header/Header.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"operator ==","qualifiedName":"http2.http2.Header.==","href":"http2.http2/Header/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"Header.ascii","qualifiedName":"http2.http2.Header.ascii","href":"http2.http2/Header/Header.ascii.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"hashCode","qualifiedName":"http2.http2.Header.hashCode","href":"http2.http2/Header/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"name","qualifiedName":"http2.http2.Header.name","href":"http2.http2/Header/name.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"neverIndexed","qualifiedName":"http2.http2.Header.neverIndexed","href":"http2.http2/Header/neverIndexed.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"noSuchMethod","qualifiedName":"http2.http2.Header.noSuchMethod","href":"http2.http2/Header/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"runtimeType","qualifiedName":"http2.http2.Header.runtimeType","href":"http2.http2/Header/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"toString","qualifiedName":"http2.http2.Header.toString","href":"http2.http2/Header/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"value","qualifiedName":"http2.http2.Header.value","href":"http2.http2/Header/value.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Header","type":"class"}},{"name":"http2.multiprotocol_server","qualifiedName":"http2.multiprotocol_server","href":"http2.multiprotocol_server/http2.multiprotocol_server-library.html","type":"library","overriddenDepth":0},{"name":"MultiProtocolHttpServer","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer","href":"http2.multiprotocol_server/MultiProtocolHttpServer-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"http2.multiprotocol_server","type":"library"}},{"name":"operator ==","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.==","href":"http2.multiprotocol_server/MultiProtocolHttpServer/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"address","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.address","href":"http2.multiprotocol_server/MultiProtocolHttpServer/address.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"bind","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.bind","href":"http2.multiprotocol_server/MultiProtocolHttpServer/bind.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"close","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.close","href":"http2.multiprotocol_server/MultiProtocolHttpServer/close.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"hashCode","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.hashCode","href":"http2.multiprotocol_server/MultiProtocolHttpServer/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"noSuchMethod","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.noSuchMethod","href":"http2.multiprotocol_server/MultiProtocolHttpServer/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"port","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.port","href":"http2.multiprotocol_server/MultiProtocolHttpServer/port.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"runtimeType","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.runtimeType","href":"http2.multiprotocol_server/MultiProtocolHttpServer/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"startServing","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.startServing","href":"http2.multiprotocol_server/MultiProtocolHttpServer/startServing.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"toString","qualifiedName":"http2.multiprotocol_server.MultiProtocolHttpServer.toString","href":"http2.multiprotocol_server/MultiProtocolHttpServer/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"MultiProtocolHttpServer","type":"class"}},{"name":"transport","qualifiedName":"transport","href":"transport/transport-library.html","type":"library","overriddenDepth":0},{"name":"ActiveStateHandler","qualifiedName":"transport.ActiveStateHandler","href":"transport/ActiveStateHandler.html","type":"typedef","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"ClientSettings","qualifiedName":"transport.ClientSettings","href":"transport/ClientSettings-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"ClientSettings","qualifiedName":"transport.ClientSettings","href":"transport/ClientSettings/ClientSettings.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ClientSettings","type":"class"}},{"name":"allowServerPushes","qualifiedName":"transport.ClientSettings.allowServerPushes","href":"transport/ClientSettings/allowServerPushes.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"ClientSettings","type":"class"}},{"name":"ClientTransportConnection","qualifiedName":"transport.ClientTransportConnection","href":"transport/ClientTransportConnection-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"isOpen","qualifiedName":"transport.ClientTransportConnection.isOpen","href":"transport/ClientTransportConnection/isOpen.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportConnection","type":"class"}},{"name":"makeRequest","qualifiedName":"transport.ClientTransportConnection.makeRequest","href":"transport/ClientTransportConnection/makeRequest.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportConnection","type":"class"}},{"name":"ClientTransportConnection.viaSocket","qualifiedName":"transport.ClientTransportConnection.viaSocket","href":"transport/ClientTransportConnection/ClientTransportConnection.viaSocket.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportConnection","type":"class"}},{"name":"ClientTransportConnection.viaStreams","qualifiedName":"transport.ClientTransportConnection.viaStreams","href":"transport/ClientTransportConnection/ClientTransportConnection.viaStreams.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportConnection","type":"class"}},{"name":"ClientTransportStream","qualifiedName":"transport.ClientTransportStream","href":"transport/ClientTransportStream-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"ClientTransportStream","qualifiedName":"transport.ClientTransportStream","href":"transport/ClientTransportStream/ClientTransportStream.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportStream","type":"class"}},{"name":"peerPushes","qualifiedName":"transport.ClientTransportStream.peerPushes","href":"transport/ClientTransportStream/peerPushes.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"ClientTransportStream","type":"class"}},{"name":"DataStreamMessage","qualifiedName":"transport.DataStreamMessage","href":"transport/DataStreamMessage-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"DataStreamMessage","qualifiedName":"transport.DataStreamMessage","href":"transport/DataStreamMessage/DataStreamMessage.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"DataStreamMessage","type":"class"}},{"name":"bytes","qualifiedName":"transport.DataStreamMessage.bytes","href":"transport/DataStreamMessage/bytes.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"DataStreamMessage","type":"class"}},{"name":"toString","qualifiedName":"transport.DataStreamMessage.toString","href":"transport/DataStreamMessage/toString.html","type":"method","overriddenDepth":1,"enclosedBy":{"name":"DataStreamMessage","type":"class"}},{"name":"HeadersStreamMessage","qualifiedName":"transport.HeadersStreamMessage","href":"transport/HeadersStreamMessage-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"HeadersStreamMessage","qualifiedName":"transport.HeadersStreamMessage","href":"transport/HeadersStreamMessage/HeadersStreamMessage.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"HeadersStreamMessage","type":"class"}},{"name":"headers","qualifiedName":"transport.HeadersStreamMessage.headers","href":"transport/HeadersStreamMessage/headers.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"HeadersStreamMessage","type":"class"}},{"name":"toString","qualifiedName":"transport.HeadersStreamMessage.toString","href":"transport/HeadersStreamMessage/toString.html","type":"method","overriddenDepth":1,"enclosedBy":{"name":"HeadersStreamMessage","type":"class"}},{"name":"ServerSettings","qualifiedName":"transport.ServerSettings","href":"transport/ServerSettings-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"ServerSettings","qualifiedName":"transport.ServerSettings","href":"transport/ServerSettings/ServerSettings.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ServerSettings","type":"class"}},{"name":"ServerTransportConnection","qualifiedName":"transport.ServerTransportConnection","href":"transport/ServerTransportConnection-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"incomingStreams","qualifiedName":"transport.ServerTransportConnection.incomingStreams","href":"transport/ServerTransportConnection/incomingStreams.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportConnection","type":"class"}},{"name":"ServerTransportConnection.viaSocket","qualifiedName":"transport.ServerTransportConnection.viaSocket","href":"transport/ServerTransportConnection/ServerTransportConnection.viaSocket.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportConnection","type":"class"}},{"name":"ServerTransportConnection.viaStreams","qualifiedName":"transport.ServerTransportConnection.viaStreams","href":"transport/ServerTransportConnection/ServerTransportConnection.viaStreams.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportConnection","type":"class"}},{"name":"ServerTransportStream","qualifiedName":"transport.ServerTransportStream","href":"transport/ServerTransportStream-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"ServerTransportStream","qualifiedName":"transport.ServerTransportStream","href":"transport/ServerTransportStream/ServerTransportStream.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportStream","type":"class"}},{"name":"canPush","qualifiedName":"transport.ServerTransportStream.canPush","href":"transport/ServerTransportStream/canPush.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportStream","type":"class"}},{"name":"push","qualifiedName":"transport.ServerTransportStream.push","href":"transport/ServerTransportStream/push.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"ServerTransportStream","type":"class"}},{"name":"Settings","qualifiedName":"transport.Settings","href":"transport/Settings-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"Settings","qualifiedName":"transport.Settings","href":"transport/Settings/Settings.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"operator ==","qualifiedName":"transport.Settings.==","href":"transport/Settings/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"concurrentStreamLimit","qualifiedName":"transport.Settings.concurrentStreamLimit","href":"transport/Settings/concurrentStreamLimit.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"hashCode","qualifiedName":"transport.Settings.hashCode","href":"transport/Settings/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.Settings.noSuchMethod","href":"transport/Settings/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.Settings.runtimeType","href":"transport/Settings/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"streamWindowSize","qualifiedName":"transport.Settings.streamWindowSize","href":"transport/Settings/streamWindowSize.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"toString","qualifiedName":"transport.Settings.toString","href":"transport/Settings/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"Settings","type":"class"}},{"name":"StreamMessage","qualifiedName":"transport.StreamMessage","href":"transport/StreamMessage-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"StreamMessage","qualifiedName":"transport.StreamMessage","href":"transport/StreamMessage/StreamMessage.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"operator ==","qualifiedName":"transport.StreamMessage.==","href":"transport/StreamMessage/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"endStream","qualifiedName":"transport.StreamMessage.endStream","href":"transport/StreamMessage/endStream.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"hashCode","qualifiedName":"transport.StreamMessage.hashCode","href":"transport/StreamMessage/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.StreamMessage.noSuchMethod","href":"transport/StreamMessage/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.StreamMessage.runtimeType","href":"transport/StreamMessage/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"toString","qualifiedName":"transport.StreamMessage.toString","href":"transport/StreamMessage/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"StreamMessage","type":"class"}},{"name":"StreamTransportException","qualifiedName":"transport.StreamTransportException","href":"transport/StreamTransportException-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"StreamTransportException","qualifiedName":"transport.StreamTransportException","href":"transport/StreamTransportException/StreamTransportException.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"StreamTransportException","type":"class"}},{"name":"TransportConnection","qualifiedName":"transport.TransportConnection","href":"transport/TransportConnection-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"TransportConnection","qualifiedName":"transport.TransportConnection","href":"transport/TransportConnection/TransportConnection.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"operator ==","qualifiedName":"transport.TransportConnection.==","href":"transport/TransportConnection/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"finish","qualifiedName":"transport.TransportConnection.finish","href":"transport/TransportConnection/finish.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"hashCode","qualifiedName":"transport.TransportConnection.hashCode","href":"transport/TransportConnection/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.TransportConnection.noSuchMethod","href":"transport/TransportConnection/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"onActiveStateChanged","qualifiedName":"transport.TransportConnection.onActiveStateChanged","href":"transport/TransportConnection/onActiveStateChanged.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"ping","qualifiedName":"transport.TransportConnection.ping","href":"transport/TransportConnection/ping.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.TransportConnection.runtimeType","href":"transport/TransportConnection/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"terminate","qualifiedName":"transport.TransportConnection.terminate","href":"transport/TransportConnection/terminate.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"toString","qualifiedName":"transport.TransportConnection.toString","href":"transport/TransportConnection/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportConnection","type":"class"}},{"name":"TransportConnectionException","qualifiedName":"transport.TransportConnectionException","href":"transport/TransportConnectionException-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"TransportConnectionException","qualifiedName":"transport.TransportConnectionException","href":"transport/TransportConnectionException/TransportConnectionException.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"TransportConnectionException","type":"class"}},{"name":"errorCode","qualifiedName":"transport.TransportConnectionException.errorCode","href":"transport/TransportConnectionException/errorCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportConnectionException","type":"class"}},{"name":"TransportException","qualifiedName":"transport.TransportException","href":"transport/TransportException-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"TransportException","qualifiedName":"transport.TransportException","href":"transport/TransportException/TransportException.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"operator ==","qualifiedName":"transport.TransportException.==","href":"transport/TransportException/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"hashCode","qualifiedName":"transport.TransportException.hashCode","href":"transport/TransportException/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"message","qualifiedName":"transport.TransportException.message","href":"transport/TransportException/message.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.TransportException.noSuchMethod","href":"transport/TransportException/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.TransportException.runtimeType","href":"transport/TransportException/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"toString","qualifiedName":"transport.TransportException.toString","href":"transport/TransportException/toString.html","type":"method","overriddenDepth":1,"enclosedBy":{"name":"TransportException","type":"class"}},{"name":"TransportStream","qualifiedName":"transport.TransportStream","href":"transport/TransportStream-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"TransportStream","qualifiedName":"transport.TransportStream","href":"transport/TransportStream/TransportStream.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"operator ==","qualifiedName":"transport.TransportStream.==","href":"transport/TransportStream/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"hashCode","qualifiedName":"transport.TransportStream.hashCode","href":"transport/TransportStream/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"id","qualifiedName":"transport.TransportStream.id","href":"transport/TransportStream/id.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"incomingMessages","qualifiedName":"transport.TransportStream.incomingMessages","href":"transport/TransportStream/incomingMessages.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.TransportStream.noSuchMethod","href":"transport/TransportStream/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"onTerminated","qualifiedName":"transport.TransportStream.onTerminated","href":"transport/TransportStream/onTerminated.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"outgoingMessages","qualifiedName":"transport.TransportStream.outgoingMessages","href":"transport/TransportStream/outgoingMessages.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.TransportStream.runtimeType","href":"transport/TransportStream/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"sendData","qualifiedName":"transport.TransportStream.sendData","href":"transport/TransportStream/sendData.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"sendHeaders","qualifiedName":"transport.TransportStream.sendHeaders","href":"transport/TransportStream/sendHeaders.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"terminate","qualifiedName":"transport.TransportStream.terminate","href":"transport/TransportStream/terminate.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"toString","qualifiedName":"transport.TransportStream.toString","href":"transport/TransportStream/toString.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStream","type":"class"}},{"name":"TransportStreamPush","qualifiedName":"transport.TransportStreamPush","href":"transport/TransportStreamPush-class.html","type":"class","overriddenDepth":0,"enclosedBy":{"name":"transport","type":"library"}},{"name":"TransportStreamPush","qualifiedName":"transport.TransportStreamPush","href":"transport/TransportStreamPush/TransportStreamPush.html","type":"constructor","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"operator ==","qualifiedName":"transport.TransportStreamPush.==","href":"transport/TransportStreamPush/operator_equals.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"hashCode","qualifiedName":"transport.TransportStreamPush.hashCode","href":"transport/TransportStreamPush/hashCode.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"noSuchMethod","qualifiedName":"transport.TransportStreamPush.noSuchMethod","href":"transport/TransportStreamPush/noSuchMethod.html","type":"method","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"requestHeaders","qualifiedName":"transport.TransportStreamPush.requestHeaders","href":"transport/TransportStreamPush/requestHeaders.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"runtimeType","qualifiedName":"transport.TransportStreamPush.runtimeType","href":"transport/TransportStreamPush/runtimeType.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"stream","qualifiedName":"transport.TransportStreamPush.stream","href":"transport/TransportStreamPush/stream.html","type":"property","overriddenDepth":0,"enclosedBy":{"name":"TransportStreamPush","type":"class"}},{"name":"toString","qualifiedName":"transport.TransportStreamPush.toString","href":"transport/TransportStreamPush/toString.html","type":"method","overriddenDepth":1,"enclosedBy":{"name":"TransportStreamPush","type":"class"}}]
diff --git a/http2/doc/api/static-assets/css/bootstrap.css.map b/http2/doc/api/static-assets/css/bootstrap.css.map
deleted file mode 100644
index 2fd84f3..0000000
--- a/http2/doc/api/static-assets/css/bootstrap.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACwBD;;;;;;;;;;;;;EAaE,gBAAA;EDtBD;AC8BD;;;;EAIE,uBAAA;EACA,0BAAA;ED5BD;ACoCD;EACE,eAAA;EACA,WAAA;EDlCD;AC0CD;;EAEE,eAAA;EDxCD;ACkDD;EACE,+BAAA;EDhDD;ACuDD;;EAEE,YAAA;EDrDD;AC+DD;EACE,2BAAA;ED7DD;ACoED;;EAEE,mBAAA;EDlED;ACyED;EACE,oBAAA;EDvED;AC+ED;EACE,gBAAA;EACA,kBAAA;ED7ED;ACoFD;EACE,kBAAA;EACA,aAAA;EDlFD;ACyFD;EACE,gBAAA;EDvFD;AC8FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED5FD;AC+FD;EACE,aAAA;ED7FD;ACgGD;EACE,iBAAA;ED9FD;ACwGD;EACE,WAAA;EDtGD;AC6GD;EACE,kBAAA;ED3GD;ACqHD;EACE,kBAAA;EDnHD;AC0HD;EACE,8BAAA;EACA,iCAAA;UAAA,yBAAA;EACA,WAAA;EDxHD;AC+HD;EACE,gBAAA;ED7HD;ACoID;;;;EAIE,mCAAA;EACA,gBAAA;EDlID;ACoJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDlJD;ACyJD;EACE,mBAAA;EDvJD;ACiKD;;EAEE,sBAAA;ED/JD;AC0KD;;;;EAIE,4BAAA;EACA,iBAAA;EDxKD;AC+KD;;EAEE,iBAAA;ED7KD;ACoLD;;EAEE,WAAA;EACA,YAAA;EDlLD;AC0LD;EACE,qBAAA;EDxLD;ACmMD;;EAEE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,YAAA;EDjMD;AC0MD;;EAEE,cAAA;EDxMD;ACiND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED/MD;ACwND;;EAEE,0BAAA;EDtND;AC6ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED3ND;ACmOD;EACE,WAAA;EACA,YAAA;EDjOD;ACwOD;EACE,gBAAA;EDtOD;AC8OD;EACE,mBAAA;ED5OD;ACsPD;EACE,2BAAA;EACA,mBAAA;EDpPD;ACuPD;;EAEE,YAAA;EDrPD;AACD,sFAAqF;AE1ErF;EAnGI;;;IAGI,oCAAA;IACA,wBAAA;IACA,qCAAA;YAAA,6BAAA;IACA,8BAAA;IFgLL;EE7KC;;IAEI,4BAAA;IF+KL;EE5KC;IACI,8BAAA;IF8KL;EE3KC;IACI,+BAAA;IF6KL;EExKC;;IAEI,aAAA;IF0KL;EEvKC;;IAEI,wBAAA;IACA,0BAAA;IFyKL;EEtKC;IACI,6BAAA;IFwKL;EErKC;;IAEI,0BAAA;IFuKL;EEpKC;IACI,4BAAA;IFsKL;EEnKC;;;IAGI,YAAA;IACA,WAAA;IFqKL;EElKC;;IAEI,yBAAA;IFoKL;EE7JC;IACI,6BAAA;IF+JL;EE3JC;IACI,eAAA;IF6JL;EE3JC;;IAGQ,mCAAA;IF4JT;EEzJC;IACI,wBAAA;IF2JL;EExJC;IACI,sCAAA;IF0JL;EE3JC;;IAKQ,mCAAA;IF0JT;EEvJC;;IAGQ,mCAAA;IFwJT;EACF;AGpPD;EACE,qCAAA;EACA,uDAAA;EACA,iYAAA;EHsPD;AG9OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EHgPD;AG5OmC;EAAW,gBAAA;EH+O9C;AG9OmC;EAAW,gBAAA;EHiP9C;AG/OmC;;EAAW,kBAAA;EHmP9C;AGlPmC;EAAW,kBAAA;EHqP9C;AGpPmC;EAAW,kBAAA;EHuP9C;AGtPmC;EAAW,kBAAA;EHyP9C;AGxPmC;EAAW,kBAAA;EH2P9C;AG1PmC;EAAW,kBAAA;EH6P9C;AG5PmC;EAAW,kBAAA;EH+P9C;AG9PmC;EAAW,kBAAA;EHiQ9C;AGhQmC;EAAW,kBAAA;EHmQ9C;AGlQmC;EAAW,kBAAA;EHqQ9C;AGpQmC;EAAW,kBAAA;EHuQ9C;AGtQmC;EAAW,kBAAA;EHyQ9C;AGxQmC;EAAW,kBAAA;EH2Q9C;AG1QmC;EAAW,kBAAA;EH6Q9C;AG5QmC;EAAW,kBAAA;EH+Q9C;AG9QmC;EAAW,kBAAA;EHiR9C;AGhRmC;EAAW,kBAAA;EHmR9C;AGlRmC;EAAW,kBAAA;EHqR9C;AGpRmC;EAAW,kBAAA;EHuR9C;AGtRmC;EAAW,kBAAA;EHyR9C;AGxRmC;EAAW,kBAAA;EH2R9C;AG1RmC;EAAW,kBAAA;EH6R9C;AG5RmC;EAAW,kBAAA;EH+R9C;AG9RmC;EAAW,kBAAA;EHiS9C;AGhSmC;EAAW,kBAAA;EHmS9C;AGlSmC;EAAW,kBAAA;EHqS9C;AGpSmC;EAAW,kBAAA;EHuS9C;AGtSmC;EAAW,kBAAA;EHyS9C;AGxSmC;EAAW,kBAAA;EH2S9C;AG1SmC;EAAW,kBAAA;EH6S9C;AG5SmC;EAAW,kBAAA;EH+S9C;AG9SmC;EAAW,kBAAA;EHiT9C;AGhTmC;EAAW,kBAAA;EHmT9C;AGlTmC;EAAW,kBAAA;EHqT9C;AGpTmC;EAAW,kBAAA;EHuT9C;AGtTmC;EAAW,kBAAA;EHyT9C;AGxTmC;EAAW,kBAAA;EH2T9C;AG1TmC;EAAW,kBAAA;EH6T9C;AG5TmC;EAAW,kBAAA;EH+T9C;AG9TmC;EAAW,kBAAA;EHiU9C;AGhUmC;EAAW,kBAAA;EHmU9C;AGlUmC;EAAW,kBAAA;EHqU9C;AGpUmC;EAAW,kBAAA;EHuU9C;AGtUmC;EAAW,kBAAA;EHyU9C;AGxUmC;EAAW,kBAAA;EH2U9C;AG1UmC;EAAW,kBAAA;EH6U9C;AG5UmC;EAAW,kBAAA;EH+U9C;AG9UmC;EAAW,kBAAA;EHiV9C;AGhVmC;EAAW,kBAAA;EHmV9C;AGlVmC;EAAW,kBAAA;EHqV9C;AGpVmC;EAAW,kBAAA;EHuV9C;AGtVmC;EAAW,kBAAA;EHyV9C;AGxVmC;EAAW,kBAAA;EH2V9C;AG1VmC;EAAW,kBAAA;EH6V9C;AG5VmC;EAAW,kBAAA;EH+V9C;AG9VmC;EAAW,kBAAA;EHiW9C;AGhWmC;EAAW,kBAAA;EHmW9C;AGlWmC;EAAW,kBAAA;EHqW9C;AGpWmC;EAAW,kBAAA;EHuW9C;AGtWmC;EAAW,kBAAA;EHyW9C;AGxWmC;EAAW,kBAAA;EH2W9C;AG1WmC;EAAW,kBAAA;EH6W9C;AG5WmC;EAAW,kBAAA;EH+W9C;AG9WmC;EAAW,kBAAA;EHiX9C;AGhXmC;EAAW,kBAAA;EHmX9C;AGlXmC;EAAW,kBAAA;EHqX9C;AGpXmC;EAAW,kBAAA;EHuX9C;AGtXmC;EAAW,kBAAA;EHyX9C;AGxXmC;EAAW,kBAAA;EH2X9C;AG1XmC;EAAW,kBAAA;EH6X9C;AG5XmC;EAAW,kBAAA;EH+X9C;AG9XmC;EAAW,kBAAA;EHiY9C;AGhYmC;EAAW,kBAAA;EHmY9C;AGlYmC;EAAW,kBAAA;EHqY9C;AGpYmC;EAAW,kBAAA;EHuY9C;AGtYmC;EAAW,kBAAA;EHyY9C;AGxYmC;EAAW,kBAAA;EH2Y9C;AG1YmC;EAAW,kBAAA;EH6Y9C;AG5YmC;EAAW,kBAAA;EH+Y9C;AG9YmC;EAAW,kBAAA;EHiZ9C;AGhZmC;EAAW,kBAAA;EHmZ9C;AGlZmC;EAAW,kBAAA;EHqZ9C;AGpZmC;EAAW,kBAAA;EHuZ9C;AGtZmC;EAAW,kBAAA;EHyZ9C;AGxZmC;EAAW,kBAAA;EH2Z9C;AG1ZmC;EAAW,kBAAA;EH6Z9C;AG5ZmC;EAAW,kBAAA;EH+Z9C;AG9ZmC;EAAW,kBAAA;EHia9C;AGhamC;EAAW,kBAAA;EHma9C;AGlamC;EAAW,kBAAA;EHqa9C;AGpamC;EAAW,kBAAA;EHua9C;AGtamC;EAAW,kBAAA;EHya9C;AGxamC;EAAW,kBAAA;EH2a9C;AG1amC;EAAW,kBAAA;EH6a9C;AG5amC;EAAW,kBAAA;EH+a9C;AG9amC;EAAW,kBAAA;EHib9C;AGhbmC;EAAW,kBAAA;EHmb9C;AGlbmC;EAAW,kBAAA;EHqb9C;AGpbmC;EAAW,kBAAA;EHub9C;AGtbmC;EAAW,kBAAA;EHyb9C;AGxbmC;EAAW,kBAAA;EH2b9C;AG1bmC;EAAW,kBAAA;EH6b9C;AG5bmC;EAAW,kBAAA;EH+b9C;AG9bmC;EAAW,kBAAA;EHic9C;AGhcmC;EAAW,kBAAA;EHmc9C;AGlcmC;EAAW,kBAAA;EHqc9C;AGpcmC;EAAW,kBAAA;EHuc9C;AGtcmC;EAAW,kBAAA;EHyc9C;AGxcmC;EAAW,kBAAA;EH2c9C;AG1cmC;EAAW,kBAAA;EH6c9C;AG5cmC;EAAW,kBAAA;EH+c9C;AG9cmC;EAAW,kBAAA;EHid9C;AGhdmC;EAAW,kBAAA;EHmd9C;AGldmC;EAAW,kBAAA;EHqd9C;AGpdmC;EAAW,kBAAA;EHud9C;AGtdmC;EAAW,kBAAA;EHyd9C;AGxdmC;EAAW,kBAAA;EH2d9C;AG1dmC;EAAW,kBAAA;EH6d9C;AG5dmC;EAAW,kBAAA;EH+d9C;AG9dmC;EAAW,kBAAA;EHie9C;AGhemC;EAAW,kBAAA;EHme9C;AGlemC;EAAW,kBAAA;EHqe9C;AGpemC;EAAW,kBAAA;EHue9C;AGtemC;EAAW,kBAAA;EHye9C;AGxemC;EAAW,kBAAA;EH2e9C;AG1emC;EAAW,kBAAA;EH6e9C;AG5emC;EAAW,kBAAA;EH+e9C;AG9emC;EAAW,kBAAA;EHif9C;AGhfmC;EAAW,kBAAA;EHmf9C;AGlfmC;EAAW,kBAAA;EHqf9C;AGpfmC;EAAW,kBAAA;EHuf9C;AGtfmC;EAAW,kBAAA;EHyf9C;AGxfmC;EAAW,kBAAA;EH2f9C;AG1fmC;EAAW,kBAAA;EH6f9C;AG5fmC;EAAW,kBAAA;EH+f9C;AG9fmC;EAAW,kBAAA;EHigB9C;AGhgBmC;EAAW,kBAAA;EHmgB9C;AGlgBmC;EAAW,kBAAA;EHqgB9C;AGpgBmC;EAAW,kBAAA;EHugB9C;AGtgBmC;EAAW,kBAAA;EHygB9C;AGxgBmC;EAAW,kBAAA;EH2gB9C;AG1gBmC;EAAW,kBAAA;EH6gB9C;AG5gBmC;EAAW,kBAAA;EH+gB9C;AG9gBmC;EAAW,kBAAA;EHihB9C;AGhhBmC;EAAW,kBAAA;EHmhB9C;AGlhBmC;EAAW,kBAAA;EHqhB9C;AGphBmC;EAAW,kBAAA;EHuhB9C;AGthBmC;EAAW,kBAAA;EHyhB9C;AGxhBmC;EAAW,kBAAA;EH2hB9C;AG1hBmC;EAAW,kBAAA;EH6hB9C;AG5hBmC;EAAW,kBAAA;EH+hB9C;AG9hBmC;EAAW,kBAAA;EHiiB9C;AGhiBmC;EAAW,kBAAA;EHmiB9C;AGliBmC;EAAW,kBAAA;EHqiB9C;AGpiBmC;EAAW,kBAAA;EHuiB9C;AGtiBmC;EAAW,kBAAA;EHyiB9C;AGxiBmC;EAAW,kBAAA;EH2iB9C;AG1iBmC;EAAW,kBAAA;EH6iB9C;AG5iBmC;EAAW,kBAAA;EH+iB9C;AG9iBmC;EAAW,kBAAA;EHijB9C;AGhjBmC;EAAW,kBAAA;EHmjB9C;AGljBmC;EAAW,kBAAA;EHqjB9C;AGpjBmC;EAAW,kBAAA;EHujB9C;AGtjBmC;EAAW,kBAAA;EHyjB9C;AGxjBmC;EAAW,kBAAA;EH2jB9C;AG1jBmC;EAAW,kBAAA;EH6jB9C;AG5jBmC;EAAW,kBAAA;EH+jB9C;AG9jBmC;EAAW,kBAAA;EHikB9C;AGhkBmC;EAAW,kBAAA;EHmkB9C;AGlkBmC;EAAW,kBAAA;EHqkB9C;AGpkBmC;EAAW,kBAAA;EHukB9C;AGtkBmC;EAAW,kBAAA;EHykB9C;AGxkBmC;EAAW,kBAAA;EH2kB9C;AG1kBmC;EAAW,kBAAA;EH6kB9C;AG5kBmC;EAAW,kBAAA;EH+kB9C;AG9kBmC;EAAW,kBAAA;EHilB9C;AGhlBmC;EAAW,kBAAA;EHmlB9C;AGllBmC;EAAW,kBAAA;EHqlB9C;AGplBmC;EAAW,kBAAA;EHulB9C;AGtlBmC;EAAW,kBAAA;EHylB9C;AGxlBmC;EAAW,kBAAA;EH2lB9C;AG1lBmC;EAAW,kBAAA;EH6lB9C;AG5lBmC;EAAW,kBAAA;EH+lB9C;AG9lBmC;EAAW,kBAAA;EHimB9C;AGhmBmC;EAAW,kBAAA;EHmmB9C;AGlmBmC;EAAW,kBAAA;EHqmB9C;AGpmBmC;EAAW,kBAAA;EHumB9C;AGtmBmC;EAAW,kBAAA;EHymB9C;AGxmBmC;EAAW,kBAAA;EH2mB9C;AG1mBmC;EAAW,kBAAA;EH6mB9C;AG5mBmC;EAAW,kBAAA;EH+mB9C;AG9mBmC;EAAW,kBAAA;EHinB9C;AGhnBmC;EAAW,kBAAA;EHmnB9C;AGlnBmC;EAAW,kBAAA;EHqnB9C;AGpnBmC;EAAW,kBAAA;EHunB9C;AGtnBmC;EAAW,kBAAA;EHynB9C;AGxnBmC;EAAW,kBAAA;EH2nB9C;AG1nBmC;EAAW,kBAAA;EH6nB9C;AG5nBmC;EAAW,kBAAA;EH+nB9C;AG9nBmC;EAAW,kBAAA;EHioB9C;AGhoBmC;EAAW,kBAAA;EHmoB9C;AGloBmC;EAAW,kBAAA;EHqoB9C;AGpoBmC;EAAW,kBAAA;EHuoB9C;AGtoBmC;EAAW,kBAAA;EHyoB9C;AGhoBmC;EAAW,kBAAA;EHmoB9C;AGloBmC;EAAW,kBAAA;EHqoB9C;AGpoBmC;EAAW,kBAAA;EHuoB9C;AGtoBmC;EAAW,kBAAA;EHyoB9C;AGxoBmC;EAAW,kBAAA;EH2oB9C;AG1oBmC;EAAW,kBAAA;EH6oB9C;AG5oBmC;EAAW,kBAAA;EH+oB9C;AG9oBmC;EAAW,kBAAA;EHipB9C;AGhpBmC;EAAW,kBAAA;EHmpB9C;AGlpBmC;EAAW,kBAAA;EHqpB9C;AGppBmC;EAAW,kBAAA;EHupB9C;AGtpBmC;EAAW,kBAAA;EHypB9C;AGxpBmC;EAAW,kBAAA;EH2pB9C;AG1pBmC;EAAW,kBAAA;EH6pB9C;AG5pBmC;EAAW,kBAAA;EH+pB9C;AG9pBmC;EAAW,kBAAA;EHiqB9C;AGhqBmC;EAAW,kBAAA;EHmqB9C;AGlqBmC;EAAW,kBAAA;EHqqB9C;AGpqBmC;EAAW,kBAAA;EHuqB9C;AGtqBmC;EAAW,kBAAA;EHyqB9C;AGxqBmC;EAAW,kBAAA;EH2qB9C;AG1qBmC;EAAW,kBAAA;EH6qB9C;AG5qBmC;EAAW,kBAAA;EH+qB9C;AG9qBmC;EAAW,kBAAA;EHirB9C;AGhrBmC;EAAW,kBAAA;EHmrB9C;AGlrBmC;EAAW,kBAAA;EHqrB9C;AGprBmC;EAAW,kBAAA;EHurB9C;AGtrBmC;EAAW,kBAAA;EHyrB9C;AGxrBmC;EAAW,kBAAA;EH2rB9C;AG1rBmC;EAAW,kBAAA;EH6rB9C;AG5rBmC;EAAW,kBAAA;EH+rB9C;AG9rBmC;EAAW,kBAAA;EHisB9C;AGhsBmC;EAAW,kBAAA;EHmsB9C;AGlsBmC;EAAW,kBAAA;EHqsB9C;AGpsBmC;EAAW,kBAAA;EHusB9C;AGtsBmC;EAAW,kBAAA;EHysB9C;AGxsBmC;EAAW,kBAAA;EH2sB9C;AG1sBmC;EAAW,kBAAA;EH6sB9C;AG5sBmC;EAAW,kBAAA;EH+sB9C;AG9sBmC;EAAW,kBAAA;EHitB9C;AGhtBmC;EAAW,kBAAA;EHmtB9C;AGltBmC;EAAW,kBAAA;EHqtB9C;AGptBmC;EAAW,kBAAA;EHutB9C;AGttBmC;EAAW,kBAAA;EHytB9C;AGxtBmC;EAAW,kBAAA;EH2tB9C;AG1tBmC;EAAW,kBAAA;EH6tB9C;AG5tBmC;EAAW,kBAAA;EH+tB9C;AG9tBmC;EAAW,kBAAA;EHiuB9C;AGhuBmC;EAAW,kBAAA;EHmuB9C;AGluBmC;EAAW,kBAAA;EHquB9C;AGpuBmC;EAAW,kBAAA;EHuuB9C;AGtuBmC;EAAW,kBAAA;EHyuB9C;AGxuBmC;EAAW,kBAAA;EH2uB9C;AG1uBmC;EAAW,kBAAA;EH6uB9C;AG5uBmC;EAAW,kBAAA;EH+uB9C;AG9uBmC;EAAW,kBAAA;EHivB9C;AIvhCD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;EL09BT;AIzhCD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELg+BT;AIvhCD;EACE,iBAAA;EACA,+CAAA;EJyhCD;AIthCD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJwhCD;AIphCD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJshCD;AIhhCD;EACE,gBAAA;EACA,uBAAA;EJkhCD;AIhhCC;;EAEE,gBAAA;EACA,4BAAA;EJkhCH;AI/gCC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENskCD;AIzgCD;EACE,WAAA;EJ2gCD;AIrgCD;EACE,wBAAA;EJugCD;AIngCD;;;;;EGvEE,gBAAA;EACA,iBAAA;EACA,cAAA;EPilCD;AIvgCD;EACE,oBAAA;EJygCD;AIngCD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC6FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEvLR,uBAAA;EACA,iBAAA;EACA,cAAA;EPimCD;AIngCD;EACE,oBAAA;EJqgCD;AI//BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJigCD;AIz/BD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJ2/BD;AIn/BC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJq/BH;AIz+BD;EACE,iBAAA;EJ2+BD;AQnoCD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ER+oCD;AQppCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ERqqCH;AQjqCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERsqCD;AQ1qCD;;;;;;;;;;;;EAQI,gBAAA;ERgrCH;AQ7qCD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERkrCD;AQtrCD;;;;;;;;;;;;EAQI,gBAAA;ER4rCH;AQxrCD;;EAAU,iBAAA;ER4rCT;AQ3rCD;;EAAU,iBAAA;ER+rCT;AQ9rCD;;EAAU,iBAAA;ERksCT;AQjsCD;;EAAU,iBAAA;ERqsCT;AQpsCD;;EAAU,iBAAA;ERwsCT;AQvsCD;;EAAU,iBAAA;ER2sCT;AQrsCD;EACE,kBAAA;ERusCD;AQpsCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ERssCD;AQjsCD;EAAA;IAFI,iBAAA;IRusCD;EACF;AQ/rCD;;EAEE,gBAAA;ERisCD;AQ9rCD;;EAEE,2BAAA;EACA,eAAA;ERgsCD;AQ5rCD;EAAuB,kBAAA;ER+rCtB;AQ9rCD;EAAuB,mBAAA;ERisCtB;AQhsCD;EAAuB,oBAAA;ERmsCtB;AQlsCD;EAAuB,qBAAA;ERqsCtB;AQpsCD;EAAuB,qBAAA;ERusCtB;AQpsCD;EAAuB,2BAAA;ERusCtB;AQtsCD;EAAuB,2BAAA;ERysCtB;AQxsCD;EAAuB,4BAAA;ER2sCtB;AQxsCD;EACE,gBAAA;ER0sCD;AQxsCD;ECrGE,gBAAA;ETgzCD;AS/yCC;EACE,gBAAA;ETizCH;AQ3sCD;ECxGE,gBAAA;ETszCD;ASrzCC;EACE,gBAAA;ETuzCH;AQ9sCD;EC3GE,gBAAA;ET4zCD;AS3zCC;EACE,gBAAA;ET6zCH;AQjtCD;EC9GE,gBAAA;ETk0CD;ASj0CC;EACE,gBAAA;ETm0CH;AQptCD;ECjHE,gBAAA;ETw0CD;ASv0CC;EACE,gBAAA;ETy0CH;AQntCD;EAGE,aAAA;EE3HA,2BAAA;EV+0CD;AU90CC;EACE,2BAAA;EVg1CH;AQptCD;EE9HE,2BAAA;EVq1CD;AUp1CC;EACE,2BAAA;EVs1CH;AQvtCD;EEjIE,2BAAA;EV21CD;AU11CC;EACE,2BAAA;EV41CH;AQ1tCD;EEpIE,2BAAA;EVi2CD;AUh2CC;EACE,2BAAA;EVk2CH;AQ7tCD;EEvIE,2BAAA;EVu2CD;AUt2CC;EACE,2BAAA;EVw2CH;AQ3tCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ER6tCD;AQrtCD;;EAEE,eAAA;EACA,qBAAA;ERutCD;AQ1tCD;;;;EAMI,kBAAA;ER0tCH;AQntCD;EACE,iBAAA;EACA,kBAAA;ERqtCD;AQjtCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ERotCD;AQttCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ERotCH;AQ/sCD;EACE,eAAA;EACA,qBAAA;ERitCD;AQ/sCD;;EAEE,yBAAA;ERitCD;AQ/sCD;EACE,mBAAA;ERitCD;AQ/sCD;EACE,gBAAA;ERitCD;AQxrCD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IGtNJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IX65CC;EQlsCH;IAHM,oBAAA;IRwsCH;EACF;AQ/rCD;;EAGE,cAAA;EACA,mCAAA;ERgsCD;AQ9rCD;EACE,gBAAA;EA9IqB,2BAAA;ER+0CtB;AQ5rCD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ER8rCD;AQzrCG;;;EACE,kBAAA;ER6rCL;AQvsCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ERyrCH;AQvrCG;;;EACE,wBAAA;ER2rCL;AQnrCD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ERqrCD;AQ/qCG;;;;;;EAAW,aAAA;ERurCd;AQtrCG;;;;;;EACE,wBAAA;ER6rCL;AQvrCD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ERyrCD;AY/9CD;;;;EAIE,gEAAA;EZi+CD;AY79CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZ+9CD;AY39CD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;UAAA,gDAAA;EZ69CD;AYn+CD;EASI,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,0BAAA;UAAA,kBAAA;EZ69CH;AYx9CD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZ09CD;AYr+CD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZy9CH;AYp9CD;EACE,mBAAA;EACA,oBAAA;EZs9CD;AahhDD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;EdshDD;AahhDC;EAAA;IAFE,cAAA;IbshDD;EACF;AalhDC;EAAA;IAFE,cAAA;IbwhDD;EACF;AaphDD;EAAA;IAFI,eAAA;Ib0hDD;EACF;AajhDD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed2iDD;Aa9gDD;ECvBE,oBAAA;EACA,qBAAA;EdwiDD;AexiDG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;EfwiDL;AexhDG;EACE,aAAA;Ef0hDL;AenhDC;EACE,aAAA;EfqhDH;AethDC;EACE,qBAAA;EfwhDH;AezhDC;EACE,qBAAA;Ef2hDH;Ae5hDC;EACE,YAAA;Ef8hDH;Ae/hDC;EACE,qBAAA;EfiiDH;AeliDC;EACE,qBAAA;EfoiDH;AeriDC;EACE,YAAA;EfuiDH;AexiDC;EACE,qBAAA;Ef0iDH;Ae3iDC;EACE,qBAAA;Ef6iDH;Ae9iDC;EACE,YAAA;EfgjDH;AejjDC;EACE,qBAAA;EfmjDH;AepjDC;EACE,oBAAA;EfsjDH;AexiDC;EACE,aAAA;Ef0iDH;Ae3iDC;EACE,qBAAA;Ef6iDH;Ae9iDC;EACE,qBAAA;EfgjDH;AejjDC;EACE,YAAA;EfmjDH;AepjDC;EACE,qBAAA;EfsjDH;AevjDC;EACE,qBAAA;EfyjDH;Ae1jDC;EACE,YAAA;Ef4jDH;Ae7jDC;EACE,qBAAA;Ef+jDH;AehkDC;EACE,qBAAA;EfkkDH;AenkDC;EACE,YAAA;EfqkDH;AetkDC;EACE,qBAAA;EfwkDH;AezkDC;EACE,oBAAA;Ef2kDH;AevkDC;EACE,aAAA;EfykDH;AezlDC;EACE,YAAA;Ef2lDH;Ae5lDC;EACE,oBAAA;Ef8lDH;Ae/lDC;EACE,oBAAA;EfimDH;AelmDC;EACE,WAAA;EfomDH;AermDC;EACE,oBAAA;EfumDH;AexmDC;EACE,oBAAA;Ef0mDH;Ae3mDC;EACE,WAAA;Ef6mDH;Ae9mDC;EACE,oBAAA;EfgnDH;AejnDC;EACE,oBAAA;EfmnDH;AepnDC;EACE,WAAA;EfsnDH;AevnDC;EACE,oBAAA;EfynDH;Ae1nDC;EACE,mBAAA;Ef4nDH;AexnDC;EACE,YAAA;Ef0nDH;Ae5mDC;EACE,mBAAA;Ef8mDH;Ae/mDC;EACE,2BAAA;EfinDH;AelnDC;EACE,2BAAA;EfonDH;AernDC;EACE,kBAAA;EfunDH;AexnDC;EACE,2BAAA;Ef0nDH;Ae3nDC;EACE,2BAAA;Ef6nDH;Ae9nDC;EACE,kBAAA;EfgoDH;AejoDC;EACE,2BAAA;EfmoDH;AepoDC;EACE,2BAAA;EfsoDH;AevoDC;EACE,kBAAA;EfyoDH;Ae1oDC;EACE,2BAAA;Ef4oDH;Ae7oDC;EACE,0BAAA;Ef+oDH;AehpDC;EACE,iBAAA;EfkpDH;AalpDD;EElCI;IACE,aAAA;IfurDH;EehrDD;IACE,aAAA;IfkrDD;EenrDD;IACE,qBAAA;IfqrDD;EetrDD;IACE,qBAAA;IfwrDD;EezrDD;IACE,YAAA;If2rDD;Ee5rDD;IACE,qBAAA;If8rDD;Ee/rDD;IACE,qBAAA;IfisDD;EelsDD;IACE,YAAA;IfosDD;EersDD;IACE,qBAAA;IfusDD;EexsDD;IACE,qBAAA;If0sDD;Ee3sDD;IACE,YAAA;If6sDD;Ee9sDD;IACE,qBAAA;IfgtDD;EejtDD;IACE,oBAAA;IfmtDD;EersDD;IACE,aAAA;IfusDD;EexsDD;IACE,qBAAA;If0sDD;Ee3sDD;IACE,qBAAA;If6sDD;Ee9sDD;IACE,YAAA;IfgtDD;EejtDD;IACE,qBAAA;IfmtDD;EeptDD;IACE,qBAAA;IfstDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,qBAAA;If4tDD;Ee7tDD;IACE,qBAAA;If+tDD;EehuDD;IACE,YAAA;IfkuDD;EenuDD;IACE,qBAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EepuDD;IACE,aAAA;IfsuDD;EetvDD;IACE,YAAA;IfwvDD;EezvDD;IACE,oBAAA;If2vDD;Ee5vDD;IACE,oBAAA;If8vDD;Ee/vDD;IACE,WAAA;IfiwDD;EelwDD;IACE,oBAAA;IfowDD;EerwDD;IACE,oBAAA;IfuwDD;EexwDD;IACE,WAAA;If0wDD;Ee3wDD;IACE,oBAAA;If6wDD;Ee9wDD;IACE,oBAAA;IfgxDD;EejxDD;IACE,WAAA;IfmxDD;EepxDD;IACE,oBAAA;IfsxDD;EevxDD;IACE,mBAAA;IfyxDD;EerxDD;IACE,YAAA;IfuxDD;EezwDD;IACE,mBAAA;If2wDD;Ee5wDD;IACE,2BAAA;If8wDD;Ee/wDD;IACE,2BAAA;IfixDD;EelxDD;IACE,kBAAA;IfoxDD;EerxDD;IACE,2BAAA;IfuxDD;EexxDD;IACE,2BAAA;If0xDD;Ee3xDD;IACE,kBAAA;If6xDD;Ee9xDD;IACE,2BAAA;IfgyDD;EejyDD;IACE,2BAAA;IfmyDD;EepyDD;IACE,kBAAA;IfsyDD;EevyDD;IACE,2BAAA;IfyyDD;Ee1yDD;IACE,0BAAA;If4yDD;Ee7yDD;IACE,iBAAA;If+yDD;EACF;AavyDD;EE3CI;IACE,aAAA;Ifq1DH;Ee90DD;IACE,aAAA;Ifg1DD;Eej1DD;IACE,qBAAA;Ifm1DD;Eep1DD;IACE,qBAAA;Ifs1DD;Eev1DD;IACE,YAAA;Ify1DD;Ee11DD;IACE,qBAAA;If41DD;Ee71DD;IACE,qBAAA;If+1DD;Eeh2DD;IACE,YAAA;Ifk2DD;Een2DD;IACE,qBAAA;Ifq2DD;Eet2DD;IACE,qBAAA;Ifw2DD;Eez2DD;IACE,YAAA;If22DD;Ee52DD;IACE,qBAAA;If82DD;Ee/2DD;IACE,oBAAA;Ifi3DD;Een2DD;IACE,aAAA;Ifq2DD;Eet2DD;IACE,qBAAA;Ifw2DD;Eez2DD;IACE,qBAAA;If22DD;Ee52DD;IACE,YAAA;If82DD;Ee/2DD;IACE,qBAAA;Ifi3DD;Eel3DD;IACE,qBAAA;Ifo3DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,qBAAA;If03DD;Ee33DD;IACE,qBAAA;If63DD;Ee93DD;IACE,YAAA;Ifg4DD;Eej4DD;IACE,qBAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eel4DD;IACE,aAAA;Ifo4DD;Eep5DD;IACE,YAAA;Ifs5DD;Eev5DD;IACE,oBAAA;Ify5DD;Ee15DD;IACE,oBAAA;If45DD;Ee75DD;IACE,WAAA;If+5DD;Eeh6DD;IACE,oBAAA;Ifk6DD;Een6DD;IACE,oBAAA;Ifq6DD;Eet6DD;IACE,WAAA;Ifw6DD;Eez6DD;IACE,oBAAA;If26DD;Ee56DD;IACE,oBAAA;If86DD;Ee/6DD;IACE,WAAA;Ifi7DD;Eel7DD;IACE,oBAAA;Ifo7DD;Eer7DD;IACE,mBAAA;Ifu7DD;Een7DD;IACE,YAAA;Ifq7DD;Eev6DD;IACE,mBAAA;Ify6DD;Ee16DD;IACE,2BAAA;If46DD;Ee76DD;IACE,2BAAA;If+6DD;Eeh7DD;IACE,kBAAA;Ifk7DD;Een7DD;IACE,2BAAA;Ifq7DD;Eet7DD;IACE,2BAAA;Ifw7DD;Eez7DD;IACE,kBAAA;If27DD;Ee57DD;IACE,2BAAA;If87DD;Ee/7DD;IACE,2BAAA;Ifi8DD;Eel8DD;IACE,kBAAA;Ifo8DD;Eer8DD;IACE,2BAAA;Ifu8DD;Eex8DD;IACE,0BAAA;If08DD;Ee38DD;IACE,iBAAA;If68DD;EACF;Aal8DD;EE9CI;IACE,aAAA;Ifm/DH;Ee5+DD;IACE,aAAA;If8+DD;Ee/+DD;IACE,qBAAA;Ifi/DD;Eel/DD;IACE,qBAAA;Ifo/DD;Eer/DD;IACE,YAAA;Ifu/DD;Eex/DD;IACE,qBAAA;If0/DD;Ee3/DD;IACE,qBAAA;If6/DD;Ee9/DD;IACE,YAAA;IfggED;EejgED;IACE,qBAAA;IfmgED;EepgED;IACE,qBAAA;IfsgED;EevgED;IACE,YAAA;IfygED;Ee1gED;IACE,qBAAA;If4gED;Ee7gED;IACE,oBAAA;If+gED;EejgED;IACE,aAAA;IfmgED;EepgED;IACE,qBAAA;IfsgED;EevgED;IACE,qBAAA;IfygED;Ee1gED;IACE,YAAA;If4gED;Ee7gED;IACE,qBAAA;If+gED;EehhED;IACE,qBAAA;IfkhED;EenhED;IACE,YAAA;IfqhED;EethED;IACE,qBAAA;IfwhED;EezhED;IACE,qBAAA;If2hED;Ee5hED;IACE,YAAA;If8hED;Ee/hED;IACE,qBAAA;IfiiED;EeliED;IACE,oBAAA;IfoiED;EehiED;IACE,aAAA;IfkiED;EeljED;IACE,YAAA;IfojED;EerjED;IACE,oBAAA;IfujED;EexjED;IACE,oBAAA;If0jED;Ee3jED;IACE,WAAA;If6jED;Ee9jED;IACE,oBAAA;IfgkED;EejkED;IACE,oBAAA;IfmkED;EepkED;IACE,WAAA;IfskED;EevkED;IACE,oBAAA;IfykED;Ee1kED;IACE,oBAAA;If4kED;Ee7kED;IACE,WAAA;If+kED;EehlED;IACE,oBAAA;IfklED;EenlED;IACE,mBAAA;IfqlED;EejlED;IACE,YAAA;IfmlED;EerkED;IACE,mBAAA;IfukED;EexkED;IACE,2BAAA;If0kED;Ee3kED;IACE,2BAAA;If6kED;Ee9kED;IACE,kBAAA;IfglED;EejlED;IACE,2BAAA;IfmlED;EeplED;IACE,2BAAA;IfslED;EevlED;IACE,kBAAA;IfylED;Ee1lED;IACE,2BAAA;If4lED;Ee7lED;IACE,2BAAA;If+lED;EehmED;IACE,kBAAA;IfkmED;EenmED;IACE,2BAAA;IfqmED;EetmED;IACE,0BAAA;IfwmED;EezmED;IACE,iBAAA;If2mED;EACF;AgB/qED;EACE,+BAAA;EhBirED;AgB/qED;EACE,kBAAA;EACA,qBAAA;EACA,gBAAA;EACA,kBAAA;EhBirED;AgB/qED;EACE,kBAAA;EhBirED;AgB3qED;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhB6qED;AgBhrED;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhB6qEP;AgB3rED;EAoBI,wBAAA;EACA,kCAAA;EhB0qEH;AgB/rED;;;;;;EA8BQ,eAAA;EhByqEP;AgBvsED;EAoCI,+BAAA;EhBsqEH;AgB1sED;EAyCI,2BAAA;EhBoqEH;AgB7pED;;;;;;EAOQ,cAAA;EhB8pEP;AgBnpED;EACE,2BAAA;EhBqpED;AgBtpED;;;;;;EAQQ,2BAAA;EhBspEP;AgB9pED;;EAeM,0BAAA;EhBmpEL;AgBzoED;EAEI,2BAAA;EhB0oEH;AgBjoED;EAEI,2BAAA;EhBkoEH;AgBznED;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB2nED;AgBtnEG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhBynEL;AiBrwEC;;;;;;;;;;;;EAOI,2BAAA;EjB4wEL;AiBtwEC;;;;;EAMI,2BAAA;EjBuwEL;AiB1xEC;;;;;;;;;;;;EAOI,2BAAA;EjBiyEL;AiB3xEC;;;;;EAMI,2BAAA;EjB4xEL;AiB/yEC;;;;;;;;;;;;EAOI,2BAAA;EjBszEL;AiBhzEC;;;;;EAMI,2BAAA;EjBizEL;AiBp0EC;;;;;;;;;;;;EAOI,2BAAA;EjB20EL;AiBr0EC;;;;;EAMI,2BAAA;EjBs0EL;AiBz1EC;;;;;;;;;;;;EAOI,2BAAA;EjBg2EL;AiB11EC;;;;;EAMI,2BAAA;EjB21EL;AgBzsED;EACE,kBAAA;EACA,mBAAA;EhB2sED;AgB9oED;EAAA;IA1DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,8CAAA;IACA,2BAAA;IhB4sED;EgBtpEH;IAlDM,kBAAA;IhB2sEH;EgBzpEH;;;;;;IAzCY,qBAAA;IhB0sET;EgBjqEH;IAjCM,WAAA;IhBqsEH;EgBpqEH;;;;;;IAxBY,gBAAA;IhBosET;EgB5qEH;;;;;;IApBY,iBAAA;IhBwsET;EgBprEH;;;;IAPY,kBAAA;IhBisET;EACF;AkB35ED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB05ED;AkBv5ED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElBy5ED;AkBt5ED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElBw5ED;AkB74ED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELo3ET;AkB74ED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElB+4ED;AkB34ED;EACE,gBAAA;ElB64ED;AkBz4ED;EACE,gBAAA;EACA,aAAA;ElB24ED;AkBv4ED;;EAEE,cAAA;ElBy4ED;AkBr4ED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENi9ED;AkBr4ED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElBu4ED;AkB72ED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAyHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELizET;AmBz7EC;EACE,uBAAA;EACA,YAAA;EdUF,wFAAA;EACQ,gFAAA;ELk7ET;AKj5EC;EACE,gBAAA;EACA,YAAA;ELm5EH;AKj5EC;EAA0B,gBAAA;ELo5E3B;AKn5EC;EAAgC,gBAAA;ELs5EjC;AkBr3EC;;;EAGE,2BAAA;EACA,YAAA;ElBu3EH;AkBp3EC;;EAEE,qBAAA;ElBs3EH;AkBl3EC;EACE,cAAA;ElBo3EH;AkBx2ED;EACE,0BAAA;ElB02ED;AkBt0ED;EAxBE;;;;IAIE,mBAAA;IlBi2ED;EkB/1EC;;;;;;;;IAEE,mBAAA;IlBu2EH;EkBp2EC;;;;;;;;IAEE,mBAAA;IlB42EH;EACF;AkBl2ED;EACE,qBAAA;ElBo2ED;AkB51ED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;ElB81ED;AkBn2ED;;EAQI,kBAAA;EACA,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElB+1EH;AkB51ED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElB81ED;AkB31ED;;EAEE,kBAAA;ElB61ED;AkBz1ED;;EAEE,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElB21ED;AkBz1ED;;EAEE,eAAA;EACA,mBAAA;ElB21ED;AkBl1EC;;;;;;EAGE,qBAAA;ElBu1EH;AkBj1EC;;;;EAEE,qBAAA;ElBq1EH;AkB/0EC;;;;EAGI,qBAAA;ElBk1EL;AkBv0ED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;EACA,kBAAA;ElBu0ED;AkBr0EC;;EAEE,iBAAA;EACA,kBAAA;ElBu0EH;AkB1zED;EC1PE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBujFD;AmBrjFC;EACE,cAAA;EACA,mBAAA;EnBujFH;AmBpjFC;;EAEE,cAAA;EnBsjFH;AkBt0ED;EC7PE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBskFD;AmBpkFC;EACE,cAAA;EACA,mBAAA;EnBskFH;AmBnkFC;;EAEE,cAAA;EnBqkFH;AkBr1ED;EAKI,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ElBm1EH;AkB/0ED;EC1QE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnB4lFD;AmB1lFC;EACE,cAAA;EACA,mBAAA;EnB4lFH;AmBzlFC;;EAEE,cAAA;EnB2lFH;AkB31ED;EC7QE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnB2mFD;AmBzmFC;EACE,cAAA;EACA,mBAAA;EnB2mFH;AmBxmFC;;EAEE,cAAA;EnB0mFH;AkB12ED;EAKI,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,kBAAA;ElBw2EH;AkB/1ED;EAEE,oBAAA;ElBg2ED;AkBl2ED;EAMI,uBAAA;ElB+1EH;AkB31ED;EACE,oBAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;EACA,sBAAA;ElB61ED;AkB31ED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB61ED;AkB31ED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB61ED;AkBz1ED;;;;;;;;;;ECrXI,gBAAA;EnB0tFH;AkBr2ED;ECjXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL2qFT;AmBztFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;ELgrFT;AkB/2ED;ECvWI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBytFH;AkBp3ED;ECjWI,gBAAA;EnBwtFH;AkBp3ED;;;;;;;;;;ECxXI,gBAAA;EnBwvFH;AkBh4ED;ECpXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELysFT;AmBvvFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL8sFT;AkB14ED;EC1WI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBuvFH;AkB/4ED;ECpWI,gBAAA;EnBsvFH;AkB/4ED;;;;;;;;;;EC3XI,gBAAA;EnBsxFH;AkB35ED;ECvXI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELuuFT;AmBrxFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL4uFT;AkBr6ED;EC7WI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBqxFH;AkB16ED;ECvWI,gBAAA;EnBoxFH;AkBt6EC;EACG,WAAA;ElBw6EJ;AkBt6EC;EACG,QAAA;ElBw6EJ;AkB95ED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElBg6ED;AkB70ED;EAAA;IA9DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB+4EH;EkBn1EH;IAvDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB64EH;EkBx1EH;IAhDM,uBAAA;IlB24EH;EkB31EH;IA5CM,uBAAA;IACA,wBAAA;IlB04EH;EkB/1EH;;;IAtCQ,aAAA;IlB04EL;EkBp2EH;IAhCM,aAAA;IlBu4EH;EkBv2EH;IA5BM,kBAAA;IACA,wBAAA;IlBs4EH;EkB32EH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBm4EH;EkBl3EH;;IAdQ,iBAAA;IlBo4EL;EkBt3EH;;IATM,oBAAA;IACA,gBAAA;IlBm4EH;EkB33EH;IAHM,QAAA;IlBi4EH;EACF;AkBv3ED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBo3EH;AkB/3ED;;EAiBI,kBAAA;ElBk3EH;AkBn4ED;EJjfE,oBAAA;EACA,qBAAA;Edu3FD;AkBh2EC;EAAA;IAVI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB82EH;EACF;AkB94ED;EAwCI,aAAA;ElBy2EH;AkB51EC;EAAA;IAHM,0BAAA;IlBm2EL;EACF;AkB11EC;EAAA;IAHM,kBAAA;IlBi2EL;EACF;AoBn5FD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,gCAAA;MAAA,4BAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC6BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB4KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;EL8sFT;AoBt5FG;;;;;;EdrBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENk7FD;AoB15FC;;;EAGE,gBAAA;EACA,uBAAA;EpB45FH;AoBz5FC;;EAEE,YAAA;EACA,wBAAA;Ef2BF,0DAAA;EACQ,kDAAA;ELi4FT;AoBz5FC;;;EAGE,qBAAA;EACA,sBAAA;EE9CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL24FT;AoBr5FD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB68FD;AqB38FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB68FP;AqB38FC;;;EAGE,wBAAA;ErB68FH;AqBx8FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBs9FT;AoB97FD;ECnBI,gBAAA;EACA,2BAAA;ErBo9FH;AoB/7FD;ECxDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB0/FD;AqBx/FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB0/FP;AqBx/FC;;;EAGE,wBAAA;ErB0/FH;AqBr/FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBmgGT;AoBx+FD;ECtBI,gBAAA;EACA,2BAAA;ErBigGH;AoBx+FD;EC5DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuiGD;AqBriGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuiGP;AqBriGC;;;EAGE,wBAAA;ErBuiGH;AqBliGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBgjGT;AoBjhGD;EC1BI,gBAAA;EACA,2BAAA;ErB8iGH;AoBjhGD;EChEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBolGD;AqBllGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBolGP;AqBllGC;;;EAGE,wBAAA;ErBolGH;AqB/kGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB6lGT;AoB1jGD;EC9BI,gBAAA;EACA,2BAAA;ErB2lGH;AoB1jGD;ECpEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBioGD;AqB/nGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBioGP;AqB/nGC;;;EAGE,wBAAA;ErBioGH;AqB5nGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB0oGT;AoBnmGD;EClCI,gBAAA;EACA,2BAAA;ErBwoGH;AoBnmGD;ECxEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB8qGD;AqB5qGC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB8qGP;AqB5qGC;;;EAGE,wBAAA;ErB8qGH;AqBzqGG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBurGT;AoB5oGD;ECtCI,gBAAA;EACA,2BAAA;ErBqrGH;AoBvoGD;EACE,gBAAA;EACA,qBAAA;EACA,kBAAA;EpByoGD;AoBvoGC;;;;;EAKE,+BAAA;Ef7BF,0BAAA;EACQ,kBAAA;ELuqGT;AoBxoGC;;;;EAIE,2BAAA;EpB0oGH;AoBxoGC;;EAEE,gBAAA;EACA,4BAAA;EACA,+BAAA;EpB0oGH;AoBtoGG;;;;EAEE,gBAAA;EACA,uBAAA;EpB0oGL;AoBjoGD;;EC/EE,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;ErBotGD;AoBpoGD;;ECnFE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErB2tGD;AoBvoGD;;ECvFE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErBkuGD;AoBtoGD;EACE,gBAAA;EACA,aAAA;EpBwoGD;AoBpoGD;EACE,iBAAA;EpBsoGD;AoB/nGC;;;EACE,aAAA;EpBmoGH;AuBvxGD;EACE,YAAA;ElBoLA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELsmGT;AuB1xGC;EACE,YAAA;EvB4xGH;AuBxxGD;EACE,eAAA;EvB0xGD;AuBxxGC;EAAY,gBAAA;EvB2xGb;AuB1xGC;EAAY,oBAAA;EvB6xGb;AuB5xGC;EAAY,0BAAA;EvB+xGb;AuB5xGD;EACE,oBAAA;EACA,WAAA;EACA,kBAAA;ElBuKA,iDAAA;EACQ,4CAAA;KAAA,yCAAA;EAOR,oCAAA;EACQ,+BAAA;KAAA,4BAAA;EAGR,0CAAA;EACQ,qCAAA;KAAA,kCAAA;ELgnGT;AwB1zGD;EACE,uBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,wBAAA;EACA,wBAAA;EACA,qCAAA;EACA,oCAAA;ExB4zGD;AwBxzGD;;EAEE,oBAAA;ExB0zGD;AwBtzGD;EACE,YAAA;ExBwzGD;AwBpzGD;EACE,oBAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,2BAAA;EACA,uCAAA;EACA,oBAAA;EnBuBA,qDAAA;EACQ,6CAAA;EmBtBR,sCAAA;UAAA,8BAAA;ExBuzGD;AwBlzGC;EACE,UAAA;EACA,YAAA;ExBozGH;AwB70GD;ECxBE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzBw2GD;AwBn1GD;EAmCI,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBmzGH;AwB7yGC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;ExB+yGH;AwBzyGC;;;EAGE,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,2BAAA;ExB2yGH;AwBlyGC;;;EAGE,gBAAA;ExBoyGH;AwBhyGC;;EAEE,uBAAA;EACA,+BAAA;EACA,wBAAA;EE1GF,qEAAA;EF4GE,qBAAA;ExBkyGH;AwB7xGD;EAGI,gBAAA;ExB6xGH;AwBhyGD;EAQI,YAAA;ExB2xGH;AwBnxGD;EACE,YAAA;EACA,UAAA;ExBqxGD;AwB7wGD;EACE,SAAA;EACA,aAAA;ExB+wGD;AwB3wGD;EACE,gBAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExB6wGD;AwBzwGD;EACE,iBAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,cAAA;ExB2wGD;AwBvwGD;EACE,UAAA;EACA,YAAA;ExBywGD;AwBjwGD;;EAII,eAAA;EACA,0BAAA;EACA,aAAA;ExBiwGH;AwBvwGD;;EAUI,WAAA;EACA,cAAA;EACA,oBAAA;ExBiwGH;AwB5uGD;EAXE;IAnEA,YAAA;IACA,UAAA;IxB8zGC;EwB5vGD;IAzDA,SAAA;IACA,aAAA;IxBwzGC;EACF;A2Bv8GD;;EAEE,oBAAA;EACA,uBAAA;EACA,wBAAA;E3By8GD;A2B78GD;;EAMI,oBAAA;EACA,aAAA;E3B28GH;A2Bz8GG;;;;;;;;EAIE,YAAA;E3B+8GL;A2Bz8GD;;;;EAKI,mBAAA;E3B08GH;A2Br8GD;EACE,mBAAA;E3Bu8GD;A2Bx8GD;;EAMI,aAAA;E3Bs8GH;A2B58GD;;;EAWI,kBAAA;E3Bs8GH;A2Bl8GD;EACE,kBAAA;E3Bo8GD;A2Bh8GD;EACE,gBAAA;E3Bk8GD;A2Bj8GC;ECjDA,+BAAA;EACG,4BAAA;E5Bq/GJ;A2Bh8GD;;EC9CE,8BAAA;EACG,2BAAA;E5Bk/GJ;A2B/7GD;EACE,aAAA;E3Bi8GD;A2B/7GD;EACE,kBAAA;E3Bi8GD;A2B/7GD;;EClEE,+BAAA;EACG,4BAAA;E5BqgHJ;A2B97GD;EChEE,8BAAA;EACG,2BAAA;E5BigHJ;A2B77GD;;EAEE,YAAA;E3B+7GD;A2B96GD;EACE,mBAAA;EACA,oBAAA;E3Bg7GD;A2B96GD;EACE,oBAAA;EACA,qBAAA;E3Bg7GD;A2B36GD;EtB9CE,0DAAA;EACQ,kDAAA;EL49GT;A2B36GC;EtBlDA,0BAAA;EACQ,kBAAA;ELg+GT;A2Bx6GD;EACE,gBAAA;E3B06GD;A2Bv6GD;EACE,yBAAA;EACA,wBAAA;E3By6GD;A2Bt6GD;EACE,yBAAA;E3Bw6GD;A2Bj6GD;;;EAII,gBAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;E3Bk6GH;A2Bz6GD;EAcM,aAAA;E3B85GL;A2B56GD;;;;EAsBI,kBAAA;EACA,gBAAA;E3B45GH;A2Bv5GC;EACE,kBAAA;E3By5GH;A2Bv5GC;EACE,8BAAA;ECnKF,+BAAA;EACC,8BAAA;E5B6jHF;A2Bx5GC;EACE,gCAAA;EC/KF,4BAAA;EACC,2BAAA;E5B0kHF;A2Bx5GD;EACE,kBAAA;E3B05GD;A2Bx5GD;;EC9KE,+BAAA;EACC,8BAAA;E5B0kHF;A2Bv5GD;EC5LE,4BAAA;EACC,2BAAA;E5BslHF;A2Bn5GD;EACE,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;E3Bq5GD;A2Bz5GD;;EAOI,aAAA;EACA,qBAAA;EACA,WAAA;E3Bs5GH;A2B/5GD;EAYI,aAAA;E3Bs5GH;A2Bl6GD;EAgBI,YAAA;E3Bq5GH;A2Bp4GD;;;;EAKM,oBAAA;EACA,wBAAA;EACA,sBAAA;E3Bq4GL;A6B9mHD;EACE,oBAAA;EACA,gBAAA;EACA,2BAAA;E7BgnHD;A6B7mHC;EACE,aAAA;EACA,iBAAA;EACA,kBAAA;E7B+mHH;A6BxnHD;EAeI,oBAAA;EACA,YAAA;EAKA,aAAA;EAEA,aAAA;EACA,kBAAA;E7BumHH;A6B9lHD;;;EV8BE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,wBAAA;EACA,oBAAA;EnBqkHD;AmBnkHC;;;EACE,cAAA;EACA,mBAAA;EnBukHH;AmBpkHC;;;;;;EAEE,cAAA;EnB0kHH;A6BhnHD;;;EVyBE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB4lHD;AmB1lHC;;;EACE,cAAA;EACA,mBAAA;EnB8lHH;AmB3lHC;;;;;;EAEE,cAAA;EnBimHH;A6B9nHD;;;EAGE,qBAAA;E7BgoHD;A6B9nHC;;;EACE,kBAAA;E7BkoHH;A6B9nHD;;EAEE,WAAA;EACA,qBAAA;EACA,wBAAA;E7BgoHD;A6B3nHD;EACE,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;E7B6nHD;A6B1nHC;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;E7B4nHH;A6B1nHC;EACE,oBAAA;EACA,iBAAA;EACA,oBAAA;E7B4nHH;A6BhpHD;;EA0BI,eAAA;E7B0nHH;A6BrnHD;;;;;;;EDhGE,+BAAA;EACG,4BAAA;E5B8tHJ;A6BtnHD;EACE,iBAAA;E7BwnHD;A6BtnHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;E5BmuHJ;A6BvnHD;EACE,gBAAA;E7BynHD;A6BpnHD;EACE,oBAAA;EAGA,cAAA;EACA,qBAAA;E7BonHD;A6BznHD;EAUI,oBAAA;E7BknHH;A6B5nHD;EAYM,mBAAA;E7BmnHL;A6BhnHG;;;EAGE,YAAA;E7BknHL;A6B7mHC;;EAGI,oBAAA;E7B8mHL;A6B3mHC;;EAGI,mBAAA;E7B4mHL;A8BtwHD;EACE,kBAAA;EACA,iBAAA;EACA,kBAAA;E9BwwHD;A8B3wHD;EAOI,oBAAA;EACA,gBAAA;E9BuwHH;A8B/wHD;EAWM,oBAAA;EACA,gBAAA;EACA,oBAAA;E9BuwHL;A8BtwHK;;EAEE,uBAAA;EACA,2BAAA;E9BwwHP;A8BnwHG;EACE,gBAAA;E9BqwHL;A8BnwHK;;EAEE,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,qBAAA;E9BqwHP;A8B9vHG;;;EAGE,2BAAA;EACA,uBAAA;E9BgwHL;A8BzyHD;ELHE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzB+yHD;A8B/yHD;EA0DI,iBAAA;E9BwvHH;A8B/uHD;EACE,kCAAA;E9BivHD;A8BlvHD;EAGI,aAAA;EAEA,qBAAA;E9BivHH;A8BtvHD;EASM,mBAAA;EACA,yBAAA;EACA,+BAAA;EACA,4BAAA;E9BgvHL;A8B/uHK;EACE,uCAAA;E9BivHP;A8B3uHK;;;EAGE,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,kCAAA;EACA,iBAAA;E9B6uHP;A8BxuHC;EAqDA,aAAA;EA8BA,kBAAA;E9BypHD;A8B5uHC;EAwDE,aAAA;E9BurHH;A8B/uHC;EA0DI,oBAAA;EACA,oBAAA;E9BwrHL;A8BnvHC;EAgEE,WAAA;EACA,YAAA;E9BsrHH;A8B1qHD;EAAA;IAPM,qBAAA;IACA,WAAA;I9BqrHH;E8B/qHH;IAJQ,kBAAA;I9BsrHL;EACF;A8BhwHC;EAuFE,iBAAA;EACA,oBAAA;E9B4qHH;A8BpwHC;;;EA8FE,2BAAA;E9B2qHH;A8B7pHD;EAAA;IATM,kCAAA;IACA,4BAAA;I9B0qHH;E8BlqHH;;;IAHM,8BAAA;I9B0qHH;EACF;A8B3wHD;EAEI,aAAA;E9B4wHH;A8B9wHD;EAMM,oBAAA;E9B2wHL;A8BjxHD;EASM,kBAAA;E9B2wHL;A8BtwHK;;;EAGE,gBAAA;EACA,2BAAA;E9BwwHP;A8BhwHD;EAEI,aAAA;E9BiwHH;A8BnwHD;EAIM,iBAAA;EACA,gBAAA;E9BkwHL;A8BtvHD;EACE,aAAA;E9BwvHD;A8BzvHD;EAII,aAAA;E9BwvHH;A8B5vHD;EAMM,oBAAA;EACA,oBAAA;E9ByvHL;A8BhwHD;EAYI,WAAA;EACA,YAAA;E9BuvHH;A8B3uHD;EAAA;IAPM,qBAAA;IACA,WAAA;I9BsvHH;E8BhvHH;IAJQ,kBAAA;I9BuvHL;EACF;A8B/uHD;EACE,kBAAA;E9BivHD;A8BlvHD;EAKI,iBAAA;EACA,oBAAA;E9BgvHH;A8BtvHD;;;EAYI,2BAAA;E9B+uHH;A8BjuHD;EAAA;IATM,kCAAA;IACA,4BAAA;I9B8uHH;E8BtuHH;;;IAHM,8BAAA;I9B8uHH;EACF;A8BruHD;EAEI,eAAA;E9BsuHH;A8BxuHD;EAKI,gBAAA;E9BsuHH;A8B7tHD;EAEE,kBAAA;EF3OA,4BAAA;EACC,2BAAA;E5B08HF;A+Bp8HD;EACE,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;E/Bs8HD;A+B97HD;EAAA;IAFI,oBAAA;I/Bo8HD;EACF;A+Br7HD;EAAA;IAFI,aAAA;I/B27HD;EACF;A+B76HD;EACE,qBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,4DAAA;UAAA,oDAAA;EAEA,mCAAA;E/B86HD;A+B56HC;EACE,kBAAA;E/B86HH;A+Bl5HD;EAAA;IAxBI,aAAA;IACA,eAAA;IACA,0BAAA;YAAA,kBAAA;I/B86HD;E+B56HC;IACE,2BAAA;IACA,yBAAA;IACA,mBAAA;IACA,8BAAA;I/B86HH;E+B36HC;IACE,qBAAA;I/B66HH;E+Bx6HC;;;IAGE,iBAAA;IACA,kBAAA;I/B06HH;EACF;A+Bt6HD;;EAGI,mBAAA;E/Bu6HH;A+Bl6HC;EAAA;;IAFI,mBAAA;I/By6HH;EACF;A+Bh6HD;;;;EAII,qBAAA;EACA,oBAAA;E/Bk6HH;A+B55HC;EAAA;;;;IAHI,iBAAA;IACA,gBAAA;I/Bs6HH;EACF;A+B15HD;EACE,eAAA;EACA,uBAAA;E/B45HD;A+Bv5HD;EAAA;IAFI,kBAAA;I/B65HD;EACF;A+Bz5HD;;EAEE,iBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;E/B25HD;A+Br5HD;EAAA;;IAFI,kBAAA;I/B45HD;EACF;A+B15HD;EACE,QAAA;EACA,uBAAA;E/B45HD;A+B15HD;EACE,WAAA;EACA,kBAAA;EACA,uBAAA;E/B45HD;A+Bt5HD;EACE,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,cAAA;E/Bw5HD;A+Bt5HC;;EAEE,uBAAA;E/Bw5HH;A+Bj6HD;EAaI,gBAAA;E/Bu5HH;A+B94HD;EALI;;IAEE,oBAAA;I/Bs5HH;EACF;A+B54HD;EACE,oBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EC9LA,iBAAA;EACA,oBAAA;ED+LA,+BAAA;EACA,wBAAA;EACA,+BAAA;EACA,oBAAA;E/B+4HD;A+B34HC;EACE,YAAA;E/B64HH;A+B35HD;EAmBI,gBAAA;EACA,aAAA;EACA,aAAA;EACA,oBAAA;E/B24HH;A+Bj6HD;EAyBI,iBAAA;E/B24HH;A+Br4HD;EAAA;IAFI,eAAA;I/B24HD;EACF;A+Bl4HD;EACE,qBAAA;E/Bo4HD;A+Br4HD;EAII,mBAAA;EACA,sBAAA;EACA,mBAAA;E/Bo4HH;A+Bx2HC;EAAA;IAtBI,kBAAA;IACA,aAAA;IACA,aAAA;IACA,eAAA;IACA,+BAAA;IACA,WAAA;IACA,0BAAA;YAAA,kBAAA;I/Bk4HH;E+Bl3HD;;IAbM,4BAAA;I/Bm4HL;E+Bt3HD;IAVM,mBAAA;I/Bm4HL;E+Bl4HK;;IAEE,wBAAA;I/Bo4HP;EACF;A+Bl3HD;EAAA;IAXI,aAAA;IACA,WAAA;I/Bi4HD;E+Bv3HH;IAPM,aAAA;I/Bi4HH;E+B13HH;IALQ,mBAAA;IACA,sBAAA;I/Bk4HL;EACF;A+Bv3HD;EACE,oBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,sCAAA;E1B9NA,8FAAA;EACQ,sFAAA;E2B/DR,iBAAA;EACA,oBAAA;EhCwpID;AkBvqHD;EAAA;IA9DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlByuHH;EkB7qHH;IAvDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlBuuHH;EkBlrHH;IAhDM,uBAAA;IlBquHH;EkBrrHH;IA5CM,uBAAA;IACA,wBAAA;IlBouHH;EkBzrHH;;;IAtCQ,aAAA;IlBouHL;EkB9rHH;IAhCM,aAAA;IlBiuHH;EkBjsHH;IA5BM,kBAAA;IACA,wBAAA;IlBguHH;EkBrsHH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlB6tHH;EkB5sHH;;IAdQ,iBAAA;IlB8tHL;EkBhtHH;;IATM,oBAAA;IACA,gBAAA;IlB6tHH;EkBrtHH;IAHM,QAAA;IlB2tHH;EACF;A+Bh6HC;EAAA;IANI,oBAAA;I/B06HH;E+Bx6HG;IACE,kBAAA;I/B06HL;EACF;A+Bz5HD;EAAA;IARI,aAAA;IACA,WAAA;IACA,gBAAA;IACA,iBAAA;IACA,gBAAA;IACA,mBAAA;I1BzPF,0BAAA;IACQ,kBAAA;IL+pIP;EACF;A+B/5HD;EACE,eAAA;EHpUA,4BAAA;EACC,2BAAA;E5BsuIF;A+B/5HD;EACE,kBAAA;EHzUA,8BAAA;EACC,6BAAA;EAOD,+BAAA;EACC,8BAAA;E5BquIF;A+B35HD;EChVE,iBAAA;EACA,oBAAA;EhC8uID;A+B55HC;ECnVA,kBAAA;EACA,qBAAA;EhCkvID;A+B75HC;ECtVA,kBAAA;EACA,qBAAA;EhCsvID;A+Bv5HD;EChWE,kBAAA;EACA,qBAAA;EhC0vID;A+Bn5HD;EAAA;IAJI,aAAA;IACA,mBAAA;IACA,oBAAA;I/B25HD;EACF;A+B93HD;EAhBE;IExWA,wBAAA;IjC0vIC;E+Bj5HD;IE5WA,yBAAA;IF8WE,qBAAA;I/Bm5HD;E+Br5HD;IAKI,iBAAA;I/Bm5HH;EACF;A+B14HD;EACE,2BAAA;EACA,uBAAA;E/B44HD;A+B94HD;EAKI,gBAAA;E/B44HH;A+B34HG;;EAEE,gBAAA;EACA,+BAAA;E/B64HL;A+Bt5HD;EAcI,gBAAA;E/B24HH;A+Bz5HD;EAmBM,gBAAA;E/By4HL;A+Bv4HK;;EAEE,gBAAA;EACA,+BAAA;E/By4HP;A+Br4HK;;;EAGE,gBAAA;EACA,2BAAA;E/Bu4HP;A+Bn4HK;;;EAGE,gBAAA;EACA,+BAAA;E/Bq4HP;A+B76HD;EA8CI,uBAAA;E/Bk4HH;A+Bj4HG;;EAEE,2BAAA;E/Bm4HL;A+Bp7HD;EAoDM,2BAAA;E/Bm4HL;A+Bv7HD;;EA0DI,uBAAA;E/Bi4HH;A+B13HK;;;EAGE,2BAAA;EACA,gBAAA;E/B43HP;A+B31HC;EAAA;IAzBQ,gBAAA;I/Bw3HP;E+Bv3HO;;IAEE,gBAAA;IACA,+BAAA;I/By3HT;E+Br3HO;;;IAGE,gBAAA;IACA,2BAAA;I/Bu3HT;E+Bn3HO;;;IAGE,gBAAA;IACA,+BAAA;I/Bq3HT;EACF;A+Bv9HD;EA8GI,gBAAA;E/B42HH;A+B32HG;EACE,gBAAA;E/B62HL;A+B79HD;EAqHI,gBAAA;E/B22HH;A+B12HG;;EAEE,gBAAA;E/B42HL;A+Bx2HK;;;;EAEE,gBAAA;E/B42HP;A+Bp2HD;EACE,2BAAA;EACA,uBAAA;E/Bs2HD;A+Bx2HD;EAKI,gBAAA;E/Bs2HH;A+Br2HG;;EAEE,gBAAA;EACA,+BAAA;E/Bu2HL;A+Bh3HD;EAcI,gBAAA;E/Bq2HH;A+Bn3HD;EAmBM,gBAAA;E/Bm2HL;A+Bj2HK;;EAEE,gBAAA;EACA,+BAAA;E/Bm2HP;A+B/1HK;;;EAGE,gBAAA;EACA,2BAAA;E/Bi2HP;A+B71HK;;;EAGE,gBAAA;EACA,+BAAA;E/B+1HP;A+Bv4HD;EA+CI,uBAAA;E/B21HH;A+B11HG;;EAEE,2BAAA;E/B41HL;A+B94HD;EAqDM,2BAAA;E/B41HL;A+Bj5HD;;EA2DI,uBAAA;E/B01HH;A+Bp1HK;;;EAGE,2BAAA;EACA,gBAAA;E/Bs1HP;A+B/yHC;EAAA;IA/BQ,uBAAA;I/Bk1HP;E+BnzHD;IA5BQ,2BAAA;I/Bk1HP;E+BtzHD;IAzBQ,gBAAA;I/Bk1HP;E+Bj1HO;;IAEE,gBAAA;IACA,+BAAA;I/Bm1HT;E+B/0HO;;;IAGE,gBAAA;IACA,2BAAA;I/Bi1HT;E+B70HO;;;IAGE,gBAAA;IACA,+BAAA;I/B+0HT;EACF;A+Bv7HD;EA+GI,gBAAA;E/B20HH;A+B10HG;EACE,gBAAA;E/B40HL;A+B77HD;EAsHI,gBAAA;E/B00HH;A+Bz0HG;;EAEE,gBAAA;E/B20HL;A+Bv0HK;;;;EAEE,gBAAA;E/B20HP;AkCr9ID;EACE,mBAAA;EACA,qBAAA;EACA,kBAAA;EACA,2BAAA;EACA,oBAAA;ElCu9ID;AkC59ID;EAQI,uBAAA;ElCu9IH;AkC/9ID;EAWM,mBAAA;EACA,gBAAA;EACA,gBAAA;ElCu9IL;AkCp+ID;EAkBI,gBAAA;ElCq9IH;AmCz+ID;EACE,uBAAA;EACA,iBAAA;EACA,gBAAA;EACA,oBAAA;EnC2+ID;AmC/+ID;EAOI,iBAAA;EnC2+IH;AmCl/ID;;EAUM,oBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,mBAAA;EnC4+IL;AmC1+IG;;EAGI,gBAAA;EPXN,gCAAA;EACG,6BAAA;E5Bu/IJ;AmCz+IG;;EPvBF,iCAAA;EACG,8BAAA;E5BogJJ;AmCp+IG;;;;EAEE,gBAAA;EACA,2BAAA;EACA,uBAAA;EnCw+IL;AmCl+IG;;;;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,iBAAA;EnCu+IL;AmC7hJD;;;;;;EAiEM,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,qBAAA;EnCo+IL;AmC39ID;;EC1EM,oBAAA;EACA,iBAAA;EpCyiJL;AoCviJG;;ERMF,gCAAA;EACG,6BAAA;E5BqiJJ;AoCtiJG;;ERRF,iCAAA;EACG,8BAAA;E5BkjJJ;AmCr+ID;;EC/EM,mBAAA;EACA,iBAAA;EpCwjJL;AoCtjJG;;ERMF,gCAAA;EACG,6BAAA;E5BojJJ;AoCrjJG;;ERRF,iCAAA;EACG,8BAAA;E5BikJJ;AqCpkJD;EACE,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,oBAAA;ErCskJD;AqC1kJD;EAOI,iBAAA;ErCskJH;AqC7kJD;;EAUM,uBAAA;EACA,mBAAA;EACA,2BAAA;EACA,2BAAA;EACA,qBAAA;ErCukJL;AqCrlJD;;EAmBM,uBAAA;EACA,2BAAA;ErCskJL;AqC1lJD;;EA2BM,cAAA;ErCmkJL;AqC9lJD;;EAkCM,aAAA;ErCgkJL;AqClmJD;;;;EA2CM,gBAAA;EACA,2BAAA;EACA,qBAAA;ErC6jJL;AsC3mJD;EACE,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sBAAA;EtC6mJD;AsCzmJG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EtC2mJL;AsCtmJC;EACE,eAAA;EtCwmJH;AsCpmJC;EACE,oBAAA;EACA,WAAA;EtCsmJH;AsC/lJD;ECtCE,2BAAA;EvCwoJD;AuCroJG;;EAEE,2BAAA;EvCuoJL;AsClmJD;EC1CE,2BAAA;EvC+oJD;AuC5oJG;;EAEE,2BAAA;EvC8oJL;AsCrmJD;EC9CE,2BAAA;EvCspJD;AuCnpJG;;EAEE,2BAAA;EvCqpJL;AsCxmJD;EClDE,2BAAA;EvC6pJD;AuC1pJG;;EAEE,2BAAA;EvC4pJL;AsC3mJD;ECtDE,2BAAA;EvCoqJD;AuCjqJG;;EAEE,2BAAA;EvCmqJL;AsC9mJD;EC1DE,2BAAA;EvC2qJD;AuCxqJG;;EAEE,2BAAA;EvC0qJL;AwC5qJD;EACE,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;EACA,oBAAA;EACA,2BAAA;EACA,qBAAA;ExC8qJD;AwC3qJC;EACE,eAAA;ExC6qJH;AwCzqJC;EACE,oBAAA;EACA,WAAA;ExC2qJH;AwCxqJC;;EAEE,QAAA;EACA,kBAAA;ExC0qJH;AwCrqJG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;ExCuqJL;AwClqJC;;EAEE,gBAAA;EACA,2BAAA;ExCoqJH;AwCjqJC;EACE,cAAA;ExCmqJH;AwChqJC;EACE,mBAAA;ExCkqJH;AwC/pJC;EACE,kBAAA;ExCiqJH;AyC3tJD;EACE,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,2BAAA;EzC6tJD;AyCjuJD;;EAQI,gBAAA;EzC6tJH;AyCruJD;EAYI,qBAAA;EACA,iBAAA;EACA,kBAAA;EzC4tJH;AyC1uJD;EAkBI,2BAAA;EzC2tJH;AyCxtJC;;EAEE,oBAAA;EzC0tJH;AyCjvJD;EA2BI,iBAAA;EzCytJH;AyCxsJD;EAAA;IAbI,iBAAA;IzCytJD;EyCvtJC;;IAEE,oBAAA;IACA,qBAAA;IzCytJH;EyCjtJH;;IAHM,iBAAA;IzCwtJH;EACF;A0CjwJD;EACE,gBAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;ErCiLA,6CAAA;EACK,wCAAA;EACG,qCAAA;ELmlJT;A0C7wJD;;EAaI,mBAAA;EACA,oBAAA;E1CowJH;A0ChwJC;;;EAGE,uBAAA;E1CkwJH;A0CvxJD;EA0BI,cAAA;EACA,gBAAA;E1CgwJH;A2CzxJD;EACE,eAAA;EACA,qBAAA;EACA,+BAAA;EACA,oBAAA;E3C2xJD;A2C/xJD;EAQI,eAAA;EAEA,gBAAA;E3CyxJH;A2CnyJD;EAeI,mBAAA;E3CuxJH;A2CtyJD;;EAqBI,kBAAA;E3CqxJH;A2C1yJD;EAyBI,iBAAA;E3CoxJH;A2C5wJD;;EAEE,qBAAA;E3C8wJD;A2ChxJD;;EAMI,oBAAA;EACA,WAAA;EACA,cAAA;EACA,gBAAA;E3C8wJH;A2CtwJD;ECvDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Cg0JD;A2C3wJD;EClDI,2BAAA;E5Cg0JH;A2C9wJD;EC/CI,gBAAA;E5Cg0JH;A2C7wJD;EC3DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C20JD;A2ClxJD;ECtDI,2BAAA;E5C20JH;A2CrxJD;ECnDI,gBAAA;E5C20JH;A2CpxJD;EC/DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Cs1JD;A2CzxJD;EC1DI,2BAAA;E5Cs1JH;A2C5xJD;ECvDI,gBAAA;E5Cs1JH;A2C3xJD;ECnEE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5Ci2JD;A2ChyJD;EC9DI,2BAAA;E5Ci2JH;A2CnyJD;EC3DI,gBAAA;E5Ci2JH;A6Cn2JD;EACE;IAAQ,6BAAA;I7Cs2JP;E6Cr2JD;IAAQ,0BAAA;I7Cw2JP;EACF;A6Cr2JD;EACE;IAAQ,6BAAA;I7Cw2JP;E6Cv2JD;IAAQ,0BAAA;I7C02JP;EACF;A6C72JD;EACE;IAAQ,6BAAA;I7Cw2JP;E6Cv2JD;IAAQ,0BAAA;I7C02JP;EACF;A6Cn2JD;EACE,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,2BAAA;EACA,oBAAA;ExCsCA,wDAAA;EACQ,gDAAA;ELg0JT;A6Cl2JD;EACE,aAAA;EACA,WAAA;EACA,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;ExCyBA,wDAAA;EACQ,gDAAA;EAyHR,qCAAA;EACK,gCAAA;EACG,6BAAA;ELotJT;A6C/1JD;;ECCI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDAF,oCAAA;UAAA,4BAAA;E7Cm2JD;A6C51JD;;ExC5CE,4DAAA;EACK,uDAAA;EACG,oDAAA;EL44JT;A6Cz1JD;EErEE,2BAAA;E/Ci6JD;A+C95JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Ci3JH;A6C71JD;EEzEE,2BAAA;E/Cy6JD;A+Ct6JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Cy3JH;A6Cj2JD;EE7EE,2BAAA;E/Ci7JD;A+C96JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Ci4JH;A6Cr2JD;EEjFE,2BAAA;E/Cy7JD;A+Ct7JC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9Cy4JH;AgDj8JD;EAEE,kBAAA;EhDk8JD;AgDh8JC;EACE,eAAA;EhDk8JH;AgD97JD;;EAEE,SAAA;EACA,kBAAA;EhDg8JD;AgD77JD;EACE,gBAAA;EhD+7JD;AgD57JD;EACE,gBAAA;EhD87JD;AgD37JD;;EAEE,oBAAA;EhD67JD;AgD17JD;;EAEE,qBAAA;EhD47JD;AgDz7JD;;;EAGE,qBAAA;EACA,qBAAA;EhD27JD;AgDx7JD;EACE,wBAAA;EhD07JD;AgDv7JD;EACE,wBAAA;EhDy7JD;AgDr7JD;EACE,eAAA;EACA,oBAAA;EhDu7JD;AgDj7JD;EACE,iBAAA;EACA,kBAAA;EhDm7JD;AiDr+JD;EAEE,qBAAA;EACA,iBAAA;EjDs+JD;AiD99JD;EACE,oBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,qBAAA;EACA,2BAAA;EACA,2BAAA;EjD+9JD;AiD59JC;ErB3BA,8BAAA;EACC,6BAAA;E5B0/JF;AiD79JC;EACE,kBAAA;ErBvBF,iCAAA;EACC,gCAAA;E5Bu/JF;AiDt9JD;EACE,gBAAA;EjDw9JD;AiDz9JD;EAII,gBAAA;EjDw9JH;AiDp9JC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;EjDs9JH;AiDh9JC;;;EAGE,2BAAA;EACA,gBAAA;EACA,qBAAA;EjDk9JH;AiDv9JC;;;EASI,gBAAA;EjDm9JL;AiD59JC;;;EAYI,gBAAA;EjDq9JL;AiDh9JC;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EjDk9JH;AiDx9JC;;;;;;;;;EAYI,gBAAA;EjDu9JL;AiDn+JC;;;EAeI,gBAAA;EjDy9JL;AkDrjKC;EACE,gBAAA;EACA,2BAAA;ElDujKH;AkDrjKG;EACE,gBAAA;ElDujKL;AkDxjKG;EAII,gBAAA;ElDujKP;AkDpjKK;;EAEE,gBAAA;EACA,2BAAA;ElDsjKP;AkDpjKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDsjKP;AkD3kKC;EACE,gBAAA;EACA,2BAAA;ElD6kKH;AkD3kKG;EACE,gBAAA;ElD6kKL;AkD9kKG;EAII,gBAAA;ElD6kKP;AkD1kKK;;EAEE,gBAAA;EACA,2BAAA;ElD4kKP;AkD1kKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD4kKP;AkDjmKC;EACE,gBAAA;EACA,2BAAA;ElDmmKH;AkDjmKG;EACE,gBAAA;ElDmmKL;AkDpmKG;EAII,gBAAA;ElDmmKP;AkDhmKK;;EAEE,gBAAA;EACA,2BAAA;ElDkmKP;AkDhmKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDkmKP;AkDvnKC;EACE,gBAAA;EACA,2BAAA;ElDynKH;AkDvnKG;EACE,gBAAA;ElDynKL;AkD1nKG;EAII,gBAAA;ElDynKP;AkDtnKK;;EAEE,gBAAA;EACA,2BAAA;ElDwnKP;AkDtnKK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDwnKP;AiD5hKD;EACE,eAAA;EACA,oBAAA;EjD8hKD;AiD5hKD;EACE,kBAAA;EACA,kBAAA;EjD8hKD;AmDlpKD;EACE,qBAAA;EACA,2BAAA;EACA,+BAAA;EACA,oBAAA;E9C0DA,mDAAA;EACQ,2CAAA;EL2lKT;AmDjpKD;EACE,eAAA;EnDmpKD;AmD9oKD;EACE,oBAAA;EACA,sCAAA;EvBpBA,8BAAA;EACC,6BAAA;E5BqqKF;AmDppKD;EAMI,gBAAA;EnDipKH;AmD5oKD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;EnD8oKD;AmDlpKD;;;;;EAWI,gBAAA;EnD8oKH;AmDzoKD;EACE,oBAAA;EACA,2BAAA;EACA,+BAAA;EvBxCA,iCAAA;EACC,gCAAA;E5BorKF;AmDnoKD;;EAGI,kBAAA;EnDooKH;AmDvoKD;;EAMM,qBAAA;EACA,kBAAA;EnDqoKL;AmDjoKG;;EAEI,eAAA;EvBvEN,8BAAA;EACC,6BAAA;E5B2sKF;AmDhoKG;;EAEI,kBAAA;EvBtEN,iCAAA;EACC,gCAAA;E5BysKF;AmD7nKD;EAEI,qBAAA;EnD8nKH;AmD3nKD;EACE,qBAAA;EnD6nKD;AmDrnKD;;;EAII,kBAAA;EnDsnKH;AmD1nKD;;;EAOM,oBAAA;EACA,qBAAA;EnDwnKL;AmDhoKD;;EvBnGE,8BAAA;EACC,6BAAA;E5BuuKF;AmDroKD;;;;EAmBQ,6BAAA;EACA,8BAAA;EnDwnKP;AmD5oKD;;;;;;;;EAwBU,6BAAA;EnD8nKT;AmDtpKD;;;;;;;;EA4BU,8BAAA;EnDooKT;AmDhqKD;;EvB3FE,iCAAA;EACC,gCAAA;E5B+vKF;AmDrqKD;;;;EAyCQ,gCAAA;EACA,iCAAA;EnDkoKP;AmD5qKD;;;;;;;;EA8CU,gCAAA;EnDwoKT;AmDtrKD;;;;;;;;EAkDU,iCAAA;EnD8oKT;AmDhsKD;;;;EA2DI,+BAAA;EnD2oKH;AmDtsKD;;EA+DI,eAAA;EnD2oKH;AmD1sKD;;EAmEI,WAAA;EnD2oKH;AmD9sKD;;;;;;;;;;;;EA0EU,gBAAA;EnDkpKT;AmD5tKD;;;;;;;;;;;;EA8EU,iBAAA;EnD4pKT;AmD1uKD;;;;;;;;EAuFU,kBAAA;EnD6pKT;AmDpvKD;;;;;;;;EAgGU,kBAAA;EnD8pKT;AmD9vKD;EAsGI,WAAA;EACA,kBAAA;EnD2pKH;AmDjpKD;EACE,qBAAA;EnDmpKD;AmDppKD;EAKI,kBAAA;EACA,oBAAA;EnDkpKH;AmDxpKD;EASM,iBAAA;EnDkpKL;AmD3pKD;EAcI,kBAAA;EnDgpKH;AmD9pKD;;EAkBM,+BAAA;EnDgpKL;AmDlqKD;EAuBI,eAAA;EnD8oKH;AmDrqKD;EAyBM,kCAAA;EnD+oKL;AmDxoKD;ECpPE,uBAAA;EpD+3KD;AoD73KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD+3KH;AoDl4KC;EAMI,2BAAA;EpD+3KL;AoDr4KC;EASI,gBAAA;EACA,2BAAA;EpD+3KL;AoD53KC;EAEI,8BAAA;EpD63KL;AmDvpKD;ECvPE,uBAAA;EpDi5KD;AoD/4KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDi5KH;AoDp5KC;EAMI,2BAAA;EpDi5KL;AoDv5KC;EASI,gBAAA;EACA,2BAAA;EpDi5KL;AoD94KC;EAEI,8BAAA;EpD+4KL;AmDtqKD;EC1PE,uBAAA;EpDm6KD;AoDj6KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDm6KH;AoDt6KC;EAMI,2BAAA;EpDm6KL;AoDz6KC;EASI,gBAAA;EACA,2BAAA;EpDm6KL;AoDh6KC;EAEI,8BAAA;EpDi6KL;AmDrrKD;EC7PE,uBAAA;EpDq7KD;AoDn7KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDq7KH;AoDx7KC;EAMI,2BAAA;EpDq7KL;AoD37KC;EASI,gBAAA;EACA,2BAAA;EpDq7KL;AoDl7KC;EAEI,8BAAA;EpDm7KL;AmDpsKD;EChQE,uBAAA;EpDu8KD;AoDr8KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDu8KH;AoD18KC;EAMI,2BAAA;EpDu8KL;AoD78KC;EASI,gBAAA;EACA,2BAAA;EpDu8KL;AoDp8KC;EAEI,8BAAA;EpDq8KL;AmDntKD;ECnQE,uBAAA;EpDy9KD;AoDv9KC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDy9KH;AoD59KC;EAMI,2BAAA;EpDy9KL;AoD/9KC;EASI,gBAAA;EACA,2BAAA;EpDy9KL;AoDt9KC;EAEI,8BAAA;EpDu9KL;AqDv+KD;EACE,oBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;ErDy+KD;AqD9+KD;;;;;EAYI,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;ErDy+KH;AqDp+KD;EACE,wBAAA;ErDs+KD;AqDl+KD;EACE,qBAAA;ErDo+KD;AsD//KD;EACE,kBAAA;EACA,eAAA;EACA,qBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EjDwDA,yDAAA;EACQ,iDAAA;EL08KT;AsDzgLD;EASI,oBAAA;EACA,mCAAA;EtDmgLH;AsD9/KD;EACE,eAAA;EACA,oBAAA;EtDggLD;AsD9/KD;EACE,cAAA;EACA,oBAAA;EtDggLD;AuDthLD;EACE,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,8BAAA;EjCRA,cAAA;EAGA,2BAAA;EtB+hLD;AuDvhLC;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EjCfF,cAAA;EAGA,2BAAA;EtBuiLD;AuDnhLC;EACE,YAAA;EACA,iBAAA;EACA,yBAAA;EACA,WAAA;EACA,0BAAA;EvDqhLH;AwD1iLD;EACE,kBAAA;ExD4iLD;AwDxiLD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,mCAAA;EAIA,YAAA;ExDuiLD;AwDpiLC;EnD+GA,uCAAA;EACI,mCAAA;EACC,kCAAA;EACG,+BAAA;EAkER,qDAAA;EAEK,2CAAA;EACG,qCAAA;ELu3KT;AwD1iLC;EnD2GA,oCAAA;EACI,gCAAA;EACC,+BAAA;EACG,4BAAA;ELk8KT;AwD9iLD;EACE,oBAAA;EACA,kBAAA;ExDgjLD;AwD5iLD;EACE,oBAAA;EACA,aAAA;EACA,cAAA;ExD8iLD;AwD1iLD;EACE,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;EnDaA,kDAAA;EACQ,0CAAA;EmDZR,sCAAA;UAAA,8BAAA;EAEA,YAAA;ExD4iLD;AwDxiLD;EACE,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,2BAAA;ExD0iLD;AwDxiLC;ElCrEA,YAAA;EAGA,0BAAA;EtB8mLD;AwD3iLC;ElCtEA,cAAA;EAGA,2BAAA;EtBknLD;AwD1iLD;EACE,eAAA;EACA,kCAAA;EACA,2BAAA;ExD4iLD;AwDziLD;EACE,kBAAA;ExD2iLD;AwDviLD;EACE,WAAA;EACA,yBAAA;ExDyiLD;AwDpiLD;EACE,oBAAA;EACA,eAAA;ExDsiLD;AwDliLD;EACE,eAAA;EACA,mBAAA;EACA,+BAAA;ExDoiLD;AwDviLD;EAQI,kBAAA;EACA,kBAAA;ExDkiLH;AwD3iLD;EAaI,mBAAA;ExDiiLH;AwD9iLD;EAiBI,gBAAA;ExDgiLH;AwD3hLD;EACE,oBAAA;EACA,cAAA;EACA,aAAA;EACA,cAAA;EACA,kBAAA;ExD6hLD;AwD3gLD;EAZE;IACE,cAAA;IACA,mBAAA;IxD0hLD;EwDxhLD;InDvEA,mDAAA;IACQ,2CAAA;ILkmLP;EwDvhLD;IAAY,cAAA;IxD0hLX;EACF;AwDrhLD;EAFE;IAAY,cAAA;IxD2hLX;EACF;AyD1qLD;EACE,oBAAA;EACA,eAAA;EACA,gBAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,kBAAA;EnCXA,YAAA;EAGA,0BAAA;EtBqrLD;AyD1qLC;EnCdA,cAAA;EAGA,2BAAA;EtByrLD;AyD7qLC;EAAW,kBAAA;EAAmB,gBAAA;EzDirL/B;AyDhrLC;EAAW,kBAAA;EAAmB,gBAAA;EzDorL/B;AyDnrLC;EAAW,iBAAA;EAAmB,gBAAA;EzDurL/B;AyDtrLC;EAAW,mBAAA;EAAmB,gBAAA;EzD0rL/B;AyDtrLD;EACE,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EzDwrLD;AyDprLD;EACE,oBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;EzDsrLD;AyDlrLC;EACE,WAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,WAAA;EACA,YAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,WAAA;EACA,WAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EzDorLH;AyDlrLC;EACE,UAAA;EACA,SAAA;EACA,kBAAA;EACA,6BAAA;EACA,6BAAA;EzDorLH;AyDlrLC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,6BAAA;EACA,4BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,YAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;AyDlrLC;EACE,QAAA;EACA,WAAA;EACA,kBAAA;EACA,yBAAA;EACA,8BAAA;EzDorLH;A0DlxLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,cAAA;EAEA,6DAAA;EACA,iBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,2BAAA;EACA,sCAAA;UAAA,8BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;ErD6CA,mDAAA;EACQ,2CAAA;EqD1CR,qBAAA;E1DkxLD;A0D/wLC;EAAY,mBAAA;E1DkxLb;A0DjxLC;EAAY,mBAAA;E1DoxLb;A0DnxLC;EAAY,kBAAA;E1DsxLb;A0DrxLC;EAAY,oBAAA;E1DwxLb;A0DrxLD;EACE,WAAA;EACA,mBAAA;EACA,iBAAA;EACA,2BAAA;EACA,kCAAA;EACA,4BAAA;E1DuxLD;A0DpxLD;EACE,mBAAA;E1DsxLD;A0D9wLC;;EAEE,oBAAA;EACA,gBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;E1DgxLH;A0D7wLD;EACE,oBAAA;E1D+wLD;A0D7wLD;EACE,oBAAA;EACA,aAAA;E1D+wLD;A0D3wLC;EACE,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,uCAAA;EACA,eAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;E1D8wLL;A0D3wLC;EACE,UAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,6BAAA;EACA,yCAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;E1D8wLL;A0D3wLC;EACE,WAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;EACA,0CAAA;EACA,YAAA;E1D6wLH;A0D5wLG;EACE,cAAA;EACA,UAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;E1D8wLL;A0D1wLC;EACE,UAAA;EACA,cAAA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,wCAAA;E1D4wLH;A0D3wLG;EACE,cAAA;EACA,YAAA;EACA,uBAAA;EACA,4BAAA;EACA,eAAA;E1D6wLL;A2D14LD;EACE,oBAAA;E3D44LD;A2Dz4LD;EACE,oBAAA;EACA,kBAAA;EACA,aAAA;E3D24LD;A2D94LD;EAMI,eAAA;EACA,oBAAA;EtD6KF,2CAAA;EACK,sCAAA;EACG,mCAAA;EL+tLT;A2Dr5LD;;EAcM,gBAAA;E3D24LL;A2Dj3LC;EAAA;ItDiKA,wDAAA;IAEK,8CAAA;IACG,wCAAA;IA7JR,qCAAA;IAEQ,6BAAA;IA+GR,2BAAA;IAEQ,mBAAA;ILowLP;E2D/4LG;;ItDmHJ,4CAAA;IACQ,oCAAA;IsDjHF,SAAA;I3Dk5LL;E2Dh5LG;;ItD8GJ,6CAAA;IACQ,qCAAA;IsD5GF,SAAA;I3Dm5LL;E2Dj5LG;;;ItDyGJ,yCAAA;IACQ,iCAAA;IsDtGF,SAAA;I3Do5LL;EACF;A2D17LD;;;EA6CI,gBAAA;E3Dk5LH;A2D/7LD;EAiDI,SAAA;E3Di5LH;A2Dl8LD;;EAsDI,oBAAA;EACA,QAAA;EACA,aAAA;E3Dg5LH;A2Dx8LD;EA4DI,YAAA;E3D+4LH;A2D38LD;EA+DI,aAAA;E3D+4LH;A2D98LD;;EAmEI,SAAA;E3D+4LH;A2Dl9LD;EAuEI,aAAA;E3D84LH;A2Dr9LD;EA0EI,YAAA;E3D84LH;A2Dt4LD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;ErC9FA,cAAA;EAGA,2BAAA;EqC6FA,iBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3Dy4LD;A2Dp4LC;EblGE,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9Cy+LH;A2Dx4LC;EACE,YAAA;EACA,UAAA;EbvGA,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9Ck/LH;A2D14LC;;EAEE,YAAA;EACA,gBAAA;EACA,uBAAA;ErCtHF,cAAA;EAGA,2BAAA;EtBigMD;A2D36LD;;;;EAsCI,oBAAA;EACA,UAAA;EACA,YAAA;EACA,uBAAA;E3D24LH;A2Dp7LD;;EA6CI,WAAA;EACA,oBAAA;E3D24LH;A2Dz7LD;;EAkDI,YAAA;EACA,qBAAA;E3D24LH;A2D97LD;;EAuDI,aAAA;EACA,cAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;E3D24LH;A2Dt4LG;EACE,kBAAA;E3Dw4LL;A2Dp4LG;EACE,kBAAA;E3Ds4LL;A2D53LD;EACE,oBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;E3D83LD;A2Dv4LD;EAYI,uBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;EACA,qBAAA;EACA,iBAAA;EAWA,2BAAA;EACA,oCAAA;E3Do3LH;A2Dn5LD;EAkCI,WAAA;EACA,aAAA;EACA,cAAA;EACA,2BAAA;E3Do3LH;A2D72LD;EACE,oBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3D+2LD;A2D92LC;EACE,mBAAA;E3Dg3LH;A2Dv0LD;EAhCE;;;;IAKI,aAAA;IACA,cAAA;IACA,mBAAA;IACA,iBAAA;I3Dy2LH;E2Dj3LD;;IAYI,oBAAA;I3Dy2LH;E2Dr3LD;;IAgBI,qBAAA;I3Dy2LH;E2Dp2LD;IACE,WAAA;IACA,YAAA;IACA,sBAAA;I3Ds2LD;E2Dl2LD;IACE,cAAA;I3Do2LD;EACF;A4DlmMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,cAAA;EACA,gBAAA;E5DgoMH;A4D9nMC;;;;;;;;;;;;;;;EACE,aAAA;E5D8oMH;AiCtpMD;E4BRE,gBAAA;EACA,mBAAA;EACA,oBAAA;E7DiqMD;AiCxpMD;EACE,yBAAA;EjC0pMD;AiCxpMD;EACE,wBAAA;EjC0pMD;AiClpMD;EACE,0BAAA;EjCopMD;AiClpMD;EACE,2BAAA;EjCopMD;AiClpMD;EACE,oBAAA;EjCopMD;AiClpMD;E6BzBE,aAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,WAAA;E9D8qMD;AiChpMD;EACE,0BAAA;EjCkpMD;AiC3oMD;EACE,iBAAA;EjC6oMD;A+D9qMD;EACE,qBAAA;E/DgrMD;A+D1qMD;;;;ECdE,0BAAA;EhE8rMD;A+DzqMD;;;;;;;;;;;;EAYE,0BAAA;E/D2qMD;A+DpqMD;EAAA;IChDE,2BAAA;IhEwtMC;EgEvtMD;IAAU,gBAAA;IhE0tMT;EgEztMD;IAAU,+BAAA;IhE4tMT;EgE3tMD;;IACU,gCAAA;IhE8tMT;EACF;A+D9qMD;EAAA;IAFI,2BAAA;I/DorMD;EACF;A+D9qMD;EAAA;IAFI,4BAAA;I/DorMD;EACF;A+D9qMD;EAAA;IAFI,kCAAA;I/DorMD;EACF;A+D7qMD;EAAA;ICrEE,2BAAA;IhEsvMC;EgErvMD;IAAU,gBAAA;IhEwvMT;EgEvvMD;IAAU,+BAAA;IhE0vMT;EgEzvMD;;IACU,gCAAA;IhE4vMT;EACF;A+DvrMD;EAAA;IAFI,2BAAA;I/D6rMD;EACF;A+DvrMD;EAAA;IAFI,4BAAA;I/D6rMD;EACF;A+DvrMD;EAAA;IAFI,kCAAA;I/D6rMD;EACF;A+DtrMD;EAAA;IC1FE,2BAAA;IhEoxMC;EgEnxMD;IAAU,gBAAA;IhEsxMT;EgErxMD;IAAU,+BAAA;IhEwxMT;EgEvxMD;;IACU,gCAAA;IhE0xMT;EACF;A+DhsMD;EAAA;IAFI,2BAAA;I/DssMD;EACF;A+DhsMD;EAAA;IAFI,4BAAA;I/DssMD;EACF;A+DhsMD;EAAA;IAFI,kCAAA;I/DssMD;EACF;A+D/rMD;EAAA;IC/GE,2BAAA;IhEkzMC;EgEjzMD;IAAU,gBAAA;IhEozMT;EgEnzMD;IAAU,+BAAA;IhEszMT;EgErzMD;;IACU,gCAAA;IhEwzMT;EACF;A+DzsMD;EAAA;IAFI,2BAAA;I/D+sMD;EACF;A+DzsMD;EAAA;IAFI,4BAAA;I/D+sMD;EACF;A+DzsMD;EAAA;IAFI,kCAAA;I/D+sMD;EACF;A+DxsMD;EAAA;IC5HE,0BAAA;IhEw0MC;EACF;A+DxsMD;EAAA;ICjIE,0BAAA;IhE60MC;EACF;A+DxsMD;EAAA;ICtIE,0BAAA;IhEk1MC;EACF;A+DxsMD;EAAA;IC3IE,0BAAA;IhEu1MC;EACF;A+DrsMD;ECnJE,0BAAA;EhE21MD;A+DlsMD;EAAA;ICjKE,2BAAA;IhEu2MC;EgEt2MD;IAAU,gBAAA;IhEy2MT;EgEx2MD;IAAU,+BAAA;IhE22MT;EgE12MD;;IACU,gCAAA;IhE62MT;EACF;A+DhtMD;EACE,0BAAA;E/DktMD;A+D7sMD;EAAA;IAFI,2BAAA;I/DmtMD;EACF;A+DjtMD;EACE,0BAAA;E/DmtMD;A+D9sMD;EAAA;IAFI,4BAAA;I/DotMD;EACF;A+DltMD;EACE,0BAAA;E/DotMD;A+D/sMD;EAAA;IAFI,kCAAA;I/DqtMD;EACF;A+D9sMD;EAAA;ICpLE,0BAAA;IhEs4MC;EACF","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n select {\n background: #fff !important;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .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 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .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 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .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 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.form-group-sm .form-control {\n height: 30px;\n line-height: 30px;\n}\ntextarea.form-group-sm .form-control,\nselect[multiple].form-group-sm .form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n min-height: 32px;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.form-group-lg .form-control {\n height: 46px;\n line-height: 46px;\n}\ntextarea.form-group-lg .form-control,\nselect[multiple].form-group-lg .form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n min-height: 38px;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px solid;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding: 30px 15px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding: 48px 0;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-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);\n background-image: -o-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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-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);\n background-image: -o-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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-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);\n background-image: -o-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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-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);\n background-image: -o-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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-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);\n background-image: -o-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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-weight: normal;\n line-height: 1.4;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n white-space: normal;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000;\n -moz-perspective: 1000;\n perspective: 1000;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n// Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged\n\n[role=\"button\"] {\n cursor: pointer;\n}","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n line-height: @input-height-base;\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n }\n .form-control-static {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n min-height: (@line-height-computed + @font-size-small);\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n }\n .form-control-static {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n min-height: (@line-height-computed + @font-size-large);\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding (@jumbotron-padding / 2);\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding: (@jumbotron-padding * 1.6) 0;\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Reset font and text properties given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-small;\n font-weight: normal;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Reset font and text properties given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: @line-height-base;\n text-align: left;\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/http2/doc/api/static-assets/favicon.png b/http2/doc/api/static-assets/favicon.png
deleted file mode 100644
index 7d3901d..0000000
--- a/http2/doc/api/static-assets/favicon.png
+++ /dev/null
Binary files differ
diff --git a/http2/doc/api/static-assets/play_button.svg b/http2/doc/api/static-assets/play_button.svg
deleted file mode 100644
index c39a2f4..0000000
--- a/http2/doc/api/static-assets/play_button.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="68" height="68" viewBox="0 0 17.992 17.992"><path d="M17.992 8.996A8.996 8.996 0 1 0 0 8.996a8.996 8.996 0 0 0 17.992 0m-2.23 0l-9.895 5.713V3.282l9.896 5.714h2.229z" fill-opacity=".198"/><path d="M15.763 8.996l-9.896 5.713V3.283z" fill="#7d7d7d" fill-opacity=".821"/></svg>
\ No newline at end of file
diff --git a/http2/doc/api/static-assets/readme.md b/http2/doc/api/static-assets/readme.md
deleted file mode 100644
index 287f566..0000000
--- a/http2/doc/api/static-assets/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# highlight.js
-
-Generated from https://highlightjs.org/download/ on 2017-08-30
-
-Included languages:
-
-* bash
-* css
-* dart
-* java
-* javascript
-* json
-* markdown
-* objectivec
-* ruby - dragged in by `yaml` - 🙄
-* shell
-* swift
-* xml - includes html
-* yaml
diff --git a/http2/example/display_headers.dart b/http2/example/display_headers.dart
deleted file mode 100644
index c1faa4d..0000000
--- a/http2/example/display_headers.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:http2/transport.dart';
-
-main(List<String> args) async {
- if (args == null || args.length != 1) {
- print('Usage: dart display_headers.dart <HTTPS_URI>');
- exit(1);
- }
-
- var uriArg = args[0];
-
- if (!uriArg.startsWith('https://')) {
- print('URI must start with https://');
- exit(1);
- }
-
- var uri = Uri.parse(uriArg);
-
- var socket = await connect(uri);
-
- // The default client settings will disable server pushes. We
- // therefore do not need to deal with [stream.peerPushes].
- var transport = new ClientTransportConnection.viaSocket(socket);
-
- var headers = [
- new Header.ascii(':method', 'GET'),
- new Header.ascii(':path', uri.path),
- new Header.ascii(':scheme', uri.scheme),
- new Header.ascii(':authority', uri.host),
- ];
-
- var stream = transport.makeRequest(headers, endStream: true);
- await for (var message in stream.incomingMessages) {
- if (message is HeadersStreamMessage) {
- for (var header in message.headers) {
- var name = utf8.decode(header.name);
- var value = utf8.decode(header.value);
- print('$name: $value');
- }
- } else if (message is DataStreamMessage) {
- // Use [message.bytes] (but respect 'content-encoding' header)
- }
- }
- await transport.finish();
-}
-
-Future<Socket> connect(Uri uri) async {
- bool useSSL = uri.scheme == 'https';
- if (useSSL) {
- var secureSocket = await SecureSocket.connect(uri.host, uri.port,
- supportedProtocols: ['h2']);
- if (secureSocket.selectedProtocol != 'h2') {
- throw new Exception("Failed to negogiate http/2 via alpn. Maybe server "
- "doesn't support http/2.");
- }
- return secureSocket;
- } else {
- return await Socket.connect(uri.host, uri.port);
- }
-}
diff --git a/http2/experimental/server.dart b/http2/experimental/server.dart
deleted file mode 100644
index 6637cc2..0000000
--- a/http2/experimental/server.dart
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.experimental.server;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:http2/src/testing/debug.dart' hide print;
-import 'package:http2/transport.dart';
-
-const bool DEBUGGING = false;
-
-const String HOSTNAME = 'localhost';
-const int PORT = 7777;
-
-main() async {
- String localFile(String path) => Platform.script.resolve(path).toFilePath();
-
- var context = new SecurityContext()
- ..usePrivateKey(localFile('server_key.pem'), password: 'dartdart')
- ..useCertificateChain(localFile('server_chain.pem'))
- ..setAlpnProtocols(['h2'], true);
-
- var server = await SecureServerSocket.bind(HOSTNAME, PORT, context);
- print('HTTP/2 server listening on https://$HOSTNAME:$PORT');
-
- runZoned(() {
- server.listen(handleClient);
- }, onError: (e, s) {
- print("Unexpected error: $e");
- print("Unexpected error - stack: $s");
- });
-}
-
-handleClient(SecureSocket socket) {
- dumpInfo('main', 'Got new https client');
-
- var connection;
- if (DEBUGGING) {
- connection = debugPrintingConnection(socket);
- } else {
- connection = new ServerTransportConnection.viaSocket(socket);
- }
-
- connection.incomingStreams.listen((ServerTransportStream stream) async {
- dumpInfo('main', 'Got new HTTP/2 stream with id: ${stream.id}');
-
- String path;
- stream.incomingMessages.listen((StreamMessage msg) async {
- dumpInfo('${stream.id}', 'Got new incoming message');
- if (msg is HeadersStreamMessage) {
- dumpHeaders('${stream.id}', msg.headers);
- if (path == null) {
- path = pathFromHeaders(msg.headers);
- if (path == null) throw new Exception('no path given');
-
- if (path == '/') {
- sendHtml(stream);
- } else if (['/iframe', '/iframe2'].contains(path)) {
- sendIFrameHtml(stream, path);
- } else {
- send404(stream, path);
- }
- }
- } else if (msg is DataStreamMessage) {
- dumpData('${stream.id}', msg.bytes);
- }
- });
- });
-}
-
-void dumpHeaders(String prefix, List<Header> headers) {
- for (int i = 0; i < headers.length; i++) {
- String key = ascii.decode(headers[i].name);
- String value = ascii.decode(headers[i].value);
- print('[$prefix] $key: $value');
- }
-}
-
-String pathFromHeaders(List<Header> headers) {
- for (int i = 0; i < headers.length; i++) {
- if (ascii.decode(headers[i].name) == ':path') {
- return ascii.decode(headers[i].value);
- }
- }
- throw new Exception('Expected a :path header, but did not find one.');
-}
-
-void dumpData(String prefix, List<int> data) {
- print('[$prefix] Got ${data.length} bytes.');
-}
-
-void dumpInfo(String prefix, String msg) {
- print('[$prefix] $msg');
-}
-
-Future sendHtml(ServerTransportStream stream) async {
- push(stream, '/iframe', sendIFrameHtml);
- push(stream, '/iframe2', sendIFrameHtml);
- push(stream, '/favicon.ico', send404);
-
- stream.sendHeaders([
- new Header.ascii(':status', '200'),
- new Header.ascii('content-type', 'text/html; charset=utf-8'),
- ]);
- stream.sendData(ascii.encode('''
-<html>
- <head><title>hello</title></head>
- <body>
- <h1> head </h1>
- first <br />
- <iframe src='/iframe' with="100" height="100"></iframe> <br />
- second <br />
- <iframe src='/iframe2' with="100" height="100"></iframe> <br />
- </body>
-</html>
-'''));
- return stream.outgoingMessages.close();
-}
-
-Future push(ServerTransportStream stream, String path,
- Future sendResponse(TransportStream stream, String path)) async {
- var requestHeaders = [
- new Header.ascii(':authority', '$HOSTNAME:$PORT'),
- new Header.ascii(':method', 'GET'),
- new Header.ascii(':path', path),
- new Header.ascii(':scheme', 'https'),
- ];
-
- var pushStream = stream.push(requestHeaders);
- await sendResponse(pushStream, path);
-}
-
-Future sendIFrameHtml(TransportStream stream, String path) async {
- stream.sendHeaders([
- new Header.ascii(':status', '200'),
- new Header.ascii('content-type', 'text/html; charset=utf-8'),
- ]);
- stream.sendData(ascii.encode('''
-<html>
- <head><title>Content for '$path' inside an IFrame.</title></head>
- <body>
- <h2>Content for '$path' inside an IFrame.</h2>
- </body>
-</html>
-'''));
- await stream.outgoingMessages.close();
-}
-
-Future send404(TransportStream stream, String path) async {
- stream.sendHeaders([
- new Header.ascii(':status', '404'),
- new Header.ascii('content-type', 'text/html; charset=utf-8'),
- ]);
- stream.sendData(ascii.encode('''
-<html>
- <head><title>Path '$path' was not found on this server.</title></head>
- <body>
- <h1>Path '$path' was not found on this server.</h1>
- </body>
-</html>
-'''));
- return stream.outgoingMessages.close();
-}
diff --git a/http2/experimental/server_chain.pem b/http2/experimental/server_chain.pem
deleted file mode 100644
index 4163fe7..0000000
--- a/http2/experimental/server_chain.pem
+++ /dev/null
@@ -1,57 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDKTCCAhGgAwIBAgIJAOWmjTS+OnTEMA0GCSqGSIb3DQEBCwUAMBcxFTATBgNV
-BAMMDGludGVybWVkaWF0ZTAeFw0xNTA1MTgwOTAwNDBaFw0yMzA4MDQwOTAwNDBa
-MBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALlcwQJuzd+xH8QFgfJSn5tRlvhkldSX98cE7NiA602NBbnAVyUrkRXq
-Ni75lgt0kwjYfA9z674m8WSVbgpLPintPCla9CYky1TH0keIs8Rz6cGWHryWEHiu
-EDuljQynu2b3sAFuHu9nfWurbJwZnFakBKpdQ9m4EyOZCHC/jHYY7HacKSXg1Cki
-we2ca0BWDrcqy8kLy0dZ5oC6IZG8O8drAK8f3f44CRYw59D3sOKBrKXaabpvyEcb
-N7Wk2HDBVwHpUJo1reVwtbM8dhqQayYSD8oXnGpP3RQNu/e2rzlXRyq/BfcDY1JI
-7TbC4t/7/N4EcPSpGsTcSOC9A7FpzvECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglg
-hkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O
-BBYEFCnwiEMMFZh7NhCr+qA8K0w4Q+AOMB8GA1UdIwQYMBaAFB0h1Evsaw2vfrmS
-YuoCTmC4EE6ZMA0GCSqGSIb3DQEBCwUAA4IBAQAcFmHMaXRxyoNaeOowQ6iQWoZd
-AUbvG7SHr7I6Pi2aqdqofsKWts7Ytm5WsS0M2nN+sW504houu0iCPeJJX8RQw2q4
-CCcNOs9IXk+2uMzlpocHpv+yYoUiD5DxgWh7eghQMLyMpf8FX3Gy4VazeuXznHOM
-4gE4L417xkDzYOzqVTp0FTyAPUv6G2euhNCD6TMru9REcRhYul+K9kocjA5tt2KG
-MH6y28LXbLyq4YJUxSUU9gY/xlnbbZS48KDqEcdYC9zjW9nQ0qS+XQuQuFIcwjJ5
-V4kAUYxDu6FoTpyQjgsrmBbZlKNxH7Nj4NDlcdJhp/zeSKHqWa5hSWjjKIxp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAeqgAwIBAgIJAOWmjTS+OnTDMA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNV
-BAMMDXJvb3RhdXRob3JpdHkwHhcNMTUwNTE4MDkwMDQwWhcNMjMwODA0MDkwMDQw
-WjAXMRUwEwYDVQQDDAxpbnRlcm1lZGlhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDSrAO1CoPvUllgLOzDm5nG0skDF7vh1DUgAIDVGz0ecD0JFbQx
-EF79pju/6MbtpTW2FYvRp11t/G7rGtX923ybOHY/1MNFQrdIvPlO1VV7IGKjoMwP
-DNeb0fIGjHoE9QxaDxR8NX8xQbItpsw+TUtRfc9SLkR+jaYJfVRoM21BOncZbSHE
-YKiZlEbpecB/+EtwVpgvl+8mPD5U07Fi4fp/lza3WXInXQPyiTVllIEJCt4PKmlu
-MocNaJOW38bysL7i0PzDpVZtOxLHOTaW68yF3FckIHNCaA7k1ABEEEegjFMmIao7
-B9w7A0jvr4jZVvNmui5Djjn+oJxwEVVgyf8LAgMBAAGjUDBOMB0GA1UdDgQWBBQd
-IdRL7GsNr365kmLqAk5guBBOmTAfBgNVHSMEGDAWgBRk81s9d0ZbiZhh44KckwPb
-oTc0XzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBZQTK0plfdB5PC
-cC5icut4EmrByJa1RbU7ayuEE70e7hla6KVmVjVdCBGltI4jBYwfhKbRItHiAJ/8
-x+XZKBG8DLPFuDb7lAa1ObhAYF7YThUFPQYaBhfzKcWrdmWDBFpvNv6E0Mm364dZ
-e7Yxmbe5S4agkYPoxEzgEYmcUk9jbjdR6eTbs8laG169ljrECXfEU9RiAcqz5iSX
-NLSewqB47hn3B9qgKcQn+PsgO2j7M+rfklhNgeGJeWmy7j6clSOuCsIjWHU0RLQ4
-0W3SB/rpEAJ7fgQbYUPTIUNALSOWi/o1tDX2mXPRjBoxqAv7I+vYk1lZPmSzkyRh
-FKvRDxsW
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAzCCAeugAwIBAgIJAJ0MomS4Ck+8MA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNV
-BAMMDXJvb3RhdXRob3JpdHkwHhcNMTUwNTE4MDkwMDQwWhcNMjMwODA0MDkwMDQw
-WjAYMRYwFAYDVQQDDA1yb290YXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAts1ijtBV92S2cOvpUMOSTp9c6A34nIGr0T5Nhz6XiqRVT+gv
-dQgmkdKJQjbvR60y6jzltYFsI2MpGVXY8h/oAL81D/k7PDB2aREgyBfTPAhBHyGw
-siR+2xYt5b/Zs99q5RdRqQNzNpLPJriIKvUsRyQWy1UiG2s7pRXQeA8qB0XtJdCj
-kFIi+G2bDsaffspGeDOCqt7t+yqvRXfSES0c/l7DIHaiMbbp4//ZNML3RNgAjPz2
-hCezZ+wOYajOIyoSPK8IgICrhYFYxvgWxwbLDBEfC5B3jOQsySe10GoRAKZz1gBV
-DmgReu81tYJmdgkc9zknnQtIFdA0ex+GvZlfWQIDAQABo1AwTjAdBgNVHQ4EFgQU
-ZPNbPXdGW4mYYeOCnJMD26E3NF8wHwYDVR0jBBgwFoAUZPNbPXdGW4mYYeOCnJMD
-26E3NF8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEATzkZ97K777uZ
-lQcduNX3ey4IbCiEzFA2zO5Blj+ilfIwNbZXNOgm/lqNvVGDYs6J1apJJe30vL3X
-J+t2zsZWzzQzb9uIU37zYemt6m0fHrSrx/iy5lGNqt3HMfqEcOqSCOIK3PCTMz2/
-uyGe1iw33PVeWsm1JUybQ9IrU/huJjbgOHU4wab+8SJCM49ipArp68Fr6j4lcEaE
-4rfRg1ZsvxiOyUB3qPn6wyL/JB8kOJ+QCBe498376eaem8AEFk0kQRh6hDaWtq/k
-t6IIXQLjx+EBDVP/veK0UnVhKRP8YTOoV8ZiG1NcdlJmX/Uk7iAfevP7CkBfSN8W
-r6AL284qtw==
------END CERTIFICATE-----
diff --git a/http2/experimental/server_key.pem b/http2/experimental/server_key.pem
deleted file mode 100644
index 1fd2324..0000000
--- a/http2/experimental/server_key.pem
+++ /dev/null
@@ -1,29 +0,0 @@
------BEGIN ENCRYPTED PRIVATE KEY-----
-MIIE5DAcBgoqhkiG9w0BDAEBMA4ECL7L6rj6uEHGAgIIAASCBMLbucyfqAkgCbhP
-xNSHYllPMAv/dsIjtnsBwepCXPGkCBCuOAw/2FaCHjN9hBqL5V7fkrKeaemhm2YE
-ycPtlHJYPDf3kEkyMjdZ9rIY6kePGfQizs2uJPcXj4YPyQ4HsfVXpOicKfQrouf5
-Mze9bGzeMN065q3iP4dYUMwHAyZYteXCsanQNHlqvsWli0W+H8St8fdsXefZhnv1
-qVatKWdNdWQ9t5MuljgNU2Vv56sHKEYXI0yLxk2QUMk8KlJfnmt8foYUsnPUXHmc
-gIjLKwwVkpdololnEHSNu0cEOUPowjgJru+uMpn7vdNl7TPEQ9jbEgdNg4JwoYzU
-0nao8WzjaSp7kzvZz0VFwKnk5AjstGvvuAWckADdq23QElbn/mF7AG1m/TBpYxzF
-gTt37UdndS/AcvVznWVVrRP5iTSIawdIwvqI4s7rqsoE0GCcak+RhchgAz2gWKkS
-oODUo0JL6pPVbJ3l4ebbaO6c99nDVc8dViPtc1EkStJEJ2O4kI4xgLSCr4Y9ahKn
-oAaoSkX7Xxq3aQm+BzqSpLjdGL8atsqR/YVOIHYIl3gThvP0NfZGx1xHyvO5mCdZ
-kHxSA7tKWxauZ3eQ2clbnzeRsl4El0WMHy/5K1ovene4v7sunmoXVtghBC8hK6eh
-zMO9orex2PNQ/VQC7HCvtytunOVx1lkSBoNo7hR70igg6rW9H7UyoAoBOwMpT1xa
-J6V62nqruTKOqFNfur7aHJGpHGtDb5/ickHeYCyPTvmGp67u4wChzKReeg02oECe
-d1E5FKAcIa8s9TVOB6Z+HvTRNQZu2PsI6TJnjQRowvY9DAHiWTlJZBBY/pko3hxX
-TsIeybpvRdEHpDWv86/iqtw1hv9CUxS/8ZTWUgBo+osShHW79FeDASr9FC4/Zn76
-ZDERTgV4YWlW/klVWcG2lFo7jix+OPXAB+ZQavLhlN1xdWBcIz1AUWjAM4hdPylW
-HCX4PB9CQIPl2E7F+Y2p6nMcMWSJVBi5UIH7E9LfaBguXSzMmTk2Fw5p1aOQ6wfN
-goVAMVwi8ppAVs741PfHdZ295xMmK/1LCxz5DeAdD/tsA/SYfT753GotioDuC7im
-EyJ5JyvTr5I6RFFBuqt3NlUb3Hp16wP3B2x9DZiB6jxr0l341/NHgsyeBXkuIy9j
-ON2mvpBPCJhS8kgWo3G0UyyKnx64tcgpGuSvZhGwPz843B6AbYyE6pMRfSWRMkMS
-YZYa+VNKhR4ixdj07ocFZEWLVjCH7kxkE8JZXKt8jKYmkWd0lS1QVjgaKlO6lRa3
-q6SPJkhW6pvqobvcqVNXwi1XuzpZeEbuh0B7OTekFTTxx5g9XeDl56M8SVQ1KEhT
-Q1t7H2Nba18WCB7cf+6PN0F0K0Jz1Kq7ZWaqEI/grX1m4RQuvNF5807sB/QKMO/Z
-Gz3NXvHg5xTJRd/567lxPGkor0cE7qD1EZfmJ2HrBYXQ91bhgA7LToBuMZo6ZRXH
-QfsanjbP4FPLMiGdQigLjj3A35L/f4sQOOVac/sRaFnm7pzcxsMvyVU/YtvGcjYE
-xaOOVnamg661Wo0wksXoDjeSz/JIyyKO3Gwp1FSm2wGLjjy/Ehmqcqy8rvHuf07w
-AUukhVtTNn4=
------END ENCRYPTED PRIVATE KEY-----
diff --git a/http2/lib/http2.dart b/http2/lib/http2.dart
deleted file mode 100644
index 3f1ed78..0000000
--- a/http2/lib/http2.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library provides an http/2 interface on top of a bidirectional stream
-/// of bytes.
-///
-/// The client and server sides can be created via [ClientTransportStream] and
-/// [ServerTransportStream] respectively. Both sides can be configured via
-/// settings (see [ClientSettings] and [ServerSettings]). The settings will be
-/// communicated to the remote peer (if necessary) and will be valid during the
-/// entire lifetime of the connection.
-///
-/// A http/2 transport allows a client to open a bidirectional stream (see
-/// [ClientTransportConnection.makeRequest]) and a server can open (or push) a
-/// unidirectional stream to the client via [ServerTransportStream.push].
-///
-/// In both cases (unidirectional and bidirectional stream), one can send
-/// headers and data to the other side (via [HeadersStreamMessage] and
-/// [DataStreamMessage]). These messages are ordered and will arrive in the same
-/// order as they were sent (data messages may be split up into multiple smaller
-/// chunks or might be combined).
-///
-/// In the most common case, each direction will send one [HeadersStreamMessage]
-/// followed by zero or more [DataStreamMessage]s.
-///
-/// Establishing a bidirectional stream of bytes to a server is up to the user
-/// of this library. There are 3 common ways to achive this
-///
-/// * connect to a server via SSL and use the ALPN (SSL) protocol extension
-/// to negotiate with the server to speak http/2 (the ALPN protocol
-/// identifier for http/2 is `h2`)
-///
-/// * have prior knowledge about the server - i.e. know ahead of time that
-/// the server will speak http/2 via an unencrypted tcp connection
-///
-/// * use a http/1.1 connection and upgrade it to http/2
-///
-/// The first way is the most common way and can be done in Dart by using
-/// `dart:io`s secure socket implementation (by using a `SecurityContext` and
-/// including 'h2' in the list of protocols used for ALPN).
-///
-/// A simple example on how to connect to a http/2 capable server and
-/// requesting a resource is available at https://github.com/dart-lang/http2/blob/master/example/display_headers.dart.
-library http2.http2;
-
-import 'transport.dart';
-export 'transport.dart';
diff --git a/http2/lib/multiprotocol_server.dart b/http2/lib/multiprotocol_server.dart
deleted file mode 100644
index 6fd168e..0000000
--- a/http2/lib/multiprotocol_server.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2016 the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.multiprotocol_server;
-
-import 'dart:async';
-import 'dart:io';
-
-import 'src/artificial_server_socket.dart';
-import 'transport.dart' as http2;
-
-/// Handles protocol negotiation with HTTP/1.1 and HTTP/2 clients.
-///
-/// Given a (host, port) pair and a [SecurityContext], [MultiProtocolHttpServer]
-/// will negotiate with the client whether HTTP/1.1 or HTTP/2 should be spoken.
-///
-/// The user must supply 2 callback functions to [startServing], which:
-/// * one handles HTTP/1.1 clients (called with a [HttpRequest])
-/// * one handles HTTP/2 clients (called with a [http2.ServerTransportStream])
-class MultiProtocolHttpServer {
- final SecureServerSocket _serverSocket;
- final http2.ServerSettings _settings;
-
- _ServerSocketController _http11Controller;
- HttpServer _http11Server;
-
- StreamController<http2.ServerTransportStream> _http2Controller;
- Stream<http2.ServerTransportStream> _http2Server;
- final _http2Connections = new Set<http2.ServerTransportConnection>();
-
- MultiProtocolHttpServer._(this._serverSocket, this._settings) {
- _http11Controller =
- new _ServerSocketController(_serverSocket.address, _serverSocket.port);
- _http11Server = new HttpServer.listenOn(_http11Controller.stream);
-
- _http2Controller = new StreamController();
- _http2Server = _http2Controller.stream;
- }
-
- /// Binds a new [SecureServerSocket] with a security [context] at [port] and
- /// [address] (see [SecureServerSocket.bind] for a description of supported
- /// types for [address]).
- ///
- /// Optionally [settings] can be supplied which will be used for HTTP/2
- /// clients.
- ///
- /// See also [startServing].
- static Future<MultiProtocolHttpServer> bind(
- address, int port, SecurityContext context,
- {http2.ServerSettings settings}) async {
- context.setAlpnProtocols(['h2', 'h2-14', 'http/1.1'], true);
- var secureServer = await SecureServerSocket.bind(address, port, context);
- return new MultiProtocolHttpServer._(secureServer, settings);
- }
-
- /// The port this multi-protocol HTTP server runs on.
- int get port => _serverSocket.port;
-
- /// The address this multi-protocol HTTP server runs on.
- InternetAddress get address => _serverSocket.address;
-
- /// Starts listening for HTTP/1.1 and HTTP/2 clients and calls the given
- /// callbacks for new clients.
- ///
- /// It is expected that [callbackHttp11] and [callbackHttp2] will never throw
- /// an exception (i.e. these must take care of error handling themselves).
- void startServing(void callbackHttp11(HttpRequest request),
- void callbackHttp2(http2.ServerTransportStream stream),
- {void onError(error, StackTrace stack)}) {
- // 1. Start listening on the real [SecureServerSocket].
- _serverSocket.listen((SecureSocket socket) {
- var protocol = socket.selectedProtocol;
- if (protocol == null || protocol == 'http/1.1') {
- _http11Controller.addHttp11Socket(socket);
- } else if (protocol == 'h2' || protocol == 'h2-14') {
- var connection = new http2.ServerTransportConnection.viaSocket(socket,
- settings: _settings);
- _http2Connections.add(connection);
- connection.incomingStreams.listen(_http2Controller.add,
- onError: onError,
- onDone: () => _http2Connections.remove(connection));
- } else {
- socket.destroy();
- throw new Exception("Unexpected negotiated ALPN protocol: $protocol.");
- }
- }, onError: onError);
-
- // 2. Drain all incoming http/1.1 and http/2 connections and call the
- // respective handlers.
- _http11Server.listen(callbackHttp11);
- _http2Server.listen(callbackHttp2);
- }
-
- /// Closes this [MultiProtocolHttpServer].
- ///
- /// Completes once everything has been successfully shut down.
- Future close({bool force: false}) {
- return _serverSocket.close().whenComplete(() {
- Future done1 = _http11Server.close(force: force);
- Future done2 = Future.wait(
- _http2Connections.map((c) => force ? c.terminate() : c.finish()));
- return Future.wait([done1, done2]);
- });
- }
-}
-
-/// An internal helper class.
-class _ServerSocketController {
- final InternetAddress address;
- final int port;
- final StreamController<Socket> _controller = new StreamController();
-
- _ServerSocketController(this.address, this.port);
-
- ArtificialServerSocket get stream {
- return new ArtificialServerSocket(address, port, _controller.stream);
- }
-
- void addHttp11Socket(Socket socket) {
- _controller.add(socket);
- }
-
- Future close() => _controller.close();
-}
diff --git a/http2/lib/src/artificial_server_socket.dart b/http2/lib/src/artificial_server_socket.dart
deleted file mode 100644
index 4c5cf07..0000000
--- a/http2/lib/src/artificial_server_socket.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2016 the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.artificial_server_socket;
-
-import 'dart:async';
-import 'dart:io';
-
-/// Custom implementation of the [ServerSocket] interface.
-///
-/// This class can be used to create a [ServerSocket] using [Stream<Socket>] and
-/// a [InternetAddress] and `port` (an example use case is to filter [Socket]s
-/// and keep the [ServerSocket] interface for APIs that expect it,
-/// e.g. `new HttpServer.listenOn()`).
-class ArtificialServerSocket extends StreamView<Socket>
- implements ServerSocket {
- ArtificialServerSocket(this.address, this.port, Stream<Socket> stream)
- : super(stream);
-
- // ########################################################################
- // These are the methods of [ServerSocket] in addition to [Stream<Socket>].
- // ########################################################################
-
- final InternetAddress address;
-
- final int port;
-
- /// Closing of an [ArtificialServerSocket] is not possible and an exception
- /// will be thrown when calling this method.
- Future<ServerSocket> close() async {
- throw new Exception("Did not expect close() to be called.");
- }
-}
diff --git a/http2/lib/src/async_utils/async_utils.dart b/http2/lib/src/async_utils/async_utils.dart
deleted file mode 100644
index 3f6d44a..0000000
--- a/http2/lib/src/async_utils/async_utils.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.async_utils.async_utils;
-
-import 'dart:async';
-import 'dart:io';
-
-/// An interface for `StreamSink`-like classes to indicate whether adding data
-/// would be buffered and when the buffer is empty again.
-class BufferIndicator {
- final StreamController _controller =
- new StreamController.broadcast(sync: true);
-
- /// A state variable indicating whether buffereing would occur at the moment.
- bool _wouldBuffer = true;
-
- /// Indicates whether calling [BufferedBytesWriter.add] would buffer the data
- /// if called.
- ///
- /// This can be used at a higher level as a way to do custom buffering and
- /// possibly prioritization.
- bool get wouldBuffer {
- return _wouldBuffer;
- }
-
- /// Signals that no buffering is happening at the moment.
- void markUnBuffered() {
- if (_wouldBuffer) {
- _wouldBuffer = false;
- _controller.add(null);
- }
- }
-
- /// Signals that buffering starts to happen.
- void markBuffered() {
- _wouldBuffer = true;
- }
-
- /// A broadcast stream notifying users that the [BufferedBytesWriter.add]
- /// method would not buffer the data if called.
- Stream get bufferEmptyEvents => _controller.stream;
-}
-
-/// Contains a [StreamSink] and a [BufferIndicator] to indicate whether writes
-/// to the sink would cause buffering.
-///
-/// It uses the `pause signal` from the `sink.addStream()` as an indicator
-/// whether the underlying stream cannot handle more data and would buffer.
-class BufferedSink {
- /// The indicator whether the underlying sink is buffering at the moment.
- final BufferIndicator bufferIndicator = new BufferIndicator();
-
- /// A intermediate [StreamController] used to catch pause signals and to
- /// propagate the change via [bufferIndicator].
- StreamController<List<int>> _controller;
-
- /// A future which completes once the sink has been closed.
- Future _doneFuture;
-
- BufferedSink(StreamSink<List<int>> dataSink) {
- bufferIndicator.markBuffered();
-
- _controller = new StreamController<List<int>>(
- onListen: () {
- bufferIndicator.markUnBuffered();
- },
- onPause: () {
- bufferIndicator.markBuffered();
- },
- onResume: () {
- bufferIndicator.markUnBuffered();
- },
- onCancel: () {
- // TODO: We may want to propagate cancel events as errors.
- // Currently `_doneFuture` will just complete normally if the sink
- // cancelled.
- },
- sync: true);
- _doneFuture =
- Future.wait([_controller.stream.pipe(dataSink), dataSink.done]);
- }
-
- /// The underlying sink.
- StreamSink<List<int>> get sink => _controller;
-
- /// The future which will complete once this sink has been closed.
- Future get doneFuture => _doneFuture;
-}
-
-/// A small wrapper around [BufferedSink] which writes data in batches.
-class BufferedBytesWriter {
- /// A buffer which will be used for batching writes.
- final BytesBuilder _builder = new BytesBuilder(copy: false);
-
- /// The underlying [BufferedSink].
- final BufferedSink _bufferedSink;
-
- BufferedBytesWriter(StreamSink<List<int>> outgoing)
- : _bufferedSink = new BufferedSink(outgoing);
-
- /// An indicator whether the underlying sink is buffering at the moment.
- BufferIndicator get bufferIndicator => _bufferedSink.bufferIndicator;
-
- /// Adds [data] immediately to the underlying buffer.
- ///
- /// If there is buffered data which was added with [addBufferedData] and it
- /// has not been flushed with [flushBufferedData] an error will be thrown.
- void add(List<int> data) {
- if (_builder.length > 0) {
- throw new StateError(
- 'Cannot trigger an asynchronous write while there is buffered data.');
- }
- _bufferedSink.sink.add(data);
- }
-
- /// Queues up [bytes] to be written.
- void addBufferedData(List<int> bytes) {
- _builder.add(bytes);
- }
-
- /// Flushes all data which was enqueued by [addBufferedData].
- void flushBufferedData() {
- if (_builder.length > 0) {
- _bufferedSink.sink.add(_builder.takeBytes());
- }
- }
-
- /// Closes this sink.
- Future close() {
- flushBufferedData();
- return _bufferedSink.sink.close().whenComplete(() => doneFuture);
- }
-
- /// The future which will complete once this sink has been closed.
- Future get doneFuture => _bufferedSink.doneFuture;
-}
diff --git a/http2/lib/src/byte_utils.dart b/http2/lib/src/byte_utils.dart
deleted file mode 100644
index 756e741..0000000
--- a/http2/lib/src/byte_utils.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.byte_utils;
-
-import 'dart:typed_data';
-
-List<int> viewOrSublist(List<int> data, int offset, int length) {
- if (data is Uint8List) {
- return new Uint8List.view(data.buffer, data.offsetInBytes + offset, length);
- } else {
- return data.sublist(offset, offset + length);
- }
-}
-
-int readInt64(List<int> bytes, int offset) {
- int high = readInt32(bytes, offset);
- int low = readInt32(bytes, offset + 4);
- return high << 32 | low;
-}
-
-int readInt32(List<int> bytes, int offset) {
- return (bytes[offset] << 24) |
- (bytes[offset + 1] << 16) |
- (bytes[offset + 2] << 8) |
- bytes[offset + 3];
-}
-
-int readInt24(List<int> bytes, int offset) {
- return (bytes[offset] << 16) | (bytes[offset + 1] << 8) | bytes[offset + 2];
-}
-
-int readInt16(List<int> bytes, int offset) {
- return (bytes[offset] << 8) | bytes[offset + 1];
-}
-
-void setInt64(List<int> bytes, int offset, int value) {
- setInt32(bytes, offset, value >> 32);
- setInt32(bytes, offset + 4, value & 0xffffffff);
-}
-
-void setInt32(List<int> bytes, int offset, int value) {
- bytes[offset] = (value >> 24) & 0xff;
- bytes[offset + 1] = (value >> 16) & 0xff;
- bytes[offset + 2] = (value >> 8) & 0xff;
- bytes[offset + 3] = value & 0xff;
-}
-
-void setInt24(List<int> bytes, int offset, int value) {
- bytes[offset] = (value >> 16) & 0xff;
- bytes[offset + 1] = (value >> 8) & 0xff;
- bytes[offset + 2] = value & 0xff;
-}
-
-void setInt16(List<int> bytes, int offset, int value) {
- bytes[offset] = (value >> 8) & 0xff;
- bytes[offset + 1] = value & 0xff;
-}
diff --git a/http2/lib/src/connection.dart b/http2/lib/src/connection.dart
deleted file mode 100644
index 271b86f..0000000
--- a/http2/lib/src/connection.dart
+++ /dev/null
@@ -1,490 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.conn;
-
-import 'dart:async';
-import 'dart:convert' show utf8;
-
-import '../transport.dart';
-import 'connection_preface.dart';
-import 'flowcontrol/connection_queues.dart';
-import 'flowcontrol/queue_messages.dart';
-import 'flowcontrol/window.dart';
-import 'flowcontrol/window_handler.dart';
-import 'frames/frame_defragmenter.dart';
-import 'frames/frames.dart';
-import 'hpack/hpack.dart';
-import 'ping/ping_handler.dart';
-import 'settings/settings.dart';
-import 'streams/stream_handler.dart';
-import 'sync_errors.dart';
-
-class ConnectionState {
- /// The connection has been established, we're waiting for the settings frame
- /// of the remote end.
- static const int Initialized = 1;
-
- /// The connection has been established and is fully operational.
- static const int Operational = 2;
-
- /// The connection is no longer accepting new streams or creating new streams.
- static const int Finishing = 3;
-
- /// The connection has been terminated and cannot be used anymore.
- static const int Terminated = 4;
-
- /// Whether we actively were finishing the connection.
- static const int FinishingActive = 1;
-
- /// Whether we passively were finishing the connection.
- static const int FinishingPassive = 2;
-
- int state = Initialized;
- int finishingState = 0;
-
- ConnectionState();
-
- bool get isInitialized => state == ConnectionState.Initialized;
-
- bool get isOperational => state == ConnectionState.Operational;
-
- bool get isFinishing => state == ConnectionState.Finishing;
-
- bool get isTerminated => state == ConnectionState.Terminated;
-
- bool get activeFinishing =>
- state == Finishing && (finishingState & FinishingActive) != 0;
-
- bool get passiveFinishing =>
- state == Finishing && (finishingState & FinishingPassive) != 0;
-
- String toString() {
- String message = '';
-
- void add(bool condition, String flag) {
- if (condition) {
- if (message.length == 0) {
- message = flag;
- } else {
- message = '$message/$flag';
- }
- }
- }
-
- add(isInitialized, 'Initialized');
- add(isOperational, 'IsOperational');
- add(isFinishing, 'IsFinishing');
- add(isTerminated, 'IsTerminated');
- add(activeFinishing, 'ActiveFinishing');
- add(passiveFinishing, 'PassiveFinishing');
-
- return message;
- }
-}
-
-abstract class Connection {
- /// The settings the other end has acknowledged to use when communicating with
- /// us.
- final ActiveSettings acknowledgedSettings = new ActiveSettings();
-
- /// The settings we have to obey communicating with the other side.
- final ActiveSettings peerSettings = new ActiveSettings();
-
- /// Whether this connection is a client connection.
- final bool isClientConnection;
-
- /// Active state handler for this connection.
- ActiveStateHandler onActiveStateChanged;
-
- /// The HPack context for this connection.
- final HPackContext _hpackContext = new HPackContext();
-
- /// The flow window for this connection of the peer.
- final Window _peerWindow = new Window();
-
- /// The flow window for this connection of this end.
- final Window _localWindow = new Window();
-
- /// Used for defragmenting PushPromise/Header frames.
- final FrameDefragmenter _defragmenter = new FrameDefragmenter();
-
- /// The outgoing frames of this connection;
- FrameWriter _frameWriter;
-
- /// A subscription of incoming [Frame]s.
- StreamSubscription<Frame> _frameReaderSubscription;
-
- /// The incoming connection-level message queue.
- ConnectionMessageQueueIn _incomingQueue;
-
- /// The outgoing connection-level message queue.
- ConnectionMessageQueueOut _outgoingQueue;
-
- /// The ping handler used for making pings & handling remote pings.
- PingHandler _pingHandler;
-
- /// The settings handler used for changing settings & for handling remote
- /// setting changes.
- SettingsHandler _settingsHandler;
-
- /// The set of active streams this connection has.
- StreamHandler _streams;
-
- /// The connection-level flow control window handler for outgoing messages.
- OutgoingConnectionWindowHandler _connectionWindowHandler;
-
- /// The state of this connection.
- ConnectionState _state;
-
- Connection(Stream<List<int>> incoming, StreamSink<List<int>> outgoing,
- Settings settings,
- {this.isClientConnection: true}) {
- _setupConnection(incoming, outgoing, settings);
- }
-
- /// Runs all setup necessary before new streams can be created with the remote
- /// peer.
- void _setupConnection(Stream<List<int>> incoming,
- StreamSink<List<int>> outgoing, Settings settingsObject) {
- // Setup frame reading.
- var incomingFrames =
- new FrameReader(incoming, acknowledgedSettings).startDecoding();
- _frameReaderSubscription = incomingFrames.listen((Frame frame) {
- _catchProtocolErrors(() => _handleFrameImpl(frame));
- }, onError: (error, stack) {
- _terminate(ErrorCode.CONNECT_ERROR, causedByTransportError: true);
- }, onDone: () {
- // Ensure existing messages from lower levels are sent to the upper
- // levels before we terminate everything.
- _incomingQueue.forceDispatchIncomingMessages();
- _streams.forceDispatchIncomingMessages();
-
- _terminate(ErrorCode.CONNECT_ERROR, causedByTransportError: true);
- });
-
- // Setup frame writing.
- _frameWriter =
- new FrameWriter(_hpackContext.encoder, outgoing, peerSettings);
- _frameWriter.doneFuture.then((_) {
- _terminate(ErrorCode.CONNECT_ERROR, causedByTransportError: true);
- }).catchError((error, stack) {
- _terminate(ErrorCode.CONNECT_ERROR, causedByTransportError: true);
- });
-
- // Setup handlers.
- _settingsHandler = new SettingsHandler(_hpackContext.encoder, _frameWriter,
- acknowledgedSettings, peerSettings);
- _pingHandler = new PingHandler(_frameWriter);
-
- var settings = _decodeSettings(settingsObject);
-
- // Do the initial settings handshake (possibly with pushes disabled).
- _settingsHandler.changeSettings(settings).catchError((error) {
- // TODO: The [error] can contain sensitive information we now expose via
- // a [Goaway] frame. We should somehow ensure we're only sending useful
- // but non-sensitive information.
- _terminate(ErrorCode.PROTOCOL_ERROR,
- message: 'Failed to set initial settings (error: $error).');
- });
-
- _settingsHandler.onInitialWindowSizeChange.listen((int difference) {
- _catchProtocolErrors(() {
- _streams.processInitialWindowSizeSettingChange(difference);
- });
- });
-
- // Setup the connection window handler, which keeps track of the
- // size of the outgoing connection window.
- _connectionWindowHandler = new OutgoingConnectionWindowHandler(_peerWindow);
-
- var connectionWindowUpdater =
- new IncomingWindowHandler.connection(_frameWriter, _localWindow);
-
- // Setup queues for outgoing/incoming messages on the connection level.
- _outgoingQueue =
- new ConnectionMessageQueueOut(_connectionWindowHandler, _frameWriter);
- _incomingQueue = new ConnectionMessageQueueIn(
- connectionWindowUpdater, _catchProtocolErrors);
-
- if (isClientConnection) {
- _streams = new StreamHandler.client(
- _frameWriter,
- _incomingQueue,
- _outgoingQueue,
- _settingsHandler.peerSettings,
- _settingsHandler.acknowledgedSettings,
- _activeStateHandler);
- } else {
- _streams = new StreamHandler.server(
- _frameWriter,
- _incomingQueue,
- _outgoingQueue,
- _settingsHandler.peerSettings,
- _settingsHandler.acknowledgedSettings,
- _activeStateHandler);
- }
-
- // NOTE: We're not waiting until initial settings have been exchanged
- // before we start using the connection (i.e. we don't wait for half a
- // round-trip-time).
- _state = new ConnectionState();
- }
-
- List<Setting> _decodeSettings(Settings settings) {
- var settingsList = <Setting>[];
-
- // By default a endpoitn can make an unlimited number of concurrent streams.
- if (settings.concurrentStreamLimit != null) {
- settingsList.add(new Setting(Setting.SETTINGS_MAX_CONCURRENT_STREAMS,
- settings.concurrentStreamLimit));
- }
-
- // By default the stream level flow control window is 64 KiB.
- if (settings.streamWindowSize != null) {
- settingsList.add(new Setting(
- Setting.SETTINGS_INITIAL_WINDOW_SIZE, settings.streamWindowSize));
- }
-
- if (settings is ClientSettings) {
- // By default the server is allowed to do server pushes.
- if (settings.allowServerPushes == null ||
- settings.allowServerPushes == false) {
- settingsList.add(new Setting(Setting.SETTINGS_ENABLE_PUSH, 0));
- }
- } else if (settings is ServerSettings) {
- // No special server settings at the moment.
- } else {
- assert(false);
- }
-
- return settingsList;
- }
-
- /// Pings the remote peer (can e.g. be used for measuring latency).
- Future ping() {
- return _pingHandler.ping().catchError((e, s) {
- return new Future.error(
- new TransportException('The connection has been terminated.'));
- }, test: (e) => e is TerminatedException);
- }
-
- /// Finishes this connection.
- Future finish() {
- _finishing(active: true);
-
- // TODO: There is probably more we need to wait for.
- return _streams.done.whenComplete(() {
- var futures = [_frameWriter.close()];
- var f = _frameReaderSubscription.cancel();
- if (f != null) futures.add(f);
- return Future.wait(futures);
- });
- }
-
- /// Terminates this connection forcefully.
- Future terminate() {
- return _terminate(ErrorCode.NO_ERROR);
- }
-
- void _activeStateHandler(bool isActive) {
- if (onActiveStateChanged != null) {
- onActiveStateChanged(isActive);
- }
- }
-
- /// Invokes the passed in closure and catches any exceptions.
- void _catchProtocolErrors(void fn()) {
- try {
- fn();
- } on ProtocolException catch (error) {
- _terminate(ErrorCode.PROTOCOL_ERROR, message: '$error');
- } on FlowControlException catch (error) {
- _terminate(ErrorCode.FLOW_CONTROL_ERROR, message: '$error');
- } on FrameSizeException catch (error) {
- _terminate(ErrorCode.FRAME_SIZE_ERROR, message: '$error');
- } on HPackDecodingException catch (error) {
- _terminate(ErrorCode.PROTOCOL_ERROR, message: '$error');
- } on TerminatedException {
- // We tried to perform an action even though the connection was already
- // terminated.
- // TODO: Can this even happen and if so, how should we propagate this
- // error?
- } catch (error) {
- _terminate(ErrorCode.INTERNAL_ERROR, message: '$error');
- }
- }
-
- void _handleFrameImpl(Frame frame) {
- // The first frame from the other side must be a [SettingsFrame], otherwise
- // we terminate the connection.
- if (_state.isInitialized) {
- if (frame is! SettingsFrame) {
- _terminate(ErrorCode.PROTOCOL_ERROR,
- message: 'Expected to first receive a settings frame.');
- return;
- }
- _state.state = ConnectionState.Operational;
- }
-
- // Try to defragment [frame] if it is a Headers/PushPromise frame.
- frame = _defragmenter.tryDefragmentFrame(frame);
- if (frame == null) return;
-
- // Try to decode headers if it's a Headers/PushPromise frame.
- // [This needs to be done even if the frames get ignored, since the entire
- // connection shares one HPack compression context.]
- if (frame is HeadersFrame) {
- frame.decodedHeaders =
- _hpackContext.decoder.decode(frame.headerBlockFragment);
- } else if (frame is PushPromiseFrame) {
- frame.decodedHeaders =
- _hpackContext.decoder.decode(frame.headerBlockFragment);
- }
-
- // Handle the frame as either a connection or a stream frame.
- if (frame.header.streamId == 0) {
- if (frame is SettingsFrame) {
- _settingsHandler.handleSettingsFrame(frame);
- } else if (frame is PingFrame) {
- _pingHandler.processPingFrame(frame);
- } else if (frame is WindowUpdateFrame) {
- _connectionWindowHandler.processWindowUpdate(frame);
- } else if (frame is GoawayFrame) {
- _streams.processGoawayFrame(frame);
- _finishing(active: false);
- } else if (frame is UnknownFrame) {
- // We can safely ignore these.
- } else {
- throw new ProtocolException(
- 'Cannot handle frame type ${frame.runtimeType} with stream-id 0.');
- }
- } else {
- _streams.processStreamFrame(_state, frame);
- }
- }
-
- void _finishing({bool active: true, String message}) {
- // If this connection is already dead, we return.
- if (_state.isTerminated) return;
-
- // If this connection is already finishing, we make sure to store the
- // passive bit, since this information is used by [StreamHandler].
- //
- // Vice versa should not matter: If we started passively finishing, an
- // active finish should be a NOP.
- if (_state.isFinishing) {
- if (!active) _state.finishingState |= ConnectionState.FinishingPassive;
- return;
- }
-
- assert(_state.isInitialized || _state.isOperational);
-
- // If we are actively finishing this connection, we'll send a
- // GoawayFrame otherwise we'll just propagate the message.
- if (active) {
- _state.state = ConnectionState.Finishing;
- _state.finishingState |= ConnectionState.FinishingActive;
-
- _outgoingQueue.enqueueMessage(new GoawayMessage(
- _streams.highestPeerInitiatedStream,
- ErrorCode.NO_ERROR,
- message != null ? utf8.encode(message) : []));
- } else {
- _state.state = ConnectionState.Finishing;
- _state.finishingState |= ConnectionState.FinishingPassive;
- }
-
- _streams.startClosing();
- }
-
- /// Terminates this connection (if it is not already terminated).
- ///
- /// The returned future will never complete with an error.
- Future _terminate(int errorCode,
- {bool causedByTransportError: false, String message}) {
- // TODO: When do we complete here?
- if (_state.state != ConnectionState.Terminated) {
- _state.state = ConnectionState.Terminated;
-
- var cancelFuture = new Future.sync(_frameReaderSubscription.cancel);
- if (!causedByTransportError) {
- _outgoingQueue.enqueueMessage(new GoawayMessage(
- _streams.highestPeerInitiatedStream,
- errorCode,
- message != null ? utf8.encode(message) : []));
- }
- var closeFuture = _frameWriter.close().catchError((e, s) {
- // We ignore any errors after writing to [GoawayFrame]
- });
-
- // Close all lower level handlers with an error message.
- // (e.g. if there is a pending connection.ping(), it's returned
- // Future will complete with this error).
- var exception = new TransportConnectionException(
- errorCode, 'Connection is being forcefully terminated.');
-
- // Close all streams & stream queues
- _streams.terminate(exception);
-
- // Close the connection queues
- _incomingQueue.terminate(exception);
- _outgoingQueue.terminate(exception);
-
- _pingHandler.terminate(exception);
- _settingsHandler.terminate(exception);
-
- return Future.wait([cancelFuture, closeFuture]).catchError((_) {});
- }
- return new Future.value();
- }
-}
-
-class ClientConnection extends Connection implements ClientTransportConnection {
- ClientConnection._(Stream<List<int>> incoming, StreamSink<List<int>> outgoing,
- Settings settings)
- : super(incoming, outgoing, settings, isClientConnection: true);
-
- factory ClientConnection(Stream<List<int>> incoming,
- StreamSink<List<int>> outgoing, ClientSettings clientSettings) {
- outgoing.add(CONNECTION_PREFACE);
- return new ClientConnection._(incoming, outgoing, clientSettings);
- }
-
- bool get isOpen =>
- !_state.isFinishing && !_state.isTerminated && _streams.canOpenStream;
-
- ClientTransportStream makeRequest(List<Header> headers,
- {bool endStream: false}) {
- if (_state.isFinishing) {
- throw new StateError(
- 'The http/2 connection is finishing and can therefore not be used to '
- 'make new streams.');
- } else if (_state.isTerminated) {
- throw new StateError(
- 'The http/2 connection is no longer active and can therefore not be '
- 'used to make new streams.');
- }
- var hStream = _streams.newStream(headers, endStream: endStream);
- if (_streams.ranOutOfStreamIds) {
- _finishing(active: true, message: 'Ran out of stream ids');
- }
- return hStream;
- }
-}
-
-class ServerConnection extends Connection implements ServerTransportConnection {
- ServerConnection._(Stream<List<int>> incoming, StreamSink<List<int>> outgoing,
- Settings settings)
- : super(incoming, outgoing, settings, isClientConnection: false);
-
- factory ServerConnection(Stream<List<int>> incoming,
- StreamSink<List<int>> outgoing, ServerSettings serverSettings) {
- var frameBytes = readConnectionPreface(incoming);
- return new ServerConnection._(frameBytes, outgoing, serverSettings);
- }
-
- Stream<ServerTransportStream> get incomingStreams =>
- _streams.incomingStreams.cast<ServerTransportStream>();
-}
diff --git a/http2/lib/src/connection_preface.dart b/http2/lib/src/connection_preface.dart
deleted file mode 100644
index 08cf7e8..0000000
--- a/http2/lib/src/connection_preface.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.connection_preface;
-
-import 'dart:async';
-import 'dart:math';
-
-import 'byte_utils.dart';
-
-/// This is a set of bytes with which a client connection begins in the normal
-/// case. It can be used on a server to distinguish HTTP/1.1 and HTTP/2 clients.
-const List<int> CONNECTION_PREFACE = const [
- 0x50,
- 0x52,
- 0x49,
- 0x20,
- 0x2a,
- 0x20,
- 0x48,
- 0x54,
- 0x54,
- 0x50,
- 0x2f,
- 0x32,
- 0x2e,
- 0x30,
- 0x0d,
- 0x0a,
- 0x0d,
- 0x0a,
- 0x53,
- 0x4d,
- 0x0d,
- 0x0a,
- 0x0d,
- 0x0a
-];
-
-/// Reads the connection preface from [incoming].
-///
-/// The returned `Stream` will be a duplicate of `incoming` without the
-/// connection preface. If an error occurs while reading the connection
-/// preface, the returned stream will have only an error.
-Stream<List<int>> readConnectionPreface(Stream<List<int>> incoming) {
- StreamController<List<int>> result;
- StreamSubscription subscription;
- bool connectionPrefaceRead = false;
- var prefaceBuffer = <int>[];
- bool terminated = false;
-
- terminate(error) {
- if (!terminated) {
- result.addError(error);
- result.close();
- subscription.cancel();
- }
- terminated = true;
- }
-
- bool compareConnectionPreface(List<int> data) {
- for (int i = 0; i < CONNECTION_PREFACE.length; i++) {
- if (data[i] != CONNECTION_PREFACE[i]) {
- terminate('Connection preface does not match.');
- return false;
- }
- }
- prefaceBuffer = null;
- connectionPrefaceRead = true;
- return true;
- }
-
- void onData(List<int> data) {
- if (connectionPrefaceRead) {
- // Forward data after reading preface.
- result.add(data);
- } else {
- if (prefaceBuffer.isEmpty && data.length > CONNECTION_PREFACE.length) {
- if (!compareConnectionPreface(data)) return;
- data = data.sublist(CONNECTION_PREFACE.length);
- } else if (prefaceBuffer.length < CONNECTION_PREFACE.length) {
- int remaining = CONNECTION_PREFACE.length - prefaceBuffer.length;
-
- int end = min(data.length, remaining);
- var part1 = viewOrSublist(data, 0, end);
- var part2 = viewOrSublist(data, end, data.length - end);
- prefaceBuffer.addAll(part1);
-
- if (prefaceBuffer.length == CONNECTION_PREFACE.length) {
- if (!compareConnectionPreface(prefaceBuffer)) return;
- }
- data = part2;
- }
- if (data.length > 0) {
- result.add(data);
- }
- }
- }
-
- result = new StreamController(
- onListen: () {
- subscription = incoming.listen(onData,
- onError: (e, StackTrace s) => result.addError(e, s),
- onDone: () {
- if (prefaceBuffer != null) {
- terminate('EOS before connection preface could be read.');
- } else {
- result.close();
- }
- });
- },
- onPause: () => subscription.pause(),
- onResume: () => subscription.resume(),
- onCancel: () => subscription.cancel());
-
- return result.stream;
-}
diff --git a/http2/lib/src/error_handler.dart b/http2/lib/src/error_handler.dart
deleted file mode 100644
index ec1935d..0000000
--- a/http2/lib/src/error_handler.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.error_handler;
-
-import 'dart:async';
-
-import 'sync_errors.dart';
-
-/// Used by classes which may be terminated from the outside.
-class TerminatableMixin {
- bool _terminated = false;
-
- /// Terminates this stream message queue. Further operations on it will fail.
- void terminate([error]) {
- if (!wasTerminated) {
- _terminated = true;
- onTerminated(error);
- }
- }
-
- bool get wasTerminated => _terminated;
-
- void onTerminated(error) {
- // Subclasses can override this method if they want.
- }
-
- T ensureNotTerminatedSync<T>(T f()) {
- if (wasTerminated) {
- throw new TerminatedException();
- }
- return f();
- }
-
- Future ensureNotTerminatedAsync(Future f()) {
- if (wasTerminated) {
- return new Future.error(new TerminatedException());
- }
- return f();
- }
-}
-
-/// Used by classes which may be cancelled.
-class CancellableMixin {
- bool _cancelled = false;
- final _cancelCompleter = new Completer<void>.sync();
-
- Future<void> get onCancel => _cancelCompleter.future;
-
- /// Cancel this stream message queue. Further operations on it will fail.
- void cancel() {
- if (!wasCancelled) {
- _cancelled = true;
- _cancelCompleter.complete();
- }
- }
-
- bool get wasCancelled => _cancelled;
-}
-
-/// Used by classes which may be closed.
-class ClosableMixin {
- bool _closing = false;
- final Completer _completer = new Completer();
-
- Future get done => _completer.future;
-
- bool get isClosing => _closing;
- bool get wasClosed => _completer.isCompleted;
-
- void startClosing() {
- if (!_closing) {
- _closing = true;
-
- onClosing();
- }
- onCheckForClose();
- }
-
- void onCheckForClose() {
- // Subclasses can override this method if they want.
- }
-
- void onClosing() {
- // Subclasses can override this method if they want.
- }
-
- dynamic ensureNotClosingSync(f()) {
- if (isClosing) {
- throw new StateError('Was in the process of closing.');
- }
- return f();
- }
-
- void closeWithValue([value]) {
- if (!wasClosed) {
- _completer.complete(value);
- }
- }
-
- void closeWithError(error) {
- if (!wasClosed) {
- _completer.complete(error);
- }
- }
-}
diff --git a/http2/lib/src/flowcontrol/connection_queues.dart b/http2/lib/src/flowcontrol/connection_queues.dart
deleted file mode 100644
index 4d28db2..0000000
--- a/http2/lib/src/flowcontrol/connection_queues.dart
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO: Take priorities into account.
-// TODO: Properly fragment large data frames, so they are not taking up too much
-// bandwidth.
-library http2.src.flowcontrol.connection_flow_controller;
-
-import 'dart:async';
-import 'dart:collection';
-
-import '../../transport.dart';
-
-import '../byte_utils.dart';
-import '../error_handler.dart';
-import '../frames/frames.dart';
-
-import 'queue_messages.dart';
-import 'stream_queues.dart';
-import 'window_handler.dart';
-
-/// The last place before messages coming from the application get encoded and
-/// send as [Frame]s.
-///
-/// It will convert [Message]s from higher layers and send them via [Frame]s.
-///
-/// - It will queue messages until the connection-level flow control window
-/// allows sending the message and the underlying [StreamSink] is not
-/// buffering.
-/// - It will use a [FrameWriter] to write a new frame to the connection.
-// TODO: Make [StreamsHandler] call [connectionOut.startClosing()] once
-// * all streams have been closed
-// * the connection state is finishing
-class ConnectionMessageQueueOut extends Object
- with TerminatableMixin, ClosableMixin {
- /// The handler which will be used for increasing the connection-level flow
- /// control window.
- final OutgoingConnectionWindowHandler _connectionWindow;
-
- /// The buffered [Message]s which are to be delivered to the remote peer.
- final Queue<Message> _messages = new Queue<Message>();
-
- /// The [FrameWriter] used for writing Headers/Data/PushPromise frames.
- final FrameWriter _frameWriter;
-
- ConnectionMessageQueueOut(this._connectionWindow, this._frameWriter) {
- _frameWriter.bufferIndicator.bufferEmptyEvents.listen((_) {
- _trySendMessages();
- });
- _connectionWindow.positiveWindow.bufferEmptyEvents.listen((_) {
- _trySendMessages();
- });
- }
-
- /// The number of pending messages which haven't been written to the wire.
- int get pendingMessages => _messages.length;
-
- /// Enqueues a new [Message] which should be delivered to the remote peer.
- void enqueueMessage(Message message) {
- ensureNotClosingSync(() {
- if (!wasTerminated) {
- _messages.addLast(message);
- _trySendMessages();
- }
- });
- }
-
- void onTerminated(error) {
- _messages.clear();
- closeWithError(error);
- }
-
- void onCheckForClose() {
- if (isClosing && _messages.length == 0) {
- closeWithValue();
- }
- }
-
- void _trySendMessages() {
- if (!wasTerminated) {
- // We can make progress if
- // * there is at least one message to send
- // * the underlying frame writer / sink / socket doesn't block
- // * either one
- // * the next message is a non-flow control message (e.g. headers)
- // * the connection window is positive
-
- if (_messages.length > 0 &&
- !_frameWriter.bufferIndicator.wouldBuffer &&
- (!_connectionWindow.positiveWindow.wouldBuffer ||
- _messages.first is! DataMessage)) {
- _trySendMessage();
-
- // If we have more messages and we can send them, we'll run them
- // using `Timer.run()` to let other things get in-between.
- if (_messages.length > 0 &&
- !_frameWriter.bufferIndicator.wouldBuffer &&
- (!_connectionWindow.positiveWindow.wouldBuffer ||
- _messages.first is! DataMessage)) {
- // TODO: If all the frame writer methods would return the
- // number of bytes written, we could just say, we loop here until 10kb
- // and after words, we'll make `Timer.run()`.
- Timer.run(_trySendMessages);
- } else {
- onCheckForClose();
- }
- }
- }
- }
-
- void _trySendMessage() {
- Message message = _messages.first;
- if (message is HeadersMessage) {
- _messages.removeFirst();
- _frameWriter.writeHeadersFrame(message.streamId, message.headers,
- endStream: message.endStream);
- } else if (message is PushPromiseMessage) {
- _messages.removeFirst();
- _frameWriter.writePushPromiseFrame(
- message.streamId, message.promisedStreamId, message.headers);
- } else if (message is DataMessage) {
- _messages.removeFirst();
-
- if (_connectionWindow.peerWindowSize >= message.bytes.length) {
- _connectionWindow.decreaseWindow(message.bytes.length);
- _frameWriter.writeDataFrame(message.streamId, message.bytes,
- endStream: message.endStream);
- } else {
- // NOTE: We need to fragment the DataMessage.
- // TODO: Do not fragment if the number of bytes we can send is too low
- int len = _connectionWindow.peerWindowSize;
- var head = viewOrSublist(message.bytes, 0, len);
- var tail =
- viewOrSublist(message.bytes, len, message.bytes.length - len);
-
- _connectionWindow.decreaseWindow(head.length);
- _frameWriter.writeDataFrame(message.streamId, head, endStream: false);
-
- var tailMessage =
- new DataMessage(message.streamId, tail, message.endStream);
- _messages.addFirst(tailMessage);
- }
- } else if (message is ResetStreamMessage) {
- _messages.removeFirst();
- _frameWriter.writeRstStreamFrame(message.streamId, message.errorCode);
- } else if (message is GoawayMessage) {
- _messages.removeFirst();
- _frameWriter.writeGoawayFrame(
- message.lastStreamId, message.errorCode, message.debugData);
- } else {
- throw new StateError(
- 'Unexpected message in queue: ${message.runtimeType}');
- }
- }
-}
-
-/// The first place an incoming stream message gets delivered to.
-///
-/// The [ConnectionMessageQueueIn] will be given [Frame]s which were sent to
-/// any stream on this connection.
-///
-/// - It will extract the necessary data from the [Frame] and store it in a new
-/// [Message] object.
-/// - It will multiplex the created [Message]es to a stream-specific
-/// [StreamMessageQueueIn].
-/// - If the [StreamMessageQueueIn] cannot accept more data, the data will be
-/// buffered until it can.
-/// - [DataMessage]s which have been successfully delivered to a stream-specific
-/// [StreamMessageQueueIn] will increase the flow control window for the
-/// connection.
-///
-/// Incoming [DataFrame]s will decrease the flow control window the peer has
-/// available.
-// TODO: Make [StreamsHandler] call [connectionOut.startClosing()] once
-// * all streams have been closed
-// * the connection state is finishing
-class ConnectionMessageQueueIn extends Object
- with TerminatableMixin, ClosableMixin {
- /// The handler which will be used for increasing the connection-level flow
- /// control window.
- final IncomingWindowHandler _windowUpdateHandler;
-
- /// Catches any protocol errors and acts upon them.
- final Function _catchProtocolErrors;
-
- /// A mapping from stream-id to the corresponding stream-specific
- /// [StreamMessageQueueIn].
- final Map<int, StreamMessageQueueIn> _stream2messageQueue = {};
-
- /// A buffer for [Message]s which cannot be received by their
- /// [StreamMessageQueueIn].
- final Map<int, Queue<Message>> _stream2pendingMessages = {};
-
- /// The number of pending messages which haven't been delivered
- /// to the stream-specific queue. (for debugging purposes)
- int _count = 0;
-
- ConnectionMessageQueueIn(
- this._windowUpdateHandler, this._catchProtocolErrors);
-
- void onTerminated(error) {
- // NOTE: The higher level will be shutdown first, so all streams
- // should have been removed at this point.
- assert(_stream2messageQueue.isEmpty);
- assert(_stream2pendingMessages.isEmpty);
- closeWithError(error);
- }
-
- void onCheckForClose() {
- if (isClosing) {
- assert(_stream2messageQueue.isEmpty == _stream2pendingMessages.isEmpty);
- if (_stream2messageQueue.isEmpty) {
- closeWithValue();
- }
- }
- }
-
- /// The number of pending messages which haven't been delivered
- /// to the stream-specific queue. (for debugging purposes)
- int get pendingMessages => _count;
-
- /// Registers a stream specific [StreamMessageQueueIn] for a new stream id.
- void insertNewStreamMessageQueue(int streamId, StreamMessageQueueIn mq) {
- if (_stream2messageQueue.containsKey(streamId)) {
- throw new ArgumentError(
- 'Cannot register a SteramMessageQueueIn for the same streamId '
- 'multiple times');
- }
-
- var pendingMessages = new Queue<Message>();
- _stream2pendingMessages[streamId] = pendingMessages;
- _stream2messageQueue[streamId] = mq;
-
- mq.bufferIndicator.bufferEmptyEvents.listen((_) {
- _catchProtocolErrors(() {
- _tryDispatch(streamId, mq, pendingMessages);
- });
- });
- }
-
- /// Removes a stream id and its message queue from this connection-level
- /// message queue.
- void removeStreamMessageQueue(int streamId) {
- _stream2pendingMessages.remove(streamId);
- _stream2messageQueue.remove(streamId);
- }
-
- /// Processes an incoming [DataFrame] which is addressed to a specific stream.
- void processDataFrame(DataFrame frame) {
- var streamId = frame.header.streamId;
- var message =
- new DataMessage(streamId, frame.bytes, frame.hasEndStreamFlag);
-
- _windowUpdateHandler.gotData(message.bytes.length);
- _addMessage(streamId, message);
- }
-
- /// If a [DataFrame] will be ignored, this method will take the minimal
- /// action necessary.
- void processIgnoredDataFrame(DataFrame frame) {
- _windowUpdateHandler.gotData(frame.bytes.length);
- }
-
- /// Processes an incoming [HeadersFrame] which is addressed to a specific
- /// stream.
- void processHeadersFrame(HeadersFrame frame) {
- var streamId = frame.header.streamId;
- var message = new HeadersMessage(
- streamId, frame.decodedHeaders, frame.hasEndStreamFlag);
- // NOTE: Header frames do not affect flow control - only data frames do.
- _addMessage(streamId, message);
- }
-
- /// Processes an incoming [PushPromiseFrame] which is addressed to a specific
- /// stream.
- void processPushPromiseFrame(
- PushPromiseFrame frame, ClientTransportStream pushedStream) {
- var streamId = frame.header.streamId;
- var message = new PushPromiseMessage(streamId, frame.decodedHeaders,
- frame.promisedStreamId, pushedStream, false);
-
- // NOTE:
- // * Header frames do not affect flow control - only data frames do.
- // * At this point we might reorder a push message earlier than
- // data/headers messages.
- _addPushMessage(streamId, message);
- }
-
- void _addMessage(int streamId, Message message) {
- _count++;
-
- // TODO: Do we need to do a runtime check here and
- // raise a protocol error if we cannot find the registered stream?
- var streamMQ = _stream2messageQueue[streamId];
- var pendingMessages = _stream2pendingMessages[streamId];
- pendingMessages.addLast(message);
- _tryDispatch(streamId, streamMQ, pendingMessages);
- }
-
- void _addPushMessage(int streamId, PushPromiseMessage message) {
- _count++;
-
- // TODO: Do we need to do a runtime check here and
- // raise a protocol error if we cannot find the registered stream?
- var streamMQ = _stream2messageQueue[streamId];
- streamMQ.enqueueMessage(message);
- }
-
- void _tryDispatch(
- int streamId, StreamMessageQueueIn mq, Queue<Message> pendingMessages) {
- int bytesDeliveredToStream = 0;
- while (!mq.bufferIndicator.wouldBuffer && pendingMessages.length > 0) {
- _count--;
-
- var message = pendingMessages.removeFirst();
- if (message is DataMessage) {
- bytesDeliveredToStream += message.bytes.length;
- }
- mq.enqueueMessage(message);
- if (message.endStream) {
- assert(pendingMessages.isEmpty);
-
- _stream2messageQueue.remove(streamId);
- _stream2pendingMessages.remove(streamId);
- }
- }
- if (bytesDeliveredToStream > 0) {
- _windowUpdateHandler.dataProcessed(bytesDeliveredToStream);
- }
-
- onCheckForClose();
- }
-
- void forceDispatchIncomingMessages() {
- final toBeRemoved = new Set<int>();
- _stream2pendingMessages.forEach((int streamId, Queue<Message> messages) {
- final mq = _stream2messageQueue[streamId];
- while (messages.isNotEmpty) {
- _count--;
- final message = messages.removeFirst();
- mq.enqueueMessage(message);
- if (message.endStream) {
- toBeRemoved.add(streamId);
- break;
- }
- }
- });
-
- for (final streamId in toBeRemoved) {
- _stream2messageQueue.remove(streamId);
- _stream2pendingMessages.remove(streamId);
- }
- }
-}
diff --git a/http2/lib/src/flowcontrol/queue_messages.dart b/http2/lib/src/flowcontrol/queue_messages.dart
deleted file mode 100644
index b30ab3f..0000000
--- a/http2/lib/src/flowcontrol/queue_messages.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.flowcontrol.queue_messages;
-
-import '../../transport.dart';
-
-/// The subclasses of [Message] are objects that are coming from the
-/// connection layer on top of frames.
-///
-/// Messages on a HTTP/2 stream will be represented by a different class
-/// hierarchy.
-abstract class Message {
- final int streamId;
- final bool endStream;
-
- Message(this.streamId, this.endStream);
-}
-
-class HeadersMessage extends Message {
- final List<Header> headers;
-
- HeadersMessage(int streamId, this.headers, bool endStream)
- : super(streamId, endStream);
-
- String toString() =>
- 'HeadersMessage(headers: ${headers.length}, endStream: $endStream)';
-}
-
-class DataMessage extends Message {
- final List<int> bytes;
-
- DataMessage(int streamId, this.bytes, bool endStream)
- : super(streamId, endStream);
-
- String toString() =>
- 'DataMessage(bytes: ${bytes.length}, endStream: $endStream)';
-}
-
-class PushPromiseMessage extends Message {
- final List<Header> headers;
- final int promisedStreamId;
- final ClientTransportStream pushedStream;
-
- PushPromiseMessage(int streamId, this.headers, this.promisedStreamId,
- this.pushedStream, bool endStream)
- : super(streamId, endStream);
-
- String toString() => 'PushPromiseMessage(bytes: ${headers.length}, '
- 'promisedStreamId: $promisedStreamId, endStream: $endStream)';
-}
-
-class ResetStreamMessage extends Message {
- final int errorCode;
-
- ResetStreamMessage(int streamId, this.errorCode) : super(streamId, false);
-
- String toString() => 'ResetStreamMessage(errorCode: $errorCode)';
-}
-
-class GoawayMessage extends Message {
- final int lastStreamId;
- final int errorCode;
- final List<int> debugData;
-
- GoawayMessage(this.lastStreamId, this.errorCode, this.debugData)
- : super(0, false);
-
- String toString() => 'GoawayMessage(lastStreamId: ${lastStreamId}, '
- 'errorCode: ${errorCode}, debugData: ${debugData.length})';
-}
diff --git a/http2/lib/src/flowcontrol/stream_queues.dart b/http2/lib/src/flowcontrol/stream_queues.dart
deleted file mode 100644
index dc6d2f2..0000000
--- a/http2/lib/src/flowcontrol/stream_queues.dart
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.flowcontrol.stream_queues;
-
-import 'dart:async';
-import 'dart:collection';
-
-import '../../transport.dart';
-import '../async_utils/async_utils.dart';
-import '../byte_utils.dart';
-import '../error_handler.dart';
-
-import 'connection_queues.dart';
-import 'queue_messages.dart';
-import 'window_handler.dart';
-
-/// This class will buffer any headers/data messages in the order they were
-/// added.
-///
-/// It will ensure that we never send more data than the remote flow control
-/// window allows.
-class StreamMessageQueueOut extends Object
- with TerminatableMixin, ClosableMixin {
- /// The id of the stream this message queue belongs to.
- final int streamId;
-
- /// The stream-level flow control handler.
- final OutgoingStreamWindowHandler streamWindow;
-
- /// The underlying connection-level message queue.
- final ConnectionMessageQueueOut connectionMessageQueue;
-
- /// A indicator for whether this queue is currently buffering.
- final BufferIndicator bufferIndicator = new BufferIndicator();
-
- /// Buffered [Message]s which will be written to the underlying connection
- /// if the flow control window allows so.
- final Queue<Message> _messages = new Queue<Message>();
-
- /// Debugging data on how much data should be written to the underlying
- /// connection message queue.
- int toBeWrittenBytes = 0;
-
- /// Debugging data on how much data was written to the underlying connection
- /// message queue.
- int writtenBytes = 0;
-
- StreamMessageQueueOut(
- this.streamId, this.streamWindow, this.connectionMessageQueue) {
- streamWindow.positiveWindow.bufferEmptyEvents.listen((_) {
- if (!wasTerminated) {
- _trySendData();
- }
- });
- if (streamWindow.positiveWindow.wouldBuffer) {
- bufferIndicator.markBuffered();
- } else {
- bufferIndicator.markUnBuffered();
- }
- }
-
- /// Debugging data about how many messages are pending to be written to the
- /// connection message queue.
- int get pendingMessages => _messages.length;
-
- /// Enqueues a new [Message] which is to be delivered to the connection
- /// message queue.
- void enqueueMessage(Message message) {
- if (message is! ResetStreamMessage) ensureNotClosingSync(() {});
- if (!wasTerminated) {
- if (message.endStream) startClosing();
-
- if (message is DataMessage) {
- toBeWrittenBytes += message.bytes.length;
- }
-
- _messages.addLast(message);
- _trySendData();
-
- if (_messages.length > 0) {
- bufferIndicator.markBuffered();
- }
- }
- }
-
- void onTerminated(error) {
- _messages.clear();
- closeWithError(error);
- }
-
- void onCheckForClose() {
- if (isClosing && _messages.isEmpty) closeWithValue();
- }
-
- void _trySendData() {
- int queueLenBefore = _messages.length;
-
- while (_messages.length > 0) {
- Message message = _messages.first;
-
- if (message is HeadersMessage) {
- _messages.removeFirst();
- connectionMessageQueue.enqueueMessage(message);
- } else if (message is DataMessage) {
- int bytesAvailable = streamWindow.peerWindowSize;
- if (bytesAvailable > 0 || message.bytes.length == 0) {
- _messages.removeFirst();
-
- // Do we need to fragment?
- DataMessage messageToSend = message;
- List<int> messageBytes = message.bytes;
- // TODO: Do not fragment if the number of bytes we can send is too low
- if (messageBytes.length > bytesAvailable) {
- var partA = viewOrSublist(messageBytes, 0, bytesAvailable);
- var partB = viewOrSublist(messageBytes, bytesAvailable,
- messageBytes.length - bytesAvailable);
- var messageA = new DataMessage(message.streamId, partA, false);
- var messageB =
- new DataMessage(message.streamId, partB, message.endStream);
-
- // Put the second fragment back into the front of the queue.
- _messages.addFirst(messageB);
-
- // Send the first fragment.
- messageToSend = messageA;
- }
-
- writtenBytes += messageToSend.bytes.length;
- streamWindow.decreaseWindow(messageToSend.bytes.length);
- connectionMessageQueue.enqueueMessage(messageToSend);
- } else {
- break;
- }
- } else if (message is ResetStreamMessage) {
- _messages.removeFirst();
- connectionMessageQueue.enqueueMessage(message);
- } else {
- throw new StateError('Unknown messages type: ${message.runtimeType}');
- }
- }
- if (queueLenBefore > 0 && _messages.isEmpty) {
- bufferIndicator.markUnBuffered();
- }
-
- onCheckForClose();
- }
-}
-
-/// Keeps a list of [Message] which should be delivered to the
-/// [TransportStream].
-///
-/// It will keep messages up to the stream flow control window size if the
-/// [messages] listener is paused.
-class StreamMessageQueueIn extends Object
- with TerminatableMixin, ClosableMixin, CancellableMixin {
- /// The stream-level window our peer is using when sending us messages.
- final IncomingWindowHandler windowHandler;
-
- /// A indicator whether this [StreamMessageQueueIn] is currently buffering.
- final BufferIndicator bufferIndicator = new BufferIndicator();
-
- /// The pending [Message]s which are to be delivered via the [messages]
- /// stream.
- final Queue<Message> _pendingMessages = new Queue<Message>();
-
- /// The [StreamController] used for producing the [messages] stream.
- StreamController<StreamMessage> _incomingMessagesC;
-
- /// The [StreamController] used for producing the [serverPushes] stream.
- StreamController<TransportStreamPush> _serverPushStreamsC;
-
- StreamMessageQueueIn(this.windowHandler) {
- // We start by marking it as buffered, since no one is listening yet and
- // incoming messages will get buffered.
- bufferIndicator.markBuffered();
-
- _incomingMessagesC = new StreamController(
- onListen: () {
- if (!wasClosed && !wasTerminated) {
- _tryDispatch();
- _tryUpdateBufferIndicator();
- }
- },
- onPause: () {
- _tryUpdateBufferIndicator();
- // TODO: Would we ever want to decrease the window size in this
- // situation?
- },
- onResume: () {
- if (!wasClosed && !wasTerminated) {
- _tryDispatch();
- _tryUpdateBufferIndicator();
- }
- },
- onCancel: cancel);
-
- _serverPushStreamsC = new StreamController(onListen: () {
- if (!wasClosed && !wasTerminated) {
- _tryDispatch();
- _tryUpdateBufferIndicator();
- }
- });
- }
-
- /// Debugging data: the number of pending messages in this queue.
- int get pendingMessages => _pendingMessages.length;
-
- /// The stream of [StreamMessage]s which come from the remote peer.
- Stream<StreamMessage> get messages => _incomingMessagesC.stream;
-
- /// The stream of [TransportStreamPush]es which come from the remote peer.
- Stream<TransportStreamPush> get serverPushes => _serverPushStreamsC.stream;
-
- /// A lower layer enqueues a new [Message] which should be delivered to the
- /// app.
- void enqueueMessage(Message message) {
- ensureNotClosingSync(() {
- if (!wasTerminated) {
- if (message is PushPromiseMessage) {
- // NOTE: If server pushes were enabled, the client is responsible for
- // either rejecting or handling them.
- assert(!_serverPushStreamsC.isClosed);
- var transportStreamPush =
- new TransportStreamPush(message.headers, message.pushedStream);
- _serverPushStreamsC.add(transportStreamPush);
- return;
- }
-
- if (message is DataMessage) {
- windowHandler.gotData(message.bytes.length);
- }
- _pendingMessages.add(message);
- if (message.endStream) startClosing();
-
- _tryDispatch();
- _tryUpdateBufferIndicator();
- }
- });
- }
-
- void onTerminated(exception) {
- _pendingMessages.clear();
- if (!wasClosed) {
- if (exception != null) {
- _incomingMessagesC.addError(exception);
- }
- _incomingMessagesC.close();
- _serverPushStreamsC.close();
- closeWithError(exception);
- }
- }
-
- void onCloseCheck() {
- if (isClosing && !wasClosed && _pendingMessages.isEmpty) {
- _incomingMessagesC.close();
- _serverPushStreamsC.close();
- closeWithValue();
- }
- }
-
- void forceDispatchIncomingMessages() {
- while (_pendingMessages.isNotEmpty) {
- final message = _pendingMessages.removeFirst();
- assert(!_incomingMessagesC.isClosed);
- if (message is HeadersMessage) {
- _incomingMessagesC.add(new HeadersStreamMessage(message.headers,
- endStream: message.endStream));
- } else if (message is DataMessage) {
- if (message.bytes.length > 0) {
- _incomingMessagesC.add(new DataStreamMessage(message.bytes,
- endStream: message.endStream));
- }
- } else {
- // This can never happen.
- assert(false);
- }
- if (message.endStream) {
- onCloseCheck();
- }
- }
- }
-
- void _tryDispatch() {
- while (!wasTerminated && _pendingMessages.isNotEmpty) {
- bool handled = wasCancelled;
-
- var message = _pendingMessages.first;
- if (wasCancelled) {
- _pendingMessages.removeFirst();
- } else if (message is HeadersMessage || message is DataMessage) {
- assert(!_incomingMessagesC.isClosed);
- if (_incomingMessagesC.hasListener && !_incomingMessagesC.isPaused) {
- _pendingMessages.removeFirst();
- if (message is HeadersMessage) {
- // NOTE: Header messages do not affect flow control - only
- // data messages do.
- _incomingMessagesC.add(new HeadersStreamMessage(message.headers,
- endStream: message.endStream));
- } else if (message is DataMessage) {
- if (message.bytes.length > 0) {
- _incomingMessagesC.add(new DataStreamMessage(message.bytes,
- endStream: message.endStream));
- windowHandler.dataProcessed(message.bytes.length);
- }
- } else {
- // This can never happen.
- assert(false);
- }
- handled = true;
- }
- }
- if (handled) {
- if (message.endStream) {
- onCloseCheck();
- }
- } else {
- break;
- }
- }
- }
-
- void _tryUpdateBufferIndicator() {
- if (_incomingMessagesC.isPaused || _pendingMessages.length > 0) {
- bufferIndicator.markBuffered();
- } else if (bufferIndicator.wouldBuffer && !_incomingMessagesC.isPaused) {
- bufferIndicator.markUnBuffered();
- }
- }
-}
diff --git a/http2/lib/src/flowcontrol/window.dart b/http2/lib/src/flowcontrol/window.dart
deleted file mode 100644
index 10ba3f7..0000000
--- a/http2/lib/src/flowcontrol/window.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.window;
-
-class Window {
- static const int MAX_WINDOW_SIZE = (1 << 31) - 1;
-
- /// The size available in this window.
- ///
- /// The default flow control window for the entire connection and for new
- /// streams is 65535).
- ///
- /// NOTE: This value can potentially become negative.
- int _size;
-
- Window({int initialSize: (1 << 16) - 1}) : _size = initialSize;
-
- /// The current size of the flow control window.
- int get size => _size;
-
- void modify(int difference) {
- _size += difference;
- }
-}
diff --git a/http2/lib/src/flowcontrol/window_handler.dart b/http2/lib/src/flowcontrol/window_handler.dart
deleted file mode 100644
index 909fa2b..0000000
--- a/http2/lib/src/flowcontrol/window_handler.dart
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.window_handler;
-
-import '../async_utils/async_utils.dart';
-import '../frames/frames.dart';
-import '../sync_errors.dart';
-
-import 'window.dart';
-
-abstract class AbstractOutgoingWindowHandler {
- /// The connection flow control window.
- final Window _peerWindow;
-
- /// Indicates when the outgoing connection window turned positive and we can
- /// send data frames again.
- final BufferIndicator positiveWindow = new BufferIndicator();
-
- AbstractOutgoingWindowHandler(this._peerWindow) {
- if (_peerWindow.size > 0) {
- positiveWindow.markUnBuffered();
- }
- }
-
- /// The flow control window size we use for sending data. We are not allowed
- /// to let this window be negative.
- int get peerWindowSize => _peerWindow.size;
-
- /// Process a window update frame received from the remote end.
- void processWindowUpdate(WindowUpdateFrame frame) {
- int increment = frame.windowSizeIncrement;
- if ((_peerWindow.size + increment) > Window.MAX_WINDOW_SIZE) {
- throw new FlowControlException(
- 'Window update received from remote peer would make flow control '
- 'window too large.');
- } else {
- _peerWindow.modify(increment);
- }
-
- // If we transitioned from an negative/empty window to a positive window
- // we'll fire an event that more data frames can be sent now.
- if (positiveWindow.wouldBuffer && _peerWindow.size > 0) {
- positiveWindow.markUnBuffered();
- }
- }
-
- /// Update the peer window by subtracting [numberOfBytes].
- ///
- /// The remote peer will send us [WindowUpdateFrame]s which will increase
- /// the window again at a later point in time.
- void decreaseWindow(int numberOfBytes) {
- _peerWindow.modify(-numberOfBytes);
- if (_peerWindow.size <= 0) {
- positiveWindow.markBuffered();
- }
- }
-}
-
-/// Handles the connection window for outgoing data frames.
-class OutgoingConnectionWindowHandler extends AbstractOutgoingWindowHandler {
- OutgoingConnectionWindowHandler(Window window) : super(window);
-}
-
-/// Handles the window for outgoing messages to the peer.
-class OutgoingStreamWindowHandler extends AbstractOutgoingWindowHandler {
- OutgoingStreamWindowHandler(Window window) : super(window);
-
- /// Update the peer window by adding [difference] to it.
- ///
- ///
- /// The remote peer has send a new [SettingsFrame] which updated the default
- /// stream level [Setting.SETTINGS_INITIAL_WINDOW_SIZE]. This causes all
- /// existing streams to update the flow stream-level flow control window.
- void processInitialWindowSizeSettingChange(int difference) {
- if ((_peerWindow.size + difference) > Window.MAX_WINDOW_SIZE) {
- throw new FlowControlException(
- 'Window update received from remote peer would make flow control '
- 'window too large.');
- } else {
- _peerWindow.modify(difference);
- if (_peerWindow.size <= 0) {
- positiveWindow.markBuffered();
- } else if (positiveWindow.wouldBuffer) {
- positiveWindow.markUnBuffered();
- }
- }
- }
-}
-
-/// Mirrors the flow control window the remote end is using.
-class IncomingWindowHandler {
- /// The [FrameWriter] used for writing [WindowUpdateFrame]s to the wire.
- final FrameWriter _frameWriter;
-
- /// The mirror of the [Window] the remote end sees.
- ///
- /// If [_localWindow ] turns negative, it means the remote peer sent us more
- /// data than we allowed it to send.
- final Window _localWindow;
-
- /// The stream id this window handler is for (is `0` for connection level).
- final int _streamId;
-
- IncomingWindowHandler.stream(
- this._frameWriter, this._localWindow, this._streamId);
-
- IncomingWindowHandler.connection(this._frameWriter, this._localWindow)
- : _streamId = 0;
-
- /// The current size for the incoming data window.
- ///
- /// (This should never get negative, otherwise the peer send us more data
- /// than we told it to send.)
- int get localWindowSize => _localWindow.size;
-
- /// Signals that we received [numberOfBytes] from the remote peer.
- void gotData(int numberOfBytes) {
- _localWindow.modify(-numberOfBytes);
-
- // If this turns negative, it means the remote end send us more data
- // then we announced we can handle (i.e. the remote window size must be
- // negative).
- //
- // NOTE: [_localWindow.size] tracks the amount of data we advertised that we
- // can handle. The value can change in three situations:
- //
- // a) We received data from the remote end (we can handle now less data)
- // => This is handled by [gotData].
- //
- // b) We processed data from the remote end (we can handle now more data)
- // => This is handled by [dataProcessed].
- //
- // c) We increase/decrease the initial stream window size after the
- // stream was created (newer streams will start with the changed
- // initial stream window size).
- // => This is not an issue, because we don't support changing the
- // initial window size later on -- only during the initial
- // settings exchange. Since streams (and therefore instances
- // of [IncomingWindowHandler]) are only created after sending out
- // our initial settings.
- //
- if (_localWindow.size < 0) {
- throw new FlowControlException(
- 'Connection level flow control window became negative.');
- }
- }
-
- /// Tell the peer we received [numberOfBytes] bytes. It will increase it's
- /// sending window then.
- ///
- // TODO/FIXME: If we pause and don't want to get more data, we have to
- // - either stop sending window update frames
- // - or decreasing the window size
- void dataProcessed(int numberOfBytes) {
- _localWindow.modify(numberOfBytes);
-
- // TODO: This can be optimized by delaying the window update to
- // send one update with a bigger difference than multiple small update
- // frames.
- _frameWriter.writeWindowUpdate(numberOfBytes, streamId: _streamId);
- }
-}
diff --git a/http2/lib/src/frames/frame_defragmenter.dart b/http2/lib/src/frames/frame_defragmenter.dart
deleted file mode 100644
index 44fc076..0000000
--- a/http2/lib/src/frames/frame_defragmenter.dart
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.frames.frame_defragmenter;
-
-import '../sync_errors.dart';
-
-import 'frames.dart';
-
-/// Class used for defragmenting [HeadersFrame]s and [PushPromiseFrame]s.
-// TODO: Somehow emit an error if too many continuation frames have been sent
-// (since we're buffering all of them).
-class FrameDefragmenter {
- /// The current incomplete [HeadersFrame] fragment.
- HeadersFrame _headersFrame;
-
- /// The current incomplete [PushPromiseFrame] fragment.
- PushPromiseFrame _pushPromiseFrame;
-
- /// Tries to defragment [frame].
- ///
- /// If the given [frame] is a [HeadersFrame] or a [PushPromiseFrame] which
- /// needs de-fragmentation, it will be saved and `null` will be returned.
- ///
- /// If there is currently an incomplete [HeadersFrame] or [PushPromiseFrame]
- /// saved, [frame] needs to be a [ContinuationFrame]. It will be added to the
- /// saved frame. In case the defragmentation is complete, the defragmented
- /// [HeadersFrame] or [PushPromiseFrame] will be returned.
- ///
- /// All other [Frame] types will be returned.
- // TODO: Consider handling continuation frames without preceding
- // headers/push-promise frame here instead of the call site?
- Frame tryDefragmentFrame(Frame frame) {
- if (_headersFrame != null) {
- if (frame is ContinuationFrame) {
- if (_headersFrame.header.streamId != frame.header.streamId) {
- throw new ProtocolException(
- 'Defragmentation: frames have different stream ids.');
- }
- _headersFrame = _headersFrame.addBlockContinuation(frame);
-
- if (frame.hasEndHeadersFlag) {
- var frame = _headersFrame;
- _headersFrame = null;
- return frame;
- } else {
- return null;
- }
- } else {
- throw new ProtocolException(
- 'Defragmentation: Incomplete frame must be followed by '
- 'continuation frame.');
- }
- } else if (_pushPromiseFrame != null) {
- if (frame is ContinuationFrame) {
- if (_pushPromiseFrame.header.streamId != frame.header.streamId) {
- throw new ProtocolException(
- 'Defragmentation: frames have different stream ids.');
- }
- _pushPromiseFrame = _pushPromiseFrame.addBlockContinuation(frame);
-
- if (frame.hasEndHeadersFlag) {
- var frame = _pushPromiseFrame;
- _pushPromiseFrame = null;
- return frame;
- } else {
- return null;
- }
- } else {
- throw new ProtocolException(
- 'Defragmentation: Incomplete frame must be followed by '
- 'continuation frame.');
- }
- } else {
- if (frame is HeadersFrame) {
- if (!frame.hasEndHeadersFlag) {
- _headersFrame = frame;
- return null;
- }
- } else if (frame is PushPromiseFrame) {
- if (!frame.hasEndHeadersFlag) {
- _pushPromiseFrame = frame;
- return null;
- }
- }
- }
-
- // If this frame is not relevant for header defragmentation, we pass it to
- // the next stage.
- return frame;
- }
-}
diff --git a/http2/lib/src/frames/frame_reader.dart b/http2/lib/src/frames/frame_reader.dart
deleted file mode 100644
index 2812dc6..0000000
--- a/http2/lib/src/frames/frame_reader.dart
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of http2.src.frames;
-
-/// Used for converting a `Stream<List<int>>` to a `Stream<Frame>`.
-class FrameReader {
- final Stream<List<int>> _inputStream;
-
- /// Connection settings which this reader needs to ensure the remote end is
- /// complying with.
- ActiveSettings _localSettings;
-
- StreamSubscription<List<int>> _subscription;
- StreamController<Frame> _framesController;
-
- FrameReader(this._inputStream, this._localSettings);
-
- /// Starts to listen on the input stream and decodes HTTP/2 transport frames.
- Stream<Frame> startDecoding() {
- List<List<int>> bufferedData = new List<List<int>>();
- int bufferedLength = 0;
-
- FrameHeader tryReadHeader() {
- if (bufferedLength >= FRAME_HEADER_SIZE) {
- // Get at least FRAME_HEADER_SIZE bytes in the first byte array.
- _mergeLists(bufferedData, FRAME_HEADER_SIZE);
-
- // Read the frame header from the first byte array.
- return _readFrameHeader(bufferedData[0], 0);
- }
- return null;
- }
-
- Frame tryReadFrame(FrameHeader header) {
- int totalFrameLen = FRAME_HEADER_SIZE + header.length;
- if (bufferedLength >= totalFrameLen) {
- // Get the whole frame in the first byte array.
- _mergeLists(bufferedData, totalFrameLen);
-
- // Read the frame.
- Frame frame = _readFrame(header, bufferedData[0], FRAME_HEADER_SIZE);
-
- // Update bufferedData/bufferedLength
- int firstChunkLen = bufferedData[0].length;
- if (firstChunkLen == totalFrameLen) {
- bufferedData.removeAt(0);
- } else {
- bufferedData[0] = viewOrSublist(
- bufferedData[0], totalFrameLen, firstChunkLen - totalFrameLen);
- }
- bufferedLength -= totalFrameLen;
-
- return frame;
- }
- return null;
- }
-
- _framesController = new StreamController(
- onListen: () {
- FrameHeader header;
-
- void terminateWithError(error, [StackTrace stack]) {
- header = null;
- _framesController.addError(error, stack);
- _subscription.cancel();
- _framesController.close();
- }
-
- _subscription = _inputStream.listen((List<int> data) {
- bufferedData.add(data);
- bufferedLength += data.length;
-
- try {
- while (true) {
- if (header == null) {
- header = tryReadHeader();
- }
- if (header != null) {
- if (header.length > _localSettings.maxFrameSize) {
- terminateWithError(
- new FrameSizeException('Incoming frame is too big.'));
- return;
- }
-
- Frame frame = tryReadFrame(header);
-
- if (frame != null) {
- _framesController.add(frame);
- header = null;
- } else {
- break;
- }
- } else {
- break;
- }
- }
- } catch (error, stack) {
- terminateWithError(error, stack);
- }
- }, onError: (error, StackTrace stack) {
- terminateWithError(error, stack);
- }, onDone: () {
- if (bufferedLength == 0) {
- _framesController.close();
- } else {
- terminateWithError(new FrameSizeException(
- 'Incoming byte stream ended with incomplete frame'));
- }
- });
- },
- onPause: () => _subscription.pause(),
- onResume: () => _subscription.resume());
-
- return _framesController.stream;
- }
-
- /// Combine combines/merges `List<int>`s of `bufferedData` until
- /// `numberOfBytes` have been accumulated.
- ///
- /// After calling `mergeLists`, `bufferedData[0]` will contain at least
- /// `numberOfBytes` bytes.
- void _mergeLists(List<List<int>> bufferedData, int numberOfBytes) {
- if (bufferedData[0].length < numberOfBytes) {
- int numLists = 0;
- int accumulatedLength = 0;
- while (accumulatedLength < numberOfBytes &&
- numLists <= bufferedData.length) {
- accumulatedLength += bufferedData[numLists++].length;
- }
- assert(accumulatedLength >= numberOfBytes);
- var newList = new Uint8List(accumulatedLength);
- int offset = 0;
- for (int i = 0; i < numLists; i++) {
- List<int> data = bufferedData[i];
- newList.setRange(offset, offset + data.length, data);
- offset += data.length;
- }
- bufferedData[0] = newList;
- bufferedData.removeRange(1, numLists);
- }
- }
-
- /// Reads a FrameHeader] from [bytes], starting at [offset].
- FrameHeader _readFrameHeader(List<int> bytes, int offset) {
- int length = readInt24(bytes, offset);
- int type = bytes[offset + 3];
- int flags = bytes[offset + 4];
- int streamId = readInt32(bytes, offset + 5) & 0x7fffffff;
-
- return new FrameHeader(length, type, flags, streamId);
- }
-
- /// Reads a [Frame] from [bytes], starting at [frameOffset].
- Frame _readFrame(FrameHeader header, List<int> bytes, int frameOffset) {
- int frameEnd = frameOffset + header.length;
-
- int offset = frameOffset;
- switch (header.type) {
- case FrameType.DATA:
- int padLength = 0;
- if (_isFlagSet(header.flags, DataFrame.FLAG_PADDED)) {
- _checkFrameLengthCondition((frameEnd - offset) >= 1);
- padLength = bytes[offset++];
- }
- int dataLen = frameEnd - offset - padLength;
- _checkFrameLengthCondition(dataLen >= 0);
- var dataBytes = viewOrSublist(bytes, offset, dataLen);
- return new DataFrame(header, padLength, dataBytes);
-
- case FrameType.HEADERS:
- int padLength = 0;
- if (_isFlagSet(header.flags, HeadersFrame.FLAG_PADDED)) {
- _checkFrameLengthCondition((frameEnd - offset) >= 1);
- padLength = bytes[offset++];
- }
- int streamDependency;
- bool exclusiveDependency = false;
- int weight;
- if (_isFlagSet(header.flags, HeadersFrame.FLAG_PRIORITY)) {
- _checkFrameLengthCondition((frameEnd - offset) >= 5);
- exclusiveDependency = (bytes[offset] & 0x80) == 0x80;
- streamDependency = readInt32(bytes, offset) & 0x7fffffff;
- offset += 4;
- weight = bytes[offset++];
- }
- int headerBlockLen = frameEnd - offset - padLength;
- _checkFrameLengthCondition(headerBlockLen >= 0);
- var headerBlockFragment = viewOrSublist(bytes, offset, headerBlockLen);
- return new HeadersFrame(header, padLength, exclusiveDependency,
- streamDependency, weight, headerBlockFragment);
-
- case FrameType.PRIORITY:
- _checkFrameLengthCondition(
- (frameEnd - offset) == PriorityFrame.FIXED_FRAME_LENGTH,
- message: 'Priority frame length must be exactly 5 bytes.');
- bool exclusiveDependency = (bytes[offset] & 0x80) == 0x80;
- int streamDependency = readInt32(bytes, offset) & 0x7fffffff;
- int weight = bytes[offset + 4];
- return new PriorityFrame(
- header, exclusiveDependency, streamDependency, weight);
-
- case FrameType.RST_STREAM:
- _checkFrameLengthCondition(
- (frameEnd - offset) == RstStreamFrame.FIXED_FRAME_LENGTH,
- message: 'Rst frames must have a length of 4.');
- int errorCode = readInt32(bytes, offset);
- return new RstStreamFrame(header, errorCode);
-
- case FrameType.SETTINGS:
- _checkFrameLengthCondition((header.length % 6) == 0,
- message: 'Settings frame length must be a multiple of 6 bytes.');
-
- int count = header.length ~/ 6;
- var settings = new List<Setting>(count);
- for (int i = 0; i < count; i++) {
- int identifier = readInt16(bytes, offset + 6 * i);
- int value = readInt32(bytes, offset + 6 * i + 2);
- settings[i] = new Setting(identifier, value);
- }
- var frame = new SettingsFrame(header, settings);
- if (frame.hasAckFlag) {
- _checkFrameLengthCondition(header.length == 0,
- message: 'Settings frame length must 0 for ACKs.');
- }
- return frame;
-
- case FrameType.PUSH_PROMISE:
- int padLength = 0;
- if (_isFlagSet(header.flags, PushPromiseFrame.FLAG_PADDED)) {
- _checkFrameLengthCondition((frameEnd - offset) >= 1);
- padLength = bytes[offset++];
- }
- int promisedStreamId = readInt32(bytes, offset) & 0x7fffffff;
- offset += 4;
- int headerBlockLen = frameEnd - offset - padLength;
- _checkFrameLengthCondition(headerBlockLen >= 0);
- var headerBlockFragment = viewOrSublist(bytes, offset, headerBlockLen);
- return new PushPromiseFrame(
- header, padLength, promisedStreamId, headerBlockFragment);
-
- case FrameType.PING:
- _checkFrameLengthCondition(
- (frameEnd - offset) == PingFrame.FIXED_FRAME_LENGTH,
- message: 'Ping frames must have a length of 8.');
- var opaqueData = readInt64(bytes, offset);
- return new PingFrame(header, opaqueData);
-
- case FrameType.GOAWAY:
- _checkFrameLengthCondition((frameEnd - offset) >= 8);
- int lastStreamId = readInt32(bytes, offset);
- int errorCode = readInt32(bytes, offset + 4);
- var debugData = viewOrSublist(bytes, offset + 8, header.length - 8);
- return new GoawayFrame(header, lastStreamId, errorCode, debugData);
-
- case FrameType.WINDOW_UPDATE:
- _checkFrameLengthCondition(
- (frameEnd - offset) == WindowUpdateFrame.FIXED_FRAME_LENGTH,
- message: 'Window update frames must have a length of 4.');
- int windowSizeIncrement = readInt32(bytes, offset) & 0x7fffffff;
- return new WindowUpdateFrame(header, windowSizeIncrement);
-
- case FrameType.CONTINUATION:
- var headerBlockFragment =
- viewOrSublist(bytes, offset, frameEnd - offset);
- return new ContinuationFrame(header, headerBlockFragment);
-
- default:
- // Unknown frames should be ignored according to spec.
- return new UnknownFrame(
- header, viewOrSublist(bytes, offset, frameEnd - offset));
- }
- }
-
- /// Checks that [condition] is `true` and raises an [FrameSizeException]
- /// otherwise.
- void _checkFrameLengthCondition(bool condition,
- {String message: 'Frame not long enough.'}) {
- if (!condition) {
- throw new FrameSizeException(message);
- }
- }
-}
diff --git a/http2/lib/src/frames/frame_types.dart b/http2/lib/src/frames/frame_types.dart
deleted file mode 100644
index 205f2a8..0000000
--- a/http2/lib/src/frames/frame_types.dart
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of http2.src.frames;
-
-const int FRAME_HEADER_SIZE = 9;
-
-class FrameType {
- static const int DATA = 0;
- static const int HEADERS = 1;
- static const int PRIORITY = 2;
- static const int RST_STREAM = 3;
- static const int SETTINGS = 4;
- static const int PUSH_PROMISE = 5;
- static const int PING = 6;
- static const int GOAWAY = 7;
- static const int WINDOW_UPDATE = 8;
- static const int CONTINUATION = 9;
-}
-
-class ErrorCode {
- static const int NO_ERROR = 0;
- static const int PROTOCOL_ERROR = 1;
- static const int INTERNAL_ERROR = 2;
- static const int FLOW_CONTROL_ERROR = 3;
- static const int SETTINGS_TIMEOUT = 4;
- static const int STREAM_CLOSED = 5;
- static const int FRAME_SIZE_ERROR = 6;
- static const int REFUSED_STREAM = 7;
- static const int CANCEL = 8;
- static const int COMPRESSION_ERROR = 9;
- static const int CONNECT_ERROR = 10;
- static const int ENHANCE_YOUR_CALM = 11;
- static const int INADEQUATE_SECURITY = 12;
- static const int HTTP_1_1_REQUIRED = 13;
-}
-
-class FrameHeader {
- final int length;
- final int type;
- final int flags;
- final int streamId;
-
- FrameHeader(this.length, this.type, this.flags, this.streamId);
-
- Map toJson() =>
- {'length': length, 'type': type, 'flags': flags, 'streamId': streamId};
-}
-
-class Frame {
- static const int MAX_LEN = (1 << 24) - 1;
-
- final FrameHeader header;
-
- Frame(this.header);
-
- Map toJson() => {'header': header.toJson()};
-}
-
-class DataFrame extends Frame {
- static const int FLAG_END_STREAM = 0x1;
- static const int FLAG_PADDED = 0x8;
-
- /// The number of padding bytes.
- final int padLength;
-
- final List<int> bytes;
-
- DataFrame(FrameHeader header, this.padLength, this.bytes) : super(header);
-
- bool get hasEndStreamFlag => _isFlagSet(header.flags, FLAG_END_STREAM);
- bool get hasPaddedFlag => _isFlagSet(header.flags, FLAG_PADDED);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'padLength': padLength,
- 'bytes (length)': bytes.length,
- 'bytes (up to 4 bytes)': bytes.length > 4 ? bytes.sublist(0, 4) : bytes,
- });
-}
-
-class HeadersFrame extends Frame {
- static const int FLAG_END_STREAM = 0x1;
- static const int FLAG_END_HEADERS = 0x4;
- static const int FLAG_PADDED = 0x8;
- static const int FLAG_PRIORITY = 0x20;
-
- // NOTE: This is the size a [HeadersFrame] can have in addition to padding
- // and header block fragment data.
- static const int MAX_CONSTANT_PAYLOAD = 6;
-
- /// The number of padding bytes (might be null).
- final int padLength;
-
- final bool exclusiveDependency;
- final int streamDependency;
- final int weight;
- final List<int> headerBlockFragment;
-
- HeadersFrame(FrameHeader header, this.padLength, this.exclusiveDependency,
- this.streamDependency, this.weight, this.headerBlockFragment)
- : super(header);
-
- /// This will be set from the outside after decoding.
- List<Header> decodedHeaders;
-
- bool get hasEndStreamFlag => _isFlagSet(header.flags, FLAG_END_STREAM);
- bool get hasEndHeadersFlag => _isFlagSet(header.flags, FLAG_END_HEADERS);
- bool get hasPaddedFlag => _isFlagSet(header.flags, FLAG_PADDED);
- bool get hasPriorityFlag => _isFlagSet(header.flags, FLAG_PRIORITY);
-
- HeadersFrame addBlockContinuation(ContinuationFrame frame) {
- var fragment = frame.headerBlockFragment;
- var flags = header.flags | frame.header.flags;
- var fh = new FrameHeader(
- header.length + fragment.length, header.type, flags, header.streamId);
-
- var mergedHeaderBlockFragment =
- new Uint8List(headerBlockFragment.length + fragment.length);
-
- mergedHeaderBlockFragment.setRange(
- 0, headerBlockFragment.length, headerBlockFragment);
-
- mergedHeaderBlockFragment.setRange(
- headerBlockFragment.length, mergedHeaderBlockFragment.length, fragment);
-
- return new HeadersFrame(fh, padLength, exclusiveDependency,
- streamDependency, weight, mergedHeaderBlockFragment);
- }
-
- Map toJson() => super.toJson()
- ..addAll({
- 'padLength': padLength,
- 'exclusiveDependency': exclusiveDependency,
- 'streamDependency': streamDependency,
- 'weight': weight,
- 'headerBlockFragment (length)': headerBlockFragment.length
- });
-}
-
-class PriorityFrame extends Frame {
- static const int FIXED_FRAME_LENGTH = 5;
-
- final bool exclusiveDependency;
- final int streamDependency;
- final int weight;
-
- PriorityFrame(FrameHeader header, this.exclusiveDependency,
- this.streamDependency, this.weight)
- : super(header);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'exclusiveDependency': exclusiveDependency,
- 'streamDependency': streamDependency,
- 'weight': weight,
- });
-}
-
-class RstStreamFrame extends Frame {
- static const int FIXED_FRAME_LENGTH = 4;
-
- final int errorCode;
-
- RstStreamFrame(FrameHeader header, this.errorCode) : super(header);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'errorCode': errorCode,
- });
-}
-
-class Setting {
- static const int SETTINGS_HEADER_TABLE_SIZE = 1;
- static const int SETTINGS_ENABLE_PUSH = 2;
- static const int SETTINGS_MAX_CONCURRENT_STREAMS = 3;
- static const int SETTINGS_INITIAL_WINDOW_SIZE = 4;
- static const int SETTINGS_MAX_FRAME_SIZE = 5;
- static const int SETTINGS_MAX_HEADER_LIST_SIZE = 6;
-
- final int identifier;
- final int value;
-
- Setting(this.identifier, this.value);
-
- Map toJson() => {'identifier': identifier, 'value': value};
-}
-
-class SettingsFrame extends Frame {
- static const int FLAG_ACK = 0x1;
-
- // A setting consist of a 2 byte identifier and a 4 byte value.
- static const int SETTING_SIZE = 6;
-
- final List<Setting> settings;
-
- SettingsFrame(FrameHeader header, this.settings) : super(header);
-
- bool get hasAckFlag => _isFlagSet(header.flags, FLAG_ACK);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'settings': settings.map((s) => s.toJson()).toList(),
- });
-}
-
-class PushPromiseFrame extends Frame {
- static const int FLAG_END_HEADERS = 0x4;
- static const int FLAG_PADDED = 0x8;
-
- // NOTE: This is the size a [PushPromiseFrame] can have in addition to padding
- // and header block fragment data.
- static const int MAX_CONSTANT_PAYLOAD = 5;
-
- final int padLength;
- final int promisedStreamId;
- final List<int> headerBlockFragment;
-
- /// This will be set from the outside after decoding.
- List<Header> decodedHeaders;
-
- PushPromiseFrame(FrameHeader header, this.padLength, this.promisedStreamId,
- this.headerBlockFragment)
- : super(header);
-
- bool get hasEndHeadersFlag => _isFlagSet(header.flags, FLAG_END_HEADERS);
- bool get hasPaddedFlag => _isFlagSet(header.flags, FLAG_PADDED);
-
- PushPromiseFrame addBlockContinuation(ContinuationFrame frame) {
- var fragment = frame.headerBlockFragment;
- var flags = header.flags | frame.header.flags;
- var fh = new FrameHeader(
- header.length + fragment.length, header.type, flags, header.streamId);
-
- var mergedHeaderBlockFragment =
- new Uint8List(headerBlockFragment.length + fragment.length);
-
- mergedHeaderBlockFragment.setRange(
- 0, headerBlockFragment.length, headerBlockFragment);
-
- mergedHeaderBlockFragment.setRange(
- headerBlockFragment.length, mergedHeaderBlockFragment.length, fragment);
-
- return new PushPromiseFrame(
- fh, padLength, promisedStreamId, mergedHeaderBlockFragment);
- }
-
- Map toJson() => super.toJson()
- ..addAll({
- 'padLength': padLength,
- 'promisedStreamId': promisedStreamId,
- 'headerBlockFragment (len)': headerBlockFragment.length,
- });
-}
-
-class PingFrame extends Frame {
- static const int FIXED_FRAME_LENGTH = 8;
-
- static const int FLAG_ACK = 0x1;
-
- final int opaqueData;
-
- PingFrame(FrameHeader header, this.opaqueData) : super(header);
-
- bool get hasAckFlag => _isFlagSet(header.flags, FLAG_ACK);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'opaqueData': opaqueData,
- });
-}
-
-class GoawayFrame extends Frame {
- final int lastStreamId;
- final int errorCode;
- final List<int> debugData;
-
- GoawayFrame(
- FrameHeader header, this.lastStreamId, this.errorCode, this.debugData)
- : super(header);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'lastStreamId': lastStreamId,
- 'errorCode': errorCode,
- 'debugData (length)': debugData.length,
- });
-}
-
-class WindowUpdateFrame extends Frame {
- static const int FIXED_FRAME_LENGTH = 4;
-
- final int windowSizeIncrement;
-
- WindowUpdateFrame(FrameHeader header, this.windowSizeIncrement)
- : super(header);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'windowSizeIncrement': windowSizeIncrement,
- });
-}
-
-class ContinuationFrame extends Frame {
- static const int FLAG_END_HEADERS = 0x4;
-
- final List<int> headerBlockFragment;
-
- ContinuationFrame(FrameHeader header, this.headerBlockFragment)
- : super(header);
-
- bool get hasEndHeadersFlag => _isFlagSet(header.flags, FLAG_END_HEADERS);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'headerBlockFragment (length)': headerBlockFragment.length,
- });
-}
-
-class UnknownFrame extends Frame {
- final List<int> data;
-
- UnknownFrame(FrameHeader header, this.data) : super(header);
-
- Map toJson() => super.toJson()
- ..addAll({
- 'data (length)': data.length,
- });
-}
diff --git a/http2/lib/src/frames/frame_utils.dart b/http2/lib/src/frames/frame_utils.dart
deleted file mode 100644
index 73a3173..0000000
--- a/http2/lib/src/frames/frame_utils.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of http2.src.frames;
-
-bool _isFlagSet(int value, int flag) => value & flag == flag;
diff --git a/http2/lib/src/frames/frame_writer.dart b/http2/lib/src/frames/frame_writer.dart
deleted file mode 100644
index 6c79581..0000000
--- a/http2/lib/src/frames/frame_writer.dart
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of http2.src.frames;
-
-// TODO: No support for writing padded information.
-// TODO: No support for stream priorities.
-class FrameWriter {
- /// The HPack compression context.
- final HPackEncoder _hpackEncoder;
-
- /// A buffered writer for outgoing bytes.
- final BufferedBytesWriter _outWriter;
-
- /// Connection settings which this writer needs to respect.
- final ActiveSettings _peerSettings;
-
- /// This is the maximum over all stream id's we've written to the underlying
- /// sink.
- int _highestWrittenStreamId = 0;
-
- FrameWriter(
- this._hpackEncoder, StreamSink<List<int>> outgoing, this._peerSettings)
- : _outWriter = new BufferedBytesWriter(outgoing);
-
- /// A indicator whether writes would be buffered.
- BufferIndicator get bufferIndicator => _outWriter.bufferIndicator;
-
- /// This is the maximum over all stream id's we've written to the underlying
- /// sink.
- int get highestWrittenStreamId => _highestWrittenStreamId;
-
- void writeDataFrame(int streamId, List<int> data, {bool endStream: false}) {
- while (data.length > _peerSettings.maxFrameSize) {
- var chunk = viewOrSublist(data, 0, _peerSettings.maxFrameSize);
- data = viewOrSublist(data, _peerSettings.maxFrameSize,
- data.length - _peerSettings.maxFrameSize);
- _writeDataFrameNoFragment(streamId, chunk, false);
- }
- _writeDataFrameNoFragment(streamId, data, endStream);
- }
-
- void _writeDataFrameNoFragment(int streamId, List<int> data, bool endStream) {
- int type = FrameType.DATA;
- int flags = endStream ? DataFrame.FLAG_END_STREAM : 0;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + data.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, data.length);
- offset += FRAME_HEADER_SIZE;
-
- buffer.setRange(offset, offset + data.length, data);
-
- _writeData(buffer);
- }
-
- void writeHeadersFrame(int streamId, List<Header> headers,
- {bool endStream: true}) {
- var fragment = _hpackEncoder.encode(headers);
- var maxSize =
- _peerSettings.maxFrameSize - HeadersFrame.MAX_CONSTANT_PAYLOAD;
-
- if (fragment.length < maxSize) {
- _writeHeadersFrameNoFragment(streamId, fragment, true, endStream);
- } else {
- var chunk = fragment.sublist(0, maxSize);
- fragment = fragment.sublist(maxSize);
- _writeHeadersFrameNoFragment(streamId, chunk, false, endStream);
- while (fragment.length > _peerSettings.maxFrameSize) {
- var chunk = fragment.sublist(0, _peerSettings.maxFrameSize);
- fragment = fragment.sublist(_peerSettings.maxFrameSize);
- _writeContinuationFrame(streamId, chunk, false);
- }
- _writeContinuationFrame(streamId, fragment, true);
- }
- }
-
- void _writeHeadersFrameNoFragment(
- int streamId, List<int> fragment, bool endHeaders, bool endStream) {
- int type = FrameType.HEADERS;
- int flags = 0;
- if (endHeaders) flags |= HeadersFrame.FLAG_END_HEADERS;
- if (endStream) flags |= HeadersFrame.FLAG_END_STREAM;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + fragment.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, fragment.length);
- offset += FRAME_HEADER_SIZE;
-
- buffer.setRange(offset, buffer.length, fragment);
-
- _writeData(buffer);
- }
-
- void _writeContinuationFrame(
- int streamId, List<int> fragment, bool endHeaders) {
- int type = FrameType.CONTINUATION;
- int flags = endHeaders ? ContinuationFrame.FLAG_END_HEADERS : 0;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + fragment.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, fragment.length);
- offset += FRAME_HEADER_SIZE;
-
- buffer.setRange(offset, buffer.length, fragment);
-
- _writeData(buffer);
- }
-
- void writePriorityFrame(int streamId, int streamDependency, int weight,
- {bool exclusive: false}) {
- int type = FrameType.PRIORITY;
- int flags = 0;
-
- var buffer =
- new Uint8List(FRAME_HEADER_SIZE + PriorityFrame.FIXED_FRAME_LENGTH);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, 5);
- offset += FRAME_HEADER_SIZE;
-
- if (exclusive) {
- setInt32(buffer, offset, (1 << 31) | streamDependency);
- } else {
- setInt32(buffer, offset, streamDependency);
- }
- buffer[offset + 4] = weight;
-
- _writeData(buffer);
- }
-
- void writeRstStreamFrame(int streamId, int errorCode) {
- int type = FrameType.RST_STREAM;
- int flags = 0;
-
- var buffer =
- new Uint8List(FRAME_HEADER_SIZE + RstStreamFrame.FIXED_FRAME_LENGTH);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, 4);
- offset += FRAME_HEADER_SIZE;
-
- setInt32(buffer, offset, errorCode);
-
- _writeData(buffer);
- }
-
- void writeSettingsFrame(List<Setting> settings) {
- int type = FrameType.SETTINGS;
- int flags = 0;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + 6 * settings.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, 0, 6 * settings.length);
- offset += FRAME_HEADER_SIZE;
-
- for (int i = 0; i < settings.length; i++) {
- var setting = settings[i];
- setInt16(buffer, offset + 6 * i, setting.identifier);
- setInt32(buffer, offset + 6 * i + 2, setting.value);
- }
-
- _writeData(buffer);
- }
-
- void writeSettingsAckFrame() {
- int type = FrameType.SETTINGS;
- int flags = SettingsFrame.FLAG_ACK;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, 0, 0);
- offset += FRAME_HEADER_SIZE;
-
- _writeData(buffer);
- }
-
- void writePushPromiseFrame(
- int streamId, int promisedStreamId, List<Header> headers) {
- var fragment = _hpackEncoder.encode(headers);
- var maxSize =
- _peerSettings.maxFrameSize - PushPromiseFrame.MAX_CONSTANT_PAYLOAD;
-
- if (fragment.length < maxSize) {
- _writePushPromiseFrameNoFragmentation(
- streamId, promisedStreamId, fragment, true);
- } else {
- var chunk = fragment.sublist(0, maxSize);
- fragment = fragment.sublist(maxSize);
- _writePushPromiseFrameNoFragmentation(
- streamId, promisedStreamId, chunk, false);
- while (fragment.length > _peerSettings.maxFrameSize) {
- var chunk = fragment.sublist(0, _peerSettings.maxFrameSize);
- fragment = fragment.sublist(_peerSettings.maxFrameSize);
- _writeContinuationFrame(streamId, chunk, false);
- }
- _writeContinuationFrame(streamId, chunk, true);
- }
- }
-
- void _writePushPromiseFrameNoFragmentation(
- int streamId, int promisedStreamId, List<int> fragment, bool endHeaders) {
- int type = FrameType.PUSH_PROMISE;
- int flags = endHeaders ? HeadersFrame.FLAG_END_HEADERS : 0;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + 4 + fragment.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, 4 + fragment.length);
- offset += FRAME_HEADER_SIZE;
-
- setInt32(buffer, offset, promisedStreamId);
- buffer.setRange(offset + 4, offset + 4 + fragment.length, fragment);
-
- _writeData(buffer);
- }
-
- void writePingFrame(int opaqueData, {bool ack: false}) {
- int type = FrameType.PING;
- int flags = ack ? PingFrame.FLAG_ACK : 0;
-
- var buffer =
- new Uint8List(FRAME_HEADER_SIZE + PingFrame.FIXED_FRAME_LENGTH);
- int offset = 0;
-
- _setFrameHeader(buffer, 0, type, flags, 0, 8);
- offset += FRAME_HEADER_SIZE;
-
- setInt64(buffer, offset, opaqueData);
- _writeData(buffer);
- }
-
- void writeGoawayFrame(int lastStreamId, int errorCode, List<int> debugData) {
- int type = FrameType.GOAWAY;
- int flags = 0;
-
- var buffer = new Uint8List(FRAME_HEADER_SIZE + 8 + debugData.length);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, 0, 8 + debugData.length);
- offset += FRAME_HEADER_SIZE;
-
- setInt32(buffer, offset, lastStreamId);
- setInt32(buffer, offset + 4, errorCode);
- buffer.setRange(offset + 8, buffer.length, debugData);
-
- _writeData(buffer);
- }
-
- void writeWindowUpdate(int sizeIncrement, {int streamId: 0}) {
- int type = FrameType.WINDOW_UPDATE;
- int flags = 0;
-
- var buffer =
- new Uint8List(FRAME_HEADER_SIZE + WindowUpdateFrame.FIXED_FRAME_LENGTH);
- int offset = 0;
-
- _setFrameHeader(buffer, offset, type, flags, streamId, 4);
- offset += FRAME_HEADER_SIZE;
-
- setInt32(buffer, offset, sizeIncrement);
-
- _writeData(buffer);
- }
-
- void _writeData(List<int> bytes) {
- _outWriter.add(bytes);
- }
-
- /// Closes the underlying sink and returns [doneFuture].
- Future close() {
- return _outWriter.close().whenComplete(() => doneFuture);
- }
-
- /// The future which will complete once this writer is done.
- Future get doneFuture => _outWriter.doneFuture;
-
- void _setFrameHeader(List<int> bytes, int offset, int type, int flags,
- int streamId, int length) {
- setInt24(bytes, offset, length);
- bytes[3] = type;
- bytes[4] = flags;
- setInt32(bytes, 5, streamId);
-
- _highestWrittenStreamId = max(_highestWrittenStreamId, streamId);
- }
-}
diff --git a/http2/lib/src/frames/frames.dart b/http2/lib/src/frames/frames.dart
deleted file mode 100644
index 8374eee..0000000
--- a/http2/lib/src/frames/frames.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.frames;
-
-import 'dart:async';
-import 'dart:math' show max;
-import 'dart:typed_data';
-
-import '../async_utils/async_utils.dart';
-import '../byte_utils.dart';
-import '../hpack/hpack.dart';
-import '../settings/settings.dart';
-import '../sync_errors.dart';
-
-part "frame_types.dart";
-part "frame_utils.dart";
-part "frame_reader.dart";
-part "frame_writer.dart";
diff --git a/http2/lib/src/hpack/hpack.dart b/http2/lib/src/hpack/hpack.dart
deleted file mode 100644
index 4821511..0000000
--- a/http2/lib/src/hpack/hpack.dart
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Implements a [HPackContext] for encoding/decoding headers according to the
-/// HPACK specificaiton. See here for more information:
-/// https://tools.ietf.org/html/draft-ietf-httpbis-header-compression-10
-library http2.hpack;
-
-import 'dart:convert' show ascii;
-import 'dart:io';
-
-import '../byte_utils.dart';
-
-import 'huffman.dart';
-import 'huffman_table.dart';
-
-/// Exception raised due to encoding/decoding errors.
-class HPackDecodingException implements Exception {
- final String _message;
-
- HPackDecodingException(this._message);
-
- String toString() => 'HPackDecodingException: $_message';
-}
-
-/// A HPACK encoding/decoding context.
-///
-/// This is a statefull class, so encoding/decoding changes internal state.
-class HPackContext {
- final HPackEncoder encoder = new HPackEncoder();
- final HPackDecoder decoder = new HPackDecoder();
-
- HPackContext(
- {int maxSendingHeaderTableSize: 4096,
- int maxReceivingHeaderTableSize: 4096}) {
- encoder.updateMaxSendingHeaderTableSize(maxSendingHeaderTableSize);
- decoder.updateMaxReceivingHeaderTableSize(maxReceivingHeaderTableSize);
- }
-}
-
-/// A HTTP/2 header.
-class Header {
- final List<int> name;
- final List<int> value;
- final bool neverIndexed;
-
- Header(this.name, this.value, {this.neverIndexed: false});
-
- factory Header.ascii(String name, String value) {
- return new Header(ascii.encode(name), ascii.encode(value));
- }
-}
-
-/// A stateful HPACK decoder.
-class HPackDecoder {
- int _maxHeaderTableSize;
-
- final IndexTable _table = new IndexTable();
-
- void updateMaxReceivingHeaderTableSize(int newMaximumSize) {
- _maxHeaderTableSize = newMaximumSize;
- }
-
- List<Header> decode(List<int> data) {
- int offset = 0;
-
- int readInteger(int prefixBits) {
- assert(prefixBits <= 8 && prefixBits > 0);
-
- var byte = data[offset++] & ((1 << prefixBits) - 1);
-
- int integer;
- if (byte == ((1 << prefixBits) - 1)) {
- // Length encodeded.
- integer = 0;
- int shift = 0;
- while (true) {
- bool done = (data[offset] & 0x80) != 0x80;
- integer += (data[offset++] & 0x7f) << shift;
- shift += 7;
- if (done) break;
- }
- integer += (1 << prefixBits) - 1;
- } else {
- // In place length.
- integer = byte;
- }
-
- return integer;
- }
-
- List<int> readStringLiteral() {
- bool isHuffmanEncoding = (data[offset] & 0x80) != 0;
- int length = readInteger(7);
-
- var sublist = viewOrSublist(data, offset, length);
- offset += length;
- if (isHuffmanEncoding) {
- return http2HuffmanCodec.decode(sublist);
- } else {
- return sublist;
- }
- }
-
- Header readHeaderFieldInternal(int index, {bool neverIndexed: false}) {
- List<int> name, value;
- if (index > 0) {
- name = _table.lookup(index).name;
- value = readStringLiteral();
- } else {
- name = readStringLiteral();
- value = readStringLiteral();
- }
- return new Header(name, value, neverIndexed: neverIndexed);
- }
-
- try {
- List<Header> headers = [];
- while (offset < data.length) {
- int byte = data[offset];
- bool isIndexedField = (byte & 0x80) != 0;
- bool isIncrementalIndexing = (byte & 0xc0) == 0x40;
-
- bool isWithoutIndexing = (byte & 0xf0) == 0;
- bool isNeverIndexing = (byte & 0xf0) == 0x10;
- bool isDynamicTableSizeUpdate = (byte & 0xe0) == 0x20;
-
- if (isIndexedField) {
- int index = readInteger(7);
- var field = _table.lookup(index);
- headers.add(field);
- } else if (isIncrementalIndexing) {
- var field = readHeaderFieldInternal(readInteger(6));
- _table.addHeaderField(field);
- headers.add(field);
- } else if (isWithoutIndexing) {
- headers.add(readHeaderFieldInternal(readInteger(4)));
- } else if (isNeverIndexing) {
- headers
- .add(readHeaderFieldInternal(readInteger(4), neverIndexed: true));
- } else if (isDynamicTableSizeUpdate) {
- int newMaxSize = readInteger(5);
- if (newMaxSize <= _maxHeaderTableSize) {
- _table.updateMaxSize(newMaxSize);
- } else {
- throw new HPackDecodingException(
- 'Dynamic table size update failed: '
- 'A new value of $newMaxSize exceeds the limit of '
- '$_maxHeaderTableSize');
- }
- } else {
- throw new HPackDecodingException('Invalid encoding of headers.');
- }
- }
- return headers;
- } on RangeError catch (e) {
- throw new HPackDecodingException('$e');
- } on HuffmanDecodingException catch (e) {
- throw new HPackDecodingException('$e');
- }
- }
-}
-
-/// A stateful HPACK encoder.
-// TODO: Currently we encode all headers:
-// - without huffman encoding
-// - without using the dynamic table
-class HPackEncoder {
- int _maxHeaderTableSize = 4096;
-
- final IndexTable _table = new IndexTable();
-
- void updateMaxSendingHeaderTableSize(int newMaximumSize) {
- // TODO: Once we start encoding via dynamic table we need to let the other
- // side know the maximum table size we're using.
- _maxHeaderTableSize = newMaximumSize;
- }
-
- List<int> encode(List<Header> headers) {
- var bytesBuilder = new BytesBuilder();
- int currentByte = 0;
-
- void writeInteger(int prefixBits, int value) {
- assert(prefixBits <= 8);
-
- if (value < (1 << prefixBits) - 1) {
- currentByte |= value;
- bytesBuilder.addByte(currentByte);
- } else {
- // Length encodeded.
- currentByte |= (1 << prefixBits) - 1;
- value -= (1 << prefixBits) - 1;
- bytesBuilder.addByte(currentByte);
- bool done = false;
- while (!done) {
- currentByte = value & 0x7f;
- value = value >> 7;
- done = value == 0;
- if (!done) currentByte |= 0x80;
- bytesBuilder.addByte(currentByte);
- }
- }
- currentByte = 0;
- }
-
- void writeStringLiteral(List<int> bytes) {
- // TODO: Support huffman encoding.
- currentByte = 0; // 1 would be huffman encoding
- writeInteger(7, bytes.length);
- bytesBuilder.add(bytes);
- }
-
- void writeLiteralHeaderWithoutIndexing(Header header) {
- bytesBuilder.addByte(0);
- writeStringLiteral(header.name);
- writeStringLiteral(header.value);
- }
-
- for (var header in headers) {
- writeLiteralHeaderWithoutIndexing(header);
- }
-
- return bytesBuilder.takeBytes();
- }
-}
-
-class IndexTable {
- static final List<Header> _staticTable = [
- null,
- new Header(ascii.encode(':authority'), const []),
- new Header(ascii.encode(':method'), ascii.encode('GET')),
- new Header(ascii.encode(':method'), ascii.encode('POST')),
- new Header(ascii.encode(':path'), ascii.encode('/')),
- new Header(ascii.encode(':path'), ascii.encode('/index.html')),
- new Header(ascii.encode(':scheme'), ascii.encode('http')),
- new Header(ascii.encode(':scheme'), ascii.encode('https')),
- new Header(ascii.encode(':status'), ascii.encode('200')),
- new Header(ascii.encode(':status'), ascii.encode('204')),
- new Header(ascii.encode(':status'), ascii.encode('206')),
- new Header(ascii.encode(':status'), ascii.encode('304')),
- new Header(ascii.encode(':status'), ascii.encode('400')),
- new Header(ascii.encode(':status'), ascii.encode('404')),
- new Header(ascii.encode(':status'), ascii.encode('500')),
- new Header(ascii.encode('accept-charset'), const []),
- new Header(ascii.encode('accept-encoding'), ascii.encode('gzip, deflate')),
- new Header(ascii.encode('accept-language'), const []),
- new Header(ascii.encode('accept-ranges'), const []),
- new Header(ascii.encode('accept'), const []),
- new Header(ascii.encode('access-control-allow-origin'), const []),
- new Header(ascii.encode('age'), const []),
- new Header(ascii.encode('allow'), const []),
- new Header(ascii.encode('authorization'), const []),
- new Header(ascii.encode('cache-control'), const []),
- new Header(ascii.encode('content-disposition'), const []),
- new Header(ascii.encode('content-encoding'), const []),
- new Header(ascii.encode('content-language'), const []),
- new Header(ascii.encode('content-length'), const []),
- new Header(ascii.encode('content-location'), const []),
- new Header(ascii.encode('content-range'), const []),
- new Header(ascii.encode('content-type'), const []),
- new Header(ascii.encode('cookie'), const []),
- new Header(ascii.encode('date'), const []),
- new Header(ascii.encode('etag'), const []),
- new Header(ascii.encode('expect'), const []),
- new Header(ascii.encode('expires'), const []),
- new Header(ascii.encode('from'), const []),
- new Header(ascii.encode('host'), const []),
- new Header(ascii.encode('if-match'), const []),
- new Header(ascii.encode('if-modified-since'), const []),
- new Header(ascii.encode('if-none-match'), const []),
- new Header(ascii.encode('if-range'), const []),
- new Header(ascii.encode('if-unmodified-since'), const []),
- new Header(ascii.encode('last-modified'), const []),
- new Header(ascii.encode('link'), const []),
- new Header(ascii.encode('location'), const []),
- new Header(ascii.encode('max-forwards'), const []),
- new Header(ascii.encode('proxy-authenticate'), const []),
- new Header(ascii.encode('proxy-authorization'), const []),
- new Header(ascii.encode('range'), const []),
- new Header(ascii.encode('referer'), const []),
- new Header(ascii.encode('refresh'), const []),
- new Header(ascii.encode('retry-after'), const []),
- new Header(ascii.encode('server'), const []),
- new Header(ascii.encode('set-cookie'), const []),
- new Header(ascii.encode('strict-transport-security'), const []),
- new Header(ascii.encode('transfer-encoding'), const []),
- new Header(ascii.encode('user-agent'), const []),
- new Header(ascii.encode('vary'), const []),
- new Header(ascii.encode('via'), const []),
- new Header(ascii.encode('www-authenticate'), const []),
- ];
-
- final List<Header> _dynamicTable = [];
-
- /// The maximum size the dynamic table can grow to before entries need to be
- /// evicted.
- int _maximumSize = 4096;
-
- /// The current size of the dynamic table.
- int _currentSize = 0;
-
- IndexTable();
-
- /// Updates the maximum size which the dynamic table can grow to.
- void updateMaxSize(int newMaxDynTableSize) {
- _maximumSize = newMaxDynTableSize;
- _reduce();
- }
-
- /// Lookup an item by index.
- Header lookup(int index) {
- if (index <= 0) {
- throw new HPackDecodingException(
- 'Invalid index (was: $index) for table lookup.');
- }
- if (index < _staticTable.length) {
- return _staticTable[index];
- }
- index -= _staticTable.length;
- if (index < _dynamicTable.length) {
- return _dynamicTable[index];
- }
- throw new HPackDecodingException(
- 'Invalid index (was: $index) for table lookup.');
- }
-
- /// Adds a new header field to the dynamic table - and evicts entries as
- /// necessary.
- void addHeaderField(Header header) {
- _dynamicTable.insert(0, header);
- _currentSize += _sizeOf(header);
- _reduce();
- }
-
- /// Removes as many entries as required to be within the limit of
- /// [_maximumSize].
- void _reduce() {
- while (_currentSize > _maximumSize) {
- Header h = _dynamicTable.removeLast();
- _currentSize -= _sizeOf(h);
- }
- }
-
- /// Returns the "size" a [header] has.
- ///
- /// This is specified to be the number of octets of name/value plus 32.
- int _sizeOf(Header header) => header.name.length + header.value.length + 32;
-}
diff --git a/http2/lib/src/hpack/huffman.dart b/http2/lib/src/hpack/huffman.dart
deleted file mode 100644
index 7dd4d09..0000000
--- a/http2/lib/src/hpack/huffman.dart
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.hpack.huffman;
-
-import 'dart:io';
-
-import 'huffman_table.dart';
-
-class HuffmanDecodingException implements Exception {
- final String _message;
-
- HuffmanDecodingException(this._message);
-
- String toString() => 'HuffmanDecodingException: $_message';
-}
-
-/// A codec used for encoding/decoding using a huffman codec.
-class HuffmanCodec {
- final HuffmanEncoder _encoder;
- final HuffmanDecoder _decoder;
-
- HuffmanCodec(this._encoder, this._decoder);
-
- List<int> decode(List<int> bytes) => _decoder.decode(bytes);
-
- List<int> encode(List<int> bytes) => _encoder.encode(bytes);
-}
-
-/// A huffman decoder based on a [HuffmanTreeNode].
-class HuffmanDecoder {
- final HuffmanTreeNode _root;
-
- HuffmanDecoder(this._root);
-
- /// Decodes [bytes] using a huffman tree.
- List<int> decode(List<int> bytes) {
- var buffer = new BytesBuilder();
-
- int currentByteOffset = 0;
- HuffmanTreeNode node = _root;
- int currentDepth = 0;
- while (currentByteOffset < bytes.length) {
- var byte = bytes[currentByteOffset];
- for (int currentBit = 7; currentBit >= 0; currentBit--) {
- bool right = (byte >> currentBit) & 1 == 1;
- if (right) {
- node = node.right;
- } else {
- node = node.left;
- }
- currentDepth++;
- if (node.value != null) {
- if (node.value == EOS_BYTE) {
- throw new HuffmanDecodingException(
- 'More than 7 bit padding is not allowed. Found entire EOS '
- 'encoding');
- }
- buffer.addByte(node.value);
- node = _root;
- currentDepth = 0;
- }
- }
- currentByteOffset++;
- }
-
- if (node != _root) {
- if (currentDepth > 7) {
- throw new HuffmanDecodingException(
- 'Incomplete encoding of a byte or more than 7 bit padding.');
- }
-
- while (node.right != null) node = node.right;
-
- if (node.value != 256) {
- throw new HuffmanDecodingException('Incomplete encoding of a byte.');
- }
- }
-
- return buffer.takeBytes();
- }
-}
-
-/// A huffman encoder based on a list of codewords.
-class HuffmanEncoder {
- final List<EncodedHuffmanValue> _codewords;
-
- HuffmanEncoder(this._codewords);
-
- /// Encodes [bytes] using a list of codewords.
- List<int> encode(List<int> bytes) {
- var buffer = new BytesBuilder();
-
- int currentByte = 0;
- int currentBitOffset = 7;
-
- writeValue(int value, int numBits) {
- int i = numBits - 1;
- while (i >= 0) {
- if (currentBitOffset == 7 && i >= 7) {
- assert(currentByte == 0);
-
- buffer.addByte((value >> (i - 7)) & 0xff);
- currentBitOffset = 7;
- currentByte = 0;
- i -= 8;
- } else {
- currentByte |= ((value >> i) & 1) << currentBitOffset;
-
- currentBitOffset--;
- if (currentBitOffset == -1) {
- buffer.addByte(currentByte);
- currentBitOffset = 7;
- currentByte = 0;
- }
- i--;
- }
- }
- }
-
- for (int i = 0; i < bytes.length; i++) {
- var byte = bytes[i];
- var value = _codewords[byte];
- writeValue(value.encodedBytes, value.numBits);
- }
-
- if (currentBitOffset < 7) {
- writeValue(0xff, 1 + currentBitOffset);
- }
-
- return buffer.takeBytes();
- }
-}
-
-/// Specifies the encoding of a specific value using huffman encoding.
-class EncodedHuffmanValue {
- /// An integer representation of the encoded bit-string.
- final int encodedBytes;
-
- /// The number of bits in [encodedBytes].
- final int numBits;
-
- const EncodedHuffmanValue(this.encodedBytes, this.numBits);
-}
-
-/// A node in the huffman tree.
-class HuffmanTreeNode {
- HuffmanTreeNode left;
- HuffmanTreeNode right;
- int value;
-}
-
-/// Generates a huffman decoding tree.
-HuffmanTreeNode generateHuffmanTree(List<EncodedHuffmanValue> valueEncodings) {
- HuffmanTreeNode root = new HuffmanTreeNode();
-
- for (int byteOffset = 0; byteOffset < valueEncodings.length; byteOffset++) {
- var entry = valueEncodings[byteOffset];
-
- HuffmanTreeNode current = root;
- for (int bitNr = 0; bitNr < entry.numBits; bitNr++) {
- bool right =
- ((entry.encodedBytes >> (entry.numBits - bitNr - 1)) & 1) == 1;
-
- if (right) {
- if (current.right == null) {
- current.right = new HuffmanTreeNode();
- }
- current = current.right;
- } else {
- if (current.left == null) {
- current.left = new HuffmanTreeNode();
- }
- current = current.left;
- }
- }
-
- current.value = byteOffset;
- }
-
- return root;
-}
diff --git a/http2/lib/src/hpack/huffman_table.dart b/http2/lib/src/hpack/huffman_table.dart
deleted file mode 100644
index 90471c8..0000000
--- a/http2/lib/src/hpack/huffman_table.dart
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.hpack.huffman_table;
-
-import 'huffman.dart';
-
-/// The huffman codec for encoding/decoding HTTP/2 header blocks.
-final HuffmanCodec http2HuffmanCodec = new HuffmanCodec(
- new HuffmanEncoder(_codeWords),
- new HuffmanDecoder(generateHuffmanTree(_codeWords)));
-
-/// This is the integer representing the End-of-String symbol
-/// (it is not representable by a byte).
-const int EOS_BYTE = 256;
-
-/// This list of byte encodings via huffman encoding was generated from the
-/// HPACK specification.
-const List<EncodedHuffmanValue> _codeWords = const <EncodedHuffmanValue>[
- const EncodedHuffmanValue(0x1ff8, 13),
- const EncodedHuffmanValue(0x7fffd8, 23),
- const EncodedHuffmanValue(0xfffffe2, 28),
- const EncodedHuffmanValue(0xfffffe3, 28),
- const EncodedHuffmanValue(0xfffffe4, 28),
- const EncodedHuffmanValue(0xfffffe5, 28),
- const EncodedHuffmanValue(0xfffffe6, 28),
- const EncodedHuffmanValue(0xfffffe7, 28),
- const EncodedHuffmanValue(0xfffffe8, 28),
- const EncodedHuffmanValue(0xffffea, 24),
- const EncodedHuffmanValue(0x3ffffffc, 30),
- const EncodedHuffmanValue(0xfffffe9, 28),
- const EncodedHuffmanValue(0xfffffea, 28),
- const EncodedHuffmanValue(0x3ffffffd, 30),
- const EncodedHuffmanValue(0xfffffeb, 28),
- const EncodedHuffmanValue(0xfffffec, 28),
- const EncodedHuffmanValue(0xfffffed, 28),
- const EncodedHuffmanValue(0xfffffee, 28),
- const EncodedHuffmanValue(0xfffffef, 28),
- const EncodedHuffmanValue(0xffffff0, 28),
- const EncodedHuffmanValue(0xffffff1, 28),
- const EncodedHuffmanValue(0xffffff2, 28),
- const EncodedHuffmanValue(0x3ffffffe, 30),
- const EncodedHuffmanValue(0xffffff3, 28),
- const EncodedHuffmanValue(0xffffff4, 28),
- const EncodedHuffmanValue(0xffffff5, 28),
- const EncodedHuffmanValue(0xffffff6, 28),
- const EncodedHuffmanValue(0xffffff7, 28),
- const EncodedHuffmanValue(0xffffff8, 28),
- const EncodedHuffmanValue(0xffffff9, 28),
- const EncodedHuffmanValue(0xffffffa, 28),
- const EncodedHuffmanValue(0xffffffb, 28),
- const EncodedHuffmanValue(0x14, 6),
- const EncodedHuffmanValue(0x3f8, 10),
- const EncodedHuffmanValue(0x3f9, 10),
- const EncodedHuffmanValue(0xffa, 12),
- const EncodedHuffmanValue(0x1ff9, 13),
- const EncodedHuffmanValue(0x15, 6),
- const EncodedHuffmanValue(0xf8, 8),
- const EncodedHuffmanValue(0x7fa, 11),
- const EncodedHuffmanValue(0x3fa, 10),
- const EncodedHuffmanValue(0x3fb, 10),
- const EncodedHuffmanValue(0xf9, 8),
- const EncodedHuffmanValue(0x7fb, 11),
- const EncodedHuffmanValue(0xfa, 8),
- const EncodedHuffmanValue(0x16, 6),
- const EncodedHuffmanValue(0x17, 6),
- const EncodedHuffmanValue(0x18, 6),
- const EncodedHuffmanValue(0x0, 5),
- const EncodedHuffmanValue(0x1, 5),
- const EncodedHuffmanValue(0x2, 5),
- const EncodedHuffmanValue(0x19, 6),
- const EncodedHuffmanValue(0x1a, 6),
- const EncodedHuffmanValue(0x1b, 6),
- const EncodedHuffmanValue(0x1c, 6),
- const EncodedHuffmanValue(0x1d, 6),
- const EncodedHuffmanValue(0x1e, 6),
- const EncodedHuffmanValue(0x1f, 6),
- const EncodedHuffmanValue(0x5c, 7),
- const EncodedHuffmanValue(0xfb, 8),
- const EncodedHuffmanValue(0x7ffc, 15),
- const EncodedHuffmanValue(0x20, 6),
- const EncodedHuffmanValue(0xffb, 12),
- const EncodedHuffmanValue(0x3fc, 10),
- const EncodedHuffmanValue(0x1ffa, 13),
- const EncodedHuffmanValue(0x21, 6),
- const EncodedHuffmanValue(0x5d, 7),
- const EncodedHuffmanValue(0x5e, 7),
- const EncodedHuffmanValue(0x5f, 7),
- const EncodedHuffmanValue(0x60, 7),
- const EncodedHuffmanValue(0x61, 7),
- const EncodedHuffmanValue(0x62, 7),
- const EncodedHuffmanValue(0x63, 7),
- const EncodedHuffmanValue(0x64, 7),
- const EncodedHuffmanValue(0x65, 7),
- const EncodedHuffmanValue(0x66, 7),
- const EncodedHuffmanValue(0x67, 7),
- const EncodedHuffmanValue(0x68, 7),
- const EncodedHuffmanValue(0x69, 7),
- const EncodedHuffmanValue(0x6a, 7),
- const EncodedHuffmanValue(0x6b, 7),
- const EncodedHuffmanValue(0x6c, 7),
- const EncodedHuffmanValue(0x6d, 7),
- const EncodedHuffmanValue(0x6e, 7),
- const EncodedHuffmanValue(0x6f, 7),
- const EncodedHuffmanValue(0x70, 7),
- const EncodedHuffmanValue(0x71, 7),
- const EncodedHuffmanValue(0x72, 7),
- const EncodedHuffmanValue(0xfc, 8),
- const EncodedHuffmanValue(0x73, 7),
- const EncodedHuffmanValue(0xfd, 8),
- const EncodedHuffmanValue(0x1ffb, 13),
- const EncodedHuffmanValue(0x7fff0, 19),
- const EncodedHuffmanValue(0x1ffc, 13),
- const EncodedHuffmanValue(0x3ffc, 14),
- const EncodedHuffmanValue(0x22, 6),
- const EncodedHuffmanValue(0x7ffd, 15),
- const EncodedHuffmanValue(0x3, 5),
- const EncodedHuffmanValue(0x23, 6),
- const EncodedHuffmanValue(0x4, 5),
- const EncodedHuffmanValue(0x24, 6),
- const EncodedHuffmanValue(0x5, 5),
- const EncodedHuffmanValue(0x25, 6),
- const EncodedHuffmanValue(0x26, 6),
- const EncodedHuffmanValue(0x27, 6),
- const EncodedHuffmanValue(0x6, 5),
- const EncodedHuffmanValue(0x74, 7),
- const EncodedHuffmanValue(0x75, 7),
- const EncodedHuffmanValue(0x28, 6),
- const EncodedHuffmanValue(0x29, 6),
- const EncodedHuffmanValue(0x2a, 6),
- const EncodedHuffmanValue(0x7, 5),
- const EncodedHuffmanValue(0x2b, 6),
- const EncodedHuffmanValue(0x76, 7),
- const EncodedHuffmanValue(0x2c, 6),
- const EncodedHuffmanValue(0x8, 5),
- const EncodedHuffmanValue(0x9, 5),
- const EncodedHuffmanValue(0x2d, 6),
- const EncodedHuffmanValue(0x77, 7),
- const EncodedHuffmanValue(0x78, 7),
- const EncodedHuffmanValue(0x79, 7),
- const EncodedHuffmanValue(0x7a, 7),
- const EncodedHuffmanValue(0x7b, 7),
- const EncodedHuffmanValue(0x7ffe, 15),
- const EncodedHuffmanValue(0x7fc, 11),
- const EncodedHuffmanValue(0x3ffd, 14),
- const EncodedHuffmanValue(0x1ffd, 13),
- const EncodedHuffmanValue(0xffffffc, 28),
- const EncodedHuffmanValue(0xfffe6, 20),
- const EncodedHuffmanValue(0x3fffd2, 22),
- const EncodedHuffmanValue(0xfffe7, 20),
- const EncodedHuffmanValue(0xfffe8, 20),
- const EncodedHuffmanValue(0x3fffd3, 22),
- const EncodedHuffmanValue(0x3fffd4, 22),
- const EncodedHuffmanValue(0x3fffd5, 22),
- const EncodedHuffmanValue(0x7fffd9, 23),
- const EncodedHuffmanValue(0x3fffd6, 22),
- const EncodedHuffmanValue(0x7fffda, 23),
- const EncodedHuffmanValue(0x7fffdb, 23),
- const EncodedHuffmanValue(0x7fffdc, 23),
- const EncodedHuffmanValue(0x7fffdd, 23),
- const EncodedHuffmanValue(0x7fffde, 23),
- const EncodedHuffmanValue(0xffffeb, 24),
- const EncodedHuffmanValue(0x7fffdf, 23),
- const EncodedHuffmanValue(0xffffec, 24),
- const EncodedHuffmanValue(0xffffed, 24),
- const EncodedHuffmanValue(0x3fffd7, 22),
- const EncodedHuffmanValue(0x7fffe0, 23),
- const EncodedHuffmanValue(0xffffee, 24),
- const EncodedHuffmanValue(0x7fffe1, 23),
- const EncodedHuffmanValue(0x7fffe2, 23),
- const EncodedHuffmanValue(0x7fffe3, 23),
- const EncodedHuffmanValue(0x7fffe4, 23),
- const EncodedHuffmanValue(0x1fffdc, 21),
- const EncodedHuffmanValue(0x3fffd8, 22),
- const EncodedHuffmanValue(0x7fffe5, 23),
- const EncodedHuffmanValue(0x3fffd9, 22),
- const EncodedHuffmanValue(0x7fffe6, 23),
- const EncodedHuffmanValue(0x7fffe7, 23),
- const EncodedHuffmanValue(0xffffef, 24),
- const EncodedHuffmanValue(0x3fffda, 22),
- const EncodedHuffmanValue(0x1fffdd, 21),
- const EncodedHuffmanValue(0xfffe9, 20),
- const EncodedHuffmanValue(0x3fffdb, 22),
- const EncodedHuffmanValue(0x3fffdc, 22),
- const EncodedHuffmanValue(0x7fffe8, 23),
- const EncodedHuffmanValue(0x7fffe9, 23),
- const EncodedHuffmanValue(0x1fffde, 21),
- const EncodedHuffmanValue(0x7fffea, 23),
- const EncodedHuffmanValue(0x3fffdd, 22),
- const EncodedHuffmanValue(0x3fffde, 22),
- const EncodedHuffmanValue(0xfffff0, 24),
- const EncodedHuffmanValue(0x1fffdf, 21),
- const EncodedHuffmanValue(0x3fffdf, 22),
- const EncodedHuffmanValue(0x7fffeb, 23),
- const EncodedHuffmanValue(0x7fffec, 23),
- const EncodedHuffmanValue(0x1fffe0, 21),
- const EncodedHuffmanValue(0x1fffe1, 21),
- const EncodedHuffmanValue(0x3fffe0, 22),
- const EncodedHuffmanValue(0x1fffe2, 21),
- const EncodedHuffmanValue(0x7fffed, 23),
- const EncodedHuffmanValue(0x3fffe1, 22),
- const EncodedHuffmanValue(0x7fffee, 23),
- const EncodedHuffmanValue(0x7fffef, 23),
- const EncodedHuffmanValue(0xfffea, 20),
- const EncodedHuffmanValue(0x3fffe2, 22),
- const EncodedHuffmanValue(0x3fffe3, 22),
- const EncodedHuffmanValue(0x3fffe4, 22),
- const EncodedHuffmanValue(0x7ffff0, 23),
- const EncodedHuffmanValue(0x3fffe5, 22),
- const EncodedHuffmanValue(0x3fffe6, 22),
- const EncodedHuffmanValue(0x7ffff1, 23),
- const EncodedHuffmanValue(0x3ffffe0, 26),
- const EncodedHuffmanValue(0x3ffffe1, 26),
- const EncodedHuffmanValue(0xfffeb, 20),
- const EncodedHuffmanValue(0x7fff1, 19),
- const EncodedHuffmanValue(0x3fffe7, 22),
- const EncodedHuffmanValue(0x7ffff2, 23),
- const EncodedHuffmanValue(0x3fffe8, 22),
- const EncodedHuffmanValue(0x1ffffec, 25),
- const EncodedHuffmanValue(0x3ffffe2, 26),
- const EncodedHuffmanValue(0x3ffffe3, 26),
- const EncodedHuffmanValue(0x3ffffe4, 26),
- const EncodedHuffmanValue(0x7ffffde, 27),
- const EncodedHuffmanValue(0x7ffffdf, 27),
- const EncodedHuffmanValue(0x3ffffe5, 26),
- const EncodedHuffmanValue(0xfffff1, 24),
- const EncodedHuffmanValue(0x1ffffed, 25),
- const EncodedHuffmanValue(0x7fff2, 19),
- const EncodedHuffmanValue(0x1fffe3, 21),
- const EncodedHuffmanValue(0x3ffffe6, 26),
- const EncodedHuffmanValue(0x7ffffe0, 27),
- const EncodedHuffmanValue(0x7ffffe1, 27),
- const EncodedHuffmanValue(0x3ffffe7, 26),
- const EncodedHuffmanValue(0x7ffffe2, 27),
- const EncodedHuffmanValue(0xfffff2, 24),
- const EncodedHuffmanValue(0x1fffe4, 21),
- const EncodedHuffmanValue(0x1fffe5, 21),
- const EncodedHuffmanValue(0x3ffffe8, 26),
- const EncodedHuffmanValue(0x3ffffe9, 26),
- const EncodedHuffmanValue(0xffffffd, 28),
- const EncodedHuffmanValue(0x7ffffe3, 27),
- const EncodedHuffmanValue(0x7ffffe4, 27),
- const EncodedHuffmanValue(0x7ffffe5, 27),
- const EncodedHuffmanValue(0xfffec, 20),
- const EncodedHuffmanValue(0xfffff3, 24),
- const EncodedHuffmanValue(0xfffed, 20),
- const EncodedHuffmanValue(0x1fffe6, 21),
- const EncodedHuffmanValue(0x3fffe9, 22),
- const EncodedHuffmanValue(0x1fffe7, 21),
- const EncodedHuffmanValue(0x1fffe8, 21),
- const EncodedHuffmanValue(0x7ffff3, 23),
- const EncodedHuffmanValue(0x3fffea, 22),
- const EncodedHuffmanValue(0x3fffeb, 22),
- const EncodedHuffmanValue(0x1ffffee, 25),
- const EncodedHuffmanValue(0x1ffffef, 25),
- const EncodedHuffmanValue(0xfffff4, 24),
- const EncodedHuffmanValue(0xfffff5, 24),
- const EncodedHuffmanValue(0x3ffffea, 26),
- const EncodedHuffmanValue(0x7ffff4, 23),
- const EncodedHuffmanValue(0x3ffffeb, 26),
- const EncodedHuffmanValue(0x7ffffe6, 27),
- const EncodedHuffmanValue(0x3ffffec, 26),
- const EncodedHuffmanValue(0x3ffffed, 26),
- const EncodedHuffmanValue(0x7ffffe7, 27),
- const EncodedHuffmanValue(0x7ffffe8, 27),
- const EncodedHuffmanValue(0x7ffffe9, 27),
- const EncodedHuffmanValue(0x7ffffea, 27),
- const EncodedHuffmanValue(0x7ffffeb, 27),
- const EncodedHuffmanValue(0xffffffe, 28),
- const EncodedHuffmanValue(0x7ffffec, 27),
- const EncodedHuffmanValue(0x7ffffed, 27),
- const EncodedHuffmanValue(0x7ffffee, 27),
- const EncodedHuffmanValue(0x7ffffef, 27),
- const EncodedHuffmanValue(0x7fffff0, 27),
- const EncodedHuffmanValue(0x3ffffee, 26),
- const EncodedHuffmanValue(0x3fffffff, 30),
-];
diff --git a/http2/lib/src/ping/ping_handler.dart b/http2/lib/src/ping/ping_handler.dart
deleted file mode 100644
index bd8bc17..0000000
--- a/http2/lib/src/ping/ping_handler.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.ping.ping_handler;
-
-import 'dart:async';
-
-import '../error_handler.dart';
-import '../frames/frames.dart';
-import '../sync_errors.dart';
-
-/// Responsible for pinging the other end and for handling pings from the
-/// other end.
-// TODO: We currently write unconditionally to the [FrameWriter]: we might want
-// to consider be more aware what [Framewriter.bufferIndicator.wouldBuffer]
-// says.
-class PingHandler extends Object with TerminatableMixin {
- final FrameWriter _frameWriter;
- final Map<int, Completer> _remainingPings = {};
- int _nextId = 1;
-
- PingHandler(this._frameWriter);
-
- void onTerminated(error) {
- var values = _remainingPings.values.toList();
- _remainingPings.clear();
- values.forEach((Completer c) => c.completeError(error));
- }
-
- void processPingFrame(PingFrame frame) {
- ensureNotTerminatedSync(() {
- if (frame.header.streamId != 0) {
- throw new ProtocolException('Ping frames must have a stream id of 0.');
- }
-
- if (!frame.hasAckFlag) {
- _frameWriter.writePingFrame(frame.opaqueData, ack: true);
- } else {
- Completer c = _remainingPings.remove(frame.opaqueData);
- if (c != null) {
- c.complete();
- } else {
- // NOTE: It is not specified what happens when one gets an ACK for a
- // ping we never sent. We be very strict and fail in this case.
- throw new ProtocolException(
- 'Received ping ack with unknown opaque data.');
- }
- }
- });
- }
-
- Future ping() {
- return ensureNotTerminatedAsync(() {
- Completer c = new Completer();
- var id = _nextId++;
- _remainingPings[id] = c;
- _frameWriter.writePingFrame(id);
- return c.future;
- });
- }
-}
diff --git a/http2/lib/src/settings/settings.dart b/http2/lib/src/settings/settings.dart
deleted file mode 100644
index 6ee2284..0000000
--- a/http2/lib/src/settings/settings.dart
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.settings;
-
-import 'dart:async';
-
-import '../error_handler.dart';
-import '../frames/frames.dart';
-import '../hpack/hpack.dart';
-import '../sync_errors.dart';
-
-/// The settings a remote peer can choose to set.
-class ActiveSettings {
- /// Allows the sender to inform the remote endpoint of the maximum size of the
- /// header compression table used to decode header blocks, in octets. The
- /// encoder can select any size equal to or less than this value by using
- /// signaling specific to the header compression format inside a header block.
- /// The initial value is 4,096 octets.
- int headerTableSize;
-
- /// This setting can be use to disable server push (Section 8.2). An endpoint
- /// MUST NOT send a PUSH_PROMISE frame if it receives this parameter set to a
- /// value of 0. An endpoint that has both set this parameter to 0 and had it
- /// acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a
- /// connection error (Section 5.4.1) of type PROTOCOL_ERROR.
- ///
- /// The initial value is 1, which indicates that server push is permitted.
- /// Any value other than 0 or 1 MUST be treated as a connection error
- /// (Section 5.4.1) of type PROTOCOL_ERROR.
- bool enablePush;
-
- /// Indicates the maximum number of concurrent streams that the sender will
- /// allow. This limit is directional: it applies to the number of streams that
- /// the sender permits the receiver to create. Initially there is no limit to
- /// this value. It is recommended that this value be no smaller than 100, so
- /// as to not unnecessarily limit parallelism.
- ///
- /// A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be treated as
- /// special by endpoints. A zero value does prevent the creation of new
- /// streams, however this can also happen for any limit that is exhausted with
- /// active streams. Servers SHOULD only set a zero value for short durations;
- /// if a server does not wish to accept requests, closing the connection is
- /// more appropriate.
- int maxConcurrentStreams;
-
- /// Indicates the sender's initial window size (in octets) for stream level
- /// flow control. The initial value is 2^16-1 (65,535) octets.
- ///
- /// This setting affects the window size of all streams, including existing
- /// streams, see Section 6.9.2.
- /// Values above the maximum flow control window size of 231-1 MUST be treated
- /// as a connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR.
- int initialWindowSize;
-
- /// Indicates the size of the largest frame payload that the sender is willing
- /// to receive, in octets.
- ///
- /// The initial value is 2^14 (16,384) octets. The value advertised by an
- /// endpoint MUST be between this initial value and the maximum allowed frame
- /// size (2^24-1 or 16,777,215 octets), inclusive. Values outside this range
- /// MUST be treated as a connection error (Section 5.4.1) of type
- /// PROTOCOL_ERROR.
- int maxFrameSize;
-
- /// This advisory setting informs a peer of the maximum size of header list
- /// that the sender is prepared to accept, in octets. The value is based on
- /// the uncompressed size of header fields, including the length of the name
- /// and value in octets plus an overhead of 32 octets for each header field.
- ///
- /// For any given request, a lower limit than what is advertised MAY be
- /// enforced. The initial value of this setting is unlimited.
- int maxHeaderListSize;
-
- ActiveSettings(
- {this.headerTableSize: 4096,
- this.enablePush: true,
- this.maxConcurrentStreams,
- this.initialWindowSize: (1 << 16) - 1,
- this.maxFrameSize: (1 << 14),
- this.maxHeaderListSize});
-}
-
-/// Handles remote and local connection [Setting]s.
-///
-/// Incoming [SettingsFrame]s will be handled here to update the peer settings.
-/// Changes to [_toBeAcknowledgedSettings] can be made, the peer will then be
-/// notified of the setting changes it should use.
-class SettingsHandler extends Object with TerminatableMixin {
- /// Certain settings changes can change the maximum allowed dynamic table
- /// size used by the HPack encoder.
- final HPackEncoder _hpackEncoder;
-
- final FrameWriter _frameWriter;
-
- /// A list of outstanding setting changes.
- final List<List<Setting>> _toBeAcknowledgedSettings = [];
-
- /// A list of completers for outstanding setting changes.
- final List<Completer> _toBeAcknowledgedCompleters = [];
-
- /// The local settings, which the remote side ACKed to obey.
- final ActiveSettings _acknowledgedSettings;
-
- /// The peer settings, which we ACKed and are obeying.
- final ActiveSettings _peerSettings;
-
- final _onInitialWindowSizeChangeController =
- new StreamController<int>.broadcast(sync: true);
-
- /// Events are fired when a SettingsFrame changes the initial size
- /// of stream windows.
- Stream<int> get onInitialWindowSizeChange =>
- _onInitialWindowSizeChangeController.stream;
-
- SettingsHandler(this._hpackEncoder, this._frameWriter,
- this._acknowledgedSettings, this._peerSettings);
-
- /// The settings for this endpoint of the connection which the remote peer
- /// has ACKed and uses.
- ActiveSettings get acknowledgedSettings => _acknowledgedSettings;
-
- /// The settings for the remote endpoint of the connection which this
- /// endpoint should use.
- ActiveSettings get peerSettings => _peerSettings;
-
- /// Handles an incoming [SettingsFrame] which can be an ACK or a settings
- /// change.
- void handleSettingsFrame(SettingsFrame frame) {
- ensureNotTerminatedSync(() {
- assert(frame.header.streamId == 0);
-
- if (frame.hasAckFlag) {
- assert(frame.header.length == 0);
-
- if (_toBeAcknowledgedSettings.isEmpty) {
- // NOTE: The specification does not say anything about ACKed settings
- // which were never sent to the other side. We consider this definitly
- // an error.
- throw new ProtocolException(
- 'Received an acknowledged settings frame which did not have a '
- 'outstanding settings request.');
- }
- List<Setting> settingChanges = _toBeAcknowledgedSettings.removeAt(0);
- Completer completer = _toBeAcknowledgedCompleters.removeAt(0);
- _modifySettings(_acknowledgedSettings, settingChanges, false);
- completer.complete();
- } else {
- _modifySettings(_peerSettings, frame.settings, true);
- _frameWriter.writeSettingsAckFrame();
- }
- });
- }
-
- void onTerminated(error) {
- _toBeAcknowledgedSettings.clear();
- _toBeAcknowledgedCompleters
- .forEach((Completer c) => c.completeError(error));
- }
-
- Future changeSettings(List<Setting> changes) {
- return ensureNotTerminatedAsync(() {
- // TODO: Have a timeout: When ACK doesn't get back in a reasonable time
- // frame we should quit with ErrorCode.SETTINGS_TIMEOUT.
- var completer = new Completer();
- _toBeAcknowledgedSettings.add(changes);
- _toBeAcknowledgedCompleters.add(completer);
- _frameWriter.writeSettingsFrame(changes);
- return completer.future;
- });
- }
-
- void _modifySettings(
- ActiveSettings base, List<Setting> changes, bool peerSettings) {
- for (var setting in changes) {
- switch (setting.identifier) {
- case Setting.SETTINGS_ENABLE_PUSH:
- if (setting.value == 0) {
- base.enablePush = false;
- } else if (setting.value == 1) {
- base.enablePush = true;
- } else {
- throw new ProtocolException(
- 'The push setting can be only set to 0 or 1.');
- }
- break;
-
- case Setting.SETTINGS_HEADER_TABLE_SIZE:
- base.headerTableSize = setting.value;
- if (peerSettings) {
- _hpackEncoder.updateMaxSendingHeaderTableSize(base.headerTableSize);
- }
- break;
-
- case Setting.SETTINGS_MAX_HEADER_LIST_SIZE:
- // TODO: Propagate this signal to the HPackContext.
- base.maxHeaderListSize = setting.value;
- break;
-
- case Setting.SETTINGS_MAX_CONCURRENT_STREAMS:
- // NOTE: We will not force closing of existing streams if the limit is
- // lower than the current number of open streams. But we will prevent
- // new streams from being created if the number of existing streams
- // is above this limit.
- base.maxConcurrentStreams = setting.value;
- break;
-
- case Setting.SETTINGS_INITIAL_WINDOW_SIZE:
- if (setting.value < (1 << 31)) {
- int difference = setting.value - base.initialWindowSize;
- _onInitialWindowSizeChangeController.add(difference);
- base.initialWindowSize = setting.value;
- } else {
- throw new FlowControlException('Invalid initial window size.');
- }
- break;
-
- default:
- // Spec says to ignore unknown settings.
- break;
- }
- }
- }
-}
diff --git a/http2/lib/src/streams/stream_handler.dart b/http2/lib/src/streams/stream_handler.dart
deleted file mode 100644
index 0f79b52..0000000
--- a/http2/lib/src/streams/stream_handler.dart
+++ /dev/null
@@ -1,874 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.stream_handler;
-
-import 'dart:async';
-import 'dart:math';
-
-import '../../transport.dart';
-
-import '../connection.dart';
-import '../error_handler.dart';
-import '../flowcontrol/connection_queues.dart';
-import '../flowcontrol/queue_messages.dart';
-import '../flowcontrol/stream_queues.dart';
-import '../flowcontrol/window.dart';
-import '../flowcontrol/window_handler.dart';
-import '../frames/frames.dart';
-import '../hpack/hpack.dart';
-import '../settings/settings.dart';
-import '../sync_errors.dart';
-
-/// Represents the current state of a stream.
-enum StreamState {
- ReservedLocal,
- ReservedRemote,
- Idle,
- Open,
- HalfClosedLocal,
- HalfClosedRemote,
- Closed,
-
- /// The [Terminated] state is an artificial state and signals that this stream
- /// has been forcefully terminated.
- Terminated,
-}
-
-/// Represents a HTTP/2 stream.
-class Http2StreamImpl extends TransportStream
- implements ClientTransportStream, ServerTransportStream {
- /// The id of this stream.
- ///
- /// * odd numbered streams are client streams
- /// * even numbered streams are opened from the server
- final int id;
-
- // The queue for incoming [StreamMessage]s.
- final StreamMessageQueueIn incomingQueue;
-
- // The queue for outgoing [StreamMessage]s.
- final StreamMessageQueueOut outgoingQueue;
-
- // The stream controller to which the application can
- // add outgoing messages.
- final StreamController<StreamMessage> _outgoingC;
-
- final OutgoingStreamWindowHandler windowHandler;
-
- // The state of this stream.
- StreamState state = StreamState.Idle;
-
- // Error code from RST_STREAM frame, if the stream has been terminated
- // remotely.
- int _terminatedErrorCode;
-
- // Termination handler. Invoked if the stream receives an RST_STREAM frame.
- void Function(int) _onTerminated;
-
- final ZoneUnaryCallback<bool, Http2StreamImpl> _canPushFun;
- final ZoneBinaryCallback<ServerTransportStream, Http2StreamImpl, List<Header>>
- _pushStreamFun;
- final ZoneUnaryCallback<dynamic, Http2StreamImpl> _terminateStreamFun;
-
- StreamSubscription _outgoingCSubscription;
-
- Http2StreamImpl(
- this.incomingQueue,
- this.outgoingQueue,
- this._outgoingC,
- this.id,
- this.windowHandler,
- this._canPushFun,
- this._pushStreamFun,
- this._terminateStreamFun);
-
- /// A stream of data and/or headers from the remote end.
- Stream<StreamMessage> get incomingMessages => incomingQueue.messages;
-
- /// A sink for writing data and/or headers to the remote end.
- StreamSink<StreamMessage> get outgoingMessages => _outgoingC.sink;
-
- /// Streams which the server pushed to this endpoint.
- Stream<TransportStreamPush> get peerPushes => incomingQueue.serverPushes;
-
- bool get canPush => _canPushFun(this);
-
- /// Pushes a new stream to a client.
- ///
- /// The [requestHeaders] are the headers to which the pushed stream
- /// responds to.
- ServerTransportStream push(List<Header> requestHeaders) =>
- _pushStreamFun(this, requestHeaders);
-
- void terminate() => _terminateStreamFun(this);
-
- set onTerminated(void handler(int v)) {
- _onTerminated = handler;
- if (_terminatedErrorCode != null && _onTerminated != null) {
- _onTerminated(_terminatedErrorCode);
- }
- }
-
- void _handleTerminated(int errorCode) {
- _terminatedErrorCode = errorCode;
- if (_onTerminated != null) {
- _onTerminated(_terminatedErrorCode);
- }
- }
-}
-
-/// Handles [Frame]s with a non-zero stream-id.
-///
-/// It keeps track of open streams, their state, their queues, forwards
-/// messages from the connection level to stream level and vise versa.
-// TODO: Handle stream/connection queue errors & forward to connection object.
-class StreamHandler extends Object with TerminatableMixin, ClosableMixin {
- static const int MAX_STREAM_ID = (1 << 31) - 1;
-
- final FrameWriter _frameWriter;
- final ConnectionMessageQueueIn incomingQueue;
- final ConnectionMessageQueueOut outgoingQueue;
-
- final StreamController<TransportStream> _newStreamsC = new StreamController();
-
- final ActiveSettings _peerSettings;
- final ActiveSettings _localSettings;
-
- final Map<int, Http2StreamImpl> _openStreams = {};
- int nextStreamId;
- int lastRemoteStreamId;
-
- int _highestStreamIdReceived = 0;
-
- /// Represents the highest stream id this connection has received from the
- /// remote side.
- int get highestPeerInitiatedStream => _highestStreamIdReceived;
-
- bool get isServer => nextStreamId.isEven;
-
- bool get ranOutOfStreamIds => _ranOutOfStreamIds();
-
- /// Whether it is possible to open a new stream to the remote end (e.g. based
- /// on whether we have reached the limit of maximum concurrent open streams).
- bool get canOpenStream => _canCreateNewStream();
-
- final ActiveStateHandler _onActiveStateChanged;
-
- StreamHandler._(
- this._frameWriter,
- this.incomingQueue,
- this.outgoingQueue,
- this._peerSettings,
- this._localSettings,
- this._onActiveStateChanged,
- this.nextStreamId,
- this.lastRemoteStreamId);
-
- factory StreamHandler.client(
- FrameWriter writer,
- ConnectionMessageQueueIn incomingQueue,
- ConnectionMessageQueueOut outgoingQueue,
- ActiveSettings peerSettings,
- ActiveSettings localSettings,
- ActiveStateHandler onActiveStateChanged) {
- return new StreamHandler._(writer, incomingQueue, outgoingQueue,
- peerSettings, localSettings, onActiveStateChanged, 1, 0);
- }
-
- factory StreamHandler.server(
- FrameWriter writer,
- ConnectionMessageQueueIn incomingQueue,
- ConnectionMessageQueueOut outgoingQueue,
- ActiveSettings peerSettings,
- ActiveSettings localSettings,
- ActiveStateHandler onActiveStateChanged) {
- return new StreamHandler._(writer, incomingQueue, outgoingQueue,
- peerSettings, localSettings, onActiveStateChanged, 2, -1);
- }
-
- void onTerminated(exception) {
- _openStreams.values.toList().forEach((stream) =>
- _closeStreamAbnormally(stream, exception, propagateException: true));
- startClosing();
- }
-
- void forceDispatchIncomingMessages() {
- _openStreams.forEach((int streamId, Http2StreamImpl stream) {
- stream.incomingQueue.forceDispatchIncomingMessages();
- });
- }
-
- Stream<TransportStream> get incomingStreams => _newStreamsC.stream;
-
- List<TransportStream> get openStreams => _openStreams.values.toList();
-
- void processInitialWindowSizeSettingChange(int difference) {
- // If the initialFlowWindow size was changed via a SettingsFrame, all
- // existing streams must be updated to reflect this change.
- _openStreams.values.forEach((Http2StreamImpl stream) {
- stream.windowHandler.processInitialWindowSizeSettingChange(difference);
- });
- }
-
- void processGoawayFrame(GoawayFrame frame) {
- var lastStreamId = frame.lastStreamId;
- var streamIds = _openStreams.keys
- .where((id) => id > lastStreamId && !_isPeerInitiatedStream(id))
- .toList();
- for (int id in streamIds) {
- var exception = new StreamException(
- id,
- 'Remote end was telling us to stop. This stream was not processed '
- 'and can therefore be retried (on a new connection).');
- _closeStreamIdAbnormally(id, exception, propagateException: true);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //// New local/remote Stream handling
- ////////////////////////////////////////////////////////////////////////////
-
- bool _isPeerInitiatedStream(int streamId) {
- bool isServerStreamId = streamId.isEven;
- bool isLocalStream = isServerStreamId == isServer;
- return !isLocalStream;
- }
-
- Http2StreamImpl newStream(List<Header> headers, {bool endStream: false}) {
- return ensureNotTerminatedSync(() {
- var stream = newLocalStream();
- _sendHeaders(stream, headers, endStream: endStream);
- return stream;
- });
- }
-
- Http2StreamImpl newLocalStream() {
- return ensureNotTerminatedSync(() {
- assert(_canCreateNewStream());
-
- if (MAX_STREAM_ID < nextStreamId) {
- throw new StateError(
- 'Cannot create new streams, since a wrap around would happen.');
- }
- int streamId = nextStreamId;
- nextStreamId += 2;
- return _newStreamInternal(streamId);
- });
- }
-
- Http2StreamImpl newRemoteStream(int remoteStreamId) {
- return ensureNotTerminatedSync(() {
- assert(remoteStreamId <= MAX_STREAM_ID);
- // NOTE: We cannot enforce that a new stream id is 2 higher than the last
- // used stream id. Meaning there can be "holes" in the sense that stream
- // ids are not used:
- //
- // http/2 spec:
- // The first use of a new stream identifier implicitly closes all
- // streams in the "idle" state that might have been initiated by that
- // peer with a lower-valued stream identifier. For example, if a client
- // sends a HEADERS frame on stream 7 without ever sending a frame on
- // stream 5, then stream 5 transitions to the "closed" state when the
- // first frame for stream 7 is sent or received.
-
- if (remoteStreamId <= lastRemoteStreamId) {
- throw new ProtocolException('Remote tried to open new stream which is '
- 'not in "idle" state.');
- }
-
- bool sameDirection = (nextStreamId + remoteStreamId) % 2 == 0;
- assert(!sameDirection);
-
- lastRemoteStreamId = remoteStreamId;
- return _newStreamInternal(remoteStreamId);
- });
- }
-
- Http2StreamImpl _newStreamInternal(int streamId) {
- // For each new stream we must:
- // - setup sending/receiving [Window]s with correct initial size
- // - setup sending/receiving WindowHandlers which take care of
- // updating the windows.
- // - setup incoming/outgoing stream queues, which buffer data
- // that is not handled by
- // * the application [incoming]
- // * the underlying transport [outgoing]
- // - register incoming stream queue in connection-level queue
-
- var outgoingStreamWindow =
- new Window(initialSize: _peerSettings.initialWindowSize);
-
- var incomingStreamWindow =
- new Window(initialSize: _localSettings.initialWindowSize);
-
- var windowOutHandler =
- new OutgoingStreamWindowHandler(outgoingStreamWindow);
-
- var windowInHandler = new IncomingWindowHandler.stream(
- _frameWriter, incomingStreamWindow, streamId);
-
- var streamQueueIn = new StreamMessageQueueIn(windowInHandler);
- var streamQueueOut =
- new StreamMessageQueueOut(streamId, windowOutHandler, outgoingQueue);
-
- incomingQueue.insertNewStreamMessageQueue(streamId, streamQueueIn);
-
- var _outgoingC = new StreamController<StreamMessage>();
- var stream = new Http2StreamImpl(
- streamQueueIn,
- streamQueueOut,
- _outgoingC,
- streamId,
- windowOutHandler,
- this._canPush,
- this._push,
- this._terminateStream);
- final wasIdle = _openStreams.isEmpty;
- _openStreams[stream.id] = stream;
-
- _setupOutgoingMessageHandling(stream);
-
- // Handle incoming stream cancellation. RST is only sent when streamQueueOut
- // has been closed because RST make the stream 'closed'.
- streamQueueIn.onCancel.then((_) {
- // If our side is done sending data, i.e. we have enqueued the
- // end-of-stream in the outgoing message queue, but the remote end is
- // still sending us data, despite us not being interested in it, we will
- // reset the stream.
- if (stream.state == StreamState.HalfClosedLocal) {
- stream.outgoingQueue.enqueueMessage(
- new ResetStreamMessage(stream.id, ErrorCode.CANCEL));
- }
- });
-
- // NOTE: We are not interested whether the streams were normally finished
- // or abnormally terminated. Therefore we use 'catchError((_) {})'!
- var streamDone = [streamQueueIn.done, streamQueueOut.done];
- Future.wait(streamDone).catchError((_) {}).whenComplete(() {
- _cleanupClosedStream(stream);
- });
-
- if (wasIdle) {
- _onActiveStateChanged(true);
- }
-
- return stream;
- }
-
- bool _canPush(Http2StreamImpl stream) {
- bool openState = (stream.state == StreamState.Open ||
- stream.state == StreamState.HalfClosedRemote);
- bool pushEnabled = this._peerSettings.enablePush;
- return openState &&
- pushEnabled &&
- _canCreateNewStream() &&
- !_ranOutOfStreamIds();
- }
-
- ServerTransportStream _push(
- Http2StreamImpl stream, List<Header> requestHeaders) {
- if (stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedRemote) {
- throw new StateError('Cannot push based on a stream that is neither open '
- 'nor half-closed-remote.');
- }
-
- if (!_peerSettings.enablePush) {
- throw new StateError('Client did disable server pushes.');
- }
-
- if (!_canCreateNewStream()) {
- throw new StateError('Maximum number of streams reached.');
- }
-
- if (_ranOutOfStreamIds()) {
- throw new StateError('There are no more stream ids left. Please use a '
- 'new connection.');
- }
-
- Http2StreamImpl pushStream = newLocalStream();
-
- // NOTE: Since there was no real request from the client, we simulate it
- // by adding a synthetic `endStream = true` Data message into the incoming
- // queue.
- _changeState(pushStream, StreamState.ReservedLocal);
- // TODO: We should wait for us to send the headers frame before doing this
- // transition.
- _changeState(pushStream, StreamState.HalfClosedRemote);
- pushStream.incomingQueue
- .enqueueMessage(new DataMessage(stream.id, const <int>[], true));
-
- _frameWriter.writePushPromiseFrame(
- stream.id, pushStream.id, requestHeaders);
-
- return pushStream;
- }
-
- void _terminateStream(Http2StreamImpl stream) {
- if (stream.state == StreamState.Open ||
- stream.state == StreamState.HalfClosedLocal ||
- stream.state == StreamState.HalfClosedRemote ||
- stream.state == StreamState.ReservedLocal ||
- stream.state == StreamState.ReservedRemote) {
- _frameWriter.writeRstStreamFrame(stream.id, ErrorCode.CANCEL);
- _closeStreamAbnormally(stream, null, propagateException: false);
- }
- }
-
- void _setupOutgoingMessageHandling(Http2StreamImpl stream) {
- stream._outgoingCSubscription =
- stream._outgoingC.stream.listen((StreamMessage msg) {
- if (!wasTerminated) {
- _handleNewOutgoingMessage(stream, msg);
- }
- }, onError: (error, stack) {
- if (!wasTerminated) {
- stream.terminate();
- }
- }, onDone: () {
- if (!wasTerminated) {
- // Stream should already have been closed by the last frame, but we
- // allow multiple close calls, just to make sure.
- _handleOutgoingClose(stream);
- }
- });
- stream.outgoingQueue.bufferIndicator.bufferEmptyEvents.listen((_) {
- if (stream._outgoingCSubscription.isPaused) {
- stream._outgoingCSubscription.resume();
- }
- });
- }
-
- void _handleNewOutgoingMessage(Http2StreamImpl stream, StreamMessage msg) {
- if (stream.state == StreamState.Idle) {
- if (msg is! HeadersStreamMessage) {
- var exception = new TransportException(
- 'The first message on a stream needs to be a headers frame.');
- _closeStreamAbnormally(stream, exception);
- return;
- }
- _changeState(stream, StreamState.Open);
- }
-
- if (msg is DataStreamMessage) {
- _sendData(stream, msg.bytes, endStream: msg.endStream);
- } else if (msg is HeadersStreamMessage) {
- _sendHeaders(stream, msg.headers, endStream: msg.endStream);
- }
-
- if (stream.outgoingQueue.bufferIndicator.wouldBuffer &&
- !stream._outgoingCSubscription.isPaused) {
- stream._outgoingCSubscription.pause();
- }
- }
-
- void _handleOutgoingClose(Http2StreamImpl stream) {
- // We allow multiple close calls.
- if (stream.state != StreamState.HalfClosedLocal &&
- stream.state != StreamState.Closed &&
- stream.state != StreamState.Terminated) {
- _sendData(stream, const [], endStream: true);
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //// Process incoming stream frames
- ////////////////////////////////////////////////////////////////////////////
-
- void processStreamFrame(ConnectionState connectionState, Frame frame) {
- try {
- _processStreamFrameInternal(connectionState, frame);
- } on StreamClosedException catch (exception) {
- _frameWriter.writeRstStreamFrame(
- exception.streamId, ErrorCode.STREAM_CLOSED);
- _closeStreamIdAbnormally(exception.streamId, exception);
- } on StreamException catch (exception) {
- _frameWriter.writeRstStreamFrame(
- exception.streamId, ErrorCode.INTERNAL_ERROR);
- _closeStreamIdAbnormally(exception.streamId, exception);
- }
- }
-
- void _processStreamFrameInternal(
- ConnectionState connectionState, Frame frame) {
- // If we initiated a close of the connection and the received frame belongs
- // to a stream id which is higher than the last peer-initiated stream we
- // processed, we'll ignore it.
- // http/2 spec:
- // After sending a GOAWAY frame, the sender can discard frames for
- // streams initiated by the receiver with identifiers higher than the
- // identified last stream. However, any frames that alter connection
- // state cannot be completely ignored. For instance, HEADERS,
- // PUSH_PROMISE, and CONTINUATION frames MUST be minimally processed to
- // ensure the state maintained for header compression is consistent
- // (see Section 4.3); similarly, DATA frames MUST be counted toward
- // the connection flow-control window. Failure to process these
- // frames can cause flow control or header compression state to become
- // unsynchronized.
- if (connectionState.activeFinishing &&
- _isPeerInitiatedStream(frame.header.streamId) &&
- frame.header.streamId > highestPeerInitiatedStream) {
- // Even if the frame will be ignored, we still need to process it in a
- // minimal way to ensure the connection window will be updated.
- if (frame is DataFrame) {
- incomingQueue.processIgnoredDataFrame(frame);
- }
- return null;
- }
-
- // TODO: Consider splitting this method into client/server handling.
- return ensureNotTerminatedSync(() {
- var stream = _openStreams[frame.header.streamId];
- if (stream == null) {
- bool frameBelongsToIdleStream() {
- int streamId = frame.header.streamId;
- bool isServerStreamId = frame.header.streamId.isEven;
- bool isLocalStream = isServerStreamId == isServer;
- bool isIdleStream = isLocalStream
- ? streamId >= nextStreamId
- : streamId > lastRemoteStreamId;
- return isIdleStream;
- }
-
- if (_isPeerInitiatedStream(frame.header.streamId)) {
- // Update highest stream id we received and processed (we update it
- // before processing, so if it was an error, the client will not
- // retry it).
- _highestStreamIdReceived =
- max(_highestStreamIdReceived, frame.header.streamId);
- }
-
- if (frame is HeadersFrame) {
- if (isServer) {
- Http2StreamImpl newStream = newRemoteStream(frame.header.streamId);
- _changeState(newStream, StreamState.Open);
-
- _handleHeadersFrame(newStream, frame);
- _newStreamsC.add(newStream);
- } else {
- // A server cannot open new streams to the client. The only way
- // for a server to start a new stream is via a PUSH_PROMISE_FRAME.
- throw new ProtocolException(
- 'HTTP/2 clients cannot receive HEADER_FRAMEs as a connection'
- 'attempt.');
- }
- } else if (frame is WindowUpdateFrame) {
- if (frameBelongsToIdleStream()) {
- // We treat this as a protocol error even though not enforced
- // or specified by the HTTP/2 spec.
- throw new ProtocolException(
- 'Got a WINDOW_UPDATE_FRAME for an "idle" stream id.');
- } else {
- // We must be able to receive window update frames for streams that
- // have been already closed. The specification does not mention
- // what happens if the streamId is belonging to an "idle" / unused
- // stream.
- }
- } else if (frame is RstStreamFrame) {
- if (frameBelongsToIdleStream()) {
- // [RstFrame]s for streams which haven't been established (known as
- // idle streams) must be treated as a connection error.
- throw new ProtocolException(
- 'Got a RST_STREAM_FRAME for an "idle" stream id.');
- } else {
- // [RstFrame]s for already dead (known as "closed") streams should
- // be ignored. (If the stream was in "HalfClosedRemote" and we did
- // send an endStream=true, it will be removed from the stream set).
- }
- } else if (frame is PriorityFrame) {
- // http/2 spec:
- // The PRIORITY frame can be sent for a stream in the "idle" or
- // "closed" states. This allows for the reprioritization of a
- // group of dependent streams by altering the priority of an
- // unused or closed parent stream.
- //
- // As long as we do not handle stream priorities, we can safely ignore
- // such frames on idle streams.
- //
- // NOTE: Firefox for example sends [PriorityFrame]s even without
- // opening any streams (e.g. streams 3,5,7,9,11 [PriorityFrame]s and
- // stream 13 is the first real stream opened by a [HeadersFrame].
- //
- // TODO: When implementing priorities for HTTP/2 streams, these frames
- // need to be taken into account.
- } else if (frame is PushPromiseFrame) {
- throw new ProtocolException('Cannot push on a non-existent stream '
- '(stream ${frame.header.streamId} does not exist)');
- } else {
- throw new StreamClosedException(
- frame.header.streamId,
- 'No open stream found and was not a headers frame opening a '
- 'new stream.');
- }
- } else {
- if (frame is HeadersFrame) {
- _handleHeadersFrame(stream, frame);
- } else if (frame is DataFrame) {
- _handleDataFrame(stream, frame);
- } else if (frame is PushPromiseFrame) {
- _handlePushPromiseFrame(stream, frame);
- } else if (frame is WindowUpdateFrame) {
- _handleWindowUpdate(stream, frame);
- } else if (frame is RstStreamFrame) {
- _handleRstFrame(stream, frame);
- } else {
- throw new ProtocolException(
- 'Unsupported frame type ${frame.runtimeType}.');
- }
- }
- });
- }
-
- void _handleHeadersFrame(Http2StreamImpl stream, HeadersFrame frame) {
- if (stream.state == StreamState.ReservedRemote) {
- _changeState(stream, StreamState.HalfClosedLocal);
- }
-
- if (stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedLocal) {
- throw new StreamClosedException(
- stream.id, 'Expected open state (was: ${stream.state}).');
- }
-
- incomingQueue.processHeadersFrame(frame);
-
- if (frame.hasEndStreamFlag) _handleEndOfStreamRemote(stream);
- }
-
- void _handleDataFrame(Http2StreamImpl stream, DataFrame frame) {
- if (stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedLocal) {
- throw new StreamClosedException(
- stream.id, 'Expected open state (was: ${stream.state}).');
- }
-
- incomingQueue.processDataFrame(frame);
-
- if (frame.hasEndStreamFlag) _handleEndOfStreamRemote(stream);
- }
-
- void _handlePushPromiseFrame(Http2StreamImpl stream, PushPromiseFrame frame) {
- if (stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedLocal) {
- throw new ProtocolException(
- 'Expected open state (was: ${stream.state}).');
- }
-
- var pushedStream = newRemoteStream(frame.promisedStreamId);
- _changeState(pushedStream, StreamState.ReservedRemote);
-
- incomingQueue.processPushPromiseFrame(frame, pushedStream);
- }
-
- void _handleWindowUpdate(Http2StreamImpl stream, WindowUpdateFrame frame) {
- stream.windowHandler.processWindowUpdate(frame);
- }
-
- void _handleRstFrame(Http2StreamImpl stream, RstStreamFrame frame) {
- stream._handleTerminated(frame.errorCode);
- var exception = new StreamTransportException(
- 'Stream was terminated by peer (errorCode: ${frame.errorCode}).');
- _closeStreamAbnormally(stream, exception, propagateException: true);
- }
-
- void _handleEndOfStreamRemote(Http2StreamImpl stream) {
- if (stream.state == StreamState.Open) {
- _changeState(stream, StreamState.HalfClosedRemote);
- } else if (stream.state == StreamState.HalfClosedLocal) {
- _changeState(stream, StreamState.Closed);
- // TODO: We have to make sure that we
- // - remove the stream for data structures which only care about the
- // state
- // - keep the stream in data structures which need to be emptied
- // (e.g. MessageQueues which are not empty yet).
- _openStreams.remove(stream.id);
- } else {
- throw new StateError(
- 'Got an end-of-stream from the remote end, but this stream is '
- 'neither in the Open nor in the HalfClosedLocal state. '
- 'This should never happen.');
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //// Process outgoing stream messages
- ////////////////////////////////////////////////////////////////////////////
-
- void _sendHeaders(Http2StreamImpl stream, List<Header> headers,
- {bool endStream: false}) {
- if (stream.state != StreamState.Idle &&
- stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedRemote) {
- throw new StateError('Idle state expected.');
- }
-
- stream.outgoingQueue
- .enqueueMessage(new HeadersMessage(stream.id, headers, endStream));
-
- if (stream.state == StreamState.Idle) {
- _changeState(stream, StreamState.Open);
- }
-
- if (endStream) {
- _endStream(stream);
- }
- }
-
- void _sendData(Http2StreamImpl stream, List<int> data,
- {bool endStream: false}) {
- if (stream.state != StreamState.Open &&
- stream.state != StreamState.HalfClosedRemote) {
- throw new StateError('Open state expected (was: ${stream.state}).');
- }
-
- stream.outgoingQueue
- .enqueueMessage(new DataMessage(stream.id, data, endStream));
-
- if (endStream) {
- _endStream(stream);
- }
- }
-
- void _endStream(Http2StreamImpl stream) {
- if (stream.state == StreamState.Open) {
- _changeState(stream, StreamState.HalfClosedLocal);
- } else if (stream.state == StreamState.HalfClosedRemote) {
- _changeState(stream, StreamState.Closed);
- } else {
- throw new StateError(
- 'Invalid state transition. This should never happen.');
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //// Stream closing
- ////////////////////////////////////////////////////////////////////////////
-
- void _cleanupClosedStream(Http2StreamImpl stream) {
- // NOTE: This function should only be called once
- // * all incoming data has been delivered to the application
- // * all outgoing data has been added to the connection queue.
- incomingQueue.removeStreamMessageQueue(stream.id);
- _openStreams.remove(stream.id);
- if (stream.state != StreamState.Terminated) {
- _changeState(stream, StreamState.Terminated);
- }
- if (_openStreams.isEmpty) {
- _onActiveStateChanged(false);
- }
- onCheckForClose();
- }
-
- void _closeStreamIdAbnormally(int streamId, Exception exception,
- {bool propagateException: false}) {
- Http2StreamImpl stream = _openStreams[streamId];
- if (stream != null) {
- _closeStreamAbnormally(stream, exception,
- propagateException: propagateException);
- }
- }
-
- void _closeStreamAbnormally(Http2StreamImpl stream, Object exception,
- {bool propagateException: false}) {
- incomingQueue.removeStreamMessageQueue(stream.id);
-
- if (stream.state != StreamState.Terminated) {
- _changeState(stream, StreamState.Terminated);
- }
- stream.incomingQueue.terminate(propagateException ? exception : null);
- stream._outgoingCSubscription.cancel();
- stream._outgoingC.close();
-
- // NOTE: we're not adding an error here.
- stream.outgoingQueue.terminate();
-
- onCheckForClose();
- }
-
- void onClosing() {
- _newStreamsC.close();
- }
-
- void onCheckForClose() {
- if (isClosing && _openStreams.isEmpty) {
- closeWithValue();
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //// State transitioning & Counting of active streams
- ////////////////////////////////////////////////////////////////////////////
-
- /// The number of streams which we initiated and which are in one of the open
- /// states (i.e. [StreamState.Open], [StreamState.HalfClosedLocal] or
- /// [StreamState.HalfClosedRemote])
- int _numberOfActiveStreams = 0;
-
- bool _canCreateNewStream() {
- int limit = _peerSettings.maxConcurrentStreams;
- return limit == null || _numberOfActiveStreams < limit;
- }
-
- bool _ranOutOfStreamIds() {
- return nextStreamId > MAX_STREAM_ID;
- }
-
- void _changeState(Http2StreamImpl stream, StreamState to) {
- StreamState from = stream.state;
-
- // In checked mode we'll test that the state transition is allowed.
- assert((from == StreamState.Idle && to == StreamState.ReservedLocal) ||
- (from == StreamState.Idle && to == StreamState.ReservedRemote) ||
- (from == StreamState.Idle && to == StreamState.Open) ||
- (from == StreamState.Open && to == StreamState.HalfClosedLocal) ||
- (from == StreamState.Open && to == StreamState.HalfClosedRemote) ||
- (from == StreamState.Open && to == StreamState.Closed) ||
- (from == StreamState.HalfClosedLocal && to == StreamState.Closed) ||
- (from == StreamState.HalfClosedRemote && to == StreamState.Closed) ||
- (from == StreamState.ReservedLocal &&
- to == StreamState.HalfClosedRemote) ||
- (from == StreamState.ReservedLocal && to == StreamState.Closed) ||
- (from == StreamState.ReservedRemote && to == StreamState.Closed) ||
- (from == StreamState.ReservedRemote &&
- to == StreamState.HalfClosedLocal) ||
- (from != StreamState.Terminated && to == StreamState.Terminated));
-
- // If we initiated the stream and it became "open" or "closed" we need to
- // update the [_numberOfActiveStreams] counter.
- if (_didInitiateStream(stream)) {
- // NOTE: We wait until the stream is completely done.
- // (If we waited only until `StreamState.Closed` then we might still have
- // the endStream header/data message buffered, but not yet sent out).
- switch (stream.state) {
- case StreamState.ReservedLocal:
- case StreamState.ReservedRemote:
- case StreamState.Idle:
- if (to == StreamState.Open ||
- to == StreamState.HalfClosedLocal ||
- to == StreamState.HalfClosedRemote) {
- _numberOfActiveStreams++;
- }
- break;
- case StreamState.Open:
- case StreamState.HalfClosedLocal:
- case StreamState.HalfClosedRemote:
- case StreamState.Closed:
- if (to == StreamState.Terminated) {
- _numberOfActiveStreams--;
- }
- break;
- case StreamState.Terminated:
- // There is nothing to do here.
- break;
- }
- }
- stream.state = to;
- }
-
- bool _didInitiateStream(Http2StreamImpl stream) {
- int id = stream.id;
- return (isServer && id.isEven) || (!isServer && id.isOdd);
- }
-}
diff --git a/http2/lib/src/sync_errors.dart b/http2/lib/src/sync_errors.dart
deleted file mode 100644
index f8afa05..0000000
--- a/http2/lib/src/sync_errors.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.src.sync_errors;
-
-class ProtocolException implements Exception {
- final String _message;
-
- ProtocolException(this._message);
-
- String toString() => 'ProtocolError: $_message';
-}
-
-class FlowControlException implements Exception {
- final String _message;
-
- FlowControlException(this._message);
-
- String toString() => 'FlowControlException: $_message';
-}
-
-class FrameSizeException implements Exception {
- final String _message;
-
- FrameSizeException(this._message);
-
- String toString() => 'FrameSizeException: $_message';
-}
-
-class TerminatedException implements Exception {
- String toString() => 'TerminatedException: The object has been terminated.';
-}
-
-class StreamException implements Exception {
- final String _message;
- final int streamId;
-
- StreamException(this.streamId, this._message);
-
- String toString() => 'StreamException(stream id: $streamId): $_message';
-}
-
-class StreamClosedException extends StreamException {
- StreamClosedException(int streamId, [String message = ''])
- : super(streamId, message);
-
- String toString() => 'StreamClosedException(stream id: $streamId): $_message';
-}
diff --git a/http2/lib/src/testing/client.dart b/http2/lib/src/testing/client.dart
deleted file mode 100644
index a7d9dc4..0000000
--- a/http2/lib/src/testing/client.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.client;
-
-import 'dart:async';
-import 'dart:convert' show ascii;
-import 'dart:io';
-
-import '../../transport.dart';
-
-class Request {
- final String method;
- final Uri uri;
-
- Request(this.method, this.uri);
-}
-
-class Response {
- final Map<String, List<String>> headers;
- final Stream<List<int>> stream;
- final Stream<ServerPush> serverPushes;
-
- Response(this.headers, this.stream, this.serverPushes);
-}
-
-class ServerPush {
- final Map<String, List<String>> requestHeaders;
- final Future<Response> response;
-
- ServerPush(this.requestHeaders, this.response);
-}
-
-class ClientConnection {
- final ClientTransportConnection connection;
-
- /// Assumes the protocol on [socket] was negogiated to be http/2.
- ///
- /// If [settings] are omitted, the default [ClientSettings] will be used.
- ClientConnection(Socket socket, {ClientSettings settings})
- : connection =
- new ClientTransportConnection.viaSocket(socket, settings: settings);
-
- Future<Response> makeRequest(Request request) {
- var path = request.uri.path;
- if (path.isEmpty) path = '/';
-
- var headers = [
- new Header.ascii(':method', request.method),
- new Header.ascii(':path', path),
- new Header.ascii(':scheme', request.uri.scheme),
- new Header.ascii(':authority', '${request.uri.host}'),
- ];
-
- return _handleStream(connection.makeRequest(headers, endStream: true));
- }
-
- Future close() {
- return connection.finish();
- }
-
- Future<Response> _handleStream(ClientTransportStream stream) {
- var completer = new Completer<Response>();
- bool isFirst = true;
- var controller = new StreamController<List<int>>();
- var serverPushController = new StreamController<ServerPush>(sync: true);
- stream.incomingMessages.listen((StreamMessage msg) {
- if (isFirst) {
- isFirst = false;
- var headerMap = _convertHeaders((msg as HeadersStreamMessage).headers);
- completer.complete(new Response(
- headerMap, controller.stream, serverPushController.stream));
- } else {
- controller.add((msg as DataStreamMessage).bytes);
- }
- }, onDone: controller.close);
- _handlePeerPushes(stream.peerPushes).pipe(serverPushController);
- return completer.future;
- }
-
- Stream<ServerPush> _handlePeerPushes(
- Stream<TransportStreamPush> serverPushes) {
- var pushesController = new StreamController<ServerPush>();
- serverPushes.listen((TransportStreamPush push) {
- var responseCompleter = new Completer<Response>();
- var serverPush = new ServerPush(
- _convertHeaders(push.requestHeaders), responseCompleter.future);
-
- pushesController.add(serverPush);
-
- bool isFirst = true;
- var dataController = new StreamController<List<int>>();
- push.stream.incomingMessages.listen((StreamMessage msg) {
- if (isFirst) {
- isFirst = false;
- var headerMap =
- _convertHeaders((msg as HeadersStreamMessage).headers);
- var response = new Response(
- headerMap, dataController.stream, new Stream.fromIterable([]));
- responseCompleter.complete(response);
- } else {
- dataController.add((msg as DataStreamMessage).bytes);
- }
- }, onDone: dataController.close);
- }, onDone: pushesController.close);
- return pushesController.stream;
- }
-
- Map<String, List<String>> _convertHeaders(List<Header> headers) {
- var headerMap = <String, List<String>>{};
- for (var header in headers) {
- headerMap
- .putIfAbsent(ascii.decode(header.name), () => [])
- .add(ascii.decode(header.value));
- }
- return headerMap;
- }
-}
-
-/// Tries to connect to [uri] via a secure socket connection and establishes a
-/// http/2 connection.
-///
-/// If [allowServerPushes] is `true`, server pushes need to be handled by the
-/// client. The maximum number of concurrent server pushes can be configured via
-/// [maxConcurrentPushes] (default is `null` meaning no limit).
-Future<ClientConnection> connect(Uri uri,
- {bool allowServerPushes: false, int maxConcurrentPushes}) async {
- const List<String> Http2AlpnProtocols = const <String>[
- 'h2-14',
- 'h2-15',
- 'h2-16',
- 'h2-17',
- 'h2'
- ];
-
- bool useSSL = uri.scheme == 'https';
- var settings = new ClientSettings(
- concurrentStreamLimit: maxConcurrentPushes,
- allowServerPushes: allowServerPushes);
- if (useSSL) {
- SecureSocket socket = await SecureSocket.connect(uri.host, uri.port,
- supportedProtocols: Http2AlpnProtocols);
- if (!Http2AlpnProtocols.contains(socket.selectedProtocol)) {
- throw new Exception('Server does not support HTTP/2.');
- }
- return new ClientConnection(socket, settings: settings);
- } else {
- Socket socket = await Socket.connect(uri.host, uri.port);
- return new ClientConnection(socket, settings: settings);
- }
-}
diff --git a/http2/lib/src/testing/debug.dart b/http2/lib/src/testing/debug.dart
deleted file mode 100644
index b4e0b2c..0000000
--- a/http2/lib/src/testing/debug.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http2.debug;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import '../../transport.dart';
-import '../connection_preface.dart';
-import '../frames/frames.dart';
-import '../settings/settings.dart';
-
-final jsonEncoder = new JsonEncoder.withIndent(' ');
-
-TransportConnection debugPrintingConnection(Socket socket,
- {bool isServer: true, bool verbose: true}) {
- TransportConnection connection;
-
- var incoming = decodeVerbose(socket, isServer, verbose: verbose);
- var outgoing = decodeOutgoingVerbose(socket, isServer, verbose: verbose);
- if (isServer) {
- connection = new ServerTransportConnection.viaStreams(incoming, outgoing);
- } else {
- connection = new ClientTransportConnection.viaStreams(incoming, outgoing);
- }
- return connection;
-}
-
-Stream<List<int>> decodeVerbose(Stream<List<int>> inc, bool isServer,
- {bool verbose: true}) {
- String name = isServer ? 'server' : 'client';
-
- var sc = new StreamController<List<int>>();
- var sDebug = new StreamController<List<int>>();
-
- _pipeAndCopy(inc, sc, sDebug);
-
- if (!isServer) {
- _decodeFrames(sDebug.stream).listen((frame) {
- print('[$name/stream:${frame.header.streamId}] '
- 'Incoming ${frame.runtimeType}:');
- if (verbose) {
- print(jsonEncoder.convert(frame.toJson()));
- print('');
- }
- }, onError: (e, s) {
- print('[$name] Stream error: $e.');
- }, onDone: () {
- print('[$name] Closed.');
- });
- } else {
- var s3 = readConnectionPreface(sDebug.stream);
- _decodeFrames(s3).listen((frame) {
- print('[$name/stream:${frame.header.streamId}] '
- 'Incoming ${frame.runtimeType}:');
- if (verbose) {
- print(jsonEncoder.convert(frame.toJson()));
- print('');
- }
- }, onError: (e, s) {
- print('[$name] Stream error: $e.');
- }, onDone: () {
- print('[$name] Closed.');
- });
- }
-
- return sc.stream;
-}
-
-StreamSink<List<int>> decodeOutgoingVerbose(
- StreamSink<List<int>> sink, bool isServer,
- {bool verbose: true}) {
- String name = isServer ? 'server' : 'client';
-
- var proxySink = new StreamController<List<int>>();
- var copy = new StreamController<List<int>>();
-
- if (!isServer) {
- _decodeFrames(readConnectionPreface(copy.stream)).listen((Frame frame) {
- print('[$name/stream:${frame.header.streamId}] '
- 'Outgoing ${frame.runtimeType}:');
- if (verbose) {
- print(jsonEncoder.convert(frame.toJson()));
- print('');
- }
- }, onError: (e, s) {
- print('[$name] Outgoing stream error: $e');
- }, onDone: () {
- print('[$name] Closing.');
- });
- } else {
- _decodeFrames(copy.stream).listen((Frame frame) {
- print('[$name/stream:${frame.header.streamId}] '
- 'Outgoing ${frame.runtimeType}:');
- if (verbose) {
- print(jsonEncoder.convert(frame.toJson()));
- print('');
- }
- }, onError: (e, s) {
- print('[$name] Outgoing stream error: $e');
- }, onDone: () {
- print('[$name] Closing.');
- proxySink.close();
- });
- }
-
- _pipeAndCopy(proxySink.stream, sink, copy);
-
- return proxySink;
-}
-
-Stream<Frame> _decodeFrames(Stream<List<int>> bytes) {
- var settings = new ActiveSettings();
- var decoder = new FrameReader(bytes, settings);
- return decoder.startDecoding();
-}
-
-Future _pipeAndCopy(Stream<List<int>> from, StreamSink to, StreamSink to2) {
- var c = new Completer();
- from.listen((List<int> data) {
- to.add(data);
- to2.add(data);
- }, onError: (e, StackTrace s) {
- to.addError(e, s);
- to2.addError(e, s);
- }, onDone: () {
- Future.wait([to.close(), to2.close()])
- .then(c.complete)
- .catchError(c.completeError);
- });
- return c.future;
-}
-
-void print(String s) {
- stderr.writeln(s);
-}
diff --git a/http2/lib/transport.dart b/http2/lib/transport.dart
deleted file mode 100644
index c0ec7bd..0000000
--- a/http2/lib/transport.dart
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'src/connection.dart';
-import 'src/hpack/hpack.dart' show Header;
-
-export 'src/hpack/hpack.dart' show Header;
-
-typedef void ActiveStateHandler(bool isActive);
-
-/// Settings for a [TransportConnection].
-abstract class Settings {
- /// The maximum number of concurrent streams the remote end can open
- /// (defaults to being unlimited).
- final int concurrentStreamLimit;
-
- /// The default stream window size the remote peer can use when creating new
- /// streams (defaults to 65535 bytes).
- final int streamWindowSize;
-
- const Settings({this.concurrentStreamLimit, this.streamWindowSize});
-}
-
-/// Settings for a [TransportConnection] a server can make.
-class ServerSettings extends Settings {
- const ServerSettings({int concurrentStreamLimit, int streamWindowSize})
- : super(
- concurrentStreamLimit: concurrentStreamLimit,
- streamWindowSize: streamWindowSize);
-}
-
-/// Settings for a [TransportConnection] a client can make.
-class ClientSettings extends Settings {
- /// Whether the client allows pushes from the server (defaults to false).
- final bool allowServerPushes;
-
- const ClientSettings(
- {int concurrentStreamLimit,
- int streamWindowSize,
- this.allowServerPushes: false})
- : super(
- concurrentStreamLimit: concurrentStreamLimit,
- streamWindowSize: streamWindowSize);
-}
-
-/// Represents a HTTP/2 connection.
-abstract class TransportConnection {
- /// Pings the other end.
- Future ping();
-
- /// Sets the active state callback.
- ///
- /// This callback is invoked with `true` when the number of active streams
- /// goes from 0 to 1 (the connection goes from idle to active), and with
- /// `false` when the number of active streams becomes 0 (the connection goes
- /// from active to idle).
- set onActiveStateChanged(ActiveStateHandler callback);
-
- /// Finish this connection.
- ///
- /// No new streams will be accepted or can be created.
- Future finish();
-
- /// Terminates this connection forcefully.
- Future terminate();
-}
-
-abstract class ClientTransportConnection extends TransportConnection {
- factory ClientTransportConnection.viaSocket(Socket socket,
- {ClientSettings settings}) =>
- new ClientTransportConnection.viaStreams(socket, socket,
- settings: settings);
-
- factory ClientTransportConnection.viaStreams(
- Stream<List<int>> incoming, StreamSink<List<int>> outgoing,
- {ClientSettings settings}) {
- if (settings == null) settings = const ClientSettings();
- return new ClientConnection(incoming, outgoing, settings);
- }
-
- /// Whether this connection is open and can be used to make new requests
- /// via [makeRequest].
- bool get isOpen;
-
- /// Creates a new outgoing stream.
- ClientTransportStream makeRequest(List<Header> headers,
- {bool endStream: false});
-}
-
-abstract class ServerTransportConnection extends TransportConnection {
- factory ServerTransportConnection.viaSocket(Socket socket,
- {ServerSettings settings}) {
- return new ServerTransportConnection.viaStreams(socket, socket,
- settings: settings);
- }
-
- factory ServerTransportConnection.viaStreams(
- Stream<List<int>> incoming, StreamSink<List<int>> outgoing,
- {ServerSettings settings:
- const ServerSettings(concurrentStreamLimit: 1000)}) {
- if (settings == null) settings = const ServerSettings();
- return new ServerConnection(incoming, outgoing, settings);
- }
-
- /// Incoming HTTP/2 streams.
- Stream<ServerTransportStream> get incomingStreams;
-}
-
-/// Represents a HTTP/2 stream.
-abstract class TransportStream {
- /// The id of this stream.
- ///
- /// * odd numbered streams are client streams
- /// * even numbered streams are opened from the server
- int get id;
-
- /// A stream of data and/or headers from the remote end.
- Stream<StreamMessage> get incomingMessages;
-
- /// A sink for writing data and/or headers to the remote end.
- StreamSink<StreamMessage> get outgoingMessages;
-
- /// Sets the termination handler on this stream.
- ///
- /// The handler will be called if the stream receives an RST_STREAM frame.
- set onTerminated(void value(int v));
-
- /// Terminates this HTTP/2 stream in an un-normal way.
- ///
- /// For normal termination, one can cancel the [StreamSubscription] from
- /// `incoming.listen()` and close the `outgoing` [StreamSink].
- ///
- /// Terminating this HTTP/2 stream will free up all resources associated with
- /// it locally and will notify the remote end that this stream is no longer
- /// used.
- void terminate();
-
- // For convenience only.
- void sendHeaders(List<Header> headers, {bool endStream: false}) {
- outgoingMessages
- .add(new HeadersStreamMessage(headers, endStream: endStream));
- if (endStream) outgoingMessages.close();
- }
-
- void sendData(List<int> bytes, {bool endStream: false}) {
- outgoingMessages.add(new DataStreamMessage(bytes, endStream: endStream));
- if (endStream) outgoingMessages.close();
- }
-}
-
-abstract class ClientTransportStream extends TransportStream {
- /// Streams which the remote end pushed to this endpoint.
- ///
- /// If peer pushes were enabled, the client is responsible to either
- /// handle or reject any peer push.
- Stream<TransportStreamPush> get peerPushes;
-}
-
-abstract class ServerTransportStream extends TransportStream {
- /// Whether a method to [push] will succeed. Requirements for this getter to
- /// return `true` are:
- /// * this stream must be in the Open or HalfClosedRemote state
- /// * the client needs to have the "enable push" settings enabled
- /// * the number of active streams has not reached the maximum
- bool get canPush;
-
- /// Pushes a new stream to the remote peer.
- ServerTransportStream push(List<Header> requestHeaders);
-}
-
-/// Represents a message which can be sent over a HTTP/2 stream.
-abstract class StreamMessage {
- final bool endStream;
-
- StreamMessage({bool endStream}) : this.endStream = endStream ?? false;
-}
-
-/// Represents a data message which can be sent over a HTTP/2 stream.
-class DataStreamMessage extends StreamMessage {
- final List<int> bytes;
-
- DataStreamMessage(this.bytes, {bool endStream}) : super(endStream: endStream);
-
- String toString() => 'DataStreamMessage(${bytes.length} bytes)';
-}
-
-/// Represents a headers message which can be sent over a HTTP/2 stream.
-class HeadersStreamMessage extends StreamMessage {
- final List<Header> headers;
-
- HeadersStreamMessage(this.headers, {bool endStream})
- : super(endStream: endStream);
-
- String toString() => 'HeadersStreamMessage(${headers.length} headers)';
-}
-
-/// Represents a remote stream push.
-class TransportStreamPush {
- /// The request headers which [stream] is the response to.
- final List<Header> requestHeaders;
-
- /// The remote stream push.
- final ClientTransportStream stream;
-
- TransportStreamPush(this.requestHeaders, this.stream);
-
- String toString() =>
- 'TransportStreamPush(${requestHeaders.length} request headers headers)';
-}
-
-/// An exception thrown by the HTTP/2 implementation.
-class TransportException implements Exception {
- final String message;
-
- TransportException(this.message);
-
- String toString() => 'HTTP/2 error: $message';
-}
-
-/// An exception thrown when a HTTP/2 connection error occurred.
-class TransportConnectionException extends TransportException {
- final int errorCode;
-
- TransportConnectionException(int errorCode, String details)
- : errorCode = errorCode,
- super('Connection error: $details (errorCode: $errorCode)');
-}
-
-/// An exception thrown when a HTTP/2 stream error occured.
-class StreamTransportException extends TransportException {
- StreamTransportException(String details) : super('Stream error: $details');
-}
diff --git a/http2/manual_test/out_of_stream_ids_test.dart b/http2/manual_test/out_of_stream_ids_test.dart
deleted file mode 100644
index 4e22f4b..0000000
--- a/http2/manual_test/out_of_stream_ids_test.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE FILE.
-
-/// ---------------------------------------------------------------------------
-/// In order to run this test one needs to change the following line in
-/// ../lib/src/streams/stream_handler.dart
-///
-/// - static const int MAX_STREAM_ID = (1 << 31) - 1;
-/// + static const int MAX_STREAM_ID = (1 << 5) - 1;
-///
-/// without this patch this test will run for a _long_ time.
-/// ---------------------------------------------------------------------------
-
-import 'dart:async';
-
-import 'package:test/test.dart';
-import 'package:http2/transport.dart';
-import 'package:http2/src/streams/stream_handler.dart';
-
-import '../test/transport_test.dart';
-
-main() {
- group('transport-test', () {
- transportTest('client-runs-out-of-stream-ids',
- (ClientTransportConnection client,
- ServerTransportConnection server) async {
- Future serverFun() async {
- await for (ServerTransportStream stream in server.incomingStreams) {
- stream.sendHeaders([new Header.ascii('x', 'y')], endStream: true);
- expect(await stream.incomingMessages.toList(), hasLength(1));
- }
- await server.finish();
- }
-
- Future clientFun() async {
- var headers = [new Header.ascii('a', 'b')];
-
- const kMaxStreamId = StreamHandler.MAX_STREAM_ID;
- for (int i = 1; i <= kMaxStreamId; i += 2) {
- var stream = client.makeRequest(headers, endStream: true);
- var messages = await stream.incomingMessages.toList();
- expect(messages, hasLength(1));
- }
-
- expect(client.isOpen, false);
- expect(() => client.makeRequest(headers),
- throwsA(const TypeMatcher<StateError>()));
-
- await new Future.delayed(const Duration(seconds: 1));
- await client.finish();
- }
-
- var serverFuture = serverFun();
- var clientFuture = clientFun();
-
- await serverFuture;
- await clientFuture;
- });
- });
-}
diff --git a/http2/pubspec.yaml b/http2/pubspec.yaml
deleted file mode 100644
index e3e2651..0000000
--- a/http2/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: http2
-version: 1.0.0
-description: A HTTP/2 implementation in Dart.
-author: Dart Team <misc@dartlang.org>
-homepage: https://github.com/dart-lang/http2
-
-environment:
- sdk: '>=2.0.0-dev.56.0 <3.0.0'
-
-dev_dependencies:
- mockito: ^4.0.0
- test: ^1.2.0