From 4e2e007c7786b9771f3c6f99bf1bf4ef3d8323b5 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:47:41 -0400 Subject: [PATCH 01/12] add encodeBase64 --- docs/supported_ops.md | 6 +++ src/operations/executors/string_executor.ts | 41 +++++++++++++++++++++ src/operations/op_list/string.ts | 27 ++++++++++++++ src/operations/types.ts | 3 +- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/operations/executors/string_executor.ts create mode 100644 src/operations/op_list/string.ts diff --git a/docs/supported_ops.md b/docs/supported_ops.md index b892eadf..e7e36939 100644 --- a/docs/supported_ops.md +++ b/docs/supported_ops.md @@ -259,6 +259,12 @@ |Not mapped|ifft| |Not mapped|rfft| +## Operations - Strings + +|Tensorflow Op Name|Tensorflow.js Op Name| +|---|---| +|EncodeBase64|encodeBase64| + ## Tensors - Transformations |Tensorflow Op Name|Tensorflow.js Op Name| diff --git a/src/operations/executors/string_executor.ts b/src/operations/executors/string_executor.ts new file mode 100644 index 00000000..437c0381 --- /dev/null +++ b/src/operations/executors/string_executor.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tfc from '@tensorflow/tfjs-core'; + +import {NamedTensorsMap} from '../../data/types'; +import {ExecutionContext} from '../../executor/execution_context'; +import {InternalOpExecutor, Node} from '../types'; + +import {getParamValue} from './utils'; + +export let executeOp: InternalOpExecutor = + (node: Node, tensorMap: NamedTensorsMap, + context: ExecutionContext): tfc.Tensor[] => { + switch (node.op) { + case 'EncodeBase64': { + const input = + getParamValue('str', node, tensorMap, context) as tfc.Tensor; + const pad = getParamValue('pad', node, tensorMap, context) as boolean; + return [tfc.encodeBase64(input, pad)]; + } + default: + throw TypeError(`Node type ${node.op} is not implemented`); + } + }; + +export const CATEGORY = 'string'; diff --git a/src/operations/op_list/string.ts b/src/operations/op_list/string.ts new file mode 100644 index 00000000..b3c93088 --- /dev/null +++ b/src/operations/op_list/string.ts @@ -0,0 +1,27 @@ +import {OpMapper} from '../types'; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +export const json: OpMapper[] = [ + { + 'tfOpName': 'EncodeBase64', + 'category': 'string', + 'inputs': [{'start': 0, 'name': 'input', 'type': 'tensor'}], + 'attrs': [{'tfName': 'pad', 'name': 'pad', 'type': 'bool'}] + } +]; diff --git a/src/operations/types.ts b/src/operations/types.ts index 9109f0af..bb0c8520 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -25,7 +25,8 @@ export type ParamType = 'number'|'string'|'string[]'|'number[]'|'bool'|'bool[]'| export type Category = 'arithmetic'|'basic_math'|'control'|'convolution'|'custom'|'dynamic'| 'evaluation'|'image'|'creation'|'graph'|'logical'|'matrices'| - 'normalization'|'reduction'|'slice_join'|'spectral'|'transformation'; + 'normalization'|'reduction'|'slice_join'|'spectral'|'string'| + 'transformation'; // For mapping input or attributes of NodeDef into TensorFlow.js op param. export declare interface ParamMapper { From 0804b37c9c8cdbf0c0d41f5628a5299bde520329 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:48:02 -0400 Subject: [PATCH 02/12] test encodeBase64 --- .../executors/string_executor_test.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/operations/executors/string_executor_test.ts diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts new file mode 100644 index 00000000..6a63931f --- /dev/null +++ b/src/operations/executors/string_executor_test.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +import * as tfc from '@tensorflow/tfjs-core'; + +import {ExecutionContext} from '../../executor/execution_context'; +import {Node} from '../types'; + +import {executeOp} from './string_executor'; +// tslint:disable-next-line:max-line-length +import {createBoolAttr, createTensorAttr} from './test_helper'; + +describe('string', () => { + let node: Node; + const input1 = [tfc.tensor(['a'], [1], 'string')]; + const context = new ExecutionContext({}, {}); + + beforeEach(() => { + node = { + name: 'test', + op: '', + category: 'string', + inputNames: ['input1'], + inputs: [], + inputParams: {str: createTensorAttr(0)}, + attrParams: {}, + children: [] + }; + }); + + describe('executeOp', () => { + describe('EncodeBase64', () => { + it('should call tfc.encodeBase64', () => { + spyOn(tfc, 'encodeBase64'); + node.op = 'EncodeBase64'; + node.attrParams.pad = createBoolAttr(true); + executeOp(node, {input1}, context); + + expect(tfc.encodeBase64).toHaveBeenCalledWith(input1[0], true); + }); + }); + }); +}); From 7b0a3338068bc4f98ae263d6540eb2ba0f348f84 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:51:20 -0400 Subject: [PATCH 03/12] add decodeBase64 --- docs/supported_ops.md | 1 + src/operations/executors/string_executor.ts | 5 +++++ src/operations/op_list/string.ts | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/docs/supported_ops.md b/docs/supported_ops.md index e7e36939..af272701 100644 --- a/docs/supported_ops.md +++ b/docs/supported_ops.md @@ -263,6 +263,7 @@ |Tensorflow Op Name|Tensorflow.js Op Name| |---|---| +|DecodeBase64|decodeBase64| |EncodeBase64|encodeBase64| ## Tensors - Transformations diff --git a/src/operations/executors/string_executor.ts b/src/operations/executors/string_executor.ts index 437c0381..c6880630 100644 --- a/src/operations/executors/string_executor.ts +++ b/src/operations/executors/string_executor.ts @@ -27,6 +27,11 @@ export let executeOp: InternalOpExecutor = (node: Node, tensorMap: NamedTensorsMap, context: ExecutionContext): tfc.Tensor[] => { switch (node.op) { + case 'DecodeBase64': { + const input = + getParamValue('str', node, tensorMap, context) as tfc.Tensor; + return [tfc.decodeBase64(input)]; + } case 'EncodeBase64': { const input = getParamValue('str', node, tensorMap, context) as tfc.Tensor; diff --git a/src/operations/op_list/string.ts b/src/operations/op_list/string.ts index b3c93088..2a181baf 100644 --- a/src/operations/op_list/string.ts +++ b/src/operations/op_list/string.ts @@ -18,6 +18,11 @@ import {OpMapper} from '../types'; */ export const json: OpMapper[] = [ + { + 'tfOpName': 'DecodeBase64', + 'category': 'string', + 'inputs': [{'start': 0, 'name': 'input', 'type': 'tensor'}] + }, { 'tfOpName': 'EncodeBase64', 'category': 'string', From 7f8e2f810cd73e92a6c7febc2d1884635b523347 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:51:29 -0400 Subject: [PATCH 04/12] test decodeBase64 --- src/operations/executors/string_executor_test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts index 6a63931f..259d3613 100644 --- a/src/operations/executors/string_executor_test.ts +++ b/src/operations/executors/string_executor_test.ts @@ -42,6 +42,14 @@ describe('string', () => { }); describe('executeOp', () => { + describe('DecodeBase64', () => { + it('should call tfc.decodeBase64', () => { + spyOn(tfc, 'decodeBase64'); + node.op = 'DecodeBase64'; + executeOp(node, {input1}, context); + expect(tfc.decodeBase64).toHaveBeenCalledWith(input1[0]); + }); + }); describe('EncodeBase64', () => { it('should call tfc.encodeBase64', () => { spyOn(tfc, 'encodeBase64'); From b16f0ba43a46d1bd782137e5a900781a6bd73b2f Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:47:41 -0400 Subject: [PATCH 05/12] add encodeBase64 --- docs/supported_ops.md | 6 +++ src/operations/executors/string_executor.ts | 41 +++++++++++++++++++++ src/operations/op_list/string.ts | 27 ++++++++++++++ src/operations/types.ts | 3 +- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/operations/executors/string_executor.ts create mode 100644 src/operations/op_list/string.ts diff --git a/docs/supported_ops.md b/docs/supported_ops.md index b892eadf..e7e36939 100644 --- a/docs/supported_ops.md +++ b/docs/supported_ops.md @@ -259,6 +259,12 @@ |Not mapped|ifft| |Not mapped|rfft| +## Operations - Strings + +|Tensorflow Op Name|Tensorflow.js Op Name| +|---|---| +|EncodeBase64|encodeBase64| + ## Tensors - Transformations |Tensorflow Op Name|Tensorflow.js Op Name| diff --git a/src/operations/executors/string_executor.ts b/src/operations/executors/string_executor.ts new file mode 100644 index 00000000..437c0381 --- /dev/null +++ b/src/operations/executors/string_executor.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +import * as tfc from '@tensorflow/tfjs-core'; + +import {NamedTensorsMap} from '../../data/types'; +import {ExecutionContext} from '../../executor/execution_context'; +import {InternalOpExecutor, Node} from '../types'; + +import {getParamValue} from './utils'; + +export let executeOp: InternalOpExecutor = + (node: Node, tensorMap: NamedTensorsMap, + context: ExecutionContext): tfc.Tensor[] => { + switch (node.op) { + case 'EncodeBase64': { + const input = + getParamValue('str', node, tensorMap, context) as tfc.Tensor; + const pad = getParamValue('pad', node, tensorMap, context) as boolean; + return [tfc.encodeBase64(input, pad)]; + } + default: + throw TypeError(`Node type ${node.op} is not implemented`); + } + }; + +export const CATEGORY = 'string'; diff --git a/src/operations/op_list/string.ts b/src/operations/op_list/string.ts new file mode 100644 index 00000000..b3c93088 --- /dev/null +++ b/src/operations/op_list/string.ts @@ -0,0 +1,27 @@ +import {OpMapper} from '../types'; + +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + +export const json: OpMapper[] = [ + { + 'tfOpName': 'EncodeBase64', + 'category': 'string', + 'inputs': [{'start': 0, 'name': 'input', 'type': 'tensor'}], + 'attrs': [{'tfName': 'pad', 'name': 'pad', 'type': 'bool'}] + } +]; diff --git a/src/operations/types.ts b/src/operations/types.ts index 9109f0af..bb0c8520 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -25,7 +25,8 @@ export type ParamType = 'number'|'string'|'string[]'|'number[]'|'bool'|'bool[]'| export type Category = 'arithmetic'|'basic_math'|'control'|'convolution'|'custom'|'dynamic'| 'evaluation'|'image'|'creation'|'graph'|'logical'|'matrices'| - 'normalization'|'reduction'|'slice_join'|'spectral'|'transformation'; + 'normalization'|'reduction'|'slice_join'|'spectral'|'string'| + 'transformation'; // For mapping input or attributes of NodeDef into TensorFlow.js op param. export declare interface ParamMapper { From 2106e9faafe9f1124c003499f2c2dc082ab86739 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:48:02 -0400 Subject: [PATCH 06/12] test encodeBase64 --- .../executors/string_executor_test.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/operations/executors/string_executor_test.ts diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts new file mode 100644 index 00000000..6a63931f --- /dev/null +++ b/src/operations/executors/string_executor_test.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +import * as tfc from '@tensorflow/tfjs-core'; + +import {ExecutionContext} from '../../executor/execution_context'; +import {Node} from '../types'; + +import {executeOp} from './string_executor'; +// tslint:disable-next-line:max-line-length +import {createBoolAttr, createTensorAttr} from './test_helper'; + +describe('string', () => { + let node: Node; + const input1 = [tfc.tensor(['a'], [1], 'string')]; + const context = new ExecutionContext({}, {}); + + beforeEach(() => { + node = { + name: 'test', + op: '', + category: 'string', + inputNames: ['input1'], + inputs: [], + inputParams: {str: createTensorAttr(0)}, + attrParams: {}, + children: [] + }; + }); + + describe('executeOp', () => { + describe('EncodeBase64', () => { + it('should call tfc.encodeBase64', () => { + spyOn(tfc, 'encodeBase64'); + node.op = 'EncodeBase64'; + node.attrParams.pad = createBoolAttr(true); + executeOp(node, {input1}, context); + + expect(tfc.encodeBase64).toHaveBeenCalledWith(input1[0], true); + }); + }); + }); +}); From d469df001676bf9c90f52fafbfba6cb8964b31af Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:51:20 -0400 Subject: [PATCH 07/12] add decodeBase64 --- docs/supported_ops.md | 1 + src/operations/executors/string_executor.ts | 5 +++++ src/operations/op_list/string.ts | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/docs/supported_ops.md b/docs/supported_ops.md index e7e36939..af272701 100644 --- a/docs/supported_ops.md +++ b/docs/supported_ops.md @@ -263,6 +263,7 @@ |Tensorflow Op Name|Tensorflow.js Op Name| |---|---| +|DecodeBase64|decodeBase64| |EncodeBase64|encodeBase64| ## Tensors - Transformations diff --git a/src/operations/executors/string_executor.ts b/src/operations/executors/string_executor.ts index 437c0381..c6880630 100644 --- a/src/operations/executors/string_executor.ts +++ b/src/operations/executors/string_executor.ts @@ -27,6 +27,11 @@ export let executeOp: InternalOpExecutor = (node: Node, tensorMap: NamedTensorsMap, context: ExecutionContext): tfc.Tensor[] => { switch (node.op) { + case 'DecodeBase64': { + const input = + getParamValue('str', node, tensorMap, context) as tfc.Tensor; + return [tfc.decodeBase64(input)]; + } case 'EncodeBase64': { const input = getParamValue('str', node, tensorMap, context) as tfc.Tensor; diff --git a/src/operations/op_list/string.ts b/src/operations/op_list/string.ts index b3c93088..2a181baf 100644 --- a/src/operations/op_list/string.ts +++ b/src/operations/op_list/string.ts @@ -18,6 +18,11 @@ import {OpMapper} from '../types'; */ export const json: OpMapper[] = [ + { + 'tfOpName': 'DecodeBase64', + 'category': 'string', + 'inputs': [{'start': 0, 'name': 'input', 'type': 'tensor'}] + }, { 'tfOpName': 'EncodeBase64', 'category': 'string', From ec8146930ac1ef9077866f62012ea35bb65a6529 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Wed, 5 Jun 2019 07:51:29 -0400 Subject: [PATCH 08/12] test decodeBase64 --- src/operations/executors/string_executor_test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts index 6a63931f..259d3613 100644 --- a/src/operations/executors/string_executor_test.ts +++ b/src/operations/executors/string_executor_test.ts @@ -42,6 +42,14 @@ describe('string', () => { }); describe('executeOp', () => { + describe('DecodeBase64', () => { + it('should call tfc.decodeBase64', () => { + spyOn(tfc, 'decodeBase64'); + node.op = 'DecodeBase64'; + executeOp(node, {input1}, context); + expect(tfc.decodeBase64).toHaveBeenCalledWith(input1[0]); + }); + }); describe('EncodeBase64', () => { it('should call tfc.encodeBase64', () => { spyOn(tfc, 'encodeBase64'); From c9ba5f63ee3ff2555b867f903e85d6c07b5771b8 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Sat, 8 Jun 2019 04:46:03 -0400 Subject: [PATCH 09/12] copyright 2019 - per review comment --- src/operations/executors/string_executor.ts | 2 +- src/operations/executors/string_executor_test.ts | 2 +- src/operations/op_list/string.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/operations/executors/string_executor.ts b/src/operations/executors/string_executor.ts index c6880630..2ae03e1f 100644 --- a/src/operations/executors/string_executor.ts +++ b/src/operations/executors/string_executor.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2019 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts index 259d3613..519b1b4a 100644 --- a/src/operations/executors/string_executor_test.ts +++ b/src/operations/executors/string_executor_test.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2019 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/src/operations/op_list/string.ts b/src/operations/op_list/string.ts index 2a181baf..e891af94 100644 --- a/src/operations/op_list/string.ts +++ b/src/operations/op_list/string.ts @@ -2,7 +2,7 @@ import {OpMapper} from '../types'; /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at From c40b65c9ec9e71f5f5c66562540ae95a74decc8d Mon Sep 17 00:00:00 2001 From: va barbosa Date: Sat, 8 Jun 2019 04:48:06 -0400 Subject: [PATCH 10/12] remove tslint comment - per review comment --- src/operations/executors/string_executor_test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts index 519b1b4a..206b17ff 100644 --- a/src/operations/executors/string_executor_test.ts +++ b/src/operations/executors/string_executor_test.ts @@ -20,7 +20,6 @@ import {ExecutionContext} from '../../executor/execution_context'; import {Node} from '../types'; import {executeOp} from './string_executor'; -// tslint:disable-next-line:max-line-length import {createBoolAttr, createTensorAttr} from './test_helper'; describe('string', () => { From 7663a3749bc044a77c26fab9a3596f3df3388cb2 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Sat, 8 Jun 2019 04:48:46 -0400 Subject: [PATCH 11/12] remove empty line - per review comment --- src/operations/executors/string_executor_test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/operations/executors/string_executor_test.ts b/src/operations/executors/string_executor_test.ts index 206b17ff..ff0ae480 100644 --- a/src/operations/executors/string_executor_test.ts +++ b/src/operations/executors/string_executor_test.ts @@ -55,7 +55,6 @@ describe('string', () => { node.op = 'EncodeBase64'; node.attrParams.pad = createBoolAttr(true); executeOp(node, {input1}, context); - expect(tfc.encodeBase64).toHaveBeenCalledWith(input1[0], true); }); }); From fb065c7b3ff7f68809b0e4c8ae632cefb836b8f7 Mon Sep 17 00:00:00 2001 From: va barbosa Date: Sat, 8 Jun 2019 05:08:10 -0400 Subject: [PATCH 12/12] copyright 2019 - per review request --- src/operations/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operations/types.ts b/src/operations/types.ts index bb0c8520..8df6154a 100644 --- a/src/operations/types.ts +++ b/src/operations/types.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at