From 852af8d4c32f53dc4b518836724d638c01bb8fa0 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Thu, 14 Mar 2024 19:47:02 +0100 Subject: [PATCH] Remove legacy providers (#6721) ## Motivation for features / changes Legacy struct providers have been deprecated by Bazel. Replacing them with modern providers, will make it possible to simplify and remove legacy handling from Bazel. Prerequiste: https://github.com/bazelbuild/rules_closure/pull/599 is merged and released. Googlers, see cl/597800285. --- .github/workflows/ci.yml | 4 +- WORKSPACE | 22 +- tensorboard/defs/defs.bzl | 45 +- tensorboard/defs/hacks.bzl | 121 +- tensorboard/defs/internal/html.bzl | 51 +- tensorboard/defs/web.bzl | 457 +++---- tensorboard/defs/zipper.bzl | 70 +- third_party/fonts.bzl | 1796 ++++++++++++++-------------- 8 files changed, 1286 insertions(+), 1280 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a1404c98a..de31b7fbee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,8 +25,8 @@ permissions: env: # Keep this Bazel version in sync with the `versions.check` directive # in our WORKSPACE file. - BAZEL_VERSION: '4.2.2' - BAZEL_SHA256SUM: '11dea6c7cfd866ed520af19a6bb1d952f3e9f4ee60ffe84e63c0825d95cb5859' + BAZEL_VERSION: '6.5.0' + BAZEL_SHA256SUM: 'a40ac69263440761199fcb8da47ad4e3f328cbe79ffbf4ecc14e5ba252857307' BUILDTOOLS_VERSION: '3.0.0' BUILDIFIER_SHA256SUM: 'e92a6793c7134c5431c58fbc34700664f101e5c9b1c1fcd93b97978e8b7f88db' BUILDOZER_SHA256SUM: '3d58a0b6972e4535718cdd6c12778170ea7382de7c75bc3728f5719437ffb84d' diff --git a/WORKSPACE b/WORKSPACE index 90f4343943..67e90a0915 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -21,16 +21,14 @@ versions.check( maximum_bazel_version = "6.999.0", # Keep this version in sync with: # * The BAZEL environment variable defined in .github/workflows/ci.yml, which is used for CI and nightly builds. - minimum_bazel_version = "4.2.2", + minimum_bazel_version = "6.5.0", ) http_archive( name = "io_bazel_rules_webtesting", - sha256 = "e9abb7658b6a129740c0b3ef6f5a2370864e102a5ba5ffca2cea565829ed825a", - urls = [ - "http://mirror.tensorflow.org/github.com/bazelbuild/rules_webtesting/releases/download/0.3.5/rules_webtesting.tar.gz", - "https://github.com/bazelbuild/rules_webtesting/releases/download/0.3.5/rules_webtesting.tar.gz", - ], + sha256 = "6e104e54c283c94ae3d5c6573cf3233ce478e89e0f541a869057521966a35b8f", + strip_prefix = "rules_webtesting-b6fc79c5a37cd18a5433fd080c9d2cc59548222c", + urls = ["https://github.com/bazelbuild/rules_webtesting/archive/b6fc79c5a37cd18a5433fd080c9d2cc59548222c.tar.gz"], ) load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories") @@ -55,11 +53,10 @@ py_repositories() http_archive( name = "io_bazel_rules_closure", - sha256 = "6a900831c1eb8dbfc9d6879b5820fd614d4ea1db180eb5ff8aedcb75ee747c1f", - strip_prefix = "rules_closure-db4683a2a1836ac8e265804ca5fa31852395185b", + sha256 = "ae060075a7c468eee42e6a08ddbb83f5a6663bdfdbd461261a465f4a3ae8598c", + strip_prefix = "rules_closure-7f3d3351a8cc31fbaa403de7d35578683c17b447", urls = [ - "http://mirror.tensorflow.org/github.com/bazelbuild/rules_closure/archive/db4683a2a1836ac8e265804ca5fa31852395185b.tar.gz", - "https://github.com/bazelbuild/rules_closure/archive/db4683a2a1836ac8e265804ca5fa31852395185b.tar.gz", # 2020-01-15 + "https://github.com/bazelbuild/rules_closure/archive/7f3d3351a8cc31fbaa403de7d35578683c17b447.tar.gz", # 2024-03-11 ], ) @@ -191,6 +188,11 @@ http_archive( ], ) +# WORKAROUND for rules_webtesting not declaring used com_github_gorilla_mux repo: +load("@io_bazel_rules_webtesting//web:go_repositories.bzl", "com_github_gorilla_mux") + +com_github_gorilla_mux() + # Please add all new dependencies in workspace.bzl. load("//third_party:workspace.bzl", "tensorboard_workspace") diff --git a/tensorboard/defs/defs.bzl b/tensorboard/defs/defs.bzl index 725a912514..77428870ea 100644 --- a/tensorboard/defs/defs.bzl +++ b/tensorboard/defs/defs.bzl @@ -22,7 +22,6 @@ load("@npm//@bazel/concatjs:index.bzl", "karma_web_test_suite", "ts_library") load("@npm//@bazel/esbuild:index.bzl", "esbuild") load("@npm//@bazel/typescript:index.bzl", "ts_config") - def tensorboard_webcomponent_library(**kwargs): """Rules referencing this will be deleted from the codebase soon.""" pass @@ -72,8 +71,8 @@ def tf_js_binary( # the global level and tends to overwrite `window` functions. "iife" is # just a thin wrapper around "esm" (it adds 11 bytes) and doesn't # suffer from the same overwriting problem. - format="iife", - minify= False if dev_mode_only else True, + format = "iife", + minify = False if dev_mode_only else True, args = { # Must specify that 'mjs' extensions are preferred, since that is # the extension that is used for es2015/esm code generated by @@ -91,7 +90,6 @@ def tf_js_binary( **kwargs ) - def tf_ng_prod_js_binary( name, compile, @@ -114,7 +112,7 @@ def tf_ng_prod_js_binary( https://esbuild.github.io/api/ for more details. """ - app_bundle_name = '%s_app_bundle' % name + app_bundle_name = "%s_app_bundle" % name app_bundle( name = app_bundle_name, **kwargs @@ -124,8 +122,8 @@ def tf_ng_prod_js_binary( # through a terser pass to be the output of this rule. copy_file( name = name, - src = '%s.min.js' % app_bundle_name, - out = '%s.js' % name, + src = "%s.min.js" % app_bundle_name, + out = "%s.js" % name, ) def tf_ts_config(**kwargs): @@ -148,22 +146,24 @@ def tf_ts_library(srcs = [], strict_checks = True, **kwargs): kwargs.setdefault("deps", []).extend(["@npm//tslib", "//tensorboard/defs:strict_types"]) new_srcs = [] + # Find test.ts and testbed.ts files and rename to test.spec.ts to be # compatible with spec_bundle() tooling. for s in srcs: - if s.endswith("_test.ts") or s.endswith("-test.ts") or s.endswith("_testbed.ts"): - # Make a copy of the file with name .spec.ts and switch to that as - # the src file. - new_src = s[0:s.rindex('.ts')] + ".spec.ts" - copy_file( - name = new_src + '_spec_copy', - src = s, - out = new_src, - allow_symlink = True) - new_srcs.append(new_src) - else: - # Not a test file. Nothing to do here. - new_srcs.append(s) + if s.endswith("_test.ts") or s.endswith("-test.ts") or s.endswith("_testbed.ts"): + # Make a copy of the file with name .spec.ts and switch to that as + # the src file. + new_src = s[0:s.rindex(".ts")] + ".spec.ts" + copy_file( + name = new_src + "_spec_copy", + src = s, + out = new_src, + allow_symlink = True, + ) + new_srcs.append(new_src) + else: + # Not a test file. Nothing to do here. + new_srcs.append(s) ts_library( srcs = new_srcs, @@ -176,7 +176,8 @@ def tf_ts_library(srcs = [], strict_checks = True, **kwargs): prodmode_target = "es2020", devmode_target = "es2020", devmode_module = "esnext", - **kwargs) + **kwargs + ) def tf_ng_web_test_suite(name, deps = [], **kwargs): """TensorBoard wrapper for the rule for a Karma web test suite. @@ -231,7 +232,7 @@ def tf_ng_web_test_suite(name, deps = [], **kwargs): # karma_web_test_suite() will rebundle it along with the test framework # in a CommonJS bundle. deps = [ - "%s_bundle" % name, + "%s_bundle" % name, ], ) diff --git a/tensorboard/defs/hacks.bzl b/tensorboard/defs/hacks.bzl index 22ecbb2a87..da469aec65 100644 --- a/tensorboard/defs/hacks.bzl +++ b/tensorboard/defs/hacks.bzl @@ -16,65 +16,66 @@ # TODO(@jart): Merge this file into defs.bzl once that file is sync unified. def tensorboard_typescript_bundle( - name, - out, - namespace_srcs, - namespace_symbol_aliases={}, - namespace_symbol_aliases_public={}, -): - """Rolls TypeScript ES6 modules into one vanilla source file without imports. + name, + out, + namespace_srcs, + namespace_symbol_aliases = {}, + namespace_symbol_aliases_public = {}): + """Rolls TypeScript ES6 modules into one vanilla source file without imports. - This is a genrule wrapper that concatenates TypeScripts sources inside - namespace blocks while removing ^import lines. Because the sources themselves - are not parsed, the structure of the modules must be passed to this macro as - a Skylark data structure. + This is a genrule wrapper that concatenates TypeScripts sources inside + namespace blocks while removing ^import lines. Because the sources themselves + are not parsed, the structure of the modules must be passed to this macro as + a Skylark data structure. - Args: - name: Name of this build rule target. - out: Path of outputted TypeScript source file. - namespace_srcs: Multimap of namespace strings to build file targets. The - ordering of the dictionary and nested lists does not matter when - generating a typings file, but *does* matter when generating a source - file. - namespace_symbol_aliases: Map of namespace strings where each value is a - map of symbol names to fully qualified symbol names. - namespace_symbol_aliases_public: Same as namespace_symbol_aliases but the - symbol will be visible to other namespaces. - """ - cmd = ["(", "echo // GENERATED BY TENSORBOARD_TYPESCRIPT_BUNDLE"] - inputs_depsets = [] - for namespace, srcs in namespace_srcs.items(): - cmd.append("echo") - if out[-5:] == ".d.ts": - cmd.append("echo 'declare namespace %s {'" % namespace) - elif out[-3:] == ".ts": - cmd.append("echo 'module %s {'" % namespace) - else: - fail("'out' must end with .ts or .d.ts: " + out) - for symbol, canon in namespace_symbol_aliases.get(namespace, {}).items(): - cmd.append("echo 'import %s = %s;'" % (symbol, canon)) - for symbol, canon in namespace_symbol_aliases_public.get(namespace, - {}).items(): - cmd.append("echo 'export import %s = %s;'" % (symbol, canon)) - inputs_depsets.append(depset(srcs)) - for src in srcs: - cmd.append("for f in $(locations %s); do" % src) - cmd.append(" echo") - cmd.append(" echo /////////////////////////////////////////////////////") - cmd.append(" echo // " + namespace) - cmd.append(" echo // $$f") - cmd.append(" echo /////////////////////////////////////////////////////") - cmd.append(" echo") - cmd.append(" sed 's!^import !// import !' $$f \\") - cmd.append(" | sed 's!^export declare !export !' \\") - cmd.append(" | sed '/^export .* from /d' \\") - cmd.append(" | sed '/^export {.*};$$/d'") - cmd.append("done") - cmd.append("echo '}'") - cmd.append(") >$@") - native.genrule( - name = name, - srcs = depset(transitive=inputs_depsets).to_list(), - outs = [out], - cmd = "\n".join(cmd), - ) + Args: + name: Name of this build rule target. + out: Path of outputted TypeScript source file. + namespace_srcs: Multimap of namespace strings to build file targets. The + ordering of the dictionary and nested lists does not matter when + generating a typings file, but *does* matter when generating a source + file. + namespace_symbol_aliases: Map of namespace strings where each value is a + map of symbol names to fully qualified symbol names. + namespace_symbol_aliases_public: Same as namespace_symbol_aliases but the + symbol will be visible to other namespaces. + """ + cmd = ["(", "echo // GENERATED BY TENSORBOARD_TYPESCRIPT_BUNDLE"] + inputs_depsets = [] + for namespace, srcs in namespace_srcs.items(): + cmd.append("echo") + if out[-5:] == ".d.ts": + cmd.append("echo 'declare namespace %s {'" % namespace) + elif out[-3:] == ".ts": + cmd.append("echo 'module %s {'" % namespace) + else: + fail("'out' must end with .ts or .d.ts: " + out) + for symbol, canon in namespace_symbol_aliases.get(namespace, {}).items(): + cmd.append("echo 'import %s = %s;'" % (symbol, canon)) + for symbol, canon in namespace_symbol_aliases_public.get( + namespace, + {}, + ).items(): + cmd.append("echo 'export import %s = %s;'" % (symbol, canon)) + inputs_depsets.append(depset(srcs)) + for src in srcs: + cmd.append("for f in $(locations %s); do" % src) + cmd.append(" echo") + cmd.append(" echo /////////////////////////////////////////////////////") + cmd.append(" echo // " + namespace) + cmd.append(" echo // $$f") + cmd.append(" echo /////////////////////////////////////////////////////") + cmd.append(" echo") + cmd.append(" sed 's!^import !// import !' $$f \\") + cmd.append(" | sed 's!^export declare !export !' \\") + cmd.append(" | sed '/^export .* from /d' \\") + cmd.append(" | sed '/^export {.*};$$/d'") + cmd.append("done") + cmd.append("echo '}'") + cmd.append(") >$@") + native.genrule( + name = name, + srcs = depset(transitive = inputs_depsets).to_list(), + outs = [out], + cmd = "\n".join(cmd), + ) diff --git a/tensorboard/defs/internal/html.bzl b/tensorboard/defs/internal/html.bzl index 48d3dcbe80..99403ba051 100644 --- a/tensorboard/defs/internal/html.bzl +++ b/tensorboard/defs/internal/html.bzl @@ -15,7 +15,7 @@ """Rule for building the HTML binary.""" load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_aspect") -load("@io_bazel_rules_closure//closure/private:defs.bzl", "collect_js", "long_path", "unfurl") # buildifier: disable=bzl-visibility +load("@io_bazel_rules_closure//closure/private:defs.bzl", "WebFilesInfo", "collect_runfiles", "extract_providers", "long_path", "unfurl") # buildifier: disable=bzl-visibility def _tb_combine_html_impl(ctx): """Compiles HTMLs into one HTML. @@ -25,18 +25,12 @@ def _tb_combine_html_impl(ctx): JavaScript file when `js_path` is specified. """ - deps = unfurl(ctx.attr.deps, provider = "webfiles") - manifests = depset(order = "postorder") - files = depset() - webpaths = depset() - for dep in deps: - manifests = depset(transitive = [manifests, dep.webfiles.manifests]) - webpaths = depset(transitive = [webpaths, dep.webfiles.webpaths]) - files = depset(transitive = [files, dep.data_runfiles.files]) + deps = extract_providers(ctx.attr.deps, provider = WebFilesInfo) + deps = unfurl(deps) + manifests = depset(order = "postorder", transitive = [dep.manifests for dep in deps]) + webpaths = depset(transitive = [dep.webpaths for dep in deps]) + files = depset(transitive = [dep[DefaultInfo].data_runfiles.files for dep in ctx.attr.deps]) webpaths = depset([ctx.attr.output_path], transitive = [webpaths]) - closure_js_library = collect_js( - unfurl(ctx.attr.deps, provider = "closure_js_library"), - ) # vulcanize ctx.actions.run( @@ -84,30 +78,25 @@ def _tb_combine_html_impl(ctx): ) manifests = depset([manifest], transitive = [manifests]) - transitive_runfiles = depset() - for dep in deps: - transitive_runfiles = depset(transitive = [ - transitive_runfiles, - dep.data_runfiles.files, - ]) - - return struct( - files = depset([ctx.outputs.html, ctx.outputs.js]), - webfiles = struct( + return [ + DefaultInfo( + files = depset([ctx.outputs.html, ctx.outputs.js]), + runfiles = collect_runfiles( + ctx, + files = ctx.files.data + [ + manifest, + ctx.outputs.html, + ctx.outputs.js, + ], + ), + ), + WebFilesInfo( manifest = manifest, manifests = manifests, webpaths = webpaths, dummy = ctx.outputs.html, ), - runfiles = ctx.runfiles( - files = ctx.files.data + [ - manifest, - ctx.outputs.html, - ctx.outputs.js, - ], - transitive_files = transitive_runfiles, - ), - ) + ] tb_combine_html = rule( implementation = _tb_combine_html_impl, diff --git a/tensorboard/defs/web.bzl b/tensorboard/defs/web.bzl index 04579085e3..c184831f8a 100644 --- a/tensorboard/defs/web.bzl +++ b/tensorboard/defs/web.bzl @@ -14,259 +14,276 @@ """Same as web_library but supports TypeScript.""" -load("@io_bazel_rules_closure//closure:defs.bzl", - "closure_js_aspect") - -load("@io_bazel_rules_closure//closure/private:defs.bzl", - "CLOSURE_LIBRARY_BASE_ATTR", - "CLOSURE_WORKER_ATTR", - "collect_js", - "collect_runfiles", - "difference", - "long_path", - "unfurl") +load( + "@io_bazel_rules_closure//closure:defs.bzl", + "closure_js_aspect", +) +load( + "@io_bazel_rules_closure//closure/private:defs.bzl", + "CLOSURE_LIBRARY_BASE_ATTR", + "CLOSURE_WORKER_ATTR", + "ClosureJsLibraryInfo", + "WebFilesInfo", + "collect_js", + "collect_runfiles", + "difference", + "extract_providers", + "long_path", + "unfurl", +) load("//tensorboard/defs/internal:html.bzl", _tb_combine_html = "tb_combine_html") def _tf_web_library(ctx): - if not ctx.attr.srcs: - if ctx.attr.deps: - fail("deps can not be set when srcs is not") - if not ctx.attr.exports: - fail("exports must be set if srcs is not") - if ctx.attr.path: - if not ctx.attr.path.startswith("/"): - fail("webpath must start with /") - if ctx.attr.path != "/" and ctx.attr.path.endswith("/"): - fail("webpath must not end with / unless it is /") - if "//" in ctx.attr.path: - fail("webpath must not have //") - elif ctx.attr.srcs: - fail("path must be set when srcs is set") - if "*" in ctx.attr.suppress and len(ctx.attr.suppress) != 1: - fail("when \"*\" is suppressed no other items should be present") + if not ctx.attr.srcs: + if ctx.attr.deps: + fail("deps can not be set when srcs is not") + if not ctx.attr.exports: + fail("exports must be set if srcs is not") + if ctx.attr.path: + if not ctx.attr.path.startswith("/"): + fail("webpath must start with /") + if ctx.attr.path != "/" and ctx.attr.path.endswith("/"): + fail("webpath must not end with / unless it is /") + if "//" in ctx.attr.path: + fail("webpath must not have //") + elif ctx.attr.srcs: + fail("path must be set when srcs is set") + if "*" in ctx.attr.suppress and len(ctx.attr.suppress) != 1: + fail("when \"*\" is suppressed no other items should be present") - # process what came before - deps = unfurl(ctx.attr.deps, provider="webfiles") - webpaths = depset() - for dep in deps: - webpaths = depset(transitive=[webpaths, dep.webfiles.webpaths]) + # process what came before + deps = extract_providers(ctx.attr.deps, provider = WebFilesInfo) + webpaths = depset(transitive = [dep.webpaths for dep in deps]) - # process what comes now - manifest_srcs = [] - new_webpaths = [] - web_srcs = [] - path = ctx.attr.path - strip = _get_strip(ctx) - for src in ctx.files.srcs: - suffix = _get_path_relative_to_package(src) - if strip: - if not suffix.startswith(strip): - fail("Relative src path not start with '%s': %s" % (strip, suffix)) - suffix = suffix[len(strip):] - webpath = "%s/%s" % ("" if path == "/" else path, suffix) - _add_webpath(ctx, src, webpath, webpaths, new_webpaths, manifest_srcs) - if suffix.endswith(".d.ts"): - # Polymer v1 fork still specifies d.ts in tf_web_library. - pass - elif suffix.endswith(".ts"): - fail( - "tf_web_library no longer can build TypeScript. Please use " + - "tf_ts_library instead." - ) - else: - web_srcs.append(src) + # process what comes now + manifest_srcs = [] + new_webpaths = [] + web_srcs = [] + path = ctx.attr.path + strip = _get_strip(ctx) + for src in ctx.files.srcs: + suffix = _get_path_relative_to_package(src) + if strip: + if not suffix.startswith(strip): + fail("Relative src path not start with '%s': %s" % (strip, suffix)) + suffix = suffix[len(strip):] + webpath = "%s/%s" % ("" if path == "/" else path, suffix) + _add_webpath(ctx, src, webpath, webpaths, new_webpaths, manifest_srcs) + if suffix.endswith(".d.ts"): + # Polymer v1 fork still specifies d.ts in tf_web_library. + pass + elif suffix.endswith(".ts"): + fail( + "tf_web_library no longer can build TypeScript. Please use " + + "tf_ts_library instead.", + ) + else: + web_srcs.append(src) - # perform strict dependency checking - manifest = _make_manifest(ctx, manifest_srcs) - webpaths = depset(new_webpaths, transitive=[webpaths]) - dummy, manifests = _run_webfiles_validator(ctx, web_srcs, deps, manifest) - web_srcs.append(dummy) + # perform strict dependency checking + manifest = _make_manifest(ctx, manifest_srcs) + webpaths = depset(new_webpaths, transitive = [webpaths]) + dummy, manifests = _run_webfiles_validator(ctx, web_srcs, deps, manifest) + web_srcs.append(dummy) - # define development web server that only applies to this transitive closure - if ctx.attr.srcs: - devserver_manifests = manifests - export_deps = [] - else: - # If a rule exists purely to export other build rules, then it's - # appropriate for the exported sources to be included in the - # development web server. - export_deps = unfurl(ctx.attr.exports) - devserver_manifests = depset( - order = "postorder", - transitive = ( - [manifests] + [dep.webfiles.manifests for dep in export_deps] + # define development web server that only applies to this transitive closure + if ctx.attr.srcs: + devserver_manifests = manifests + export_deps = [] + else: + # If a rule exists purely to export other build rules, then it's + # appropriate for the exported sources to be included in the + # development web server. + export_deps = unfurl(extract_providers(ctx.attr.exports)) + devserver_manifests = depset( + order = "postorder", + transitive = ( + [manifests] + [dep[WebFilesInfo].manifests for dep in export_deps] + ), + ) + params = struct( + label = str(ctx.label), + bind = "localhost:6006", + manifest = [long_path(ctx, man) for man in devserver_manifests.to_list()], + external_asset = [ + struct(webpath = k, path = v) + for k, v in ctx.attr.external_assets.items() + ], + ) + params_file = _new_file(ctx, "-params.pbtxt") + ctx.actions.write(output = params_file, content = params.to_proto()) + ctx.actions.write( + is_executable = True, + output = ctx.outputs.executable, + content = "#!/bin/sh\nexec %s %s" % ( + ctx.executable._WebfilesServer.short_path, + long_path(ctx, params_file), ), ) - params = struct( - label=str(ctx.label), - bind="localhost:6006", - manifest=[long_path(ctx, man) for man in devserver_manifests.to_list()], - external_asset=[struct(webpath=k, path=v) - for k, v in ctx.attr.external_assets.items()]) - params_file = _new_file(ctx, "-params.pbtxt") - ctx.actions.write(output=params_file, content=proto.encode_text(params)) - ctx.actions.write( - is_executable=True, - output=ctx.outputs.executable, - content="#!/bin/sh\nexec %s %s" % ( - ctx.executable._WebfilesServer.short_path, - long_path(ctx, params_file))) - # Export data to parent rules. This uses the legacy, string-based - # provider mechanism for compatibility with the base `web_library` - # rule from rules_closure: because `tf_web_library`s may depend on - # either other `tf_web_library`s or base `web_library`s, the - # interfaces ~must be the same. - # - # buildozer: disable=rule-impl-return - return struct( - files=depset(web_srcs + [dummy]), - exports=unfurl(ctx.attr.exports), - webfiles=struct( - manifest=manifest, - manifests=manifests, - webpaths=webpaths, - dummy=dummy, - ), - closure_js_library=collect_js( - unfurl(ctx.attr.deps, provider="closure_js_library"), - ctx.files._closure_library_base), - runfiles=ctx.runfiles( - files=(ctx.files.srcs + - ctx.files.data + - ctx.files._closure_library_base + [ - manifest, - params_file, - ctx.outputs.executable, - dummy]), - transitive_files=depset(transitive=[ - collect_runfiles([ctx.attr._WebfilesServer]), - collect_runfiles(deps), - collect_runfiles(export_deps), - collect_runfiles(ctx.attr.data), - ]))) + # Export data to parent rules. This uses the legacy, string-based + # provider mechanism for compatibility with the base `web_library` + # rule from rules_closure: because `tf_web_library`s may depend on + # either other `tf_web_library`s or base `web_library`s, the + # interfaces ~must be the same. + return [ + WebFilesInfo( + manifest = manifest, + manifests = manifests, + webpaths = webpaths, + dummy = dummy, + exports = export_deps, + ), + collect_js( + unfurl(deps), + ctx.files._closure_library_base, + ), + DefaultInfo( + files = depset(web_srcs + [dummy]), + runfiles = collect_runfiles( + ctx, + files = (ctx.files.srcs + + ctx.files.data + + ctx.files._closure_library_base + [ + manifest, + params_file, + ctx.outputs.executable, + dummy, + ]), + extra_runfiles_attrs = ["export_deps", "_WebfilesServer"], + ), + ), + ] def _make_manifest(ctx, src_list): - manifest = _new_file(ctx, "-webfiles.pbtxt") - ctx.actions.write( - output=manifest, - content=proto.encode_text(struct( - label=str(ctx.label), - src=src_list))) - return manifest + manifest = _new_file(ctx, "-webfiles.pbtxt") + ctx.actions.write( + output = manifest, + content = proto.encode_text(struct( + label = str(ctx.label), + src = src_list, + )), + ) + return manifest def _run_webfiles_validator(ctx, srcs, deps, manifest): - dummy = _new_file(ctx, "-webfiles.ignoreme") - manifests = depset(order="postorder") - for dep in deps: - manifests = depset(transitive=[manifests, dep.webfiles.manifests]) - if srcs: - args = ["WebfilesValidator", - "--dummy", dummy.path, - "--target", manifest.path] - if hasattr(ctx, "attr") and hasattr(ctx.attr, "suppress"): - for category in ctx.attr.suppress: - args.append("--suppress") - args.append(category) - inputs = [] # list of depsets - inputs.append(depset([manifest] + srcs)) - direct_manifests = depset() - for dep in deps: - inputs.append(depset([dep.webfiles.dummy])) - inputs.append(dep.files) - direct_manifests = depset( - [dep.webfiles.manifest], - transitive=[direct_manifests], - ) - inputs.append(depset([dep.webfiles.manifest])) - args.append("--direct_dep") - args.append(dep.webfiles.manifest.path) - for man in difference(manifests, direct_manifests): - inputs.append(depset([man])) - args.append("--transitive_dep") - args.append(man.path) - argfile = _new_file(ctx, "-webfiles-checker-args.txt") - ctx.actions.write(output=argfile, content="\n".join(args)) - inputs.append(depset([argfile])) - ctx.actions.run( - inputs=depset(transitive=inputs), - outputs=[dummy], - executable=(getattr(ctx.executable, "_ClosureWorker", None) or - getattr(ctx.executable, "_ClosureWorkerAspect", None)), - arguments=["@@" + argfile.path], - mnemonic="Closure", - execution_requirements={"supports-workers": "1"}, - progress_message="Checking webfiles %s" % ctx.label) - else: - ctx.actions.write(output=dummy, content="BOO!") - manifests = depset([manifest], transitive=[manifests]) - return dummy, manifests + dummy = _new_file(ctx, "-webfiles.ignoreme") + manifests = depset(order = "postorder", transitive = [dep.manifests for dep in deps]) + if srcs: + args = [ + "WebfilesValidator", + "--dummy", + dummy.path, + "--target", + manifest.path, + ] + if hasattr(ctx, "attr") and hasattr(ctx.attr, "suppress"): + for category in ctx.attr.suppress: + args.append("--suppress") + args.append(category) + inputs = [] # list of depsets + inputs.append(depset([manifest] + srcs)) + direct_manifests = depset([dep.manifest for dep in deps]) + for dep in deps: + inputs.append(depset([dep.dummy])) + inputs.append(depset([dep.manifest])) + args.append("--direct_dep") + args.append(dep.manifest.path) + for man in difference(manifests, direct_manifests): + inputs.append(depset([man])) + args.append("--transitive_dep") + args.append(man.path) + argfile = _new_file(ctx, "-webfiles-checker-args.txt") + ctx.actions.write(output = argfile, content = "\n".join(args)) + inputs.append(depset([argfile])) + ctx.actions.run( + inputs = depset(transitive = inputs), + outputs = [dummy], + executable = (getattr(ctx.executable, "_ClosureWorker", None) or + getattr(ctx.executable, "_ClosureWorkerAspect", None)), + arguments = ["@@" + argfile.path], + mnemonic = "Closure", + execution_requirements = {"supports-workers": "1"}, + progress_message = "Checking webfiles %s" % ctx.label, + ) + else: + ctx.actions.write(output = dummy, content = "BOO!") + manifests = depset([manifest], transitive = [manifests]) + return dummy, manifests def _new_file(ctx, suffix): - return ctx.actions.declare_file("%s%s" % (ctx.label.name, suffix)) + return ctx.actions.declare_file("%s%s" % (ctx.label.name, suffix)) def _add_webpath(ctx, src, webpath, webpaths, new_webpaths, manifest_srcs): - if webpath in new_webpaths: - _fail(ctx, "multiple srcs within %s define the webpath %s " % ( - ctx.label, webpath)) - if webpath in webpaths.to_list(): - _fail(ctx, "webpath %s was defined by %s when already defined by deps" % ( - webpath, ctx.label)) - new_webpaths.append(webpath) - manifest_srcs.append(struct( - path=src.path, - longpath=long_path(ctx, src), - webpath=webpath)) + if webpath in new_webpaths: + _fail(ctx, "multiple srcs within %s define the webpath %s " % ( + ctx.label, + webpath, + )) + if webpath in webpaths.to_list(): + _fail(ctx, "webpath %s was defined by %s when already defined by deps" % ( + webpath, + ctx.label, + )) + new_webpaths.append(webpath) + manifest_srcs.append(struct( + path = src.path, + longpath = long_path(ctx, src), + webpath = webpath, + )) def _fail(ctx, message): - if ctx.attr.suppress == ["*"]: - print(message) - else: - fail(message) + if ctx.attr.suppress == ["*"]: + print(message) + else: + fail(message) def _get_path_relative_to_package(artifact): - """Returns file path relative to the package that declared it.""" - path = artifact.path - for prefix in (artifact.root.path, - artifact.owner.workspace_root if artifact.owner else '', - artifact.owner.package if artifact.owner else ''): - if prefix: - prefix = prefix + "/" - if not path.startswith(prefix): - fail("Path %s doesn't start with %s" % (path, prefix)) - path = path[len(prefix):] - return path + """Returns file path relative to the package that declared it.""" + path = artifact.path + for prefix in ( + artifact.root.path, + artifact.owner.workspace_root if artifact.owner else "", + artifact.owner.package if artifact.owner else "", + ): + if prefix: + prefix = prefix + "/" + if not path.startswith(prefix): + fail("Path %s doesn't start with %s" % (path, prefix)) + path = path[len(prefix):] + return path def _get_strip(ctx): - strip = ctx.attr.strip_prefix - if strip: - if strip.startswith("/"): - _fail(ctx, "strip_prefix should not end with /") - strip = strip[1:] - if strip.endswith("/"): - _fail(ctx, "strip_prefix should not end with /") - else: - strip += "/" - return strip + strip = ctx.attr.strip_prefix + if strip: + if strip.startswith("/"): + _fail(ctx, "strip_prefix should not end with /") + strip = strip[1:] + if strip.endswith("/"): + _fail(ctx, "strip_prefix should not end with /") + else: + strip += "/" + return strip tf_web_library = rule( - implementation=_tf_web_library, - executable=True, - attrs={ + implementation = _tf_web_library, + executable = True, + attrs = { "path": attr.string(), - "srcs": attr.label_list(allow_files=True), + "srcs": attr.label_list(allow_files = True), "deps": attr.label_list( - aspects=[closure_js_aspect] + aspects = [closure_js_aspect], ), "exports": attr.label_list(), - "data": attr.label_list(allow_files=True), + "data": attr.label_list(allow_files = True), "suppress": attr.string_list(), "strip_prefix": attr.string(), - "external_assets": attr.string_dict(default={"/_/runfiles": "."}), + "external_assets": attr.string_dict(default = {"/_/runfiles": "."}), "_WebfilesServer": attr.label( - default=Label("@io_bazel_rules_closure//java/io/bazel/rules/closure/webfiles/server:WebfilesServer"), - executable=True, - cfg="exec"), + default = Label("@io_bazel_rules_closure//java/io/bazel/rules/closure/webfiles/server:WebfilesServer"), + executable = True, + cfg = "exec", + ), "_ClosureWorker": CLOSURE_WORKER_ATTR, "_closure_library_base": CLOSURE_LIBRARY_BASE_ATTR, }, diff --git a/tensorboard/defs/zipper.bzl b/tensorboard/defs/zipper.bzl index a73763b037..8ea3f8edf5 100644 --- a/tensorboard/defs/zipper.bzl +++ b/tensorboard/defs/zipper.bzl @@ -14,47 +14,43 @@ """Rule for zipping Webfiles.""" -load("@io_bazel_rules_closure//closure/private:defs.bzl", "unfurl") +load("@io_bazel_rules_closure//closure/private:defs.bzl", "WebFilesInfo", "collect_runfiles", "extract_providers", "unfurl") def _tensorboard_zip_file(ctx): - deps = unfurl(ctx.attr.deps, provider="webfiles") - manifests = depset(order="postorder") - files = depset() - webpaths = depset() - for dep in deps: - manifests = depset(transitive=[manifests, dep.webfiles.manifests]) - webpaths = depset(transitive=[webpaths, dep.webfiles.webpaths]) - files = depset(transitive=[files, dep.data_runfiles.files]) - ctx.actions.run( - mnemonic="Zipper", - inputs=depset(transitive=[manifests, files]).to_list(), - outputs=[ctx.outputs.zip], - executable=ctx.executable._Zipper, - arguments=([ctx.outputs.zip.path] + - [m.path for m in manifests.to_list()]), - progress_message="Zipping %d files" % len(webpaths.to_list())) - transitive_runfiles = depset() - for dep in deps: - transitive_runfiles = depset(transitive=[ - transitive_runfiles, - dep.data_runfiles.files, - ]) - return struct( - files=depset([ctx.outputs.zip]), - runfiles=ctx.runfiles( - files=ctx.files.data + [ctx.outputs.zip], - transitive_files=transitive_runfiles)) + deps = extract_providers(ctx.attr.deps, provider = WebFilesInfo) + deps = unfurl(deps) + manifests = depset(order = "postorder", transitive = [dep.manifests for dep in deps]) + webpaths = depset(transitive = [dep.webpaths for dep in deps]) + files = depset(transitive = [dep[DefaultInfo].data_runfiles.files for dep in ctx.attr.deps]) + ctx.actions.run( + mnemonic = "Zipper", + inputs = depset(transitive = [manifests, files]).to_list(), + outputs = [ctx.outputs.zip], + executable = ctx.executable._Zipper, + arguments = ([ctx.outputs.zip.path] + + [m.path for m in manifests.to_list()]), + progress_message = "Zipping %d files" % len(webpaths.to_list()), + ) + return DefaultInfo( + files = depset([ctx.outputs.zip]), + runfiles = collect_runfiles( + ctx, + files = ctx.files.data + [ctx.outputs.zip], + ), + ) tensorboard_zip_file = rule( - implementation=_tensorboard_zip_file, - attrs={ - "data": attr.label_list(allow_files=True), - "deps": attr.label_list(providers=["webfiles"], mandatory=True), + implementation = _tensorboard_zip_file, + attrs = { + "data": attr.label_list(allow_files = True), + "deps": attr.label_list(providers = [WebFilesInfo], mandatory = True), "_Zipper": attr.label( - default=Label("//tensorboard/java/org/tensorflow/tensorboard/vulcanize:Zipper"), - executable=True, - cfg="exec"), + default = Label("//tensorboard/java/org/tensorflow/tensorboard/vulcanize:Zipper"), + executable = True, + cfg = "exec", + ), }, - outputs={ + outputs = { "zip": "%{name}.zip", - }) + }, +) diff --git a/third_party/fonts.bzl b/third_party/fonts.bzl index 7136dd184e..8635f18622 100644 --- a/third_party/fonts.bzl +++ b/third_party/fonts.bzl @@ -15,902 +15,902 @@ load("@io_bazel_rules_closure//closure:defs.bzl", "filegroup_external") def tensorboard_fonts_workspace(): - """Downloads TensorBoard fonts.""" + """Downloads TensorBoard fonts.""" - # bazel run //tensorboard/tools:import_google_fonts -- --url='https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic,500,500italic,700,700italic;https://fonts.googleapis.com/css?family=Roboto+Mono:400,700' - filegroup_external( - name = "com_google_fonts_roboto", - licenses = ["notice"], # Apache 2.0 - sha256_urls = { - "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4": [ - "http://mirror.tensorflow.org/raw.githubusercontent.com/google/roboto/ba03b84b90b50afd99f9688059447bc545e5c0e1/LICENSE", - "https://raw.githubusercontent.com/google/roboto/ba03b84b90b50afd99f9688059447bc545e5c0e1/LICENSE", - ], - # Roboto (cyrillic) - "41720926981ffb6dc229f06fc0bbf0f43e45ba032d126726ebee481c2a6559e2": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto (cyrillic-ext) - "90a0ad0b48861588a6e33a5905b17e1219ea87ab6f07ccc41e7c2cddf38967a8": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto (greek) - "949e287846b0940817e4ea0f65accc4481a46b8733dc12aa0265293a4645c661": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto (greek-ext) - "e5b2e29a16d8ef4c5a123b40786af72da589c4aad634eab40d90eef8bb4418aa": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto (latin) - "4352380f92ce7f9a4a4a23306b992bed10055dbfffe90987cc72083e583fc280": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2", - "https://fonts.gstatic.com/s/roboto/v18/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2", - ], - # Roboto (latin-ext) - "80fa23b4804621ce7f16b5c56d524dd90ea09d792622eeac9adf0ee6317b9e3a": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto (vietnamese) - "a0a893b2ff1c82d49ac0c09ace71cf8178c0830f6a988103c779b6fc12c0da78": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2", - "https://fonts.gstatic.com/s/roboto/v18/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2", - ], - # Roboto Bold (cyrillic) - "6082aa2f5aab855120cd58f560f58975579097c484d23cc7854977a529f91bc4": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold (cyrillic-ext) - "616eb767627d16bef2b9be2218bb5f1bbbb97cfbd06c4e5241c8b532b56467aa": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold (greek) - "28959a3f1fea0c7f7feca26f92465f5263f2e8fdec17030e0e7a9e6a8cb321af": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold (greek-ext) - "e94a5635cb68464d332cd374fd57b95913fc5b549f1967fbb73829b2084efd98": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold (latin) - "1be216dbc059d96e288b0c1f399a1a80ee8c65e4c1272dbc4574bd6d23cf45d9": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2", - "https://fonts.gstatic.com/s/roboto/v18/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2", - ], - # Roboto Bold (latin-ext) - "6c8be972381d4da037f47c33ef1e31b88f0130ded1432730d4d792331f983839": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold (vietnamese) - "5f162f1ca2441cae368e97ed42b56332d7b68b1ffbbf9f7e4b648420667acee5": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Bold Italic (cyrillic) - "bb4e478b0fe2ae7fbd6369c94d126060ffa697df189d7f3653f23f521f906cd8": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC14sYYdJg5dU2qzJEVSuta0.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC14sYYdJg5dU2qzJEVSuta0.woff2", - ], - # Roboto Bold Italic (cyrillic-ext) - "9fc911647b05ecdbadfe6693d6ff306a0a34829999b2055ad2e474e3ad0b778d": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC_ZraR2Tg8w2lzm7kLNL0-w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC_ZraR2Tg8w2lzm7kLNL0-w.woff2", - ], - # Roboto Bold Italic (greek) - "62509e2b63168ae83848cb3f76d2c47177de8618ac918af119cc7ae90c71213b": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcCwt_Rm691LTebKfY2ZkKSmI.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcCwt_Rm691LTebKfY2ZkKSmI.woff2", - ], - # Roboto Bold Italic (greek-ext) - "07a2e7b4a480176f0f0bc9f7ca757d8467bf41f86e3b1eed374be06ff1b51b56": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC1BW26QxpSj-_ZKm_xT4hWw.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC1BW26QxpSj-_ZKm_xT4hWw.woff2", - ], - # Roboto Bold Italic (latin) - "556e09ad66d48078d2ea341eff36e93dafdb56fed15e9d92e052a7cb3910e2e9": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC4gp9Q8gbYrhqGlRav_IXfk.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC4gp9Q8gbYrhqGlRav_IXfk.woff2", - ], - # Roboto Bold Italic (latin-ext) - "5f6115b8655a4e9e0bb6440956b2d7b7d52e90193c6be53731fcf97d1fc45ec3": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC6E8kM4xWR1_1bYURRojRGc.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC6E8kM4xWR1_1bYURRojRGc.woff2", - ], - # Roboto Bold Italic (vietnamese) - "b75ce2f4333ea21c1d0aeb0061edcf81b7fffe022a732dae52834a8b62615c5f": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - ], - # Roboto Italic (cyrillic) - "38602b65e115ae1b267627d5533c2607f446aba939b9ca9143cc4373bd285b83": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OpXUqTo0UgQQhGj_SFdLWBkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OpXUqTo0UgQQhGj_SFdLWBkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Italic (cyrillic-ext) - "d04ce842e235d3e6abfcd37d6598138007f56e391a035167d78edf9088d3035a": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/WxrXJa0C3KdtC7lMafG4dRkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/WxrXJa0C3KdtC7lMafG4dRkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Italic (greek) - "aa9a8db3e6de8124291c3f2fd0bbd0aca8c796f365204d78414536067115be07": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/cDKhRaXnQTOVbaoxwdOr9xkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/cDKhRaXnQTOVbaoxwdOr9xkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Italic (greek-ext) - "785896def5be5b35967d63f5589ce67fc8d3b452153a37323a4d9b886d828c60": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/1hZf02POANh32k2VkgEoUBkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/1hZf02POANh32k2VkgEoUBkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Italic (latin) - "64565561ddb338a11ffce5b84aa53fa6e8fd203c34208e61eb5602cd08bf527f": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2", - "https://fonts.gstatic.com/s/roboto/v18/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2", - ], - # Roboto Italic (latin-ext) - "d5b2d7e9efe90feef0c4507d90b2b4e464c6929efd05ad4294d3d5057db57b97": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/vSzulfKSK0LLjjfeaxcREhkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/vSzulfKSK0LLjjfeaxcREhkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Italic (vietnamese) - "5d875731e35140f94bc4cb23944d104688d3c6d372833ddae8d22d3aa802beb4": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/K23cxWVTrIFD6DJsEVi07RkAz4rYn47Zy2rvigWQf6w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/K23cxWVTrIFD6DJsEVi07RkAz4rYn47Zy2rvigWQf6w.woff2", - ], - # Roboto Light (cyrillic) - "cb94537350a4c593515c0b9066a22f0d74284173b88521c50b894a3179402e46": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light (cyrillic-ext) - "66a095c96771a94d2772c7e19a32c6585d4bed3a989faa9e595bb270a2621608": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light (greek) - "f0e3a88ae70245bcac12d2640792e50a165ce618d3b5979b735913e582d204f7": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light (greek-ext) - "40a162d49fd25da223ea81454616f469270020fc186fe2f109534fb1f72e1bcb": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light (latin) - "f7c386915e39d8a925fe10d15744a9da95ac8f90423e12728e7fc3c5e34f4559": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2", - "https://fonts.gstatic.com/s/roboto/v18/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2", - ], - # Roboto Light (latin-ext) - "bbeeb150a0f72cbd898ba36ed908bb95ef2386d41158c943aa3af4e0c8430639": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light (vietnamese) - "5a4e99d1db8c9fd38f6b1c92582c2351cf27075f5ccef89404a8d673fa8e7b26": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Light Italic (cyrillic) - "4160dc56c5afc7320243a73cdf025d1c64ea19e035b98bad9c170e37c98ee5e2": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at14sYYdJg5dU2qzJEVSuta0.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at14sYYdJg5dU2qzJEVSuta0.woff2", - ], - # Roboto Light Italic (cyrillic-ext) - "d95d953cff5e309f22a680e48981070d2cbebf75daba25b078834bf0c4f143e4": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at_ZraR2Tg8w2lzm7kLNL0-w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at_ZraR2Tg8w2lzm7kLNL0-w.woff2", - ], - # Roboto Light Italic (greek) - "8d649207dfd9e6f53614ee7ee8e0865789e38b39244ab1546ee5117ab6f6ed2f": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0atwt_Rm691LTebKfY2ZkKSmI.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0atwt_Rm691LTebKfY2ZkKSmI.woff2", - ], - # Roboto Light Italic (greek-ext) - "a1153c52da99d21ed2f036e5849c3b2a5d7d3d5913d63ceac983d388288420b4": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at1BW26QxpSj-_ZKm_xT4hWw.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at1BW26QxpSj-_ZKm_xT4hWw.woff2", - ], - # Roboto Light Italic (latin) - "c4fc2fd6457f67718ccff3434f39a84a83be98defa8e23ac1942580ea53a925e": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at4gp9Q8gbYrhqGlRav_IXfk.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at4gp9Q8gbYrhqGlRav_IXfk.woff2", - ], - # Roboto Light Italic (latin-ext) - "fd5b96eb1adc32b3fd7823f6a9e3c14122a060d5665091c33d9243f2541b016c": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at6E8kM4xWR1_1bYURRojRGc.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at6E8kM4xWR1_1bYURRojRGc.woff2", - ], - # Roboto Light Italic (vietnamese) - "ced9470e7e60d5edeccf4d3a0ab2f57ef653ec9de3097e6950bc06c64157aa5a": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - ], - # Roboto Medium (cyrillic) - "74f08a5b16db96fd23eeca2c2e6c354d08a95b3360aa2bb6ea0890517bb10469": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium (cyrillic-ext) - "2aa57d00d0cac3b30aef28a19e9cfea12b45daf9562b4fa623750c8145c0767b": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium (greek) - "b95a36dd1483f97002a0c8aba87106f7fefbd67f22bc25a2bf21352bb4f316ef": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium (greek-ext) - "399cdbc9a94414d94fb15b0386888c6bc8ce4d6140cc3a9a571406a76cf47bb5": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium (latin) - "b79781efede37903be212fcdf63955e41c8649e678b6b83adf824459d240a188": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2", - "https://fonts.gstatic.com/s/roboto/v18/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2", - ], - # Roboto Medium (latin-ext) - "ba99e38768dd8358450dc363431400b1642c7cd7e5b47830e30aa8ec80fb4790": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium (vietnamese) - "e785fcb2332a43e5f489c0e7457001a93800b459bdf5173cffbb880f350077eb": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2", - "https://fonts.gstatic.com/s/roboto/v18/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2", - ], - # Roboto Medium Italic (cyrillic) - "e9f24fd84cfbdad488d4f05d97ca2e009af8248044def329f0c78c04e12c32cb": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0V4sYYdJg5dU2qzJEVSuta0.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0V4sYYdJg5dU2qzJEVSuta0.woff2", - ], - # Roboto Medium Italic (cyrillic-ext) - "ecfda0e4317641a395971d71435ad1a3dce0499bccc9bcdcaaebffb714588a4e": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0fZraR2Tg8w2lzm7kLNL0-w.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0fZraR2Tg8w2lzm7kLNL0-w.woff2", - ], - # Roboto Medium Italic (greek) - "510c1001aa3c1ae574eba6eaa5a404414dd0f5d5cd8c213fe0fac404c1fbbd7c": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Qt_Rm691LTebKfY2ZkKSmI.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Qt_Rm691LTebKfY2ZkKSmI.woff2", - ], - # Roboto Medium Italic (greek-ext) - "e5343e5d46125f688c2f266369983a1f92dbefa8d16f131b09768cdd4a5cebd4": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0VBW26QxpSj-_ZKm_xT4hWw.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0VBW26QxpSj-_ZKm_xT4hWw.woff2", - ], - # Roboto Medium Italic (latin) - "76d779c16f21b55a95fb182bf7552447ee340d15556e53a99dd789383f6d8c32": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Ygp9Q8gbYrhqGlRav_IXfk.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Ygp9Q8gbYrhqGlRav_IXfk.woff2", - ], - # Roboto Medium Italic (latin-ext) - "a69b0c33d809b7aac3e9648bfc995bc38cd5e426efeb006dc3b31523f4867f73": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0aE8kM4xWR1_1bYURRojRGc.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0aE8kM4xWR1_1bYURRojRGc.woff2", - ], - # Roboto Medium Italic (vietnamese) - "2c94704be76a8ec87995f3427911e50987cfcaa13c5749c770419559fe836509": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0dDiNsR5a-9Oe_Ivpu8XWlY.woff2", - "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0dDiNsR5a-9Oe_Ivpu8XWlY.woff2", - ], - # Roboto Mono (cyrillic) - "2c9fae8205ea404d8400b9731423d5f8261788efcb26b651ad1031c70c895824": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY14sYYdJg5dU2qzJEVSuta0.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY14sYYdJg5dU2qzJEVSuta0.woff2", - ], - # Roboto Mono (cyrillic-ext) - "671d1df350d3ccfd9a5ebbc9e92810a274d6215a648099f0f6e3e256b2bdae02": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY_ZraR2Tg8w2lzm7kLNL0-w.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY_ZraR2Tg8w2lzm7kLNL0-w.woff2", - ], - # Roboto Mono (greek) - "eb84188b287e62e965be53c788b6562554cefcc0a3520f792ba91bb60d40e607": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpYwt_Rm691LTebKfY2ZkKSmI.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpYwt_Rm691LTebKfY2ZkKSmI.woff2", - ], - # Roboto Mono (greek-ext) - "978a5db5af1654146da5ec93980c273df7010a2d045f1360ac3b9d85bd890299": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY1BW26QxpSj-_ZKm_xT4hWw.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY1BW26QxpSj-_ZKm_xT4hWw.woff2", - ], - # Roboto Mono (latin) - "ecc28128233f90171df8f8915d60cdc59ff70b9194e1d93061816d3e3cd1f320": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY4gp9Q8gbYrhqGlRav_IXfk.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY4gp9Q8gbYrhqGlRav_IXfk.woff2", - ], - # Roboto Mono (latin-ext) - "9a7b6e1f38e9a47867ad5c2f403ff4f4477a03bbec300d4e345bf67d5d0da262": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY6E8kM4xWR1_1bYURRojRGc.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY6E8kM4xWR1_1bYURRojRGc.woff2", - ], - # Roboto Mono (vietnamese) - "b568a2d630d5924e40b73489cc4a8720fb9fb0249b8117d6d45cfc95d249c1da": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY9DiNsR5a-9Oe_Ivpu8XWlY.woff2", - ], - # Roboto Mono Bold (cyrillic) - "656e4cb0b042d18f6b889948f3c9a1f87b70340bd20a38a0d738b0e32a7f00ee": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1x-M1I1w5OMiqnVF8xBLhU.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1x-M1I1w5OMiqnVF8xBLhU.woff2", - ], - # Roboto Mono Bold (cyrillic-ext) - "0d5221a5f914d57a674049b718a37b8f09a0e79647af8b187273f35ab0d8376c": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59FzwXaAXup5mZlfK6xRLrhsco.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59FzwXaAXup5mZlfK6xRLrhsco.woff2", - ], - # Roboto Mono Bold (greek) - "41553f58ea074adde7eaaefe9b220b49021128f6b68b8be384072c4db430603f": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fzwn6Wqxo-xwxilDXPU8chVU.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fzwn6Wqxo-xwxilDXPU8chVU.woff2", - ], - # Roboto Mono Bold (greek-ext) - "27798d63b7fadca6c6a2d17ea7673855d44baf75e8172fa9749888898ce04125": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1T7aJLK6nKpn36IMwTcMMc.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1T7aJLK6nKpn36IMwTcMMc.woff2", - ], - # Roboto Mono Bold (latin) - "8b827f046df0acf54d80954ae05f0b5e87fdf09bc4c1bf02e8edb0d928e259b7": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz_79_ZuUxCigM2DespTnFaw.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz_79_ZuUxCigM2DespTnFaw.woff2", - ], - # Roboto Mono Bold (latin-ext) - "b38383e889863e1c25c2334087e6b00835cef283f8448c8b2a2d5d51489d202b": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz4gd9OEPUCN3AdYW0e8tat4.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz4gd9OEPUCN3AdYW0e8tat4.woff2", - ], - # Roboto Mono Bold (vietnamese) - "03b9c55ee9bf53c57c9b9dcb739bc92ada5b97fc81deb5a57e4e8347c4eee8bb": [ - "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz8bIQSYZnWLaWC9QNCpTK_U.woff2", - "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz8bIQSYZnWLaWC9QNCpTK_U.woff2", - ], - }, - generated_rule_name = "files", - extra_build_file_content = "\n".join([ - 'load("@io_bazel_rules_closure//closure:defs.bzl", "web_library")', - '', - 'licenses(["notice"]) # Apache 2.0', - '', - 'exports_files(["LICENSE"]) # Apache 2.0', - '', - 'web_library(', - ' name = "com_google_fonts_roboto",', - ' path = "/font-roboto",', - ' srcs = [', - ' "roboto.html",', - ' ":files",', - ' ],', - ')', - '', - 'genrule(', - ' name = "html",', - ' outs = ["roboto.html"],', - ' cmd = "\\n".join([', - ' "cat <<\'EOF\' >$@",', - " '',", - " '',", - " '',", - " '',", - ' "EOF",', - ' ]),', - ')', - ]), - ) + # bazel run //tensorboard/tools:import_google_fonts -- --url='https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic,500,500italic,700,700italic;https://fonts.googleapis.com/css?family=Roboto+Mono:400,700' + filegroup_external( + name = "com_google_fonts_roboto", + licenses = ["notice"], # Apache 2.0 + sha256_urls = { + "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4": [ + "http://mirror.tensorflow.org/raw.githubusercontent.com/google/roboto/ba03b84b90b50afd99f9688059447bc545e5c0e1/LICENSE", + "https://raw.githubusercontent.com/google/roboto/ba03b84b90b50afd99f9688059447bc545e5c0e1/LICENSE", + ], + # Roboto (cyrillic) + "41720926981ffb6dc229f06fc0bbf0f43e45ba032d126726ebee481c2a6559e2": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto (cyrillic-ext) + "90a0ad0b48861588a6e33a5905b17e1219ea87ab6f07ccc41e7c2cddf38967a8": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto (greek) + "949e287846b0940817e4ea0f65accc4481a46b8733dc12aa0265293a4645c661": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto (greek-ext) + "e5b2e29a16d8ef4c5a123b40786af72da589c4aad634eab40d90eef8bb4418aa": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto (latin) + "4352380f92ce7f9a4a4a23306b992bed10055dbfffe90987cc72083e583fc280": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2", + "https://fonts.gstatic.com/s/roboto/v18/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2", + ], + # Roboto (latin-ext) + "80fa23b4804621ce7f16b5c56d524dd90ea09d792622eeac9adf0ee6317b9e3a": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto (vietnamese) + "a0a893b2ff1c82d49ac0c09ace71cf8178c0830f6a988103c779b6fc12c0da78": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2", + "https://fonts.gstatic.com/s/roboto/v18/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2", + ], + # Roboto Bold (cyrillic) + "6082aa2f5aab855120cd58f560f58975579097c484d23cc7854977a529f91bc4": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/isZ-wbCXNKAbnjo6_TwHToX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold (cyrillic-ext) + "616eb767627d16bef2b9be2218bb5f1bbbb97cfbd06c4e5241c8b532b56467aa": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/77FXFjRbGzN4aCrSFhlh3oX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold (greek) + "28959a3f1fea0c7f7feca26f92465f5263f2e8fdec17030e0e7a9e6a8cb321af": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/jSN2CGVDbcVyCnfJfjSdfIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold (greek-ext) + "e94a5635cb68464d332cd374fd57b95913fc5b549f1967fbb73829b2084efd98": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/UX6i4JxQDm3fVTc1CPuwqoX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold (latin) + "1be216dbc059d96e288b0c1f399a1a80ee8c65e4c1272dbc4574bd6d23cf45d9": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2", + "https://fonts.gstatic.com/s/roboto/v18/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2", + ], + # Roboto Bold (latin-ext) + "6c8be972381d4da037f47c33ef1e31b88f0130ded1432730d4d792331f983839": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/97uahxiqZRoncBaCEI3aW4X0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold (vietnamese) + "5f162f1ca2441cae368e97ed42b56332d7b68b1ffbbf9f7e4b648420667acee5": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/PwZc-YbIL414wB9rB1IAPYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Bold Italic (cyrillic) + "bb4e478b0fe2ae7fbd6369c94d126060ffa697df189d7f3653f23f521f906cd8": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC14sYYdJg5dU2qzJEVSuta0.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC14sYYdJg5dU2qzJEVSuta0.woff2", + ], + # Roboto Bold Italic (cyrillic-ext) + "9fc911647b05ecdbadfe6693d6ff306a0a34829999b2055ad2e474e3ad0b778d": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC_ZraR2Tg8w2lzm7kLNL0-w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC_ZraR2Tg8w2lzm7kLNL0-w.woff2", + ], + # Roboto Bold Italic (greek) + "62509e2b63168ae83848cb3f76d2c47177de8618ac918af119cc7ae90c71213b": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcCwt_Rm691LTebKfY2ZkKSmI.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcCwt_Rm691LTebKfY2ZkKSmI.woff2", + ], + # Roboto Bold Italic (greek-ext) + "07a2e7b4a480176f0f0bc9f7ca757d8467bf41f86e3b1eed374be06ff1b51b56": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC1BW26QxpSj-_ZKm_xT4hWw.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC1BW26QxpSj-_ZKm_xT4hWw.woff2", + ], + # Roboto Bold Italic (latin) + "556e09ad66d48078d2ea341eff36e93dafdb56fed15e9d92e052a7cb3910e2e9": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC4gp9Q8gbYrhqGlRav_IXfk.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC4gp9Q8gbYrhqGlRav_IXfk.woff2", + ], + # Roboto Bold Italic (latin-ext) + "5f6115b8655a4e9e0bb6440956b2d7b7d52e90193c6be53731fcf97d1fc45ec3": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC6E8kM4xWR1_1bYURRojRGc.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC6E8kM4xWR1_1bYURRojRGc.woff2", + ], + # Roboto Bold Italic (vietnamese) + "b75ce2f4333ea21c1d0aeb0061edcf81b7fffe022a732dae52834a8b62615c5f": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + "https://fonts.gstatic.com/s/roboto/v18/t6Nd4cfPRhZP44Q5QAjcC9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + ], + # Roboto Italic (cyrillic) + "38602b65e115ae1b267627d5533c2607f446aba939b9ca9143cc4373bd285b83": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OpXUqTo0UgQQhGj_SFdLWBkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OpXUqTo0UgQQhGj_SFdLWBkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Italic (cyrillic-ext) + "d04ce842e235d3e6abfcd37d6598138007f56e391a035167d78edf9088d3035a": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/WxrXJa0C3KdtC7lMafG4dRkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/WxrXJa0C3KdtC7lMafG4dRkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Italic (greek) + "aa9a8db3e6de8124291c3f2fd0bbd0aca8c796f365204d78414536067115be07": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/cDKhRaXnQTOVbaoxwdOr9xkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/cDKhRaXnQTOVbaoxwdOr9xkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Italic (greek-ext) + "785896def5be5b35967d63f5589ce67fc8d3b452153a37323a4d9b886d828c60": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/1hZf02POANh32k2VkgEoUBkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/1hZf02POANh32k2VkgEoUBkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Italic (latin) + "64565561ddb338a11ffce5b84aa53fa6e8fd203c34208e61eb5602cd08bf527f": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2", + "https://fonts.gstatic.com/s/roboto/v18/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2", + ], + # Roboto Italic (latin-ext) + "d5b2d7e9efe90feef0c4507d90b2b4e464c6929efd05ad4294d3d5057db57b97": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/vSzulfKSK0LLjjfeaxcREhkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/vSzulfKSK0LLjjfeaxcREhkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Italic (vietnamese) + "5d875731e35140f94bc4cb23944d104688d3c6d372833ddae8d22d3aa802beb4": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/K23cxWVTrIFD6DJsEVi07RkAz4rYn47Zy2rvigWQf6w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/K23cxWVTrIFD6DJsEVi07RkAz4rYn47Zy2rvigWQf6w.woff2", + ], + # Roboto Light (cyrillic) + "cb94537350a4c593515c0b9066a22f0d74284173b88521c50b894a3179402e46": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light (cyrillic-ext) + "66a095c96771a94d2772c7e19a32c6585d4bed3a989faa9e595bb270a2621608": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light (greek) + "f0e3a88ae70245bcac12d2640792e50a165ce618d3b5979b735913e582d204f7": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light (greek-ext) + "40a162d49fd25da223ea81454616f469270020fc186fe2f109534fb1f72e1bcb": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light (latin) + "f7c386915e39d8a925fe10d15744a9da95ac8f90423e12728e7fc3c5e34f4559": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2", + "https://fonts.gstatic.com/s/roboto/v18/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2", + ], + # Roboto Light (latin-ext) + "bbeeb150a0f72cbd898ba36ed908bb95ef2386d41158c943aa3af4e0c8430639": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light (vietnamese) + "5a4e99d1db8c9fd38f6b1c92582c2351cf27075f5ccef89404a8d673fa8e7b26": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Light Italic (cyrillic) + "4160dc56c5afc7320243a73cdf025d1c64ea19e035b98bad9c170e37c98ee5e2": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at14sYYdJg5dU2qzJEVSuta0.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at14sYYdJg5dU2qzJEVSuta0.woff2", + ], + # Roboto Light Italic (cyrillic-ext) + "d95d953cff5e309f22a680e48981070d2cbebf75daba25b078834bf0c4f143e4": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at_ZraR2Tg8w2lzm7kLNL0-w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at_ZraR2Tg8w2lzm7kLNL0-w.woff2", + ], + # Roboto Light Italic (greek) + "8d649207dfd9e6f53614ee7ee8e0865789e38b39244ab1546ee5117ab6f6ed2f": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0atwt_Rm691LTebKfY2ZkKSmI.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0atwt_Rm691LTebKfY2ZkKSmI.woff2", + ], + # Roboto Light Italic (greek-ext) + "a1153c52da99d21ed2f036e5849c3b2a5d7d3d5913d63ceac983d388288420b4": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at1BW26QxpSj-_ZKm_xT4hWw.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at1BW26QxpSj-_ZKm_xT4hWw.woff2", + ], + # Roboto Light Italic (latin) + "c4fc2fd6457f67718ccff3434f39a84a83be98defa8e23ac1942580ea53a925e": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at4gp9Q8gbYrhqGlRav_IXfk.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at4gp9Q8gbYrhqGlRav_IXfk.woff2", + ], + # Roboto Light Italic (latin-ext) + "fd5b96eb1adc32b3fd7823f6a9e3c14122a060d5665091c33d9243f2541b016c": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at6E8kM4xWR1_1bYURRojRGc.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at6E8kM4xWR1_1bYURRojRGc.woff2", + ], + # Roboto Light Italic (vietnamese) + "ced9470e7e60d5edeccf4d3a0ab2f57ef653ec9de3097e6950bc06c64157aa5a": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + "https://fonts.gstatic.com/s/roboto/v18/7m8l7TlFO-S3VkhHuR0at9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + ], + # Roboto Medium (cyrillic) + "74f08a5b16db96fd23eeca2c2e6c354d08a95b3360aa2bb6ea0890517bb10469": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/oHi30kwQWvpCWqAhzHcCSIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium (cyrillic-ext) + "2aa57d00d0cac3b30aef28a19e9cfea12b45daf9562b4fa623750c8145c0767b": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/ZLqKeelYbATG60EpZBSDy4X0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium (greek) + "b95a36dd1483f97002a0c8aba87106f7fefbd67f22bc25a2bf21352bb4f316ef": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/mx9Uck6uB63VIKFYnEMXrYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium (greek-ext) + "399cdbc9a94414d94fb15b0386888c6bc8ce4d6140cc3a9a571406a76cf47bb5": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/rGvHdJnr2l75qb0YND9NyIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium (latin) + "b79781efede37903be212fcdf63955e41c8649e678b6b83adf824459d240a188": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2", + "https://fonts.gstatic.com/s/roboto/v18/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2", + ], + # Roboto Medium (latin-ext) + "ba99e38768dd8358450dc363431400b1642c7cd7e5b47830e30aa8ec80fb4790": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/oOeFwZNlrTefzLYmlVV1UIX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium (vietnamese) + "e785fcb2332a43e5f489c0e7457001a93800b459bdf5173cffbb880f350077eb": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2", + "https://fonts.gstatic.com/s/roboto/v18/mbmhprMH69Zi6eEPBYVFhYX0hVgzZQUfRDuZrPvH3D8.woff2", + ], + # Roboto Medium Italic (cyrillic) + "e9f24fd84cfbdad488d4f05d97ca2e009af8248044def329f0c78c04e12c32cb": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0V4sYYdJg5dU2qzJEVSuta0.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0V4sYYdJg5dU2qzJEVSuta0.woff2", + ], + # Roboto Medium Italic (cyrillic-ext) + "ecfda0e4317641a395971d71435ad1a3dce0499bccc9bcdcaaebffb714588a4e": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0fZraR2Tg8w2lzm7kLNL0-w.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0fZraR2Tg8w2lzm7kLNL0-w.woff2", + ], + # Roboto Medium Italic (greek) + "510c1001aa3c1ae574eba6eaa5a404414dd0f5d5cd8c213fe0fac404c1fbbd7c": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Qt_Rm691LTebKfY2ZkKSmI.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Qt_Rm691LTebKfY2ZkKSmI.woff2", + ], + # Roboto Medium Italic (greek-ext) + "e5343e5d46125f688c2f266369983a1f92dbefa8d16f131b09768cdd4a5cebd4": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0VBW26QxpSj-_ZKm_xT4hWw.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0VBW26QxpSj-_ZKm_xT4hWw.woff2", + ], + # Roboto Medium Italic (latin) + "76d779c16f21b55a95fb182bf7552447ee340d15556e53a99dd789383f6d8c32": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Ygp9Q8gbYrhqGlRav_IXfk.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Ygp9Q8gbYrhqGlRav_IXfk.woff2", + ], + # Roboto Medium Italic (latin-ext) + "a69b0c33d809b7aac3e9648bfc995bc38cd5e426efeb006dc3b31523f4867f73": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0aE8kM4xWR1_1bYURRojRGc.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0aE8kM4xWR1_1bYURRojRGc.woff2", + ], + # Roboto Medium Italic (vietnamese) + "2c94704be76a8ec87995f3427911e50987cfcaa13c5749c770419559fe836509": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0dDiNsR5a-9Oe_Ivpu8XWlY.woff2", + "https://fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0dDiNsR5a-9Oe_Ivpu8XWlY.woff2", + ], + # Roboto Mono (cyrillic) + "2c9fae8205ea404d8400b9731423d5f8261788efcb26b651ad1031c70c895824": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY14sYYdJg5dU2qzJEVSuta0.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY14sYYdJg5dU2qzJEVSuta0.woff2", + ], + # Roboto Mono (cyrillic-ext) + "671d1df350d3ccfd9a5ebbc9e92810a274d6215a648099f0f6e3e256b2bdae02": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY_ZraR2Tg8w2lzm7kLNL0-w.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY_ZraR2Tg8w2lzm7kLNL0-w.woff2", + ], + # Roboto Mono (greek) + "eb84188b287e62e965be53c788b6562554cefcc0a3520f792ba91bb60d40e607": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpYwt_Rm691LTebKfY2ZkKSmI.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpYwt_Rm691LTebKfY2ZkKSmI.woff2", + ], + # Roboto Mono (greek-ext) + "978a5db5af1654146da5ec93980c273df7010a2d045f1360ac3b9d85bd890299": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY1BW26QxpSj-_ZKm_xT4hWw.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY1BW26QxpSj-_ZKm_xT4hWw.woff2", + ], + # Roboto Mono (latin) + "ecc28128233f90171df8f8915d60cdc59ff70b9194e1d93061816d3e3cd1f320": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY4gp9Q8gbYrhqGlRav_IXfk.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY4gp9Q8gbYrhqGlRav_IXfk.woff2", + ], + # Roboto Mono (latin-ext) + "9a7b6e1f38e9a47867ad5c2f403ff4f4477a03bbec300d4e345bf67d5d0da262": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY6E8kM4xWR1_1bYURRojRGc.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY6E8kM4xWR1_1bYURRojRGc.woff2", + ], + # Roboto Mono (vietnamese) + "b568a2d630d5924e40b73489cc4a8720fb9fb0249b8117d6d45cfc95d249c1da": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/hMqPNLsu_dywMa4C_DEpY9DiNsR5a-9Oe_Ivpu8XWlY.woff2", + ], + # Roboto Mono Bold (cyrillic) + "656e4cb0b042d18f6b889948f3c9a1f87b70340bd20a38a0d738b0e32a7f00ee": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1x-M1I1w5OMiqnVF8xBLhU.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1x-M1I1w5OMiqnVF8xBLhU.woff2", + ], + # Roboto Mono Bold (cyrillic-ext) + "0d5221a5f914d57a674049b718a37b8f09a0e79647af8b187273f35ab0d8376c": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59FzwXaAXup5mZlfK6xRLrhsco.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59FzwXaAXup5mZlfK6xRLrhsco.woff2", + ], + # Roboto Mono Bold (greek) + "41553f58ea074adde7eaaefe9b220b49021128f6b68b8be384072c4db430603f": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fzwn6Wqxo-xwxilDXPU8chVU.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fzwn6Wqxo-xwxilDXPU8chVU.woff2", + ], + # Roboto Mono Bold (greek-ext) + "27798d63b7fadca6c6a2d17ea7673855d44baf75e8172fa9749888898ce04125": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1T7aJLK6nKpn36IMwTcMMc.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz1T7aJLK6nKpn36IMwTcMMc.woff2", + ], + # Roboto Mono Bold (latin) + "8b827f046df0acf54d80954ae05f0b5e87fdf09bc4c1bf02e8edb0d928e259b7": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz_79_ZuUxCigM2DespTnFaw.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz_79_ZuUxCigM2DespTnFaw.woff2", + ], + # Roboto Mono Bold (latin-ext) + "b38383e889863e1c25c2334087e6b00835cef283f8448c8b2a2d5d51489d202b": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz4gd9OEPUCN3AdYW0e8tat4.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz4gd9OEPUCN3AdYW0e8tat4.woff2", + ], + # Roboto Mono Bold (vietnamese) + "03b9c55ee9bf53c57c9b9dcb739bc92ada5b97fc81deb5a57e4e8347c4eee8bb": [ + "http://mirror.tensorflow.org/fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz8bIQSYZnWLaWC9QNCpTK_U.woff2", + "https://fonts.gstatic.com/s/robotomono/v5/N4duVc9C58uwPiY8_59Fz8bIQSYZnWLaWC9QNCpTK_U.woff2", + ], + }, + generated_rule_name = "files", + extra_build_file_content = "\n".join([ + 'load("@io_bazel_rules_closure//closure:defs.bzl", "web_library")', + "", + 'licenses(["notice"]) # Apache 2.0', + "", + 'exports_files(["LICENSE"]) # Apache 2.0', + "", + "web_library(", + ' name = "com_google_fonts_roboto",', + ' path = "/font-roboto",', + " srcs = [", + ' "roboto.html",', + ' ":files",', + " ],", + ")", + "", + "genrule(", + ' name = "html",', + ' outs = ["roboto.html"],', + ' cmd = "\\n".join([', + ' "cat <<\'EOF\' >$@",', + " '',", + " '',", + " '',", + " '',", + ' "EOF",', + " ]),", + ")", + ]), + )