tensorbored 2.21.0rc1769983804__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. tensorbored/__init__.py +112 -0
  2. tensorbored/_vendor/__init__.py +0 -0
  3. tensorbored/_vendor/bleach/__init__.py +125 -0
  4. tensorbored/_vendor/bleach/_vendor/__init__.py +0 -0
  5. tensorbored/_vendor/bleach/_vendor/html5lib/__init__.py +35 -0
  6. tensorbored/_vendor/bleach/_vendor/html5lib/_ihatexml.py +289 -0
  7. tensorbored/_vendor/bleach/_vendor/html5lib/_inputstream.py +918 -0
  8. tensorbored/_vendor/bleach/_vendor/html5lib/_tokenizer.py +1735 -0
  9. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/__init__.py +5 -0
  10. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/_base.py +40 -0
  11. tensorbored/_vendor/bleach/_vendor/html5lib/_trie/py.py +67 -0
  12. tensorbored/_vendor/bleach/_vendor/html5lib/_utils.py +159 -0
  13. tensorbored/_vendor/bleach/_vendor/html5lib/constants.py +2946 -0
  14. tensorbored/_vendor/bleach/_vendor/html5lib/filters/__init__.py +0 -0
  15. tensorbored/_vendor/bleach/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
  16. tensorbored/_vendor/bleach/_vendor/html5lib/filters/base.py +12 -0
  17. tensorbored/_vendor/bleach/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
  18. tensorbored/_vendor/bleach/_vendor/html5lib/filters/lint.py +93 -0
  19. tensorbored/_vendor/bleach/_vendor/html5lib/filters/optionaltags.py +207 -0
  20. tensorbored/_vendor/bleach/_vendor/html5lib/filters/sanitizer.py +916 -0
  21. tensorbored/_vendor/bleach/_vendor/html5lib/filters/whitespace.py +38 -0
  22. tensorbored/_vendor/bleach/_vendor/html5lib/html5parser.py +2795 -0
  23. tensorbored/_vendor/bleach/_vendor/html5lib/serializer.py +409 -0
  24. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/__init__.py +30 -0
  25. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/genshi.py +54 -0
  26. tensorbored/_vendor/bleach/_vendor/html5lib/treeadapters/sax.py +50 -0
  27. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/__init__.py +88 -0
  28. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/base.py +417 -0
  29. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/dom.py +239 -0
  30. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree.py +343 -0
  31. tensorbored/_vendor/bleach/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
  32. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/__init__.py +154 -0
  33. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/base.py +252 -0
  34. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/dom.py +43 -0
  35. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree.py +131 -0
  36. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
  37. tensorbored/_vendor/bleach/_vendor/html5lib/treewalkers/genshi.py +69 -0
  38. tensorbored/_vendor/bleach/_vendor/parse.py +1078 -0
  39. tensorbored/_vendor/bleach/callbacks.py +32 -0
  40. tensorbored/_vendor/bleach/html5lib_shim.py +757 -0
  41. tensorbored/_vendor/bleach/linkifier.py +633 -0
  42. tensorbored/_vendor/bleach/parse_shim.py +1 -0
  43. tensorbored/_vendor/bleach/sanitizer.py +638 -0
  44. tensorbored/_vendor/bleach/six_shim.py +19 -0
  45. tensorbored/_vendor/webencodings/__init__.py +342 -0
  46. tensorbored/_vendor/webencodings/labels.py +231 -0
  47. tensorbored/_vendor/webencodings/mklabels.py +59 -0
  48. tensorbored/_vendor/webencodings/x_user_defined.py +325 -0
  49. tensorbored/assets.py +36 -0
  50. tensorbored/auth.py +102 -0
  51. tensorbored/backend/__init__.py +0 -0
  52. tensorbored/backend/application.py +604 -0
  53. tensorbored/backend/auth_context_middleware.py +38 -0
  54. tensorbored/backend/client_feature_flags.py +113 -0
  55. tensorbored/backend/empty_path_redirect.py +46 -0
  56. tensorbored/backend/event_processing/__init__.py +0 -0
  57. tensorbored/backend/event_processing/data_ingester.py +276 -0
  58. tensorbored/backend/event_processing/data_provider.py +535 -0
  59. tensorbored/backend/event_processing/directory_loader.py +142 -0
  60. tensorbored/backend/event_processing/directory_watcher.py +272 -0
  61. tensorbored/backend/event_processing/event_accumulator.py +950 -0
  62. tensorbored/backend/event_processing/event_file_inspector.py +463 -0
  63. tensorbored/backend/event_processing/event_file_loader.py +292 -0
  64. tensorbored/backend/event_processing/event_multiplexer.py +521 -0
  65. tensorbored/backend/event_processing/event_util.py +68 -0
  66. tensorbored/backend/event_processing/io_wrapper.py +223 -0
  67. tensorbored/backend/event_processing/plugin_asset_util.py +104 -0
  68. tensorbored/backend/event_processing/plugin_event_accumulator.py +721 -0
  69. tensorbored/backend/event_processing/plugin_event_multiplexer.py +522 -0
  70. tensorbored/backend/event_processing/reservoir.py +266 -0
  71. tensorbored/backend/event_processing/tag_types.py +29 -0
  72. tensorbored/backend/experiment_id.py +71 -0
  73. tensorbored/backend/experimental_plugin.py +51 -0
  74. tensorbored/backend/http_util.py +263 -0
  75. tensorbored/backend/json_util.py +70 -0
  76. tensorbored/backend/path_prefix.py +67 -0
  77. tensorbored/backend/process_graph.py +74 -0
  78. tensorbored/backend/security_validator.py +202 -0
  79. tensorbored/compat/__init__.py +69 -0
  80. tensorbored/compat/proto/__init__.py +0 -0
  81. tensorbored/compat/proto/allocation_description_pb2.py +35 -0
  82. tensorbored/compat/proto/api_def_pb2.py +82 -0
  83. tensorbored/compat/proto/attr_value_pb2.py +80 -0
  84. tensorbored/compat/proto/cluster_pb2.py +58 -0
  85. tensorbored/compat/proto/config_pb2.py +271 -0
  86. tensorbored/compat/proto/coordination_config_pb2.py +45 -0
  87. tensorbored/compat/proto/cost_graph_pb2.py +87 -0
  88. tensorbored/compat/proto/cpp_shape_inference_pb2.py +70 -0
  89. tensorbored/compat/proto/debug_pb2.py +65 -0
  90. tensorbored/compat/proto/event_pb2.py +149 -0
  91. tensorbored/compat/proto/full_type_pb2.py +74 -0
  92. tensorbored/compat/proto/function_pb2.py +157 -0
  93. tensorbored/compat/proto/graph_debug_info_pb2.py +111 -0
  94. tensorbored/compat/proto/graph_pb2.py +41 -0
  95. tensorbored/compat/proto/histogram_pb2.py +39 -0
  96. tensorbored/compat/proto/meta_graph_pb2.py +254 -0
  97. tensorbored/compat/proto/node_def_pb2.py +61 -0
  98. tensorbored/compat/proto/op_def_pb2.py +81 -0
  99. tensorbored/compat/proto/resource_handle_pb2.py +48 -0
  100. tensorbored/compat/proto/rewriter_config_pb2.py +93 -0
  101. tensorbored/compat/proto/rpc_options_pb2.py +35 -0
  102. tensorbored/compat/proto/saved_object_graph_pb2.py +193 -0
  103. tensorbored/compat/proto/saver_pb2.py +38 -0
  104. tensorbored/compat/proto/step_stats_pb2.py +116 -0
  105. tensorbored/compat/proto/struct_pb2.py +144 -0
  106. tensorbored/compat/proto/summary_pb2.py +111 -0
  107. tensorbored/compat/proto/tensor_description_pb2.py +38 -0
  108. tensorbored/compat/proto/tensor_pb2.py +68 -0
  109. tensorbored/compat/proto/tensor_shape_pb2.py +46 -0
  110. tensorbored/compat/proto/tfprof_log_pb2.py +307 -0
  111. tensorbored/compat/proto/trackable_object_graph_pb2.py +90 -0
  112. tensorbored/compat/proto/types_pb2.py +105 -0
  113. tensorbored/compat/proto/variable_pb2.py +62 -0
  114. tensorbored/compat/proto/verifier_config_pb2.py +38 -0
  115. tensorbored/compat/proto/versions_pb2.py +35 -0
  116. tensorbored/compat/tensorflow_stub/__init__.py +38 -0
  117. tensorbored/compat/tensorflow_stub/app.py +124 -0
  118. tensorbored/compat/tensorflow_stub/compat/__init__.py +131 -0
  119. tensorbored/compat/tensorflow_stub/compat/v1/__init__.py +20 -0
  120. tensorbored/compat/tensorflow_stub/dtypes.py +692 -0
  121. tensorbored/compat/tensorflow_stub/error_codes.py +169 -0
  122. tensorbored/compat/tensorflow_stub/errors.py +507 -0
  123. tensorbored/compat/tensorflow_stub/flags.py +124 -0
  124. tensorbored/compat/tensorflow_stub/io/__init__.py +17 -0
  125. tensorbored/compat/tensorflow_stub/io/gfile.py +1011 -0
  126. tensorbored/compat/tensorflow_stub/pywrap_tensorflow.py +285 -0
  127. tensorbored/compat/tensorflow_stub/tensor_shape.py +1035 -0
  128. tensorbored/context.py +129 -0
  129. tensorbored/data/__init__.py +0 -0
  130. tensorbored/data/grpc_provider.py +365 -0
  131. tensorbored/data/ingester.py +46 -0
  132. tensorbored/data/proto/__init__.py +0 -0
  133. tensorbored/data/proto/data_provider_pb2.py +517 -0
  134. tensorbored/data/proto/data_provider_pb2_grpc.py +374 -0
  135. tensorbored/data/provider.py +1365 -0
  136. tensorbored/data/server_ingester.py +301 -0
  137. tensorbored/data_compat.py +159 -0
  138. tensorbored/dataclass_compat.py +224 -0
  139. tensorbored/default.py +124 -0
  140. tensorbored/errors.py +130 -0
  141. tensorbored/lazy.py +99 -0
  142. tensorbored/main.py +48 -0
  143. tensorbored/main_lib.py +62 -0
  144. tensorbored/manager.py +487 -0
  145. tensorbored/notebook.py +441 -0
  146. tensorbored/plugin_util.py +266 -0
  147. tensorbored/plugins/__init__.py +0 -0
  148. tensorbored/plugins/audio/__init__.py +0 -0
  149. tensorbored/plugins/audio/audio_plugin.py +229 -0
  150. tensorbored/plugins/audio/metadata.py +69 -0
  151. tensorbored/plugins/audio/plugin_data_pb2.py +37 -0
  152. tensorbored/plugins/audio/summary.py +230 -0
  153. tensorbored/plugins/audio/summary_v2.py +124 -0
  154. tensorbored/plugins/base_plugin.py +367 -0
  155. tensorbored/plugins/core/__init__.py +0 -0
  156. tensorbored/plugins/core/core_plugin.py +981 -0
  157. tensorbored/plugins/custom_scalar/__init__.py +0 -0
  158. tensorbored/plugins/custom_scalar/custom_scalars_plugin.py +320 -0
  159. tensorbored/plugins/custom_scalar/layout_pb2.py +85 -0
  160. tensorbored/plugins/custom_scalar/metadata.py +35 -0
  161. tensorbored/plugins/custom_scalar/summary.py +79 -0
  162. tensorbored/plugins/debugger_v2/__init__.py +0 -0
  163. tensorbored/plugins/debugger_v2/debug_data_multiplexer.py +631 -0
  164. tensorbored/plugins/debugger_v2/debug_data_provider.py +634 -0
  165. tensorbored/plugins/debugger_v2/debugger_v2_plugin.py +504 -0
  166. tensorbored/plugins/distribution/__init__.py +0 -0
  167. tensorbored/plugins/distribution/compressor.py +158 -0
  168. tensorbored/plugins/distribution/distributions_plugin.py +116 -0
  169. tensorbored/plugins/distribution/metadata.py +19 -0
  170. tensorbored/plugins/graph/__init__.py +0 -0
  171. tensorbored/plugins/graph/graph_util.py +129 -0
  172. tensorbored/plugins/graph/graphs_plugin.py +336 -0
  173. tensorbored/plugins/graph/keras_util.py +328 -0
  174. tensorbored/plugins/graph/metadata.py +42 -0
  175. tensorbored/plugins/histogram/__init__.py +0 -0
  176. tensorbored/plugins/histogram/histograms_plugin.py +144 -0
  177. tensorbored/plugins/histogram/metadata.py +63 -0
  178. tensorbored/plugins/histogram/plugin_data_pb2.py +34 -0
  179. tensorbored/plugins/histogram/summary.py +234 -0
  180. tensorbored/plugins/histogram/summary_v2.py +292 -0
  181. tensorbored/plugins/hparams/__init__.py +14 -0
  182. tensorbored/plugins/hparams/_keras.py +93 -0
  183. tensorbored/plugins/hparams/api.py +130 -0
  184. tensorbored/plugins/hparams/api_pb2.py +208 -0
  185. tensorbored/plugins/hparams/backend_context.py +606 -0
  186. tensorbored/plugins/hparams/download_data.py +158 -0
  187. tensorbored/plugins/hparams/error.py +26 -0
  188. tensorbored/plugins/hparams/get_experiment.py +71 -0
  189. tensorbored/plugins/hparams/hparams_plugin.py +206 -0
  190. tensorbored/plugins/hparams/hparams_util_pb2.py +69 -0
  191. tensorbored/plugins/hparams/json_format_compat.py +38 -0
  192. tensorbored/plugins/hparams/list_metric_evals.py +57 -0
  193. tensorbored/plugins/hparams/list_session_groups.py +1040 -0
  194. tensorbored/plugins/hparams/metadata.py +125 -0
  195. tensorbored/plugins/hparams/metrics.py +41 -0
  196. tensorbored/plugins/hparams/plugin_data_pb2.py +69 -0
  197. tensorbored/plugins/hparams/summary.py +205 -0
  198. tensorbored/plugins/hparams/summary_v2.py +597 -0
  199. tensorbored/plugins/image/__init__.py +0 -0
  200. tensorbored/plugins/image/images_plugin.py +232 -0
  201. tensorbored/plugins/image/metadata.py +65 -0
  202. tensorbored/plugins/image/plugin_data_pb2.py +34 -0
  203. tensorbored/plugins/image/summary.py +159 -0
  204. tensorbored/plugins/image/summary_v2.py +130 -0
  205. tensorbored/plugins/mesh/__init__.py +14 -0
  206. tensorbored/plugins/mesh/mesh_plugin.py +292 -0
  207. tensorbored/plugins/mesh/metadata.py +152 -0
  208. tensorbored/plugins/mesh/plugin_data_pb2.py +37 -0
  209. tensorbored/plugins/mesh/summary.py +251 -0
  210. tensorbored/plugins/mesh/summary_v2.py +214 -0
  211. tensorbored/plugins/metrics/__init__.py +0 -0
  212. tensorbored/plugins/metrics/metadata.py +17 -0
  213. tensorbored/plugins/metrics/metrics_plugin.py +623 -0
  214. tensorbored/plugins/pr_curve/__init__.py +0 -0
  215. tensorbored/plugins/pr_curve/metadata.py +75 -0
  216. tensorbored/plugins/pr_curve/plugin_data_pb2.py +34 -0
  217. tensorbored/plugins/pr_curve/pr_curves_plugin.py +241 -0
  218. tensorbored/plugins/pr_curve/summary.py +574 -0
  219. tensorbored/plugins/profile_redirect/__init__.py +0 -0
  220. tensorbored/plugins/profile_redirect/profile_redirect_plugin.py +49 -0
  221. tensorbored/plugins/projector/__init__.py +67 -0
  222. tensorbored/plugins/projector/metadata.py +26 -0
  223. tensorbored/plugins/projector/projector_config_pb2.py +54 -0
  224. tensorbored/plugins/projector/projector_plugin.py +795 -0
  225. tensorbored/plugins/projector/tf_projector_plugin/index.js +32 -0
  226. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.html +524 -0
  227. tensorbored/plugins/projector/tf_projector_plugin/projector_binary.js +15536 -0
  228. tensorbored/plugins/scalar/__init__.py +0 -0
  229. tensorbored/plugins/scalar/metadata.py +60 -0
  230. tensorbored/plugins/scalar/plugin_data_pb2.py +34 -0
  231. tensorbored/plugins/scalar/scalars_plugin.py +181 -0
  232. tensorbored/plugins/scalar/summary.py +109 -0
  233. tensorbored/plugins/scalar/summary_v2.py +124 -0
  234. tensorbored/plugins/text/__init__.py +0 -0
  235. tensorbored/plugins/text/metadata.py +62 -0
  236. tensorbored/plugins/text/plugin_data_pb2.py +34 -0
  237. tensorbored/plugins/text/summary.py +114 -0
  238. tensorbored/plugins/text/summary_v2.py +124 -0
  239. tensorbored/plugins/text/text_plugin.py +288 -0
  240. tensorbored/plugins/wit_redirect/__init__.py +0 -0
  241. tensorbored/plugins/wit_redirect/wit_redirect_plugin.py +49 -0
  242. tensorbored/program.py +910 -0
  243. tensorbored/summary/__init__.py +35 -0
  244. tensorbored/summary/_output.py +124 -0
  245. tensorbored/summary/_tf/__init__.py +14 -0
  246. tensorbored/summary/_tf/summary/__init__.py +178 -0
  247. tensorbored/summary/_writer.py +105 -0
  248. tensorbored/summary/v1.py +51 -0
  249. tensorbored/summary/v2.py +25 -0
  250. tensorbored/summary/writer/__init__.py +13 -0
  251. tensorbored/summary/writer/event_file_writer.py +291 -0
  252. tensorbored/summary/writer/record_writer.py +50 -0
  253. tensorbored/util/__init__.py +0 -0
  254. tensorbored/util/encoder.py +116 -0
  255. tensorbored/util/grpc_util.py +311 -0
  256. tensorbored/util/img_mime_type_detector.py +40 -0
  257. tensorbored/util/io_util.py +20 -0
  258. tensorbored/util/lazy_tensor_creator.py +110 -0
  259. tensorbored/util/op_evaluator.py +104 -0
  260. tensorbored/util/platform_util.py +20 -0
  261. tensorbored/util/tb_logging.py +24 -0
  262. tensorbored/util/tensor_util.py +617 -0
  263. tensorbored/util/timing.py +122 -0
  264. tensorbored/version.py +21 -0
  265. tensorbored/webfiles.zip +0 -0
  266. tensorbored-2.21.0rc1769983804.dist-info/METADATA +49 -0
  267. tensorbored-2.21.0rc1769983804.dist-info/RECORD +271 -0
  268. tensorbored-2.21.0rc1769983804.dist-info/WHEEL +5 -0
  269. tensorbored-2.21.0rc1769983804.dist-info/entry_points.txt +6 -0
  270. tensorbored-2.21.0rc1769983804.dist-info/licenses/LICENSE +739 -0
  271. tensorbored-2.21.0rc1769983804.dist-info/top_level.txt +1 -0
@@ -0,0 +1,70 @@
1
+ # Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+
16
+ """A module providing a function for serializing JSON values with Infinity.
17
+
18
+ Python provides no way to override how json.dumps serializes
19
+ Infinity/-Infinity/NaN; if allow_nan is true, it encodes them as
20
+ Infinity/-Infinity/NaN, in violation of the JSON spec and in violation
21
+ of what JSON.parse accepts. If it's false, it throws a ValueError,
22
+ Neither subclassing JSONEncoder nor passing a function in the |default|
23
+ keyword argument overrides this.
24
+ """
25
+
26
+ import collections
27
+ import math
28
+
29
+ _INFINITY = float("inf")
30
+ _NEGATIVE_INFINITY = float("-inf")
31
+
32
+
33
+ def Cleanse(obj, encoding="utf-8"):
34
+ """Makes Python object appropriate for JSON serialization.
35
+
36
+ - Replaces instances of Infinity/-Infinity/NaN with strings.
37
+ - Turns byte strings into unicode strings.
38
+ - Turns sets into sorted lists.
39
+ - Turns tuples into lists.
40
+
41
+ Args:
42
+ obj: Python data structure.
43
+ encoding: Charset used to decode byte strings.
44
+
45
+ Returns:
46
+ Unicode JSON data structure.
47
+ """
48
+ if isinstance(obj, int):
49
+ return obj
50
+ elif isinstance(obj, float):
51
+ if obj == _INFINITY:
52
+ return "Infinity"
53
+ elif obj == _NEGATIVE_INFINITY:
54
+ return "-Infinity"
55
+ elif math.isnan(obj):
56
+ return "NaN"
57
+ else:
58
+ return obj
59
+ elif isinstance(obj, bytes):
60
+ return obj.decode(encoding)
61
+ elif isinstance(obj, (list, tuple)):
62
+ return [Cleanse(i, encoding) for i in obj]
63
+ elif isinstance(obj, set):
64
+ return [Cleanse(i, encoding) for i in sorted(obj)]
65
+ elif isinstance(obj, dict):
66
+ return collections.OrderedDict(
67
+ (Cleanse(k, encoding), Cleanse(v, encoding)) for k, v in obj.items()
68
+ )
69
+ else:
70
+ return obj
@@ -0,0 +1,67 @@
1
+ # Copyright 2019 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Internal path prefix support for TensorBoard.
16
+
17
+ Using a path prefix of `/foo/bar` enables TensorBoard to serve from
18
+ `http://localhost:6006/foo/bar/` rather than `http://localhost:6006/`.
19
+ See the `--path_prefix` flag docs for more details.
20
+ """
21
+
22
+ from tensorbored import errors
23
+
24
+
25
+ class PathPrefixMiddleware:
26
+ """WSGI middleware for path prefixes.
27
+
28
+ All requests to this middleware must begin with the specified path
29
+ prefix (otherwise, a 404 will be returned immediately). Requests
30
+ will be forwarded to the underlying application with the path prefix
31
+ stripped and appended to `SCRIPT_NAME` (see the WSGI spec, PEP 3333,
32
+ for details).
33
+ """
34
+
35
+ def __init__(self, application, path_prefix):
36
+ """Initializes this middleware.
37
+
38
+ Args:
39
+ application: The WSGI application to wrap (see PEP 3333).
40
+ path_prefix: A string path prefix to be stripped from incoming
41
+ requests. If empty, this middleware is a no-op. If non-empty,
42
+ the path prefix must start with a slash and not end with one
43
+ (e.g., "/tensorboard").
44
+ """
45
+ if path_prefix.endswith("/"):
46
+ raise ValueError(
47
+ "Path prefix must not end with slash: %r" % path_prefix
48
+ )
49
+ if path_prefix and not path_prefix.startswith("/"):
50
+ raise ValueError(
51
+ "Non-empty path prefix must start with slash: %r" % path_prefix
52
+ )
53
+ self._application = application
54
+ self._path_prefix = path_prefix
55
+ self._strict_prefix = self._path_prefix + "/"
56
+
57
+ def __call__(self, environ, start_response):
58
+ path = environ.get("PATH_INFO", "")
59
+ if path != self._path_prefix and not path.startswith(
60
+ self._strict_prefix
61
+ ):
62
+ raise errors.NotFoundError()
63
+ environ["PATH_INFO"] = path[len(self._path_prefix) :]
64
+ environ["SCRIPT_NAME"] = (
65
+ environ.get("SCRIPT_NAME", "") + self._path_prefix
66
+ )
67
+ return self._application(environ, start_response)
@@ -0,0 +1,74 @@
1
+ # Copyright 2016 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Graph post-processing logic.
16
+
17
+ Used by both TensorBoard and mldash.
18
+ """
19
+
20
+
21
+ def prepare_graph_for_ui(
22
+ graph, limit_attr_size=1024, large_attrs_key="_too_large_attrs"
23
+ ):
24
+ """Prepares (modifies in-place) the graph to be served to the front-end.
25
+
26
+ For now, it supports filtering out attributes that are
27
+ too large to be shown in the graph UI.
28
+
29
+ Args:
30
+ graph: The GraphDef proto message.
31
+ limit_attr_size: Maximum allowed size in bytes, before the attribute
32
+ is considered large. Default is 1024 (1KB). Must be > 0 or None.
33
+ If None, there will be no filtering.
34
+ large_attrs_key: The attribute key that will be used for storing attributes
35
+ that are too large. Default is '_too_large_attrs'. Must be != None if
36
+ `limit_attr_size` is != None.
37
+
38
+ Raises:
39
+ ValueError: If `large_attrs_key is None` while `limit_attr_size != None`.
40
+ ValueError: If `limit_attr_size` is defined, but <= 0.
41
+ """
42
+ # TODO(@davidsoergel): detect whether a graph has been filtered already
43
+ # (to a limit_attr_size <= what is requested here). If it is already
44
+ # filtered, return immediately.
45
+
46
+ # Check input for validity.
47
+ if limit_attr_size is not None:
48
+ if large_attrs_key is None:
49
+ raise ValueError(
50
+ "large_attrs_key must be != None when limit_attr_size"
51
+ "!= None."
52
+ )
53
+
54
+ if limit_attr_size <= 0:
55
+ raise ValueError(
56
+ "limit_attr_size must be > 0, but is %d" % limit_attr_size
57
+ )
58
+
59
+ # Filter only if a limit size is defined.
60
+ if limit_attr_size is not None:
61
+ for node in graph.node:
62
+ # Go through all the attributes and filter out ones bigger than the
63
+ # limit.
64
+ keys = list(node.attr.keys())
65
+ for key in keys:
66
+ size = node.attr[key].ByteSize()
67
+ if size > limit_attr_size or size < 0:
68
+ del node.attr[key]
69
+ # Add the attribute key to the list of "too large" attributes.
70
+ # This is used in the info card in the graph UI to show the user
71
+ # that some attributes are too large to be shown.
72
+ node.attr[large_attrs_key].list.s.append(
73
+ key.encode("utf-8")
74
+ )
@@ -0,0 +1,202 @@
1
+ # Copyright 2019 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Validates responses and their security features."""
16
+
17
+ import dataclasses
18
+
19
+ from typing import Collection
20
+
21
+ from werkzeug.datastructures import Headers
22
+ from werkzeug import http
23
+
24
+ from tensorbored.util import tb_logging
25
+
26
+ logger = tb_logging.get_logger()
27
+
28
+ _HTML_MIME_TYPE = "text/html"
29
+ _CSP_DEFAULT_SRC = "default-src"
30
+ # Whitelist of allowed CSP violations.
31
+ _CSP_IGNORE = {
32
+ # Polymer-based code uses unsafe-inline.
33
+ "style-src": ["'unsafe-inline'", "data:"],
34
+ # Used in canvas
35
+ "img-src": ["blob:", "data:"],
36
+ # Used by numericjs.
37
+ # TODO(stephanwlee): remove it eventually.
38
+ "script-src": ["'unsafe-eval'"],
39
+ "font-src": ["data:"],
40
+ }
41
+
42
+
43
+ @dataclasses.dataclass(frozen=True)
44
+ class Directive:
45
+ """Content security policy directive.
46
+
47
+ Loosely follow vocabulary from https://www.w3.org/TR/CSP/#framework-directives.
48
+
49
+ Attributes:
50
+ name: A non-empty string.
51
+ value: A collection of non-empty strings.
52
+ """
53
+
54
+ name: str
55
+ value: Collection[str]
56
+
57
+
58
+ def _maybe_raise_value_error(error_msg):
59
+ logger.warning("In 3.0, this warning will become an error:\n%s" % error_msg)
60
+ # TODO(3.x): raise a value error.
61
+
62
+
63
+ class SecurityValidatorMiddleware:
64
+ """WSGI middleware validating security on response.
65
+
66
+ It validates:
67
+ - responses have Content-Type
68
+ - responses have X-Content-Type-Options: nosniff
69
+ - text/html responses have CSP header. It also validates whether the CSP
70
+ headers pass basic requirement. e.g., default-src should be present, cannot
71
+ use "*" directive, and others. For more complete list, please refer to
72
+ _validate_csp_policies.
73
+
74
+ Instances of this class are WSGI applications (see PEP 3333).
75
+ """
76
+
77
+ def __init__(self, application):
78
+ """Initializes an `SecurityValidatorMiddleware`.
79
+
80
+ Args:
81
+ application: The WSGI application to wrap (see PEP 3333).
82
+ """
83
+ self._application = application
84
+
85
+ def __call__(self, environ, start_response):
86
+ def start_response_proxy(status, headers, exc_info=None):
87
+ self._validate_headers(headers)
88
+ return start_response(status, headers, exc_info)
89
+
90
+ return self._application(environ, start_response_proxy)
91
+
92
+ def _validate_headers(self, headers_list):
93
+ headers = Headers(headers_list)
94
+ self._validate_content_type(headers)
95
+ self._validate_x_content_type_options(headers)
96
+ self._validate_csp_headers(headers)
97
+
98
+ def _validate_content_type(self, headers):
99
+ if headers.get("Content-Type"):
100
+ return
101
+
102
+ _maybe_raise_value_error("Content-Type is required on a Response")
103
+
104
+ def _validate_x_content_type_options(self, headers):
105
+ option = headers.get("X-Content-Type-Options")
106
+ if option == "nosniff":
107
+ return
108
+
109
+ _maybe_raise_value_error(
110
+ 'X-Content-Type-Options is required to be "nosniff"'
111
+ )
112
+
113
+ def _validate_csp_headers(self, headers):
114
+ mime_type, _ = http.parse_options_header(headers.get("Content-Type"))
115
+ if mime_type != _HTML_MIME_TYPE:
116
+ return
117
+
118
+ csp_texts = headers.get_all("Content-Security-Policy")
119
+ policies = []
120
+
121
+ for csp_text in csp_texts:
122
+ policies += self._parse_serialized_csp(csp_text)
123
+
124
+ self._validate_csp_policies(policies)
125
+
126
+ def _validate_csp_policies(self, policies):
127
+ has_default_src = False
128
+ violations = []
129
+
130
+ for directive in policies:
131
+ name = directive.name
132
+ for value in directive.value:
133
+ has_default_src = has_default_src or name == _CSP_DEFAULT_SRC
134
+
135
+ if value in _CSP_IGNORE.get(name, []):
136
+ # There are cases where certain directives are legitimate.
137
+ continue
138
+
139
+ # TensorBoard follows principle of least privilege. However, to make it
140
+ # easier to conform to the security policy for plugin authors,
141
+ # TensorBoard trusts request and resources originating its server. Also,
142
+ # it can selectively trust domains as long as they use https protocol.
143
+ # Lastly, it can allow 'none' directive.
144
+ # TODO(stephanwlee): allow configuration for whitelist of domains for
145
+ # stricter enforcement.
146
+ # TODO(stephanwlee): deprecate the sha-based whitelisting.
147
+ if (
148
+ value == "'self'"
149
+ or value == "'none'"
150
+ or value.startswith("https:")
151
+ or value.startswith("'sha256-")
152
+ ):
153
+ continue
154
+
155
+ msg = "Illegal Content-Security-Policy for {name}: {value}".format(
156
+ name=name, value=value
157
+ )
158
+ violations.append(msg)
159
+
160
+ if not has_default_src:
161
+ violations.append(
162
+ "Requires default-src for Content-Security-Policy"
163
+ )
164
+
165
+ if violations:
166
+ _maybe_raise_value_error("\n".join(violations))
167
+
168
+ def _parse_serialized_csp(self, csp_text):
169
+ # See https://www.w3.org/TR/CSP/#parse-serialized-policy.
170
+ # Below Steps are based on the algorithm stated in above spec.
171
+ # Deviations:
172
+ # - it does not warn and ignore duplicative directive (Step 2.5)
173
+
174
+ # Step 2
175
+ csp_srcs = csp_text.split(";")
176
+
177
+ policy = []
178
+ for token in csp_srcs:
179
+ # Step 2.1
180
+ token = token.strip()
181
+
182
+ if not token:
183
+ # Step 2.2
184
+ continue
185
+
186
+ # Step 2.3
187
+ token_frag = token.split(None, 1)
188
+ name = token_frag[0]
189
+
190
+ values = token_frag[1] if len(token_frag) == 2 else ""
191
+
192
+ # Step 2.4
193
+ name = name.lower()
194
+
195
+ # Step 2.6
196
+ value = values.split()
197
+ # Step 2.7
198
+ directive = Directive(name=name, value=value)
199
+ # Step 2.8
200
+ policy.append(directive)
201
+
202
+ return policy
@@ -0,0 +1,69 @@
1
+ # Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Compatibility interfaces for TensorBoard.
16
+
17
+ This module provides logic for importing variations on the TensorFlow
18
+ APIs, as lazily loaded imports to help avoid circular dependency issues
19
+ and defer the search and loading of the module until necessary.
20
+ """
21
+
22
+ import tensorbored.lazy as _lazy
23
+
24
+
25
+ @_lazy.lazy_load("tensorbored.compat.tf")
26
+ def tf():
27
+ """Provide the root module of a TF-like API for use within TensorBoard.
28
+
29
+ By default this is equivalent to `import tensorflow as tf`, but it can be used
30
+ in combination with //tensorbored/compat:tensorflow (to fall back to a stub TF
31
+ API implementation if the real one is not available) or with
32
+ //tensorbored/compat:no_tensorflow (to force unconditional use of the stub).
33
+
34
+ Returns:
35
+ The root module of a TF-like API, if available.
36
+
37
+ Raises:
38
+ ImportError: if a TF-like API is not available.
39
+ """
40
+ try:
41
+ from tensorbored.compat import notf # noqa: F401
42
+ except ImportError:
43
+ try:
44
+ import tensorflow
45
+
46
+ return tensorflow
47
+ except ImportError:
48
+ pass
49
+ from tensorbored.compat import tensorflow_stub
50
+
51
+ return tensorflow_stub
52
+
53
+
54
+ @_lazy.lazy_load("tensorbored.compat.tf2")
55
+ def tf2():
56
+ """Provide the root module of a TF-2.0 API for use within TensorBoard.
57
+
58
+ Returns:
59
+ The root module of a TF-2.0 API, if available.
60
+
61
+ Raises:
62
+ ImportError: if a TF-2.0 API is not available.
63
+ """
64
+ # Resolve the lazy `tf` compat API from earlier in this file and try to find
65
+ # tf.compat.v2. Don't check tf.__version__ since this is not always reliable
66
+ # if TF was built with tf_api_version!=2.
67
+ if hasattr(tf, "compat") and hasattr(tf.compat, "v2"):
68
+ return tf.compat.v2
69
+ raise ImportError("cannot import tensorflow 2.0 API")
File without changes
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: tensorbored/compat/proto/allocation_description.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import message as _message
8
+ from google.protobuf import reflection as _reflection
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+
16
+
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n5tensorbored/compat/proto/allocation_description.proto\x12\x0btensorbored\"\xa3\x01\n\x15\x41llocationDescription\x12\x17\n\x0frequested_bytes\x18\x01 \x01(\x03\x12\x17\n\x0f\x61llocated_bytes\x18\x02 \x01(\x03\x12\x16\n\x0e\x61llocator_name\x18\x03 \x01(\t\x12\x15\n\rallocation_id\x18\x04 \x01(\x03\x12\x1c\n\x14has_single_reference\x18\x05 \x01(\x08\x12\x0b\n\x03ptr\x18\x06 \x01(\x04\x42\x9b\x01\n\x18org.tensorflow.frameworkB\x1b\x41llocationDescriptionProtosP\x01Z]github.com/tensorflow/tensorflow/tensorflow/go/core/framework/allocation_description_go_proto\xf8\x01\x01\x62\x06proto3')
18
+
19
+
20
+
21
+ _ALLOCATIONDESCRIPTION = DESCRIPTOR.message_types_by_name['AllocationDescription']
22
+ AllocationDescription = _reflection.GeneratedProtocolMessageType('AllocationDescription', (_message.Message,), {
23
+ 'DESCRIPTOR' : _ALLOCATIONDESCRIPTION,
24
+ '__module__' : 'tensorbored.compat.proto.allocation_description_pb2'
25
+ # @@protoc_insertion_point(class_scope:tensorbored.AllocationDescription)
26
+ })
27
+ _sym_db.RegisterMessage(AllocationDescription)
28
+
29
+ if _descriptor._USE_C_DESCRIPTORS == False:
30
+
31
+ DESCRIPTOR._options = None
32
+ DESCRIPTOR._serialized_options = b'\n\030org.tensorflow.frameworkB\033AllocationDescriptionProtosP\001Z]github.com/tensorflow/tensorflow/tensorflow/go/core/framework/allocation_description_go_proto\370\001\001'
33
+ _ALLOCATIONDESCRIPTION._serialized_start=71
34
+ _ALLOCATIONDESCRIPTION._serialized_end=234
35
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,82 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: tensorbored/compat/proto/api_def.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf import descriptor as _descriptor
6
+ from google.protobuf import descriptor_pool as _descriptor_pool
7
+ from google.protobuf import message as _message
8
+ from google.protobuf import reflection as _reflection
9
+ from google.protobuf import symbol_database as _symbol_database
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from tensorbored.compat.proto import attr_value_pb2 as tensorbored_dot_compat_dot_proto_dot_attr__value__pb2
16
+
17
+
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&tensorbored/compat/proto/api_def.proto\x12\x0btensorbored\x1a)tensorbored/compat/proto/attr_value.proto\"\xe7\x05\n\x06\x41piDef\x12\x15\n\rgraph_op_name\x18\x01 \x01(\t\x12\x1b\n\x13\x64\x65precation_message\x18\x0c \x01(\t\x12\x1b\n\x13\x64\x65precation_version\x18\r \x01(\x05\x12\x32\n\nvisibility\x18\x02 \x01(\x0e\x32\x1e.tensorbored.ApiDef.Visibility\x12.\n\x08\x65ndpoint\x18\x03 \x03(\x0b\x32\x1c.tensorbored.ApiDef.Endpoint\x12\'\n\x06in_arg\x18\x04 \x03(\x0b\x32\x17.tensorbored.ApiDef.Arg\x12(\n\x07out_arg\x18\x05 \x03(\x0b\x32\x17.tensorbored.ApiDef.Arg\x12\x11\n\targ_order\x18\x0b \x03(\t\x12&\n\x04\x61ttr\x18\x06 \x03(\x0b\x32\x18.tensorbored.ApiDef.Attr\x12\x0f\n\x07summary\x18\x07 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x1a\n\x12\x64\x65scription_prefix\x18\t \x01(\t\x12\x1a\n\x12\x64\x65scription_suffix\x18\n \x01(\t\x1aI\n\x08\x45ndpoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ndeprecated\x18\x03 \x01(\x08\x12\x1b\n\x13\x64\x65precation_version\x18\x04 \x01(\x05\x1a;\n\x03\x41rg\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\trename_to\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x1ak\n\x04\x41ttr\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\trename_to\x18\x02 \x01(\t\x12-\n\rdefault_value\x18\x03 \x01(\x0b\x32\x16.tensorbored.AttrValue\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\"G\n\nVisibility\x12\x16\n\x12\x44\x45\x46\x41ULT_VISIBILITY\x10\x00\x12\x0b\n\x07VISIBLE\x10\x01\x12\x08\n\x04SKIP\x10\x02\x12\n\n\x06HIDDEN\x10\x03\"*\n\x07\x41piDefs\x12\x1f\n\x02op\x18\x01 \x03(\x0b\x32\x13.tensorbored.ApiDefB}\n\x18org.tensorflow.frameworkB\x0c\x41piDefProtosP\x01ZNgithub.com/tensorflow/tensorflow/tensorflow/go/core/framework/api_def_go_proto\xf8\x01\x01\x62\x06proto3')
19
+
20
+
21
+
22
+ _APIDEF = DESCRIPTOR.message_types_by_name['ApiDef']
23
+ _APIDEF_ENDPOINT = _APIDEF.nested_types_by_name['Endpoint']
24
+ _APIDEF_ARG = _APIDEF.nested_types_by_name['Arg']
25
+ _APIDEF_ATTR = _APIDEF.nested_types_by_name['Attr']
26
+ _APIDEFS = DESCRIPTOR.message_types_by_name['ApiDefs']
27
+ _APIDEF_VISIBILITY = _APIDEF.enum_types_by_name['Visibility']
28
+ ApiDef = _reflection.GeneratedProtocolMessageType('ApiDef', (_message.Message,), {
29
+
30
+ 'Endpoint' : _reflection.GeneratedProtocolMessageType('Endpoint', (_message.Message,), {
31
+ 'DESCRIPTOR' : _APIDEF_ENDPOINT,
32
+ '__module__' : 'tensorbored.compat.proto.api_def_pb2'
33
+ # @@protoc_insertion_point(class_scope:tensorbored.ApiDef.Endpoint)
34
+ })
35
+ ,
36
+
37
+ 'Arg' : _reflection.GeneratedProtocolMessageType('Arg', (_message.Message,), {
38
+ 'DESCRIPTOR' : _APIDEF_ARG,
39
+ '__module__' : 'tensorbored.compat.proto.api_def_pb2'
40
+ # @@protoc_insertion_point(class_scope:tensorbored.ApiDef.Arg)
41
+ })
42
+ ,
43
+
44
+ 'Attr' : _reflection.GeneratedProtocolMessageType('Attr', (_message.Message,), {
45
+ 'DESCRIPTOR' : _APIDEF_ATTR,
46
+ '__module__' : 'tensorbored.compat.proto.api_def_pb2'
47
+ # @@protoc_insertion_point(class_scope:tensorbored.ApiDef.Attr)
48
+ })
49
+ ,
50
+ 'DESCRIPTOR' : _APIDEF,
51
+ '__module__' : 'tensorbored.compat.proto.api_def_pb2'
52
+ # @@protoc_insertion_point(class_scope:tensorbored.ApiDef)
53
+ })
54
+ _sym_db.RegisterMessage(ApiDef)
55
+ _sym_db.RegisterMessage(ApiDef.Endpoint)
56
+ _sym_db.RegisterMessage(ApiDef.Arg)
57
+ _sym_db.RegisterMessage(ApiDef.Attr)
58
+
59
+ ApiDefs = _reflection.GeneratedProtocolMessageType('ApiDefs', (_message.Message,), {
60
+ 'DESCRIPTOR' : _APIDEFS,
61
+ '__module__' : 'tensorbored.compat.proto.api_def_pb2'
62
+ # @@protoc_insertion_point(class_scope:tensorbored.ApiDefs)
63
+ })
64
+ _sym_db.RegisterMessage(ApiDefs)
65
+
66
+ if _descriptor._USE_C_DESCRIPTORS == False:
67
+
68
+ DESCRIPTOR._options = None
69
+ DESCRIPTOR._serialized_options = b'\n\030org.tensorflow.frameworkB\014ApiDefProtosP\001ZNgithub.com/tensorflow/tensorflow/tensorflow/go/core/framework/api_def_go_proto\370\001\001'
70
+ _APIDEF._serialized_start=99
71
+ _APIDEF._serialized_end=842
72
+ _APIDEF_ENDPOINT._serialized_start=526
73
+ _APIDEF_ENDPOINT._serialized_end=599
74
+ _APIDEF_ARG._serialized_start=601
75
+ _APIDEF_ARG._serialized_end=660
76
+ _APIDEF_ATTR._serialized_start=662
77
+ _APIDEF_ATTR._serialized_end=769
78
+ _APIDEF_VISIBILITY._serialized_start=771
79
+ _APIDEF_VISIBILITY._serialized_end=842
80
+ _APIDEFS._serialized_start=844
81
+ _APIDEFS._serialized_end=886
82
+ # @@protoc_insertion_point(module_scope)