From 3b9fa49e94fbadaf868c5ae96f7dbd5821a81dd8 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Sat, 24 Feb 2024 22:45:19 -0500 Subject: [PATCH 1/6] Update package.json to use tfjs-core v4.9.0+ tfjs v4.0+ solves issue https://github.com/tensorflow/tfjs/issues/6922 which caused it to not be usable in web workers. tfjs-automl still used v3.9.0 . This fork updates it to 4.9.0+ , same as in its devDependencies. --- tfjs-automl/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tfjs-automl/package.json b/tfjs-automl/package.json index dca63ac78a8..982ee24b6f5 100644 --- a/tfjs-automl/package.json +++ b/tfjs-automl/package.json @@ -58,8 +58,8 @@ "yalc": "~1.0.0-pre.21" }, "peerDependencies": { - "@tensorflow/tfjs-backend-webgl": "^3.9.0", - "@tensorflow/tfjs-converter": "^3.9.0", - "@tensorflow/tfjs-core": "^3.9.0" + "@tensorflow/tfjs-backend-webgl": "^4.9.0", + "@tensorflow/tfjs-converter": "^4.9.0", + "@tensorflow/tfjs-core": "^4.9.0" } } From 7790649fa3aa1ef5f18992735e07b43922ca2cd4 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Sat, 24 Feb 2024 23:00:55 -0500 Subject: [PATCH 2/6] AutoML with new TF.js-core for epiPath --- .gitignore | 2 +- tfjs-automl/dist/img_classification.d.ts | 33 +++ tfjs-automl/dist/img_classification.js | 84 ++++++ tfjs-automl/dist/img_classification_test.d.ts | 17 ++ tfjs-automl/dist/img_classification_test.js | 107 ++++++++ tfjs-automl/dist/index.d.ts | 20 ++ tfjs-automl/dist/index.js | 22 ++ tfjs-automl/dist/index_test.d.ts | 17 ++ tfjs-automl/dist/index_test.js | 25 ++ tfjs-automl/dist/object_detection.d.ts | 58 ++++ tfjs-automl/dist/object_detection.js | 109 ++++++++ tfjs-automl/dist/object_detection_test.d.ts | 17 ++ tfjs-automl/dist/object_detection_test.js | 122 +++++++++ tfjs-automl/dist/test_browser.d.ts | 17 ++ tfjs-automl/dist/test_browser.js | 52 ++++ tfjs-automl/dist/test_node.d.ts | 17 ++ tfjs-automl/dist/test_node.js | 33 +++ tfjs-automl/dist/test_util.d.ts | 17 ++ tfjs-automl/dist/test_util.js | 33 +++ tfjs-automl/dist/tf-automl.esm.js | 83 ++++++ tfjs-automl/dist/tf-automl.js | 250 ++++++++++++++++++ tfjs-automl/dist/tf-automl.min.js | 83 ++++++ tfjs-automl/dist/tf-automl.node.js | 247 +++++++++++++++++ tfjs-automl/dist/tsconfig.tsbuildinfo | 1 + tfjs-automl/dist/types.d.ts | 18 ++ tfjs-automl/dist/types.js | 18 ++ tfjs-automl/dist/util.d.ts | 21 ++ tfjs-automl/dist/util.js | 30 +++ tfjs-automl/dist/util_test.d.ts | 18 ++ tfjs-automl/dist/util_test.js | 55 ++++ tfjs-automl/dist/version.d.ts | 3 + tfjs-automl/dist/version.js | 5 + 32 files changed, 1633 insertions(+), 1 deletion(-) create mode 100644 tfjs-automl/dist/img_classification.d.ts create mode 100644 tfjs-automl/dist/img_classification.js create mode 100644 tfjs-automl/dist/img_classification_test.d.ts create mode 100644 tfjs-automl/dist/img_classification_test.js create mode 100644 tfjs-automl/dist/index.d.ts create mode 100644 tfjs-automl/dist/index.js create mode 100644 tfjs-automl/dist/index_test.d.ts create mode 100644 tfjs-automl/dist/index_test.js create mode 100644 tfjs-automl/dist/object_detection.d.ts create mode 100644 tfjs-automl/dist/object_detection.js create mode 100644 tfjs-automl/dist/object_detection_test.d.ts create mode 100644 tfjs-automl/dist/object_detection_test.js create mode 100644 tfjs-automl/dist/test_browser.d.ts create mode 100644 tfjs-automl/dist/test_browser.js create mode 100644 tfjs-automl/dist/test_node.d.ts create mode 100644 tfjs-automl/dist/test_node.js create mode 100644 tfjs-automl/dist/test_util.d.ts create mode 100644 tfjs-automl/dist/test_util.js create mode 100644 tfjs-automl/dist/tf-automl.esm.js create mode 100644 tfjs-automl/dist/tf-automl.js create mode 100644 tfjs-automl/dist/tf-automl.min.js create mode 100644 tfjs-automl/dist/tf-automl.node.js create mode 100644 tfjs-automl/dist/tsconfig.tsbuildinfo create mode 100644 tfjs-automl/dist/types.d.ts create mode 100644 tfjs-automl/dist/types.js create mode 100644 tfjs-automl/dist/util.d.ts create mode 100644 tfjs-automl/dist/util.js create mode 100644 tfjs-automl/dist/util_test.d.ts create mode 100644 tfjs-automl/dist/util_test.js create mode 100644 tfjs-automl/dist/version.d.ts create mode 100644 tfjs-automl/dist/version.js diff --git a/.gitignore b/.gitignore index b3a2ac1c2ab..8360f94fc37 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ clone/ coverage/ demo/train-* deps/ -dist/ +#dist/ tfjs-layers/integration_tests/tfjs2keras/test-data/ tfjs-layers/integration/typescript/yarn.lock e2e/integration_tests/create_save_predict_data diff --git a/tfjs-automl/dist/img_classification.d.ts b/tfjs-automl/dist/img_classification.d.ts new file mode 100644 index 00000000000..c109e0d3e56 --- /dev/null +++ b/tfjs-automl/dist/img_classification.d.ts @@ -0,0 +1,33 @@ +/** + * @license + * 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 + * + * 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 { GraphModel } from '@tensorflow/tfjs-converter'; +import { ImageInput } from './types'; +export interface ImagePrediction { + prob: number; + label: string; +} +export interface ImageClassificationOptions { + centerCrop: boolean; +} +export declare class ImageClassificationModel { + graphModel: GraphModel; + dictionary: string[]; + constructor(graphModel: GraphModel, dictionary: string[]); + classify(input: ImageInput, options?: ImageClassificationOptions): Promise; + private preprocess; +} +export declare function loadImageClassification(modelUrl: string): Promise; diff --git a/tfjs-automl/dist/img_classification.js b/tfjs-automl/dist/img_classification.js new file mode 100644 index 00000000000..e0617edcd34 --- /dev/null +++ b/tfjs-automl/dist/img_classification.js @@ -0,0 +1,84 @@ +/** + * @license + * 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 + * + * 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 { loadGraphModel } from '@tensorflow/tfjs-converter'; +import { cast, div, expandDims, image, sub, tidy } from '@tensorflow/tfjs-core'; +import { imageToTensor, loadDictionary } from './util'; +/** Input size as expected by the model. */ +const IMG_SIZE = [224, 224]; +// Constants used to normalize the image between -1 and 1. +const DIV_FACTOR = 127.5; +const SUB_FACTOR = 1; +export class ImageClassificationModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async classify(input, options) { + options = sanitizeOptions(options); + const scores = tidy(() => { + const preprocessedImg = this.preprocess(input, options); + return this.graphModel.predict(preprocessedImg); + }); + const probabilities = await scores.data(); + scores.dispose(); + const result = Array.from(probabilities) + .map((prob, i) => ({ label: this.dictionary[i], prob })); + return result; + } + preprocess(input, options) { + // Preprocessing involves center crop and normalizing between [-1, 1]. + const img = imageToTensor(input); + const croppedImg = options.centerCrop ? + centerCropAndResize(img) : + expandDims(image.resizeBilinear(img, IMG_SIZE)); + return sub(div(croppedImg, DIV_FACTOR), SUB_FACTOR); + } +} +export async function loadImageClassification(modelUrl) { + const [model, dict] = await Promise.all([loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ImageClassificationModel(model, dict); +} +function sanitizeOptions(options) { + options = options || {}; + if (options.centerCrop == null) { + options.centerCrop = true; + } + return options; +} +/** Center crops an image */ +function centerCropAndResize(img) { + return tidy(() => { + const [height, width] = img.shape.slice(0, 2); + let top = 0; + let left = 0; + if (height > width) { + top = (height - width) / 2; + } + else { + left = (width - height) / 2; + } + const size = Math.min(width, height); + const boxes = [ + [top / height, left / width, (top + size) / height, (left + size) / width] + ]; + const boxIndices = [0]; + return image.cropAndResize( + // tslint:disable-next-line + expandDims(cast(img, 'float32')), boxes, boxIndices, IMG_SIZE); + }); +} +//# sourceMappingURL=img_classification.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/img_classification_test.d.ts b/tfjs-automl/dist/img_classification_test.d.ts new file mode 100644 index 00000000000..1c3c75a123c --- /dev/null +++ b/tfjs-automl/dist/img_classification_test.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 {}; diff --git a/tfjs-automl/dist/img_classification_test.js b/tfjs-automl/dist/img_classification_test.js new file mode 100644 index 00000000000..54cc3b5ba75 --- /dev/null +++ b/tfjs-automl/dist/img_classification_test.js @@ -0,0 +1,107 @@ +/** + * @license + * 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 + * + * 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 { GraphModel } from '@tensorflow/tfjs-converter'; +import * as tf from '@tensorflow/tfjs-core'; +// tslint:disable-next-line: no-imports-from-dist +import { BROWSER_ENVS, describeWithFlags } from '@tensorflow/tfjs-core/dist/jasmine_util'; +import * as automl from './index'; +import { fetchImage } from './test_util'; +const MODEL_URL = 'https://storage.googleapis.com/tfjs-testing/tfjs-automl/img_classification/model.json'; +const DAISY_URL = 'https://storage.googleapis.com/tfjs-testing/tfjs-automl/img_classification/daisy.jpg'; +describeWithFlags('image classification', {}, () => { + let model = null; + beforeAll(async () => { + model = await automl.loadImageClassification(MODEL_URL); + }); + it('make prediction from a tensor', async () => { + const img = tf.zeros([100, 80, 3]); + const predictions = await model.classify(img); + expect(predictions[0].label).toBe('daisy'); + expect(predictions[1].label).toBe('dandelion'); + expect(predictions[2].label).toBe('roses'); + tf.test_util.expectNumbersClose(predictions[0].prob, 0.5806022); + tf.test_util.expectNumbersClose(predictions[1].prob, 0.32249659); + tf.test_util.expectNumbersClose(predictions[2].prob, 0.0283515); + }); + it('make prediction from a tensor without cropping', async () => { + const img = tf.zeros([100, 80, 3]); + const predictions = await model.classify(img, { centerCrop: false }); + expect(predictions[0].label).toBe('daisy'); + expect(predictions[1].label).toBe('dandelion'); + expect(predictions[2].label).toBe('roses'); + tf.test_util.expectNumbersClose(predictions[0].prob, 0.5806022); + tf.test_util.expectNumbersClose(predictions[1].prob, 0.32249659); + tf.test_util.expectNumbersClose(predictions[2].prob, 0.0283515); + }); + it('no memory leak when making a prediction', async () => { + const img = tf.zeros([100, 80, 3]); + const numTensorsBefore = tf.memory().numTensors; + await model.classify(img); + const numTensorsAfter = tf.memory().numTensors; + expect(numTensorsAfter).toEqual(numTensorsBefore); + }); + it('has access to dictionary', () => { + expect(model.dictionary).toEqual([ + 'daisy', 'dandelion', 'roses', 'sunflowers', 'tulips' + ]); + }); + it('can access the underlying graph model', () => { + expect(model.graphModel instanceof GraphModel).toBe(true); + expect(model.graphModel.inputNodes).toEqual(['image']); + expect(model.graphModel.outputNodes).toEqual(['scores']); + const img = tf.zeros([1, 224, 224, 3]); + const scores = model.graphModel.predict(img); + expect(scores.shape).toEqual([1, 5]); + }); +}); +describeWithFlags('image classification browser', BROWSER_ENVS, () => { + let model = null; + let daisyImg; + beforeAll(async () => { + model = await automl.loadImageClassification(MODEL_URL); + daisyImg = await fetchImage(DAISY_URL); + }); + function assertTop3PredsForDaisy(predictions, centerCrop) { + const probs = centerCrop ? [0.9310929, 0.0273733, 0.0130559] : + [0.8411523, 0.0729438, 0.03020708]; + expect(predictions[0].label).toBe('daisy'); + tf.test_util.expectNumbersClose(predictions[0].prob, probs[0]); + expect(predictions[1].label).toBe('dandelion'); + tf.test_util.expectNumbersClose(predictions[1].prob, probs[1]); + expect(predictions[2].label).toBe('roses'); + tf.test_util.expectNumbersClose(predictions[2].prob, probs[2]); + } + it('make prediction from an image element', async () => { + const predictions = await model.classify(daisyImg); + assertTop3PredsForDaisy(predictions, true /* centerCrop */); + }); + it('make prediction from a canvas element', async () => { + // Copy the pixels from the image to a canvas. + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = daisyImg.width; + canvas.height = daisyImg.height; + ctx.drawImage(daisyImg, 0, 0, daisyImg.width, daisyImg.height); + const predictions = await model.classify(canvas); + assertTop3PredsForDaisy(predictions, true /* centerCrop */); + }); + it('make prediction without center cropping', async () => { + const predictions = await model.classify(daisyImg, { centerCrop: false }); + assertTop3PredsForDaisy(predictions, false /* centerCrop */); + }); +}); +//# sourceMappingURL=img_classification_test.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/index.d.ts b/tfjs-automl/dist/index.d.ts new file mode 100644 index 00000000000..a5e7b4b67da --- /dev/null +++ b/tfjs-automl/dist/index.d.ts @@ -0,0 +1,20 @@ +/** + * @license + * 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 + * + * 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 { ImageClassificationModel, ImageClassificationOptions, ImagePrediction, loadImageClassification } from './img_classification'; +export { Box, loadObjectDetection, ObjectDetectionModel, ObjectDetectionOptions, PredictedObject } from './object_detection'; +export { ImageInput } from './types'; +export { version } from './version'; diff --git a/tfjs-automl/dist/index.js b/tfjs-automl/dist/index.js new file mode 100644 index 00000000000..02c9f6c623a --- /dev/null +++ b/tfjs-automl/dist/index.js @@ -0,0 +1,22 @@ +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */ +// Image classification API. +export { ImageClassificationModel, loadImageClassification } from './img_classification'; +// Object detection API. +export { loadObjectDetection, ObjectDetectionModel } from './object_detection'; +export { version } from './version'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/index_test.d.ts b/tfjs-automl/dist/index_test.d.ts new file mode 100644 index 00000000000..1c3c75a123c --- /dev/null +++ b/tfjs-automl/dist/index_test.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 {}; diff --git a/tfjs-automl/dist/index_test.js b/tfjs-automl/dist/index_test.js new file mode 100644 index 00000000000..e8708949b51 --- /dev/null +++ b/tfjs-automl/dist/index_test.js @@ -0,0 +1,25 @@ +/** + * @license + * 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 + * + * 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 automl from './index'; +describe('public API', () => { + it('exported version matches package version', () => { + // tslint:disable-next-line:no-require-imports + const expected = require('../package.json').version; + expect(automl.version).toBe(expected); + }); +}); +//# sourceMappingURL=index_test.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/object_detection.d.ts b/tfjs-automl/dist/object_detection.d.ts new file mode 100644 index 00000000000..00a49c63937 --- /dev/null +++ b/tfjs-automl/dist/object_detection.d.ts @@ -0,0 +1,58 @@ +/** + * @license + * 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 + * + * 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 { GraphModel } from '@tensorflow/tfjs-converter'; +import { ImageInput } from './types'; +export interface ObjectDetectionOptions { + /** + * Only the `topk` most likely objects are returned. The actual number of + * objects might be less than this number. + */ + topk?: number; + /** + * Intersection over union threshold. IoU is a metric between 0 and 1 used to + * measure the overlap of two boxes. The predicted boxes will not overlap more + * than the specified threshold. + */ + iou?: number; + /** Boxes with score lower than this threshold will be ignored. */ + score?: number; +} +/** Contains the coordinates of a bounding box. */ +export interface Box { + /** Number of pixels from the top of the image (top padding). */ + top: number; + /** Number of pixels from the left of the image (left padding). */ + left: number; + /** The width of the box. */ + width: number; + /** The height of the box. */ + height: number; +} +/** The predicted object, which holds the score, label and bounding box. */ +export interface PredictedObject { + box: Box; + score: number; + label: string; +} +export declare class ObjectDetectionModel { + graphModel: GraphModel; + dictionary: string[]; + constructor(graphModel: GraphModel, dictionary: string[]); + detect(input: ImageInput, options?: ObjectDetectionOptions): Promise; + private preprocess; +} +export declare function loadObjectDetection(modelUrl: string): Promise; diff --git a/tfjs-automl/dist/object_detection.js b/tfjs-automl/dist/object_detection.js new file mode 100644 index 00000000000..1f6a3e73471 --- /dev/null +++ b/tfjs-automl/dist/object_detection.js @@ -0,0 +1,109 @@ +/** + * @license + * 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 + * + * 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 { loadGraphModel } from '@tensorflow/tfjs-converter'; +import { cast, dispose, expandDims, image, tidy } from '@tensorflow/tfjs-core'; +import { imageToTensor, loadDictionary } from './util'; +const DEFAULT_TOPK = 20; +const DEFAULT_IOU_THRESHOLD = 0.5; +const DEFAULT_SCORE_THRESHOLD = 0.5; +const INPUT_NODE_NAME = 'ToFloat'; +const OUTPUT_NODE_NAMES = ['Postprocessor/convert_scores', 'Postprocessor/Decode/transpose_1']; +export class ObjectDetectionModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async detect(input, options) { + options = sanitizeOptions(options); + const img = tidy(() => this.preprocess(input, options)); + const [height, width] = [img.shape[1], img.shape[2]]; + const feedDict = {}; + feedDict[INPUT_NODE_NAME] = img; + const [scoresTensor, boxesTensor] = await this.graphModel.executeAsync(feedDict, OUTPUT_NODE_NAMES); + const [, numBoxes, numClasses] = scoresTensor.shape; + const [scores, boxes] = await Promise.all([scoresTensor.data(), boxesTensor.data()]); + const { boxScores, boxLabels } = calculateMostLikelyLabels(scores, numBoxes, numClasses); + // Sort the boxes by score, ignoring overlapping boxes. + const selectedBoxesTensor = await image.nonMaxSuppressionAsync(boxesTensor, boxScores, options.topk, options.iou, options.score); + const selectedBoxes = await selectedBoxesTensor.data(); + dispose([img, scoresTensor, boxesTensor, selectedBoxesTensor]); + const result = buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, this.dictionary); + return result; + } + preprocess(input, options) { + return cast(expandDims(imageToTensor(input)), 'float32'); + } +} +export async function loadObjectDetection(modelUrl) { + const [model, dict] = await Promise.all([loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ObjectDetectionModel(model, dict); +} +function sanitizeOptions(options) { + options = options || {}; + if (options.topk == null) { + options.topk = DEFAULT_TOPK; + } + if (options.iou == null) { + options.iou = DEFAULT_IOU_THRESHOLD; + } + if (options.score == null) { + options.score = DEFAULT_SCORE_THRESHOLD; + } + return options; +} +function calculateMostLikelyLabels(scores, numBoxes, numClasses) { + // Holds a score for each box. + const boxScores = []; + // Holds the label id for each box. + const boxLabels = []; + for (let i = 0; i < numBoxes; i++) { + let maxScore = Number.MIN_VALUE; + let mostLikelyLabel = -1; + for (let j = 0; j < numClasses; j++) { + const flatIndex = i * numClasses + j; + const score = scores[flatIndex]; + if (score > maxScore) { + maxScore = scores[flatIndex]; + mostLikelyLabel = j; + } + } + boxScores[i] = maxScore; + boxLabels[i] = mostLikelyLabel; + } + return { boxScores, boxLabels }; +} +function buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, dictionary) { + const objects = []; + // Each 2d rectangle is fully described with 4 coordinates. + const numBoxCoords = 4; + for (let i = 0; i < selectedBoxes.length; i++) { + const boxIndex = selectedBoxes[i]; + const [top, left, bottom, right] = Array.from(boxes.slice(boxIndex * numBoxCoords, boxIndex * numBoxCoords + numBoxCoords)); + objects.push({ + box: { + left: left * width, + top: top * height, + width: (right - left) * width, + height: (bottom - top) * height, + }, + label: dictionary[boxLabels[boxIndex]], + score: boxScores[boxIndex], + }); + } + return objects; +} +//# sourceMappingURL=object_detection.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/object_detection_test.d.ts b/tfjs-automl/dist/object_detection_test.d.ts new file mode 100644 index 00000000000..1c3c75a123c --- /dev/null +++ b/tfjs-automl/dist/object_detection_test.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 {}; diff --git a/tfjs-automl/dist/object_detection_test.js b/tfjs-automl/dist/object_detection_test.js new file mode 100644 index 00000000000..20c9a1e4487 --- /dev/null +++ b/tfjs-automl/dist/object_detection_test.js @@ -0,0 +1,122 @@ +/** + * @license + * 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 + * + * 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 { GraphModel } from '@tensorflow/tfjs-converter'; +import * as tf from '@tensorflow/tfjs-core'; +// tslint:disable-next-line: no-imports-from-dist +import { BROWSER_ENVS, describeWithFlags } from '@tensorflow/tfjs-core/dist/jasmine_util'; +import * as automl from './index'; +import { fetchImage } from './test_util'; +const MODEL_URL = 'https://storage.googleapis.com/tfjs-testing/tfjs-automl/object_detection/model.json'; +const SALAD_IMAGE = 'https://storage.googleapis.com/tfjs-testing/tfjs-automl/object_detection/test_image.jpg'; +describeWithFlags('object detection', {}, () => { + let model = null; + const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 40000; + beforeAll(async () => { + model = await automl.loadObjectDetection(MODEL_URL); + }); + afterAll(() => { + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + }); + it('prediction from a zero tensor', async () => { + const img = tf.zeros([100, 80, 3]); + const predictions = await model.detect(img); + expect(predictions.length).toBe(0); + }); + it('prediction from a zero tensor with score threshold', async () => { + const img = tf.zeros([100, 80, 3]); + const options = { score: 0.11 }; + const predictions = await model.detect(img, options); + expect(predictions.length).toBe(1); + const { box: { left, top, width, height }, label, score } = predictions[0]; + expect(label).toBe('Salad'); + tf.test_util.expectNumbersClose(score, 0.116391); + tf.test_util.expectNumbersClose(left, 26.6741156); + tf.test_util.expectNumbersClose(top, 94.003981); + tf.test_util.expectNumbersClose(width, 22.6277661); + tf.test_util.expectNumbersClose(height, 6.30063414); + }); + it('prediction with iou threshold', async () => { + const img = tf.zeros([100, 80, 3]); + const options = { score: 0.10 }; + options.iou = 0.9; + let predictions = await model.detect(img, options); + expect(predictions.length).toBe(9); + options.iou = 0.1; + predictions = await model.detect(img, options); + expect(predictions.length).toBe(1); + }); + it('no memory leak when making a prediction', async () => { + const img = tf.zeros([100, 80, 3]); + const numTensorsBefore = tf.memory().numTensors; + await model.detect(img); + const numTensorsAfter = tf.memory().numTensors; + // The increased tensor is for the hashtable id handle + expect(numTensorsAfter).toBeLessThanOrEqual(numTensorsBefore + 1); + }); + it('has access to dictionary', () => { + expect(model.dictionary).toEqual([ + 'background', 'Tomato', 'Seafood', 'Salad', 'Baked Goods', 'Cheese' + ]); + }); + it('can access the underlying graph model', () => { + expect(model.graphModel instanceof GraphModel).toBe(true); + }); +}); +describeWithFlags('object detection browser', BROWSER_ENVS, () => { + let model = null; + let saladImg; + beforeAll(async () => { + model = await automl.loadObjectDetection(MODEL_URL); + saladImg = await fetchImage(SALAD_IMAGE); + }); + function assertTop3PredsForSalad(predictions) { + expect(predictions.length).toBe(3); + const [top1, top2, top3] = predictions; + expect(top1.label).toBe('Tomato'); + tf.test_util.expectNumbersClose(top1.score, 0.97170084); + expect(top2.label).toBe('Tomato'); + tf.test_util.expectNumbersClose(top2.score, 0.93456619); + expect(top3.label).toBe('Salad'); + tf.test_util.expectNumbersClose(top3.score, 0.9074271); + } + it('make prediction from an image element', async () => { + const predictions = await model.detect(saladImg); + assertTop3PredsForSalad(predictions); + }); + it('make prediction from a canvas element', async () => { + // Copy the pixels from the image to a canvas. + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = saladImg.width; + canvas.height = saladImg.height; + ctx.drawImage(saladImg, 0, 0, saladImg.width, saladImg.height); + const predictions = await model.detect(canvas); + assertTop3PredsForSalad(predictions); + }); + it('make prediction from image data', async () => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = saladImg.width; + canvas.height = saladImg.height; + ctx.drawImage(saladImg, 0, 0, saladImg.width, saladImg.height); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const predictions = await model.detect(imageData); + assertTop3PredsForSalad(predictions); + }); +}); +//# sourceMappingURL=object_detection_test.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/test_browser.d.ts b/tfjs-automl/dist/test_browser.d.ts new file mode 100644 index 00000000000..3814aea2250 --- /dev/null +++ b/tfjs-automl/dist/test_browser.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-webgl'; diff --git a/tfjs-automl/dist/test_browser.js b/tfjs-automl/dist/test_browser.js new file mode 100644 index 00000000000..42b532ac8af --- /dev/null +++ b/tfjs-automl/dist/test_browser.js @@ -0,0 +1,52 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-webgl'; +// tslint:disable-next-line: no-imports-from-dist +import { parseTestEnvFromKarmaFlags, registerTestEnv, setTestEnvs, TEST_ENVS } from '@tensorflow/tfjs-core/dist/jasmine_util'; +// Increase test timeout since we are fetching the model files from GCS. +jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000; +registerTestEnv({ + name: 'webgl1', + backendName: 'webgl', + flags: { + 'WEBGL_VERSION': 1, + 'WEBGL_CPU_FORWARD': false, + 'WEBGL_SIZE_UPLOAD_UNIFORM': 0 + }, + isDataSync: true +}); +const testEnv = parseTestEnvFromKarmaFlags(__karma__.config.args, TEST_ENVS); +if (testEnv != null) { + setTestEnvs([testEnv]); +} +else { + // Run browser tests againts both the webgl backends. + setTestEnvs([ + // WebGL. + { + name: 'test-webgl', + backendName: 'webgl', + flags: { + 'WEBGL_VERSION': 2, + 'WEBGL_CPU_FORWARD': false, + 'WEBGL_SIZE_UPLOAD_UNIFORM': 0 + }, + isDataSync: true + } + ]); +} +//# sourceMappingURL=test_browser.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/test_node.d.ts b/tfjs-automl/dist/test_node.d.ts new file mode 100644 index 00000000000..2ef14ec2b30 --- /dev/null +++ b/tfjs-automl/dist/test_node.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-cpu'; diff --git a/tfjs-automl/dist/test_node.js b/tfjs-automl/dist/test_node.js new file mode 100644 index 00000000000..a49ceb33000 --- /dev/null +++ b/tfjs-automl/dist/test_node.js @@ -0,0 +1,33 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-cpu'; +// tslint:disable-next-line: no-imports-from-dist +import { setTestEnvs } from '@tensorflow/tfjs-core/dist/jasmine_util'; +// tslint:disable-next-line:no-require-imports +const jasmine = require('jasmine'); +// Increase test timeout since we are fetching the model files from GCS. +jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000; +process.on('unhandledRejection', e => { + throw e; +}); +// Run node tests againts the cpu backend. +setTestEnvs([{ name: 'node', backendName: 'cpu' }]); +const runner = new jasmine(); +runner.loadConfig({ spec_files: ['src/**/*_test.ts'], jsLoader: 'require', + random: false }); +runner.execute(); +//# sourceMappingURL=test_node.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/test_util.d.ts b/tfjs-automl/dist/test_util.d.ts new file mode 100644 index 00000000000..110e4ed24ce --- /dev/null +++ b/tfjs-automl/dist/test_util.d.ts @@ -0,0 +1,17 @@ +/** + * @license + * 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 + * + * 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 declare function fetchImage(url: string): Promise; diff --git a/tfjs-automl/dist/test_util.js b/tfjs-automl/dist/test_util.js new file mode 100644 index 00000000000..c580f5d4232 --- /dev/null +++ b/tfjs-automl/dist/test_util.js @@ -0,0 +1,33 @@ +/** + * @license + * 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 + * + * 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 async function fetchImage(url) { + const response = await fetch(url); + const blob = await response.blob(); + const img = new Image(); + const blobUrl = URL.createObjectURL(blob); + return new Promise((resolve, reject) => { + img.onload = () => { + URL.revokeObjectURL(blobUrl); + resolve(img); + }; + img.onerror = (evt /* Arg is an event, not error. Can't rethrow it */) => { + reject(new Error('Failed to load blob as image.')); + }; + img.src = blobUrl; + }); +} +//# sourceMappingURL=test_util.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/tf-automl.esm.js b/tfjs-automl/dist/tf-automl.esm.js new file mode 100644 index 00000000000..f5d12fca5aa --- /dev/null +++ b/tfjs-automl/dist/tf-automl.esm.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2024 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. + * ============================================================================= + */ +/** + * @license + * Copyright 2024 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. + * ============================================================================= + */ +import{loadGraphModel as t}from"@tensorflow/tfjs-converter";import{Tensor as o,browser as r,util as e,tidy as s,expandDims as n,image as c,sub as a,div as i,cast as l,dispose as p}from"@tensorflow/tfjs-core"; +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */function u(t){return t instanceof o?t:r.fromPixels(t)}async function f(t){const o=t.lastIndexOf("/"),r=`${o>=0?t.slice(0,o+1):""}dict.txt`,s=await e.fetch(r);return(await s.text()).trim().split("\n")} +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */const h=[224,224];class d{constructor(t,o){this.graphModel=t,this.dictionary=o}async classify(t,o){o=function(t){null==(t=t||{}).centerCrop&&(t.centerCrop=!0);return t}(o);const r=s((()=>{const r=this.preprocess(t,o);return this.graphModel.predict(r)})),e=await r.data();r.dispose();return Array.from(e).map(((t,o)=>({label:this.dictionary[o],prob:t})))}preprocess(t,o){const r=u(t),e=o.centerCrop?function(t){return s((()=>{const[o,r]=t.shape.slice(0,2);let e=0,s=0;o>r?e=(o-r)/2:s=(r-o)/2;const a=Math.min(r,o),i=[[e/o,s/r,(e+a)/o,(s+a)/r]],p=[0];return c.cropAndResize(n(l(t,"float32")),i,p,h)}))} +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */(r):n(c.resizeBilinear(r,h));return a(i(e,127.5),1)}}async function m(o){const[r,e]=await Promise.all([t(o),f(o)]);return new d(r,e)}const w=["Postprocessor/convert_scores","Postprocessor/Decode/transpose_1"];class y{constructor(t,o){this.graphModel=t,this.dictionary=o}async detect(t,o){o=function(t){null==(t=t||{}).topk&&(t.topk=20);null==t.iou&&(t.iou=.5);null==t.score&&(t.score=.5);return t}(o);const r=s((()=>this.preprocess(t,o))),[e,n]=[r.shape[1],r.shape[2]],a={};a.ToFloat=r;const[i,l]=await this.graphModel.executeAsync(a,w),[,u,f]=i.shape,[h,d]=await Promise.all([i.data(),l.data()]),{boxScores:m,boxLabels:y}=function(t,o,r){const e=[],s=[];for(let n=0;no&&(o=t[s],c=e)}e[n]=o,s[n]=c}return{boxScores:e,boxLabels:s}}(h,u,f),x=await c.nonMaxSuppressionAsync(l,m,o.topk,o.iou,o.score),b=await x.data();p([r,i,l,x]);const M=function(t,o,r,e,s,n,c){const a=[],i=4;for(let l=0;l= 0 ? modelUrl.slice(0, lastIndexOfSlash + 1) : ''; + const dictUrl = `${prefixUrl}dict.txt`; + const response = await tfjsCore.util.fetch(dictUrl); + const text = await response.text(); + return text.trim().split('\n'); + } + + /** + * @license + * 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 + * + * 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. + * ============================================================================= + */ + /** Input size as expected by the model. */ + const IMG_SIZE = [224, 224]; + // Constants used to normalize the image between -1 and 1. + const DIV_FACTOR = 127.5; + const SUB_FACTOR = 1; + class ImageClassificationModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async classify(input, options) { + options = sanitizeOptions$1(options); + const scores = tfjsCore.tidy(() => { + const preprocessedImg = this.preprocess(input, options); + return this.graphModel.predict(preprocessedImg); + }); + const probabilities = await scores.data(); + scores.dispose(); + const result = Array.from(probabilities) + .map((prob, i) => ({ label: this.dictionary[i], prob })); + return result; + } + preprocess(input, options) { + // Preprocessing involves center crop and normalizing between [-1, 1]. + const img = imageToTensor(input); + const croppedImg = options.centerCrop ? + centerCropAndResize(img) : + tfjsCore.expandDims(tfjsCore.image.resizeBilinear(img, IMG_SIZE)); + return tfjsCore.sub(tfjsCore.div(croppedImg, DIV_FACTOR), SUB_FACTOR); + } + } + async function loadImageClassification(modelUrl) { + const [model, dict] = await Promise.all([tfjsConverter.loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ImageClassificationModel(model, dict); + } + function sanitizeOptions$1(options) { + options = options || {}; + if (options.centerCrop == null) { + options.centerCrop = true; + } + return options; + } + /** Center crops an image */ + function centerCropAndResize(img) { + return tfjsCore.tidy(() => { + const [height, width] = img.shape.slice(0, 2); + let top = 0; + let left = 0; + if (height > width) { + top = (height - width) / 2; + } + else { + left = (width - height) / 2; + } + const size = Math.min(width, height); + const boxes = [ + [top / height, left / width, (top + size) / height, (left + size) / width] + ]; + const boxIndices = [0]; + return tfjsCore.image.cropAndResize( + // tslint:disable-next-line + tfjsCore.expandDims(tfjsCore.cast(img, 'float32')), boxes, boxIndices, IMG_SIZE); + }); + } + + /** + * @license + * 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 + * + * 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. + * ============================================================================= + */ + const DEFAULT_TOPK = 20; + const DEFAULT_IOU_THRESHOLD = 0.5; + const DEFAULT_SCORE_THRESHOLD = 0.5; + const INPUT_NODE_NAME = 'ToFloat'; + const OUTPUT_NODE_NAMES = ['Postprocessor/convert_scores', 'Postprocessor/Decode/transpose_1']; + class ObjectDetectionModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async detect(input, options) { + options = sanitizeOptions(options); + const img = tfjsCore.tidy(() => this.preprocess(input, options)); + const [height, width] = [img.shape[1], img.shape[2]]; + const feedDict = {}; + feedDict[INPUT_NODE_NAME] = img; + const [scoresTensor, boxesTensor] = await this.graphModel.executeAsync(feedDict, OUTPUT_NODE_NAMES); + const [, numBoxes, numClasses] = scoresTensor.shape; + const [scores, boxes] = await Promise.all([scoresTensor.data(), boxesTensor.data()]); + const { boxScores, boxLabels } = calculateMostLikelyLabels(scores, numBoxes, numClasses); + // Sort the boxes by score, ignoring overlapping boxes. + const selectedBoxesTensor = await tfjsCore.image.nonMaxSuppressionAsync(boxesTensor, boxScores, options.topk, options.iou, options.score); + const selectedBoxes = await selectedBoxesTensor.data(); + tfjsCore.dispose([img, scoresTensor, boxesTensor, selectedBoxesTensor]); + const result = buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, this.dictionary); + return result; + } + preprocess(input, options) { + return tfjsCore.cast(tfjsCore.expandDims(imageToTensor(input)), 'float32'); + } + } + async function loadObjectDetection(modelUrl) { + const [model, dict] = await Promise.all([tfjsConverter.loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ObjectDetectionModel(model, dict); + } + function sanitizeOptions(options) { + options = options || {}; + if (options.topk == null) { + options.topk = DEFAULT_TOPK; + } + if (options.iou == null) { + options.iou = DEFAULT_IOU_THRESHOLD; + } + if (options.score == null) { + options.score = DEFAULT_SCORE_THRESHOLD; + } + return options; + } + function calculateMostLikelyLabels(scores, numBoxes, numClasses) { + // Holds a score for each box. + const boxScores = []; + // Holds the label id for each box. + const boxLabels = []; + for (let i = 0; i < numBoxes; i++) { + let maxScore = Number.MIN_VALUE; + let mostLikelyLabel = -1; + for (let j = 0; j < numClasses; j++) { + const flatIndex = i * numClasses + j; + const score = scores[flatIndex]; + if (score > maxScore) { + maxScore = scores[flatIndex]; + mostLikelyLabel = j; + } + } + boxScores[i] = maxScore; + boxLabels[i] = mostLikelyLabel; + } + return { boxScores, boxLabels }; + } + function buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, dictionary) { + const objects = []; + // Each 2d rectangle is fully described with 4 coordinates. + const numBoxCoords = 4; + for (let i = 0; i < selectedBoxes.length; i++) { + const boxIndex = selectedBoxes[i]; + const [top, left, bottom, right] = Array.from(boxes.slice(boxIndex * numBoxCoords, boxIndex * numBoxCoords + numBoxCoords)); + objects.push({ + box: { + left: left * width, + top: top * height, + width: (right - left) * width, + height: (bottom - top) * height, + }, + label: dictionary[boxLabels[boxIndex]], + score: boxScores[boxIndex], + }); + } + return objects; + } + + /** @license See the LICENSE file. */ + // This code is auto-generated, do not modify this file! + const version = '1.2.0'; + + exports.ImageClassificationModel = ImageClassificationModel; + exports.ObjectDetectionModel = ObjectDetectionModel; + exports.loadImageClassification = loadImageClassification; + exports.loadObjectDetection = loadObjectDetection; + exports.version = version; + +})); +//# sourceMappingURL=tf-automl.js.map diff --git a/tfjs-automl/dist/tf-automl.min.js b/tfjs-automl/dist/tf-automl.min.js new file mode 100644 index 00000000000..a9037eeb7d6 --- /dev/null +++ b/tfjs-automl/dist/tf-automl.min.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2024 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. + * ============================================================================= + */ +/** + * @license + * Copyright 2024 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. + * ============================================================================= + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@tensorflow/tfjs-converter"),require("@tensorflow/tfjs-core")):"function"==typeof define&&define.amd?define(["exports","@tensorflow/tfjs-converter","@tensorflow/tfjs-core"],e):e(((t="undefined"!=typeof globalThis?globalThis:t||self).tf=t.tf||{},t.tf.automl=t.tf.automl||{}),t.tf,t.tf)}(this,(function(t,e,o){"use strict"; +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */function s(t){return t instanceof o.Tensor?t:o.browser.fromPixels(t)}async function r(t){const e=t.lastIndexOf("/"),s=`${e>=0?t.slice(0,e+1):""}dict.txt`,r=await o.util.fetch(s);return(await r.text()).trim().split("\n")} +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */const n=[224,224];class i{constructor(t,e){this.graphModel=t,this.dictionary=e}async classify(t,e){e=function(t){null==(t=t||{}).centerCrop&&(t.centerCrop=!0);return t}(e);const s=o.tidy((()=>{const o=this.preprocess(t,e);return this.graphModel.predict(o)})),r=await s.data();s.dispose();return Array.from(r).map(((t,e)=>({label:this.dictionary[e],prob:t})))}preprocess(t,e){const r=s(t),i=e.centerCrop?function(t){return o.tidy((()=>{const[e,s]=t.shape.slice(0,2);let r=0,i=0;e>s?r=(e-s)/2:i=(s-e)/2;const a=Math.min(s,e),c=[[r/e,i/s,(r+a)/e,(i+a)/s]],l=[0];return o.image.cropAndResize(o.expandDims(o.cast(t,"float32")),c,l,n)}))} +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */(r):o.expandDims(o.image.resizeBilinear(r,n));return o.sub(o.div(i,127.5),1)}}const a=["Postprocessor/convert_scores","Postprocessor/Decode/transpose_1"];class c{constructor(t,e){this.graphModel=t,this.dictionary=e}async detect(t,e){e=function(t){null==(t=t||{}).topk&&(t.topk=20);null==t.iou&&(t.iou=.5);null==t.score&&(t.score=.5);return t}(e);const s=o.tidy((()=>this.preprocess(t,e))),[r,n]=[s.shape[1],s.shape[2]],i={};i.ToFloat=s;const[c,l]=await this.graphModel.executeAsync(i,a),[,f,u]=c.shape,[p,d]=await Promise.all([c.data(),l.data()]),{boxScores:h,boxLabels:m}=function(t,e,o){const s=[],r=[];for(let n=0;ne&&(e=t[r],i=s)}s[n]=e,r[n]=i}return{boxScores:s,boxLabels:r}}(p,f,u),y=await o.image.nonMaxSuppressionAsync(l,h,e.topk,e.iou,e.score),b=await y.data();o.dispose([s,c,l,y]);const w=function(t,e,o,s,r,n,i){const a=[],c=4;for(let l=0;l= 0 ? modelUrl.slice(0, lastIndexOfSlash + 1) : ''; + const dictUrl = `${prefixUrl}dict.txt`; + const response = await tfjsCore.util.fetch(dictUrl); + const text = await response.text(); + return text.trim().split('\n'); +} + +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */ +/** Input size as expected by the model. */ +const IMG_SIZE = [224, 224]; +// Constants used to normalize the image between -1 and 1. +const DIV_FACTOR = 127.5; +const SUB_FACTOR = 1; +class ImageClassificationModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async classify(input, options) { + options = sanitizeOptions$1(options); + const scores = tfjsCore.tidy(() => { + const preprocessedImg = this.preprocess(input, options); + return this.graphModel.predict(preprocessedImg); + }); + const probabilities = await scores.data(); + scores.dispose(); + const result = Array.from(probabilities) + .map((prob, i) => ({ label: this.dictionary[i], prob })); + return result; + } + preprocess(input, options) { + // Preprocessing involves center crop and normalizing between [-1, 1]. + const img = imageToTensor(input); + const croppedImg = options.centerCrop ? + centerCropAndResize(img) : + tfjsCore.expandDims(tfjsCore.image.resizeBilinear(img, IMG_SIZE)); + return tfjsCore.sub(tfjsCore.div(croppedImg, DIV_FACTOR), SUB_FACTOR); + } +} +async function loadImageClassification(modelUrl) { + const [model, dict] = await Promise.all([tfjsConverter.loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ImageClassificationModel(model, dict); +} +function sanitizeOptions$1(options) { + options = options || {}; + if (options.centerCrop == null) { + options.centerCrop = true; + } + return options; +} +/** Center crops an image */ +function centerCropAndResize(img) { + return tfjsCore.tidy(() => { + const [height, width] = img.shape.slice(0, 2); + let top = 0; + let left = 0; + if (height > width) { + top = (height - width) / 2; + } + else { + left = (width - height) / 2; + } + const size = Math.min(width, height); + const boxes = [ + [top / height, left / width, (top + size) / height, (left + size) / width] + ]; + const boxIndices = [0]; + return tfjsCore.image.cropAndResize( + // tslint:disable-next-line + tfjsCore.expandDims(tfjsCore.cast(img, 'float32')), boxes, boxIndices, IMG_SIZE); + }); +} + +/** + * @license + * 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 + * + * 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. + * ============================================================================= + */ +const DEFAULT_TOPK = 20; +const DEFAULT_IOU_THRESHOLD = 0.5; +const DEFAULT_SCORE_THRESHOLD = 0.5; +const INPUT_NODE_NAME = 'ToFloat'; +const OUTPUT_NODE_NAMES = ['Postprocessor/convert_scores', 'Postprocessor/Decode/transpose_1']; +class ObjectDetectionModel { + constructor(graphModel, dictionary) { + this.graphModel = graphModel; + this.dictionary = dictionary; + } + async detect(input, options) { + options = sanitizeOptions(options); + const img = tfjsCore.tidy(() => this.preprocess(input, options)); + const [height, width] = [img.shape[1], img.shape[2]]; + const feedDict = {}; + feedDict[INPUT_NODE_NAME] = img; + const [scoresTensor, boxesTensor] = await this.graphModel.executeAsync(feedDict, OUTPUT_NODE_NAMES); + const [, numBoxes, numClasses] = scoresTensor.shape; + const [scores, boxes] = await Promise.all([scoresTensor.data(), boxesTensor.data()]); + const { boxScores, boxLabels } = calculateMostLikelyLabels(scores, numBoxes, numClasses); + // Sort the boxes by score, ignoring overlapping boxes. + const selectedBoxesTensor = await tfjsCore.image.nonMaxSuppressionAsync(boxesTensor, boxScores, options.topk, options.iou, options.score); + const selectedBoxes = await selectedBoxesTensor.data(); + tfjsCore.dispose([img, scoresTensor, boxesTensor, selectedBoxesTensor]); + const result = buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, this.dictionary); + return result; + } + preprocess(input, options) { + return tfjsCore.cast(tfjsCore.expandDims(imageToTensor(input)), 'float32'); + } +} +async function loadObjectDetection(modelUrl) { + const [model, dict] = await Promise.all([tfjsConverter.loadGraphModel(modelUrl), loadDictionary(modelUrl)]); + return new ObjectDetectionModel(model, dict); +} +function sanitizeOptions(options) { + options = options || {}; + if (options.topk == null) { + options.topk = DEFAULT_TOPK; + } + if (options.iou == null) { + options.iou = DEFAULT_IOU_THRESHOLD; + } + if (options.score == null) { + options.score = DEFAULT_SCORE_THRESHOLD; + } + return options; +} +function calculateMostLikelyLabels(scores, numBoxes, numClasses) { + // Holds a score for each box. + const boxScores = []; + // Holds the label id for each box. + const boxLabels = []; + for (let i = 0; i < numBoxes; i++) { + let maxScore = Number.MIN_VALUE; + let mostLikelyLabel = -1; + for (let j = 0; j < numClasses; j++) { + const flatIndex = i * numClasses + j; + const score = scores[flatIndex]; + if (score > maxScore) { + maxScore = scores[flatIndex]; + mostLikelyLabel = j; + } + } + boxScores[i] = maxScore; + boxLabels[i] = mostLikelyLabel; + } + return { boxScores, boxLabels }; +} +function buildDetectedObjects(width, height, boxes, boxScores, boxLabels, selectedBoxes, dictionary) { + const objects = []; + // Each 2d rectangle is fully described with 4 coordinates. + const numBoxCoords = 4; + for (let i = 0; i < selectedBoxes.length; i++) { + const boxIndex = selectedBoxes[i]; + const [top, left, bottom, right] = Array.from(boxes.slice(boxIndex * numBoxCoords, boxIndex * numBoxCoords + numBoxCoords)); + objects.push({ + box: { + left: left * width, + top: top * height, + width: (right - left) * width, + height: (bottom - top) * height, + }, + label: dictionary[boxLabels[boxIndex]], + score: boxScores[boxIndex], + }); + } + return objects; +} + +/** @license See the LICENSE file. */ +// This code is auto-generated, do not modify this file! +const version = '1.2.0'; + +exports.ImageClassificationModel = ImageClassificationModel; +exports.ObjectDetectionModel = ObjectDetectionModel; +exports.loadImageClassification = loadImageClassification; +exports.loadObjectDetection = loadObjectDetection; +exports.version = version; +//# sourceMappingURL=tf-automl.node.js.map diff --git a/tfjs-automl/dist/tsconfig.tsbuildinfo b/tfjs-automl/dist/tsconfig.tsbuildinfo new file mode 100644 index 00000000000..2220b6b6639 --- /dev/null +++ b/tfjs-automl/dist/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/flags.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/data/compiled_api.d.ts","../node_modules/@webgpu/types/dist/index.d.ts","../node_modules/@tensorflow/tfjs-core/dist/types.d.ts","../node_modules/@tensorflow/tfjs-core/dist/tensor_info.d.ts","../node_modules/@tensorflow/tfjs-core/dist/tensor.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/backend.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/types.d.ts","../node_modules/@tensorflow/tfjs-core/dist/platforms/platform.d.ts","../node_modules/@tensorflow/tfjs-core/dist/environment.d.ts","../node_modules/@tensorflow/tfjs-core/dist/tensor_types.d.ts","../node_modules/@tensorflow/tfjs-core/dist/tape.d.ts","../node_modules/@tensorflow/tfjs-core/dist/kernel_registry.d.ts","../node_modules/@tensorflow/tfjs-core/dist/engine.d.ts","../node_modules/@tensorflow/tfjs-core/dist/flags.d.ts","../node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.d.ts","../node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.d.ts","../node_modules/@tensorflow/tfjs-core/dist/base_side_effects.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/router_registry.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/local_storage.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/browser_files.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/http.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/io_utils.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/passthrough.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/composite_array_buffer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/model_management.d.ts","../node_modules/@tensorflow/tfjs-core/dist/io/io.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.d.ts","../node_modules/@tensorflow/tfjs-core/dist/math.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/browser.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/serialization.d.ts","../node_modules/@tensorflow/tfjs-core/dist/tensor_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/test_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/util_base.d.ts","../node_modules/@tensorflow/tfjs-core/dist/hash_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/version.d.ts","../node_modules/@tensorflow/tfjs-core/dist/model_types.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/abs.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/acos.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/acosh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/add.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/add_n.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/all.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/any.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/asin.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/asinh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/atan.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/atan2.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/atanh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/bincount.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/bitwise_and.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_args.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/buffer.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/cast.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ceil.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/clone.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/complex.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/cos.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/cosh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/cumprod.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/diag.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/div.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/dot.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/einsum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/elu.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ensure_shape.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/equal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/erf.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/euclidean_norm.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/exp.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/expm1.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/eye.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fill.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/floor.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/floordiv.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/gather.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/greater.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/imag.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/less.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/linspace.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/log.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/log1p.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/lower_bound.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/max.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/maximum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/mean.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/min.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/minimum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/mod.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/moments.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/mul.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/neg.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ones.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pad.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pool.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/pow.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/prelu.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/print.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/prod.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_gather.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_range.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_tensor_to_tensor.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/rand.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/random_standard_normal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform_int.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/range.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/real.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/relu.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/relu6.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reshape.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/round.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/scalar.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/selu.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sign.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sin.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sinh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/softmax.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/softplus.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/split.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/square.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/stack.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/step.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sub.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tan.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tanh.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor_scatter_update.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/tile.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/topk.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/unique.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/unstack.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/upper_bound.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/variable.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/where.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/where_async.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/zeros.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/transpose.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/norm.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/search_sorted.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/dropout.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/operation.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused_types.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/conv2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ops.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.d.ts","../node_modules/@tensorflow/tfjs-core/dist/train.d.ts","../node_modules/@tensorflow/tfjs-core/dist/globals.d.ts","../node_modules/@tensorflow/tfjs-core/dist/gradients.d.ts","../node_modules/@tensorflow/tfjs-core/dist/browser_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_to_dense_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/log.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/split_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_reduction_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/device_util.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.d.ts","../node_modules/@tensorflow/tfjs-core/dist/backends/kernel_impls.d.ts","../node_modules/@tensorflow/tfjs-core/dist/kernel_names.d.ts","../node_modules/@tensorflow/tfjs-core/dist/base.d.ts","../node_modules/@tensorflow/tfjs-core/dist/index.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/hash_table.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_array.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_list.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/data/types.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/graph_model.d.ts","../node_modules/@tensorflow/tfjs-core/dist/ops/ops_for_converter.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/types.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/execution_context.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/executor/resource_manager.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/operations/types.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/operations/custom_op/register.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/version.d.ts","../node_modules/@tensorflow/tfjs-converter/dist/index.d.ts","../src/types.ts","../src/util.ts","../src/img_classification.ts","../node_modules/@tensorflow/tfjs-core/dist/jasmine_util.d.ts","../src/object_detection.ts","../src/version.ts","../src/index.ts","../src/test_util.ts","../src/img_classification_test.ts","../src/index_test.ts","../src/object_detection_test.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/version.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_types.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/base.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.d.ts","../node_modules/@tensorflow/tfjs-backend-webgl/dist/index.d.ts","../src/test_browser.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/abs.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/add.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/bincount_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/bitwiseand.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/cast.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_types.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ceil.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/concat_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/equal.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/exp.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/expm1.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/floor.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/floordiv.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/gathernd_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/gatherv2_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/greater.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/greaterequal.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/less.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/lessequal.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/linspace_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/log.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/max_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/maximum.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/minimum.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/multiply.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/neg.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/notequal.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/prod.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/raggedgather_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/raggedrange_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/raggedtensortotensor_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/range_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/rsqrt.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/scatter_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sigmoid.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/slice.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sparsefillemptyrows_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sparsereshape_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sparsesegmentreduction_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sqrt.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/squareddifference.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/staticregexreplace.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/stridedslice_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/stringngrams_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/stringsplit_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/stringtohashbucketfast_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/sub.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/tile_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/topk_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/transpose_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/unique_impl.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_types.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/version.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/base.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.d.ts","../node_modules/@tensorflow/tfjs-backend-cpu/dist/index.d.ts","../src/test_node.ts","../src/util_test.ts","../node_modules/@types/cookie/index.d.ts","../node_modules/@types/cors/index.d.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/jasmine/index.d.ts","../node_modules/@types/long/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/ts3.6/base.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/base.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/offscreencanvas/index.d.ts","../node_modules/@types/resolve/index.d.ts","../node_modules/@types/seedrandom/index.d.ts","../node_modules/@types/webgl-ext/index.d.ts","../../node_modules/@types/argparse/index.d.ts","../../node_modules/@types/component-emitter/index.d.ts","../../node_modules/@types/dom-webcodecs/webcodecs.generated.d.ts","../../node_modules/@types/dom-webcodecs/index.d.ts","../../node_modules/@types/emscripten/index.d.ts","../../node_modules/@types/minimatch/index.d.ts","../../node_modules/@types/glob/index.d.ts","../../node_modules/rxjs/dist/types/internal/subscription.d.ts","../../node_modules/rxjs/dist/types/internal/subscriber.d.ts","../../node_modules/rxjs/dist/types/internal/operator.d.ts","../../node_modules/rxjs/dist/types/internal/observable.d.ts","../../node_modules/rxjs/dist/types/internal/types.d.ts","../../node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/bufferwhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/catcherror.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combinelatestall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combineall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combinelatest.d.ts","../../node_modules/rxjs/dist/types/internal/operators/combinelatestwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatmap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatmapto.d.ts","../../node_modules/rxjs/dist/types/internal/operators/concatwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../node_modules/rxjs/dist/types/internal/operators/debouncetime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/defaultifempty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/delaywhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinctuntilchanged.d.ts","../../node_modules/rxjs/dist/types/internal/operators/distinctuntilkeychanged.d.ts","../../node_modules/rxjs/dist/types/internal/operators/elementat.d.ts","../../node_modules/rxjs/dist/types/internal/operators/endwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaustall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../node_modules/rxjs/dist/types/internal/operators/exhaustmap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../node_modules/rxjs/dist/types/internal/operators/findindex.d.ts","../../node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../node_modules/rxjs/dist/types/internal/subject.d.ts","../../node_modules/rxjs/dist/types/internal/operators/groupby.d.ts","../../node_modules/rxjs/dist/types/internal/operators/ignoreelements.d.ts","../../node_modules/rxjs/dist/types/internal/operators/isempty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mapto.d.ts","../../node_modules/rxjs/dist/types/internal/notification.d.ts","../../node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergeall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergemap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/flatmap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergemapto.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergescan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/mergewith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../node_modules/rxjs/dist/types/internal/observable/connectableobservable.d.ts","../../node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/observeon.d.ts","../../node_modules/rxjs/dist/types/internal/operators/onerrorresumenextwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishbehavior.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishlast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/publishreplay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../node_modules/rxjs/dist/types/internal/operators/racewith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../node_modules/rxjs/dist/types/internal/operators/repeatwhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../node_modules/rxjs/dist/types/internal/operators/retrywhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/refcount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sampletime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sequenceequal.d.ts","../../node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../node_modules/rxjs/dist/types/internal/operators/sharereplay.d.ts","../../node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skiplast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skipuntil.d.ts","../../node_modules/rxjs/dist/types/internal/operators/skipwhile.d.ts","../../node_modules/rxjs/dist/types/internal/operators/startwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/subscribeon.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchmap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchmapto.d.ts","../../node_modules/rxjs/dist/types/internal/operators/switchscan.d.ts","../../node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takelast.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takeuntil.d.ts","../../node_modules/rxjs/dist/types/internal/operators/takewhile.d.ts","../../node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throttletime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/throwifempty.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeinterval.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timeoutwith.d.ts","../../node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../node_modules/rxjs/dist/types/internal/operators/toarray.d.ts","../../node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowcount.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowtime.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowtoggle.d.ts","../../node_modules/rxjs/dist/types/internal/operators/windowwhen.d.ts","../../node_modules/rxjs/dist/types/internal/operators/withlatestfrom.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zipall.d.ts","../../node_modules/rxjs/dist/types/internal/operators/zipwith.d.ts","../../node_modules/rxjs/dist/types/operators/index.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/action.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler.d.ts","../../node_modules/rxjs/dist/types/internal/testing/testmessage.d.ts","../../node_modules/rxjs/dist/types/internal/testing/subscriptionlog.d.ts","../../node_modules/rxjs/dist/types/internal/testing/subscriptionloggable.d.ts","../../node_modules/rxjs/dist/types/internal/testing/coldobservable.d.ts","../../node_modules/rxjs/dist/types/internal/testing/hotobservable.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/asyncscheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/timerhandle.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/asyncaction.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/virtualtimescheduler.d.ts","../../node_modules/rxjs/dist/types/internal/testing/testscheduler.d.ts","../../node_modules/rxjs/dist/types/testing/index.d.ts","../../node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../node_modules/rxjs/dist/types/internal/observable/dom/animationframes.d.ts","../../node_modules/rxjs/dist/types/internal/behaviorsubject.d.ts","../../node_modules/rxjs/dist/types/internal/replaysubject.d.ts","../../node_modules/rxjs/dist/types/internal/asyncsubject.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/asapscheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/queuescheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/animationframescheduler.d.ts","../../node_modules/rxjs/dist/types/internal/scheduler/animationframe.d.ts","../../node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../node_modules/rxjs/dist/types/internal/util/isobservable.d.ts","../../node_modules/rxjs/dist/types/internal/lastvaluefrom.d.ts","../../node_modules/rxjs/dist/types/internal/firstvaluefrom.d.ts","../../node_modules/rxjs/dist/types/internal/util/argumentoutofrangeerror.d.ts","../../node_modules/rxjs/dist/types/internal/util/emptyerror.d.ts","../../node_modules/rxjs/dist/types/internal/util/notfounderror.d.ts","../../node_modules/rxjs/dist/types/internal/util/objectunsubscribederror.d.ts","../../node_modules/rxjs/dist/types/internal/util/sequenceerror.d.ts","../../node_modules/rxjs/dist/types/internal/util/unsubscriptionerror.d.ts","../../node_modules/rxjs/dist/types/internal/observable/bindcallback.d.ts","../../node_modules/rxjs/dist/types/internal/observable/bindnodecallback.d.ts","../../node_modules/rxjs/dist/types/internal/anycatcher.d.ts","../../node_modules/rxjs/dist/types/internal/observable/combinelatest.d.ts","../../node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../node_modules/rxjs/dist/types/internal/observable/forkjoin.d.ts","../../node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../node_modules/rxjs/dist/types/internal/observable/fromevent.d.ts","../../node_modules/rxjs/dist/types/internal/observable/fromeventpattern.d.ts","../../node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../node_modules/rxjs/dist/types/internal/observable/onerrorresumenext.d.ts","../../node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../node_modules/rxjs/dist/types/internal/observable/throwerror.d.ts","../../node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../node_modules/rxjs/dist/types/internal/config.d.ts","../../node_modules/rxjs/dist/types/index.d.ts","../../node_modules/@types/through/index.d.ts","../../node_modules/@types/inquirer/lib/objects/choice.d.ts","../../node_modules/@types/inquirer/lib/objects/separator.d.ts","../../node_modules/@types/inquirer/lib/objects/choices.d.ts","../../node_modules/@types/inquirer/lib/utils/screen-manager.d.ts","../../node_modules/@types/inquirer/lib/prompts/base.d.ts","../../node_modules/@types/inquirer/lib/utils/paginator.d.ts","../../node_modules/@types/inquirer/lib/prompts/checkbox.d.ts","../../node_modules/@types/inquirer/lib/prompts/confirm.d.ts","../../node_modules/@types/inquirer/lib/prompts/editor.d.ts","../../node_modules/@types/inquirer/lib/prompts/expand.d.ts","../../node_modules/@types/inquirer/lib/prompts/input.d.ts","../../node_modules/@types/inquirer/lib/prompts/list.d.ts","../../node_modules/@types/inquirer/lib/prompts/number.d.ts","../../node_modules/@types/inquirer/lib/prompts/password.d.ts","../../node_modules/@types/inquirer/lib/prompts/rawlist.d.ts","../../node_modules/@types/inquirer/lib/ui/baseui.d.ts","../../node_modules/@types/inquirer/lib/ui/bottom-bar.d.ts","../../node_modules/@types/inquirer/lib/ui/prompt.d.ts","../../node_modules/@types/inquirer/lib/utils/events.d.ts","../../node_modules/@types/inquirer/lib/utils/readline.d.ts","../../node_modules/@types/inquirer/index.d.ts","../../node_modules/@types/is-windows/index.d.ts","../../node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/@types/js-yaml/index.d.ts","../../node_modules/@types/mkdirp/index.d.ts","../../node_modules/@types/node-fetch/index.d.ts","../../node_modules/@types/rimraf/index.d.ts","../../node_modules/@types/rollup-plugin-visualizer/node_modules/rollup/dist/rollup.d.ts","../../node_modules/@types/rollup-plugin-visualizer/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/shelljs/index.d.ts"],"fileInfos":[{"version":"6a6b471e7e43e15ef6f8fe617a22ce4ecb0e34efa6c3dfcfe7cebd392bcca9d2","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7",{"version":"fcd3ecc9f764f06f4d5c467677f4f117f6abf49dee6716283aa204ff1162498b","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"5114a95689b63f96b957e00216bc04baf9e1a1782aa4d8ee7e5e9acbf768e301","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"9e940485121a1d57ac36902964bc56461c3f23ccb000c3903677c8adf53f3994","037a005905a338cf56a166911eb18269ea65997941e388f4ac3b42b931d0f2fa",{"version":"59fea718aa3b246052fab0355eba4f49a806d5ec72b0571d914dff3786de50cd","affectsGlobalScope":true},"93e441f2bc7b069c29fa9c2d7481f3bb96c36208934402fad4cccd44e2da6de2","e72426b29ed5c9129fda0562f4f4c77c54ca6f7a64b4ccacd469c7f34d4bccb0","70630d91cba57caa22a3eb03442c8baa2a1c5cdb4925a85179f69034c39c5c63","6e878b8ad8efd8f4e03b5e0e9426881fd2156f0f772dd145eef8ddccb1bea5c0","27b80c0c45cdd933e1b0c762704bb02c79ab0d4997d6640a2d57d128f7fe11dc","15060487683cdd635b8cc810e8cac7cb0920b6530613c3cc76bafaa476a4515e","54242f0e1b51b56b2d724879a31b836d94b16a2f9d7584cde62cc55a22491137","66938a4e745d47580868a989f499e8525722886f169c294eacd4e9b1c1aaf081","8974fc92dfb8eda33f542b598c103b41e4ddb70eda0ce474f0cefd94fadae89f","f031fdd229a8063c5abebbae11083588a803adabc88693c8765a305359a9f53a","9a00ffebcf1bff987653f2b4cf263de440f1d241f660855ff2e1c08803da3020","f34836298ccd8457fc96b5dd9e2d202a86dac466e410ddd53071d0ae9285b4d4","fddded6600635bee2303dd02e02a79c41a074485825ccf068ff0201448f2ae98","c19efd3d19224da4d63b38e1d00bf4447a6ee38e3f062a58d1f0d8691bb5433e","a47575f92522ec12bda97d325d3bde9c81a5f0b18b3afbe21e8254d3cec62092","a1910d69ba104b085ff9041097c0057a7113d2e9be99f14d666e579354d6d628","7bc7d87e539db5f6fd89647d1b319a17d85a7c43a400f1caccdc635278998ca2","7e3ce6d055ebf8666cbc9baf0a78688c880b6ab853b2cc2398408ffcb1d0bbad","5afce8b1a1e6c7b0fa72358326512a4bf537690b1d82e98072e6f565648ec9a4","e6a0a88e1e75017c7c934ac889f668335de75b3db89dc0db001df6df784668f4","6f4e31b684b2680189dc73ea2377d39fa9d3ddfd76686f541d19494cb36d114b","0f4044f55d69511bba98ab780213a8a3b0e30a01891b96bede8445ee014bdc5f","efc097e9578e867df4f19886493120eefc556ea31a1086949430f9082a60f3cb","958e83fdc2a2f06acdcf56cd4964eff0c2620d6c900d98698b54f23d9dc92174","f688954198914003a5162ee556c9e04720d844f2ac28ab69495e46849dd64a0c","3fd83b6480960dd9379f5b0d6d5b9040e085b1d131693ac7ecfbbb5405080c36","ee7b8f8eba42465579ede66c5e41e2eb566ff7e908fe15018843ac314a2d7e73","29448517423f80524bec281e139118a3908d046c499c00beea91bbdb26a652f0","f5212f6d8c94ec975c5e63bc6a77030f0855334259a3b6cf44947eda5f8c34a3","52c89c5e8b0f366b3da1b8771f66f35a956e95efaa0eb6b5b4e050b386ac281e","8d28783e4453e2496e5f6bb4ffb4cab88b173f1435c2b30a238baf2501a84287","7719baed8ce04780d834bc4be158921153ea6cceffbc02d0e1907c1a94c2dab9","e9927cc836660ad71c5f96917a4ba0cadc9c7ba8d7c7acb5c43426d63d38226f","b85674db4e070c2d0c318058edc62929ca815011c370a7f1a8c96c4d7a535621","236ba85b6069b28102b212c76607b6ec5b8c1c4fbc1dc3c281e1bf5270fef48e","f20f0eba42d91b8f9da8d35fb226cd3e9f4e9cec92a29150f7b061188e0f5360","73c80a43d015c4c622d372e5845ccfe6977d99c171517dd8a9028154b1f1c29c","36048ef79e8ec02c070aed5e8fca53d803653bc7b64d4ca2a8c2296ff57f2933","b81ef3c3783d1e868e16d4ea68725ea233417fffb0e52bc6dcb2e9f277079f4e","8214073158f59f1096b5f2e3039fdec0ae9a8d575ebcd0162b2a7a1f7a48574f","1543a94455304a159bab754e54de99fc81405b075b6527a4f3b52fa965986bc4","99225b34972ee91985b105b7dfdc5063801995e492752d1c8d071d5860bc0864","544027af6054c31cc47fca2930963409814aae8a402ef2ba88d793132a1e76c7","5d870596e932ea1ce3ba5d50a9e60ae2059da99d60dd5d7fa8052e40898f35ec","c424f9ae986eff13f6df495ce2d08e88d7ded62340c735f1629da5be5781ff5b","5669393084e77417e29bf7343d403f3b3acc562a0e80b12e30ed1bdc459aebea","05ec34f3dd0614adcbbcc0c1ea69b87157d659812d978a8c322c38e68d06e4ef","4c50e0b87699f43a39f816b7113ad6e3de3476b769244acc2f1659ad05b54242","cad6edfee4b7dc0ca047388f76bf309c26bee8e72f99a53a96dc94222499055e","06d696388f98b31f5bcf78c4e3f4544995c3ca331ed6f8b3af014d4e9fa07819","b69f081db3db3eeab6e225dbe3cb68e1c328f677e2e8ba9e1e70685febe7ef5d","ab4773f4373d811c57c87b4af56ea967078be9599e4817fd01feb776cf4cc8e7","15c4f2177763c7e7ad4d0c6e1defe12905f610915f8dceb0d1d6d6ab17875799","b1dd11e2073c04e5b894c4a4469f915206fcca5da42882a33882a6938797b0c1","b6dd407ea17906a0497bbe5868ea8ae9dda0ec2b2d9b6984dadafe10abfa7313","f6b2bb4c12d24a177163912eadcaa5e22e6e300e98ce4f726698baca832a281c","e6aebb5887dcbac8f30b7411f2a7458bc32e4f87bd542c66533da8c050b08b5e","ecd71c5a364472706c0ccf8486d44e38bcdf22350895a9d7b62c3db32355fe9e","4b62127576146ff0847e2c1cdbaf7bcd7983138f9fdac2517651e5d7d5ee617c","4757338e6b897bc851572edccbc3ad09dd8bc21449a40ce2341ede38d7c5678a","9d52d626ecd72e80b28f4f5fe65bf2e9193285070cf9a18a96a63549a63b6601","2f04c22b734aebe5b7f8442da1e7e9f5fb82e5dc49928510c213bf704068fc9d","afc01e7ca7759dcef12c88f1b0b3d5017fcfff6d02fad777b34a927c955a1dd6","facccb3c719c0225a959b419d62f7fd107ce8bfe93f9a5c4bc551ee257734777","abb1d02b724165220a5608fbd81c40ed636e4efd2504b74e6c00e4fbe8fd837a","2a6c1eaa4121636af0f1315a2032e167061c2e51b4ceade50723a96a736a1207","aab034aea490671a68810d1ff07a707820c609e45d05ec7bf08c93890fdc5533","167079a0661a6bedcb1b8d62ede3f26f968bb27ae8fd2e1051f5cfefa3b588e0","b7b3dd484f6cdff309b9f7177a5659ea32a8b0f798caa778d0119829930c4a39","286282506b0e0b55e87cc1db16bf86997d0cd037a1b1f0d2faa854ceea1fbc17","66394672cf09f92068a4aab1a0d3b4079afb6a8a9affaf73c02d8b8dd752591c","e67bd741cabcf37f99e0e6a1226ec46baac758abde50d922b8f5facec7376e64","f5410407a881f5da96ccde2bef9ad05b0b7a8b58f4fb7391a26df3e5371afc82","f994f58f9a4f29b3665b441a1cef9e5b9307b6d2c0eb04c45deb8d2e61e1125d","856467857adc8c0f5fb555840e4008b9372ccf915d1531b37aa6c207ba097be6","c9206c48532733a47f9b4fa34d21b685b9290dafc481b68fb123f8e2b2117faa","2e6dccf2f78bd0b60d6e22ae3382192209d2014372f6f4b1f65ea243ca13de33","e2ce3f5ebaaa7e27e6cb398c4d704b71af3344dda324089cf984e5361563b422","e6928d6bc739c7d933e5d91d7979aad9eafe800300c4d773061f84156a4415b7","64b89ef101875fe633858c1cfdbf61e9dfeda00286fcdf122433bfa6fb3a343b","defc5999703af7390fd835fcc8d17e8e0c841d5afddb5ca38bbb23b42db1ebec","3983eb3a679797d2c79d00817093657b4be714413c6a7f17707d8aa0bb42ca9d","0634063441797585224003f9a83307e2ab02c8b5d35e27fe344b7cf1ebc90760","9e9e84b756c5658e338a966b8f65136b4af05d9137a691f73418c582e0422b9a","c243a175db0b65b50d50071eb43811399e9788482332a0d708563d55d2c33b1f","02304343494f1c42100908a5ce8c76324282c0dcf247073cd7d3d390c3f81426","cc531fb523a47db98fa7f31a5a1332b1cba6f20d3b5ab61057cc2ee543d48cfe","a29027d40d7b3578fefd25a2187a39074db4a2562d5c57030a3f6905964ecf68","a440bb7259bd047866d7116fa058902eb241e664b74065f169ecea0ff965f8d6","77092fd6e25c380f29e9ec5cdae0a1aa68e0c2d45d55bb359a1eb34a1c347dff","63197a8847f836ae73efb2f0a3d7097b772b2b7016f60ac577f35491c30f8ac8","79a3e93ca3a6dca9894f3ceca2ceef06a8cd4d2b23f683152b9179e7d0ecd982","1fa8b7206e7d5af70ded6496135ece73fe25a2348e36378958f2d39c240127a1","1509efd4de7c17d9baf73857917a53ad48377cf1e89dffece45cc6dbd168df79","a58466af471d051c02902e94d636bf841e0cc843805a6a2a9c7243b92a383bbb","1a272415792f190755199906e75174ac3e29d1f2bf14fc0ad3ba86c216d048b4","96cf41fa7460d5800d3c55fa1ae67adf33c2e1755484ab5d7b7b42d426f4dfcb","6ddba8d5951dc885b113a9e1b26a6421642bf2b2250e2cca8a0ddb43b5344471","58f5340b63a3fa243ac5a5d4bce42ddb3207d919dd0c86594a3bd0b75ecac5d3","c4b719ce1ae0a2894737ddfb8e442ff0f264a0a3ba6d7d648a372937362e7031","2a03c74d1db99aa24c0c284045cda2e74cc48d0c95194bda6e541d087af039f2","b1f87ffa19c6fd913e880960bdae941d5bdc8267a506e6f71f01883b9fcc2006","0cfdd8d3a9b2585b6c282727fde19a4bb58e3a8a6f4ab2390952850456442587","2bb266e24d6642328fea94aa0219ed2da07f44a662e2c89830709b056d1e3696","d33eb3ee4a54a524fb84103d91de59a040fce0851a96817443ba62d0796f0493","23ead8f62073e4af883eb5248d1472cbe0a124298d8bf28cd55c08bca057043d","0d862ec5f15930c7e91042d406b2ba12658cc63bce8e63854679480daf944e22","ac7f31aa675e21b8cbc545b2f91405287ed1a16647bef1b29e37561e410dba81","8cd9d8d64beb2061f63d54b98607c6a22f09bf0ebf3ea1b3b57520190e706b75","73ebc811016b730fc0ac22d12023359fc728c875dde8f054a884e6f22de84fd5","2f7933cf928f4502e190a63b55daa219aff9020efa5045927c23beffbd2d0e18","ee5ee93749cf7bc59e08b554a3f7057bb0796ba73ea3e1bae043d02bff84f2f3","69de4623215ccd52fafb41043b9a325cfa6bede242fd4352ee70e33d62ec6c5c","b023b6b3de675064e301a447ba2db258827b225077142f910642b26a71bb9e8a","a44c902015b58acb66d8f2aa8071ed7d1ed7a7a5f587c48e276292f36117bb1f","4b2918295f4f4c6be29e3eed6c4d39e78bbb3fc2ea4f3dc034648e0076ce4ac9","2473d9f95c2748775129a33ef2f563b95a08fcce88164210cc56dc30acb8e69f","9ac19289527d7d577dc1125421e5239fa00c7e637721f7d2f9b6f56e65cf727d","a7936232ed5e82ea73c8924c071d082cb687146520d77baf97f79ae3ce167476","cb90b243ff3b978f64574b8db39dabced1a5558afee52674d09dd7791400480a","7ad86daba6e8763014eb0c5ff4d560b90bd351dded63b85b024422e884b394e1","1972a0145ce15ef7dc0f09f4d4fb3565245eae835015b91c56fe454b8b99aef9","7f9b422c6765eff60fb16155e22c2fc46cd2ab4c6790e6ac6c16693b3c6ee222","502ee709b67ed4e55f80eb7a828d70e2a830a573c657fffd0554f0448170af7e","19921ffca751b16c1037f036d52183a9d2af388a2d661dbb2cc7d1169d24cb0c","7f9dac53f3e8d37132981270a6c7db880507015a11021308e69a6abc08dff4a9","4b097254e402ef1d1a7482db0309d2d824d6f6e312bb1c1da94d609e9baee753","4219c7a0a0ad110b18caed4c3a0ff67c1c89197b963e176fb4ef84adcb87ae0f","22afc2a7ed4a0aeb0834797b1f80713acd8776310e307ca6ab8978861b03b274","a5f669151a1397d04cd9b63058142df6d87e684d05683ff87466196704a414a0","8e51a81f1fa18fc68a613c12fe453b6d4238dc754848bd4e7a72a6cc118730ce","1c96e7e5499f62d720fefd83e3e0aaa2493644f4118ea223d4669b72511b074b","629a12d4a6523cab2c873aaf1efa23474b020b6bf1d2bad7c98cedd34b0296c2","9bb5fc9dd427a4dc43c132281d8f73c1cd49270ca7a86e3676fcc0f63286ffea","25354123883fb3ce73c086056ace0a47f6e9afe36841da44af896152cffa69c4","52b3d9818d4ea76e09f64fc05cacf946bc992cab1451699277b75d3de2b7f7f2","eb01f0332e951e121e2ad2a115e3904b45bb90628c9d44d5c1d4afc441792c9d","92c024b1c0b9f43cd011ea5baa3f8db34c22356a03da157d1cf034e3236d3441","f179b463b5b75b1c635544e230e9fa4a4afcc9dfd95012ff08cca8df526680ea","d8903f223fd8c08f25d7f0ebe41e07c1fbe272fff42e9774bab17ae166c9dfdc","d880a9f0d2842786b669852efcdd0691806f483c1a783da9e0a232d9bc7f46bf","1c160bc7f510767db1ed04f60eba344b501af25622524b3c967abcc97dfe548a","ac8fbc85937f34d2769abc2ae71497c28740a916c207fb0db17dea902374315d","82e6a279443c9c97cfc802f2cb5c7483fb6e8ec277bc78b31b5c6b17613044cf","6cc1a45f60e83009a910a8ea29d226342c31d7eb6a86c431e56ad706a0039c2a","eae15143c71393cbf3618402374d4dae33ecfd5065fbf299f300490657f9750c","66e269ea2bb913eeb2cbbd3355d60778e4b8b4a3f5468e25197b4705616e3992","31c1f8617f969c7fa1f4d262ed190dff65a6c01b8edc7f499df8252fd03f24d5","a2ef5cbb3388541b660f8d0dc2025a196ae652501beecf5ebbd2ef7a086d57e8","31447e3f2d3af43a8bdf15601f911b168e70424cc1684b1eda5cca861f2b1ba0","c12131e9451ca6fa1631cf729c71cc0a7a996255bb19bd0e7bdb9dba995b2627","37482ab003d2cbee774b60e1bbdf944736ac47e117164b43f5fca3114b2a12dc","5704f33f80cee3c961c6487a86db2357e2e927f13fa3cf5ff8101aa6285e1037","de279f52971ddd97a9314bab76f9aa2feebc9ce24e3942df668926fc6c8f8f6d","021a6cdf4268fb9c20d37caca908acfe0240671d429044c2d43246938cf22566","14f265621be95902becd02fe182973073477bb2f902996d8497f6a226c65aeb6","77dc80add3945851b818233fce4d4988730b22924d25c2b2a52d5a4be7c8a0b1","dcab7c74ed9b5f2cb422d318ec65e1721cca7ebff71a9724ce6940f0bb92e780","4910bed51fcd736249047d2fb87c6a46abefbf63795a446a0b3ab8d3cea9385a","f62a899bccece3bc2013337271359ca52e85f6cfb7dc19fb27f20b01c4251930","a41c809bdd3f986d09574ad87e9070835fdbddb69523ebdaac8673d7bb8cc4b7","58c73ddf2a7d17c18498bcad45ac791cc766112cd1f8c869e8176c26d34075da","c5c5ada2179100e1692f2e83ebb8b14540fc0c70ed89c8f3ce9334ce33b39040","30e78a4f3c062428ca3cf718de08badd12e89e36697c5c9a5baf18ba90d87eca","bcefa8f6df455b7edfe6d87128ae23c644fc2f566bfbcb4fff1c40e9bde5a662","e0aaf707195b5f52f3a6d19cb2239baedc861e5b0c465db9ddea4fd7235017e3","c9c6acce84da6ba03850a8071950491edb25d6c0647cc52a1a80287955557949","27c21a999b4af6659a5b5249d3b44f39a2e7f6c5c7ccf5cfcd48eac414ae881d","381b62d286390c596f7aadbc4ff5506292447d49b2d3b989df10db97ed5d16b3","be72c5f95cef5e8a1b10e4ddfcb3f2b1664779e4a835d190968a43e0b08f6705","5d29d797b4b615bd6eb0ff3ccc04ec4e0f2e29cb371ff62eeb87bc45328f1a6c","2c5acc8ece020bee5f85fd158e43ed6fe9fb272a27debebbf1cc64b4df798cb5","fe1ba8cddf0af4b8aa5350e15645177e786efec9f69c7e14b4128388a5035a54","12d0c8b8401e15cc138603a659c0a84ac95026ab3328a2421ddbd2e7291f01b6","e4828faa804f2f0fab95438a0e905db849cd75e35f8afe00e072533ca69bbeb9","4e8e4165cc23f665d92fdbb61136f375a2ec61c990c38fd4527d73004aa561c6","305a7549b5d383c6f9dcba79336819128c0ddc0c08b576d01b3c301bcc4aebd8","621ba4aeac55130e618d39bbe1d9f149a118caaa80f7b58129225654827c1aa9","3d2bdc1e927a89dfb74120e2305510b3f3ca8532cd622551c21e0b85fd4a9fcf","a2f0175565329f419ca22adcab220177c4a5b85346e02aff5057c2b796db1a76","f4851b813405c98df97fcb0a73372f56fcabea36b5d608a2613d4840526faad8","cd6c109fa7c4994f695b8c74fb66c644a8309871d0b9d56355a8691d005b50fc","5471abbd143d55255ef68360da364f9c40bd56356b22bea00596032d750b64b2","3288a269a5be14c4cbec2241d2c1cb42bab4dbc93f002a307021a6bb901e9da2","34c19ccfa1d9b63fe8ef6b67ec64aa677efef8184fa5163f887f62769b75d906","9ea28018625abcd737d108aff9321984b74ffe3b943f3a76bf4efbad37444bd4","1b4a8432b19b71188872da9e197c76c4bb9445159cc01d6612f14e86327a724b","3f2e7e9fd6712c5d61658f673483c22a05da818e46401a41d311ab929f2d8377","5005767c9d133e23f28b3f64b2758733a746a708fa8130a6d304793c2e3ffe91","1662bef6f7629e920b24ac8ca86f5d6c1e0031c4ea1cad1cb7e47a879d53977d","6fa21f75533a039652885e23eb803dc7a031ab27f97f5177ceaf19fc8ca130ba","2068e6b583be7539959e76407d4784c2a8734bf9cba1e0a68fb3d7d65d981aa2","4c3f273706348c5423a2a24cb5e25f5e88c220c0cdc1c68058fc61ac5a6ba780","81e0a1265b75e6c70e45cf1d4f27bb2db7cd4d235e012547016bcbeb79b3efa5","ae11ff0a444156d199ed384a45068d756fe14d92add33a015e6e3d358582f03a","8fb01fadee9580606af16d8d7636eadb8d6f7f73b40b98a6fefb84e4f09674e5","c2f2b38e870c11f011deef3b74fa265a937b8f373ca47d35760af3f2be893e4e","53305aaff3301584131ef61c0034a16d05a041a2d479096f4262db25282d76c9","589e80f87be16d8280b800dd215a07e050a6f9c2db5beb8863f8b52da6e09742","b24d283a291c15ed14eca5fdbe5c41f05becd29973001c292081401cc24deb6b","89fed4dca3af73a5cdadd15e4af4f3f3d05c1717a5081ceb5f7a1217bcd28b32","a744d27b448b63bd46291f8424773f44c85fc04dce1b5ae04897323a0239dc25","b4fac9c86c470f653814be3dbc14e222a190020ad27d3a1c08c1323b03126741","1bd0e7eee7e3bf827f7dd275c118e6dc26353713efe1f12ee51ae3815c36768b","9196c185f06ca1cb64cdca1935ea4eac3ae4cd913e6e5ad468f4f7c5c87831d2","d9f65708966047d042832a1a233b76e3c8ea43fb83ba757c99a2fc06b9c17ca5","0d20aa64f307021ce05bf4fc6d7c2e2fcec4fac357f5d11e1a092af50dd2e656","1232fe497f7ca7f3e0288ee8a31a772bf8dfa3e9c47eaa5fe5778dae05c43d6b","3cb8e2a7a9edf4be19dc70b3e62c26019750b284882f6b61abb11234975b21bb","73fe3de619263f4c77dd023a89b123e3c618f0f8fd54b027e979fc00f6cc9190","51b46ba2328c3645f6abab083c97bbbd76ae00e77617f34733f9f720a53e15f0","eff3ca3709693be9002262f66ac921cc6d7cf18932c3bd2f3871a72858121a1f","da592d15a12b8da8c095945bb84ef21fe675bd99f06d2a53079ffd65b7d8f9f0","de89b83e39bc8955bc98f4b3f499d2630e0ff99309ea3816cb3776df3c377f71","07321ad202630039126d113cf6e3df0a027deb6bdc2f55c3ee1722268059c341","589722c5538682fb0511dc1433294c8f9b6dbc4aca83888982a1b6a41b506682","a3615dc90b293d59a17b7bc2a51f19d59f0b9c67818bb9d2844035e79dde4480","bdf1d3431e13881e1497fee4477393e56179ecfac08a7911116a8d1880684d42","800e069d723ec48ac1f59470e840d8994743514156603463317538b5e68beb95","1c8f067f30993e4e233a85d04f73e792b672a60c2a64ee6dd625aef329abf5cd","15950c58d2d4af5ac2c3a02d4246f3305b316506ad71c6142756a527c240ecf7","f089b8316d10bfcd7c6dab15f22ea8489587d8f125661ca3643619023fe6a94d","e50a42e10582bb17fc7b2e05a74127a534fb5b33ab27eda0575d43747e4d1cf8","6b50d3683561e1e8cfe5d09d1ce7ab96d8f78959c98f50bbde9af824feec9543","37d063d2c278a1cfe58a269cdbb71f9040686c2d76569ed13231f46dfa09c3bf","949a389c4902fd04827ac3741a880748720025172048aff77dbd23a10e595d59","c5340d54a343d872218a0e62fd2150d0b14bac1c0a07b6fcf5cf8c4bb01212ab","2c9b9894bd46a0153469ef4cef38d3e36cfec62d157f47d87cadc4ddce8ed64d","134f0d1e3839c733a670c7f9d1e5f76ed68d01bdb05d289c443544edf980ff83","be3fd51c730462bde1048abd02185e08cd14cbe3e8e76b7528200e93f026a785","4b76aa93d3b400354fbcade6bab52bfb5660a920f51b41111871c4ecaa895404","b5355bd01eb1a7526255d444909adfaa9e8d43facfab8271895598ecff7894ee","e8b8eff5aa44875da4ec68a4b10bfe9339095b63a4558b391b75ffba849f78a1","e216a02854ca4f79749cf674148bac2fce620cb7e00625afa9747b3fa337b1b1","5f2149247b5af187c5465c1632ab1b210d0e939b19af09c5d24d920897ca4f9a","134e6d4d307a320bd25e92bf34900c5d19f7964cb0ab2c5e395fc4900235a049","adef4ef1fc7dee50cb3d34380067982717c1457141a487cd3608a531298b7ed1","fe4db928d70d4dcab644bd5e13548da5de5fd44c06ffdcce9828af9d498a24af","b3d90d14adef22dc402c75c24536fbd02050e62485d7c9f4352a1498334f94ec","4543f6d67c42925d2424b603b36163c85768a4967588a06b29abef1dfb62aa37","d70c9fbdd2bad5fe29dbf4dcd2ca150a6497415ad389d86bb723f1981d4f9a69","24a384127f9401fa5d95e8379276346ce235c1d8aad0fcd5200dc2706e972cd3","b42c3c5eef982407e32c05e4a3a30538a9df18119769f119ed4fef97b91b63ec","3303a11a59b62f106673fcd32e8525e4ff7006755cebbac30ed5d9956368ff9c","41eac446fa90b0a369d267a3c67be4fc51f9504a4c70f8b3c7781f907b682ef1","25601ae77f95fedd95f6530aa23b48d1057392aa9876976a3993bb5846584c4f","5aaac3e6562c64a3eed6bc1939dc14f58dca05f21098549e2c412bf53e8d3617","3e66af60c061036e42415bbaa903ef547ad173a49ed3ef82a69e5eb157947e6d","7c899221be57cbd886b9024c14369caebc46eccff33aa5ad75f0e784a4e606af","df18af0e80c910d8a3764c616c4523db3d6e01afc13aa7ebc5591e6e0d6b4998","71ca6aba1e4b2bc55a094edee893ae31ae6218bf17071a9a6ac1440edb5a3b15","d3167d0d896d945e10d4e039c58921e065705fc0c6e4816807b4bcb74581e50b","ff9e081072cb761c188f91d8c0d20c15d17e7c7c2cbbb212e6333ed4bc9e4941","8b58f7c085d50cd600b64c3e82a8de9813527b56d642033edcf5fcdbc7785fbe","9a82b2883e32a54b127f49e61e7c2b42b4114c50ba26796b35c924600d32390a","6baf6b5cf2f9cdab9446736eb83c8f89856873fe8008f6933a77bfb7bb518602","ab744d5520a796bc95f680e65699eacaaf742ac4ea1733d8aba5bd3d2d4b4a35","717538d3083508674571ca96b2ea2b3a9b4fb6d043e87e081f93063b81412dff","0f558c4be566d21cc8afdda14e5e5006e926b23d559e342f52bb3d35598a4856","2e03f50a48d3c2b2e53eb196fe0cfab7b393f689cd9ec1770398aa1c30553bb2","c0206f2f7c2010cddbadf8f2c255996f031a5814e520ef2cb86b36b778870467","ffaec16df578f509e0577cd870198c7de17d81ef4e7da6e2fe96777f8aa428c4","3455f598309663506079bd39badd30dca568291bd512476aa861432284e4ffc0","d136ec17008896b8c409a04f483a627ec691836516e33560b70b31fa5c7977c8","efcb605556603a2a1bb0d475a1140e5b0744447c0afa9e7c68333ae9e6943154","eeb5d05e6099f3d6c856ab1e2a36ea143442f3ccfc9e83617593d8ba0cb318ad","053fc1e52b7eed54f382e69bc6cf66471dc5bf11316152e7f0ac3ad460c2d1b5","233ee73e28895248017b2496fe6e7ef710f786b53408859bffda83c25f185be9","b4a45dbf945b0efb4326585542c7c6610c250b8c4aa5ad33f4e5180b8aee5227","1d1905f461b08a4324ea7e22e5ff6676bd63d4aa7ee1c555e16f85f87a1888fd","aa63fbb9f74dbc7e10f86f8e5dcc378dd4caa2a05401045968722ab249ea5dd7","aca1ad9c7e0a4c8b607ffe2f026535b517de9e9e6a6171c6d0fcdc7cd3f670c9","2a047b70eace0af0524e1f7cc0ad6d73634a12113963d34f489635527dc3eaff","5e19245e5769cbaa18ede25fed8fc29b0643eaa8392ee7953a6710547bb82cde","f832f5dd7eaf14c5e450bc8389df7f355270a4209c6d49f1548e945884b98641","f8a523792ba40aac8c2d551967613bb0406489964285324f26c66fa97a4bef98","aae4a1f48565201e165ed7644cfc1d3664b95b1458754a245a82e1cc1100eb33","36cd969868fce0672cc2262b4905aa520a78770cf9ede51e78364320825fe2d8","1098c7324bbb826fae81d3c695f110f2d366ac6c8a777ea9b63930262abdcac0","622979e8e88d6c3bc66353deb2e8773d8eaf411596e4499c862fd10a535e369f","58c6c11141069ce1b6c1a5ca14a10226dae719d503668fbeaa8567e92068c9ec","f50a03eb8b276a92bd0bac3ed6696ec7c8a386fd896b2c6d0080bdbfabe76a6b","d5cbfd315f41243d116dbf8108827e01919bbf35197a521130e5651866e10751","1bfa8a980334112c35e3ad80814ccd75268e907b4ff28d96e781542561bacfb2","6cd769f53210e534a02da8e4736612a629a2b62dc28727e27187c7c6e1aa29bd","47a4889c8037e3557fb95ad0afe8b4e6666f4e134f6c99faeb15e79ac2abdc3b","b9f061c4800d1a68c7dc1833ed8c19c6021c6bb915f8315b06fad0cfe819ad6d","b0dd46eeaa79899064473b06c249887055b1e63a53a00f251d50b2b4525b202d","56134e62e1a52f946d2197ecdd07e97df7c72ff7fbcdabb54db28742e0ab65d0","32a61f2d62b3d37b54a4391ac522c1664e51ea750c3e810074fd57529d534f26","e04996121d6a18a37dbbcd01f17b93b4815d7dfd5da9486d469673bfe289c3aa","aa9a3813ff36559c863a1e40fc4ca2da10f4df73405887e8e01c012fb9b68cff","14883cb37310095e49fc27b915a8f127d88cc8d47fee3a8feb0d8043735e6019","1fccc96e6f9de4d4804921ede2b102dec601710f84e8a0a0baba2fcfa965b07e","1cb55efff813ddd20bd0992641d9651b6ca40327eac094d7c40a78452fabc925","a981c3381d076575fada121d3e7d927af605fc56a0a0d859ede62fdc3d8899bf","2d6826ac3d185245dd937c509b299a3cedf0a9d1fef0a4a178b083b7f1f9e6ff","18068e65fdf13ab35f1e6696bde621d6725a4dc5d4778d2263745d221c7aa986","26d5bd055a5aec0d1a6b548435396ebd3d2e36ce173a53aef6c69179d1fa613e","45aab4e99ac9ed1cb04c1affc9b2e3b0d0cfd70913bd72d0f0681ccadbd124c0","6acaf9eec4e8c850772850f478e548952e60e0782488e20cc4fa1d184bc20da0","eedd40b8e411ccfdc8d21744ed89a4cdc6e8685430e1d7a10e819cf69dbe844a","59e5c6a78a677c16da48584f8d3f27bc29ddda5fe7565fa030b890a07f034636","e82d787a3184584ed505477ac43f75c873c3f16b189a06a91e8554d5889ceb8a","c450a67144797f004bedf14319697fc8d932a9cad7346522fb88fe8f3b780224","d1d9f3c5011e7423123d65a11f2d38f942179d831e731ba2f4d566eff7023727","2c467897c33e6be53ee68f10cdb2983a9d332da9ba634ba1928b8276e9aa2b61",{"version":"eb2ce2df6eb3442fdc3d867226b5f1e2c600061b58bd500c374f1c5e125c26c7","signature":"87da4390d160dfd062c9acc3546258bd759ab5e0568e5b5bfe72063e43d04de9"},{"version":"0e4c5a4984e078ae5f3646b1525823307a3133c73d4f136c94d84b3915fefa49","signature":"78a3b1d283c20a0bbd5cf9d4261c3f2ecfc0c729ee3adfe8e9edcfe27fbc7b4f"},{"version":"3332efc39e7431a0a7dce9e67e79dc65af95952ebd0630fb11cc49606860afec","signature":"f8374d7a28e5d48759fd8c0f83c4c537443a013f8ad0fc70d78e0f0ef9f69d5b"},"698bf78b2f0d3c113e1584a5ca96df3a5f112136d8d168edfc1dd185a5f4a655",{"version":"6c849aa53d952f3420706c1e1462d5f455d24e713552c5f9d0ef58e5ed52557e","signature":"2861d85a707afd4b12327cef85982e79877c34b3645efef1fdf299608ae18a53"},{"version":"3406122d5bac0651f72dc05b3e2096d446e0cf9de4259ed98f0a05187b5dbf35","signature":"b0bf267c0437a1d38a5ccaf2dec5746721de48bb611e8f5eccc52e967ca23830"},{"version":"39fb77f139301d3f48fbca914b6e8eb49f270f542796cf79835beb8ad59d278f","signature":"0f0f29fc61e874f5051cd9e779f9c834a2493a4a73b93fb0619141dbc20721b7"},{"version":"adcd49f592196905f7486d8628b9d0a03a37805fd2bd422a4995d937c6ca3a0e","signature":"47be3219602e5ce47c5e53010f7f58b87324279d15a2454f4f56e31e3062d13b"},{"version":"41794496eaf6579c2a7286f165e347bd418bed2cfb49ec0d4d0d1f18059a2fbb","signature":"7ab4599ea84fe926131e6209c3cea2a8a2a2bda6b1bb31739736492a2e2ebf52"},{"version":"9b423b6e41ba44cdab5b2be70a594d3a1121c03794239e3961028450fb7893bb","signature":"7ab4599ea84fe926131e6209c3cea2a8a2a2bda6b1bb31739736492a2e2ebf52"},{"version":"01b83767330ed3de049759c48916a6387ba6270db498cdb6e51bd94aa1d4a1b8","signature":"7ab4599ea84fe926131e6209c3cea2a8a2a2bda6b1bb31739736492a2e2ebf52"},"865a04bcdc37fcdf61ccba8100295da65e84049e5b109da2064b1fed3610d2ad","48219a1168227eeaf159195800c71fb35d17a8ed0e5971e5e2c03f7f4eb3eac5","15cefa44dbdfbd986a4d4cbdfd148c4bd03d3983ca51c48d93240e62dbd9afa5","c6764d7e276f7aecb5d7623493b9ae635842cae0ccd26dd0fbed8df66c0c6e74","905192d3919b3a26a3bd2df1ff37318802a5283faa0852ddf0eacf2b6a01a5cc","c5d2d914a14adc1d7d88fc5faa4e32a55a01d5b6a50c01dc377c4cf3c190ab5b","cf895d10004eb04d328714f878b7a1156bd7ee1cbf6d5022ffb52272a3c78f95","6db6c008522e25cea49d05c04d9407444fcf136a7f35449b50450990900ae04f","b17855579d0c8513790bcb376871cb84795595aa2b235625bf09e80cdc8a2a2c","b38135216e120de9ab8aec8b181a4378d7b00974526d44748b3d117d8b82230b","9c7747f0d89050a5a90385785e1c0c8919474c60fac48d82cfa9a26737596da7","d2502433c5e71a0207f71542cb576c5d40fd49b9dee89fd34cfc4cd709cd9378","b5506046d42edd3dcd10549335a5d1ada795b23ee47caf6f9dd32c855cd9f7e1","d6e1acadb75ad4acc6afd5eed5a44b355fe847c883cebe40c181125980b64b81","b2b7e733164831293a986ac1cc027f14773036e9177f995a3aee81b64b3ac0e4","643a8b5a559535249a2f4e638262b3a44c54bac390f229bda674b42f8045f930",{"version":"fc36db2e103f36328ee2a6272b16a5fbdd8c722274a23df0eb9d35054c9c977c","signature":"559a1295fbcd94cd9812456d0d88b44e64c0d84235ca225eae13b02d36b24e70"},"f6e0158d4585c22928ff47c70b12e48178c8ca7cbf27950068b7769f55520cbc","99ff747d2138fe08e9d2eba3915191fdb77865d6630292903381ad6e5a756b62","1e4a6df62588f94344c73fd22a6186f95e061b4ac8fe318fab22507fc6c496fa","418e4321e661ea63631914288279f36c8c86ce42d1914898a6d6b849e28819fd","cb71a85e3549ee39be04682a6ffe1cf7efd7bf513d788325993b6659482b825f","0e0a111771f59418b4674a87f60e40beb8bdddc4d701671df30035063e78264f","a235019b8a0b354c82bc4e006b7cbba0330a8aedbe275790b7d17cb06f34008c","bb2b3dfca2a623ddc33cbe1ad47f18f35622a2e34064652690599a9495353997","69d9ebfcd05adbb1b6900d79eb0cc88f9eb23984e6d0119d7b38b729ee554366","f7073b332610a8323fd411c30a79429a16b48e9e56fc9be18f9aaa36b27dbd7b","edc5f71597e9b2c3c70a6f5393da49662fa0445a92079e2e94848c64dc419213","371cc847f70236345195d6e4d38ecf94e1d48e24bd84138d1e93d1f4b74328b0","64d47df8528a6eca7eda9e092d11913748bdf50a8b5f8d322cc9ce0afda60d83","c491e36747e540354adb0e288a42b2c6d17d4edd7daaf8a7e63455647c07f219","a24d618047b637ee09f8017a5cd0da01ae0f20175214c27dbac27d35a5242970","81fc6d027cdbe6dc4a587fd021512d4b5014a5a544be2932b7aac085cd7238f1","135b0755989b3c3b640e9463e3a3145f38eaa44bb38ea2abbeffdae8dc95d433","e057fdb9bee006f78f6d8dc9aaedbbc9fec262f7d29a1ac1b1802f8bfbe8c147","db176597bef83637fef761b1f9c6c6cd2407ddc479a29624934d3f8d47304b66","da4cb47498ccd1785a2a5510f9c1532547d7f42f8fe17b1a0726eea405a32a1c","7edf8128e76fd623c09ba7ad9a917a18f036759f190c3916f14e38ad9a6d0853","bbac731d68609a1325ac2f53014db006730b313b044634862284f8a17be7dc37","eb9ca5d304463fca75530a5da1a8204c885a6952dd4fc08f20e8de57096488a0","1c933724d74e8faf9a2f4e8695b34c581d4dcdcb9fbc00f8f960b562447740f2","c2295b4175a6109853889f80b3c3fb078a6f22aab3e8ce6f0c4ebce2aefe5164","481c95365106bc3e1238e1372912a872c7b465eb2262b11833a989c507d4dd94","7a9f93a38b1dea8a54c9c6bd25f8222be1ca1b6846dd54042710efff89e27447","acd219708f7046de7917bd6012f39927d38d2ad355f56d82cec1e8754c5a3c87","a1af6bb8ece7353ef6769f004395bb3bee9ac35f435c0c6392d75424c02d9b92","1f636f3a4aa0f1bd15b9553f9965b427ca9dc78b262b5bd26a4612fcd60c2470","ab6df5e1c8d3feb54ab5ca6784a9f218b479db060b12b2c3aa2a32a049c98852","69a2fa86f2a0f17bba2108d4261287862440de17fee86cf9c3a1d5fd15746fcf","dc573be660be64ddffa5b7890a53db420a6a72c15127556edfdfea1cdbb0c550","4f18be01f6558fed637391fb31785436015b186196eafcc2c203aa2003089849","eb4bea987572411f2107d6b9c38d7d02b90069e844370b6c6d26ba823e78e924","84a3442d3ccd680a4fd7044d6ed19eaea6d41d6b3efcdb97ce74e76e49bd9092","22998b16ae6fb9c3c335bf8701ced45731a01f466ac97a8d7f252cfde79446b6","298c9c076970435de611e11a91e3de993024954d0936e915f856996a25b832d1","74da7af26adaed38996284b13c0991c65e0611495199851dbee6a48137884bd5","edbccee359ce50c3f11512691ccc980787b30616a05451290f07caea87357544","a6d0024f0e6ba4bb2833687c612feb6d17f009869354b21f2d288f26480cca36","57c32feadfa3e59d194e683c6f9f9d16691f1bbf9a52a62944f144451f3648d3","8ce805b95cf56d7c995791b45896d95953b633a19167f1beb9b30919be60817e","cb5914bd3359c14509b9a3ef2ecb4024b6324bbb5853246b131de411fcd110ea","769f173fa73f9aad21d0012f749472c44210f9bb5233adde9ceafb29cc17607f","5f4d315fbb7b904b5c6515e90273937f4d48f90adebf564728d89edc31d6b901","a623d5ba061c298385c2a0384976c8ff1f8295859997c5efacfe9aa82bcdbcde","05b88de2d87a2eab3635896b7700261666e6789816808d2f1fd9fc1c56270a15","44e400579e85507cf12f21df08ffd7615c6a2dc16ae642c45590b7b19df9e197","ce8d6a3c6fe2a69af42fdbb6bb0e4b43d8ba531e7f9e18ff4e0718f9461bc7a1","9a27ac694b2cd32a732309e2aaf8e5eda10a6707af05dc830f97b1e13bf13ce2","d284e25fc794af203943fb44cf8444b01a1ba7eace3f9b3e53b1e39033bb29ed","c559e2c686e346af7595af49b1c4a7a6d41651a8180f73d2c0a8d468293ef60d","949c6b2391ca0539fdb7770e1362b3ddc90feac973e836becdc22f5e50ad5b1b","bad21ce9cf3b0dfb234e907af9b128c0d57a1a3ef6e77d55fefe2ae4d6c925c9","2d96991e5d40e7c9d482728cbc0194e2ba0f37b01efcc6217eed47825e6f703e","1de6af73582a89d12b5daa1717c600958c413bf0b70dc90c76206a8ac401bae8","bf20a6ad8e4b9ccfb122eaa9e07651d6f37b28e686e985c6ef3856ea2c52d4ce",{"version":"0a032f018594f1cd1fc0f289fc657a221828211d0adee478a643f38aa384c7a4","signature":"f28e68dc936d6d381a7df22dd114d6308b9ca58af93d7ae1308874e66fba6b6b"},{"version":"f59d92ba5293fbb9e3aff3cd20b4f781882e511130f8cf699b9266895ac1f7df","signature":"0f38dbebca3dfe6279d50a54b82b79c5293795b764410d148fd96be2da6b39fb"},"117ffeecf6c55e25b6446f449ad079029b5e7317399b0a693858faaaea5ca73e","6fbd58e4015b9ae31ea977d4d549eb24a1102cc798b57ec5d70868b542c06612","946bd1737d9412395a8f24414c70f18660b84a75a12b0b448e6eb1a2161d06dd",{"version":"6746c740192f7ea0efb8cd17be737f09ae11ec6322d35103dcb269959dc57026","affectsGlobalScope":true},"e8465811693dfe4e96ef2b3dffda539d6edfe896961b7af37b44db2c0e48532b",{"version":"25b4a0c4fab47c373ee49df4c239826ee3430019fc0c1b5e59edc3e398b7468d","affectsGlobalScope":true},"7698983d080f951eaf53ff81e5c7bd61abc02e4a1a21266f1bd79ea85c0dc641","5726b5ce952dc5beaeb08d5f64236632501568a54a390363d2339ba1dc5393b1","674bedbfd2004e233e2a266a3d2286e524f0d58787a98522d834d6ccda1d215a","714637d594e1a38a075091fe464ca91c6abc0b154784b4287f6883200e28ccef",{"version":"23edba5f47d3409810c563fe8034ae2c59e718e1ef8570f4152ccdde1915a096","affectsGlobalScope":true},"0e9c55f894ca2d9cf63b5b0d43a8cec1772dd560233fd16275bc7a485eb82f83","d53b352a01645c470a0d8c31bf290ba791fc28ade0ce187a4a50f5c2f826f75e","5f0a09de75bd965c21dc6d73671ba88830272f9ed62897bb0aa9754b369b1eed","2b34e7fcba9e1f24e7f54ba5c8be5a8895b0b8b444ccf6548e04acdee0899317",{"version":"06d2be99c3dd2ff52114d02ee443ba486ab482423df1941d3c97d6a92e924d70","affectsGlobalScope":true},{"version":"bfd4f140c07091b5e8a963c89e6fa3f44b6cfcbc11471b465cf63e2d020ad0eb","affectsGlobalScope":true},"a106a0bea088b70879ac88ff606dc253c0cc474ea05ad3a282b8bfb1091ae576","c98ce957db9eebd75f53edda3f6893e05ab2d2283b5667b18e31bcdb6427ed10","1f08bd8305d4a789a68f71ab622156dfff993aa51a2aa58b9ccf166cc6f9fcf7","9aff68f1b847b846d3d50a58c9f8f99389bedd0258d1b1c201f11b97ecfd36f8","1978992206803f5761e99e893d93b25abc818c5fe619674fdf2ae02b29f641ba","05fbe81f09fc455a2c343d2458d2b3c600c90b92b22926be765ee79326be9466","8e7d6dae9e19bbe47600dcfd4418db85b30ae7351474ea0aad5e628f9845d340","f20ea392f7f27feb7a90e5a24319a4e365b07bf83c39a547711fe7ff9df68657","32542c4660ecda892a333a533feedba31738ee538ef6a78eb73af647137bc3fc","0ecacea5047d1a7d350e7049dbd22f26435be5e8736a81a56afec5b3264db1ca","ffcb4ebde21f83370ed402583888b28651d2eb7f05bfec9482eb46d82adedd7f",{"version":"06c004006016a51c4d1855527a523562c329dc44c473931c65f10373281f730e","affectsGlobalScope":true},"a7b43c69f9602d198825e403ee34e5d64f83c48b391b2897e8c0e6f72bca35f8","f4a3fc4efc6944e7b7bd4ccfa45e0df68b6359808e6cf9d061f04fd964a7b2d3","73cad675aead7a2c05cf934e7e700c61d84b2037ac1d576c3f751199b25331da","8c3137ba3583ec18484429ec1c8eff89efdc42730542f157b38b102fdccc0c71","d84300d886b45a198c346158e4ff7ae361cc7bc1c3deab44afb3db7de56b5d25","94ca7beec4e274d32362b54e0133152f7b4be9487db7b005070c03880b6363aa","2d713cbcbd5bcc38d91546eaeea7bb1c8686dc4a2995a28556d957b1b9de11d9","bbf21f210782db4193359010a4710786add43e3b50aa42fc0d371f45b4e4d8d3","0b7733d83619ac4e3963e2a9f7c75dc1e9af6850cb2354c9554977813092c10a","3ce933f0c3955f67f67eb7d6b5c83c2c54a18472c1d6f2bb651e51dd40c84837","631e96db896d645f7132c488ad34a16d71fd2be9f44696f8c98289ee1c8cbfa9","2c77230d381cba81eb6f87cda2fbfff6c0427c6546c2e2590110effff37c58f7","da86ee9a2f09a4583db1d5e37815894967e1f694ad9f3c25e84e0e4d40411e14","66679e8ffbf1fddef1796c60757e54e6e6551dd9823f75ef2f80176473bdaaff","ddc086b1adac44e2fccf55422da1e90fa970e659d77f99712422a421564b4877","515ef1d99036ff0dafa5bf738e02222edea94e0d97a0aa0ff277ac5e96b57977",{"version":"2708349d5a11a5c2e5f3a0765259ebe7ee00cdcc8161cb9990cb4910328442a1","affectsGlobalScope":true},"780058f4a804c8bdcdd2f60e7af64b2bc57d149c1586ee3db732a84d659a50bf","ae68a04912ee5a0f589276f9ec60b095f8c40d48128a4575b3fdd7d93806931c","19d580a3b42ad5caeaee266ae958260e23f2df0549ee201c886c8bd7a4f01d4e","e61a21e9418f279bc480394a94d1581b2dee73747adcbdef999b6737e34d721b","9c4c395e927045b324877acdc4bfb95f128f36bc9f073266a2f0342495075a4f",{"version":"fc35a74dd14f55d6fea9e5a4804ae812d559519352fa3836eb5f5555a64dd0ac","affectsGlobalScope":true},"2880728492d6a6baa55411d14cc42fa55714a24b1d1d27ff9a8a610abd47c761","f42d12ffffc63820fb13c4befaacbf2752e40442c2429e21205c1537505a46bf",{"version":"49febed15cc962e5823a8b0781f0fcd8f5f63f6bcadcdda5e30e4d173ce738d4","affectsGlobalScope":true},"dc3b172ee27054dbcedcf5007b78c256021db936f6313a9ce9a3ecbb503fd646","567a315b240a060518c532d38a46803b6d35e75dc14a9be435b6dc20c816741e",{"version":"28c72aa2e02bcc60b11846c94415d3633b4734c9312f97e13e9d24c66afb0d66","affectsGlobalScope":true},{"version":"5b59260fda6c72e83631134d59d82885532c5202bde913fd77fc359188d1018c","affectsGlobalScope":true},{"version":"c32547f52e297900ab6d983aad20d15cad2d67ec0b3e730df4fbc53d07928c8a","affectsGlobalScope":true},"8841e2aa774b89bd23302dede20663306dc1b9902431ac64b24be8b8d0e3f649","725b884357ba84171341a8e4cc08edf11417854fd069842ca6d22afb2e340e45","ecf5cb089ea438f2545e04b6c52828c68d0b0f4bfaa661986faf36da273e9892","95444fb6292d5e2f7050d7021383b719c0252bf5f88854973977db9e3e3d8006","241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","06540a9f3f2f88375ada0b89712de1c4310f7398d821c4c10ab5c6477dafb4bc",{"version":"c0ed4fcaf919e6990f53a966d329ef058499696e3d97a8a076dc9254dfe20228","affectsGlobalScope":true},"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","97bdf234f5db52085d99c6842db560bca133f8a0413ff76bf830f5f38f088ce3","a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","b493ff8a5175cbbb4e6e8bcfa9506c08f5a7318b2278365cfca3b397c9710ebc","e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","303ee143a869e8f605e7b1d12be6c7269d4cab90d230caba792495be595d4f56","89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","a5eb4835ab561c140ffc4634bb039387d5d0cceebb86918f1696c7ac156d26fd","c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","4252b852dd791305da39f6e1242694c2e560d5e46f9bb26e2aca77252057c026","0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","ba13c7d46a560f3d4df8ffb1110e2bbec5801449af3b1240a718514b5576156e","6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","ebc8936ed464874fcceb0ded3b8728695aa356a21890238e9076887ec0722a54","db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","05c4e2a992bb83066a3a648bad1c310cecd4d0628d7e19545bb107ac9596103a","b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","dd6c3362aaaec60be028b4ba292806da8e7020eef7255c7414ce4a5c3a7138ef","8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","3114b315cd0687aad8b57cff36f9c8c51f5b1bc6254f1b1e8446ae583d8e2474","0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","af733cb878419f3012f0d4df36f918a69ba38d73f3232ba1ab46ef9ede6cb29c","cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","0a01b0b5a9e87d04737084731212106add30f63ec640169f1462ba2e44b6b3a8","06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","e07d62a8a9a3bb65433a62e9bbf400c6bfd2df4de60652af4d738303ee3670a1","bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","851e8d57d6dd17c71e9fa0319abd20ab2feb3fb674d0801611a09b7a25fd281c","c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","748e79252a7f476f8f28923612d7696b214e270cc909bc685afefaac8f052af0","9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","c3f32a185cd27ac232d3428a8d9b362c3f7b4892a58adaaa022828a7dcd13eed","3139c3e5e09251feec7a87f457084bee383717f3626a7f1459d053db2f34eb76","4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","3be870c8e17ec14f1c18fc248f5d2c4669e576404744ff5c63e6dafcf05b97ea","56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","6ab380571d87bd1d6f644fb6ab7837239d54b59f07dc84347b1341f866194214","547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","7c9ed7ffdc6f843ab69e5b2a3e7f667b050dd8d24d0052db81e35480f6d4e15d","7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","3656f0584d5a7ee0d0f2cc2b9cffbb43af92e80186b2ce160ebd4421d1506655","a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","ce871684a7cb81d6a89630e0c6b4a064f876f7ec1d352917ace027b3fc3e537f","354582b26ecec449c94c71f76227102aad8a3aa7a113810a6b932c2421ddc050","42f8ed746d486725017ead628c6589fe13d6d6f5fa1517f978b3ccfcd7b46860","b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","90f690a1c5fcb4c2d19c80fea05c8ab590d8f6534c4c296d70af6293ede67366","be95e987818530082c43909be722a838315a0fc5deb6043de0a76f5221cbad24","9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","1f6058d60eaa8825f59d4b76bbf6cc0e6ad9770948be58de68587b0931da00cc","5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","50100b1a91f61d81ca3329a98e64b7f05cddc5e3cb26b3411adc137c9c631aca","11aceaee5663b4ed597544567d6e6a5a94b66857d7ebd62a9875ea061018cd2c","6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","94ff6974e4afe28061d44732ecb889bb2296cf98c52022e8ebaf99ba8e9e5d62","669b754ec246dd7471e19b655b73bda6c2ca5bb7ccb1a4dff44a9ae45b6a716a","4bb6035e906946163ecfaec982389d0247ceeac6bdee7f1d07c03d9c224db3aa","8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","c82857a876075e665bbcc78213abfe9e9b0206d502379576d7abd481ade3a569","4f71d883ed6f398ba8fe11fcd003b44bb5f220f840b3eac3c395ad91304e4620","5229c3934f58413f34f1b26c01323c93a5a65a2d9f2a565f216590dfbed1fe32","9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","4c754b03f36ff35fc539f9ebb5f024adbb73ec2d3e4bfb35b385a05abb36a50e","59507446213e73654d6979f3b82dadc4efb0ed177425ae052d96a3f5a5be0d35","a914be97ca7a5be670d1545fc0691ac3fbabd023d7d084b338f6934349798a1f","8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","87437ca9dabab3a41d483441696ff9220a19e713f58e0b6a99f1731af10776d7","26c5dfa9aa4e6428f4bb7d14cbf72917ace69f738fa92480b9749eebce933370","8e94328e7ca1a7a517d1aa3c569eac0f6a44f67473f6e22c2c4aff5f9f4a9b38","d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","299f0af797897d77685d606502be72846b3d1f0dc6a2d8c964e9ea3ccbacf5bc","12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","3c97b5ea66276cf463525a6aa9d5bb086bf5e05beac70a0597cda2575503b57b","b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","a31383256374723b47d8b5497a9558bbbcf95bcecfb586a36caf7bfd3693eb0e","06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","64aa66c7458cbfd0f48f88070b08c2f66ae94aba099dac981f17c2322d147c06","11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","9814545517193cf51127d7fbdc3b7335688206ec04ee3a46bba2ee036bd0dcac","0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","7acee2009eb9f4c6b17245edc555c7d5c9404343ea1b0cf8adae3b66292c1527","656424ca784760c679bf2677d8aaf55d1cb8452cd0ac04bbe1c0f659f45f8c11","0be1753924a848cf8df0be004518d84957a8539f6b01f1fad1ac639dc17586cb","e243f7d314cb8d05f393a5dc9904b3bcbd769ac082596402ab197df75bf582bf","5a7c95bcd09e90d7feb672686992187a310c37d5e30a1ddf3c39487c1aa74710","441ae3724070b80188b7bc48f66b96ca521d817e81836cdddb905cef6bbb4c8a","75c1851fd42fce32c4b066cc4666b158b44bb1cea3e88cc74a24ea2e5d1c5056","3901d2da5f2efb88bf7adf2cf609ac628469a6e00a57c241dff8068871239175","06af2a73111a13b52a270c1e74fd7dcccd1a9f1fdc3425bda9f8b45fa0c269cd","6abc96a8be012572275422560c525ed036b84fc6a798a90bd89d17c9810e2762","f71cbe1afd8376df3764bb980646b503353611b42534f1a1d44cb311bedab837","e9934689b2e167ba54f01b1225ff348055a8574ee7c907ef49b62c14102c6d26","0ecff30f6ee36ed2899ca0259e8bd018e9c627702d204256a436d76ac5991413","a353332b8d2de7ae57ab97b72ace1e8794e2907d3f907e04bff1a636ee93c826","505f2e4a22d30a66a1ffbc3f43ccc895e2ea3fcd92f9521797f25c354a87435d","60fef2f608d0ecaf124cb543ab18d835979a4841d38e5df9d64794ab51cd1352","cb8f5ffbf8bb06658a6ef27f1829c69238673b467a4881cac6a8247df73d94f3","9304e0b36cfdf03a7b7f972ac0b21ecd55e2cf5a5c0ce70754f8a47b55b6a90e","ab2265036d8a12bdd5454800b03966bf0e971be44fbd118f3aed3c1bd0124fc6","bbe08916928cbaca40a89cf36fc3c751ff3b32ab549b9f7e0b4fafcd0c3699d4","ab3f0217cbf698cadf45799bf224ade13e0b410d2cf76b0757b3f47349ff11a3","616ea4ff77f89fe59032df6f80ebdf5f40789419341de9b25d2946485c85ad05","9e59e01db841f0d4fe21443b8611e49ea7c91f297afc28ce6c433458afbcd081","b938f24d3af55eba025debac20bcf2d6a3be6033f1bb41462d6ca7d6c81e0314","de18acda71730bac52f4b256ce7511bb56cc21f6f114c59c46782eff2f632857","686e548ae30250d62532c8cacb43fccc922b693408371bd3503563c4a0f28eed","6396a7a06f3ef0fc31a7c89330e015146b78a2256b030c698b6d404594c37b8f","07c251f1baf3825cbde02335ba07554f700deee4138bbbfe2d29203a9e26a8f1","f4cf5f0ad1cfb0ceebbe4fbe8aaf0aa728e899c99cc36ec6c0c4b8f6e8a84c83","f6ae4d70775f50beaaa1a3968ed7b6e2a7185c172243c4ac1c8ecb3d39c3faf6","3fc8159934f2a4cf63368b0c9600e41fea5f4a0bfc454b2f7ee0e34b9bdc6217","d9e55d93aa33fad61bd5c63800972d00ba8879ec5d29f6f3bce67d16d86abc33","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","c544d81603149987796b24cca297c965db427b84b2580fb27e52fb37ddc1f470","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","9eb2875a1e4c583066af7d6194ea8162191b2756e5d87ccb3c562fdf74d06869","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","6eef5113135a0f2bbac8259909a5bbb7666bcde022c28f4ab95145623cbe1f72","058b8dd97b7c67b6bf33e7bda7b1e247b019b675d4b6449d14ac002091a8b4f8","89c8a7b88c378663a8124664f2d9b8c2887e186b55aa066edf6d67177ca1aa04","5a30ba65ad753eb2ef65355dbb3011b28b192cb9df2ef0b5f595b51ca7faf353","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","86d425f7fcd8d100dafa6286cc289af88cbb639ecbdbd25c3018a8f0f7b09fe5","9795e0a3a45d5b6f1a791ee54b7c8b58bc931e8900966cea2dff9c5bae56073b","5890be29879d02424b7654f40592915189034948f7a18c5ad121c006d4e92811","0ab49086f10c75a1cb3b18bffe799dae021774146d8a2d5a4bb42dda67b64f9b","81c77839e152b8f715ec67b0a8b910bcc2d6cf916794c3519f8798c40efd12ac","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","464843c00fb3dd4735b28255c5c9fe713f16b8e47a3db09ba1647687440f7aef","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","d0f6d36b2d86f934560c48d8bfdc7ab60c67cfb2ab6dc1916706aa68e83d6dc2","5b8476e49f360da8548e0acfbb77344291512db4453512c7b5ec8277f1c762c3"],"root":[[348,350],[352,358],375,434,435],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"alwaysStrict":true,"declaration":true,"inlineSources":true,"module":5,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":false,"outDir":"./","preserveConstEnums":true,"removeComments":false,"skipLibCheck":true,"sourceMap":true,"target":4},"fileIdsList":[[493],[452,486,496],[467,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707],[708],[688,689,708],[467,686,691,708],[467,692,693,708],[467,692,708],[467,686,692,708],[467,698,708],[467,708],[467,686],[691],[467],[453,486],[455,475,486],[453,486,497],[486,715],[717,756],[717,741,756],[756],[717],[717,742,756],[717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755],[742,756],[444,486,497],[469,486],[498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,514,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,554,555,556,557,558,559,560,561,562,563,564,565,567,568,569,570,571,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,617,618,619,621,630,632,633,634,635,636,637,639,640,642,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685],[543],[499,502],[501],[501,502],[498,499,500,502],[499,501,502,659],[502],[498,501,543],[501,502,659],[501,667],[499,501,502],[511],[534],[555],[501,502,543],[502,550],[501,502,543,561],[501,502,561],[502,602],[502,543],[498,502,620],[498,502,621],[643],[627,629],[638],[627],[498,502,620,627,628],[620,621,629],[641],[498,502,627,628,629],[500,501,502],[498,502],[499,501,621,622,623,624],[543,621,622,623,624],[621,623],[501,622,623,625,626,630],[498,501],[502,645],[503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,544,545,546,547,548,549,551,552,553,554,555,556,557,558,559,560,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618],[631],[334],[376,429,430],[431,432],[334,376],[334,429],[334,382],[377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428],[334,360,363,365,367,368],[359,371],[334,360,364],[334,360,365,366],[334,360],[372,373],[360,365],[361,362,365,367,369,370],[334,335,336,337],[334,336,337,338,341],[334,338],[334,335,338],[38,39,339,344,345,346],[344],[39,334,338,340,342,343],[41,42,43],[41,51,69,71,72,73,105,299,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326],[41],[43],[329,330],[41,43],[41,42,43,44,46,47,48,50,51,66,68,69,70,71,72,73,74,75,76,79,80,81,82,83,84,85,86,87,88,89,90,304,305,306,307,308,309,327,328,331,332],[52,53,54],[41,42,43,44,47,48,49,50],[46],[51],[43,44,46,48,51],[41,43,48,51],[55,333],[45,52,56],[45,56],[45,56,57,58,59,60,61,62,63,64,65],[41,45,48],[45],[45,48],[44,47],[41,42,50,105,299],[41,42,43,49],[67],[41,43,48],[41,43,105],[41,43,105,299],[41,43,299],[299,300,301,302],[43,105],[43,299],[42],[41,43,48,91,92,93,94,95,96,97,98,99,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,303,333],[304],[42,43],[48,74,82],[48,74,87],[43,48,74],[83,84,85,86,87,88,89],[43,48,74,82],[46,52],[43,48],[40,41,42],[90],[40],[41,77,78],[455],[484],[442],[483,484],[443],[444,452,453,460,469],[444,445,452,460],[476],[447,448,453,461],[448,469],[449,450,452,460],[450],[451,452],[452],[452,453,454,469,475],[453,454],[455,460,469,475],[452,453,455,456,460,469,472,475],[455,457,472,475],[485],[452,458],[459,475],[450,452,460,469],[461],[462],[442,463],[474],[465],[466],[452,467],[467,468,476,478],[452,469],[470],[471],[460,472],[473],[441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482],[460,474],[466,475],[469,477],[478],[482],[452,454,469,475,478,479],[469,480],[486],[334,347,348,349],[334,347,351,354,355],[348,350,352,353],[354],[351,374],[351,433],[334,348],[334,349,374,433],[347,348],[374],[433],[374,433]],"referencedMap":[[494,1],[497,2],[708,3],[688,4],[690,5],[689,4],[692,6],[694,7],[695,8],[696,9],[697,7],[698,8],[699,7],[700,10],[701,8],[702,7],[703,11],[704,4],[705,4],[706,12],[693,13],[707,14],[691,14],[712,15],[713,16],[714,17],[716,18],[741,19],[742,20],[717,21],[720,21],[739,19],[740,19],[730,22],[729,22],[727,19],[722,19],[735,19],[733,19],[737,19],[721,19],[734,19],[738,19],[723,19],[724,19],[736,19],[718,19],[725,19],[726,19],[728,19],[732,19],[743,23],[731,19],[719,19],[756,24],[750,23],[752,25],[751,23],[744,23],[745,23],[747,23],[749,23],[753,25],[754,25],[746,25],[748,25],[757,26],[687,27],[686,28],[637,29],[635,29],[685,30],[650,31],[649,31],[550,32],[501,33],[657,32],[658,32],[660,34],[661,32],[662,35],[561,36],[663,32],[634,32],[664,32],[665,37],[666,32],[667,31],[668,38],[669,32],[670,32],[671,32],[672,32],[673,31],[674,32],[675,32],[676,32],[677,32],[678,39],[679,32],[680,32],[681,32],[682,32],[683,32],[500,30],[503,35],[504,35],[505,35],[506,35],[507,35],[508,35],[509,35],[510,32],[512,40],[513,35],[511,35],[514,35],[515,35],[516,35],[517,35],[518,35],[519,35],[520,32],[521,35],[522,35],[523,35],[524,35],[525,35],[526,32],[527,35],[528,35],[529,35],[530,35],[531,35],[532,35],[533,32],[535,41],[534,35],[536,35],[537,35],[538,35],[539,35],[540,39],[541,32],[542,32],[556,42],[544,43],[545,35],[546,35],[547,32],[548,35],[549,35],[551,44],[552,35],[553,35],[554,35],[555,35],[557,35],[558,35],[559,35],[560,35],[562,45],[563,35],[564,35],[565,35],[566,32],[567,35],[568,46],[569,46],[570,46],[571,32],[572,35],[573,35],[574,35],[579,35],[575,35],[576,32],[577,35],[578,32],[580,35],[581,35],[582,35],[583,35],[584,35],[585,35],[586,32],[587,35],[588,35],[589,35],[590,35],[591,35],[592,35],[593,35],[594,35],[595,35],[596,35],[597,35],[598,35],[599,35],[600,35],[601,35],[602,35],[603,47],[604,35],[605,35],[606,35],[607,35],[608,35],[609,35],[610,32],[611,32],[612,32],[613,32],[614,32],[615,35],[616,35],[617,35],[618,35],[636,48],[684,32],[621,49],[620,50],[644,51],[643,52],[639,53],[638,52],[640,54],[629,55],[627,56],[642,57],[641,54],[630,58],[543,59],[499,60],[498,35],[625,61],[626,62],[624,63],[622,35],[631,64],[502,65],[648,31],[646,66],[619,67],[632,68],[376,69],[431,70],[433,71],[377,72],[378,73],[379,69],[380,73],[381,72],[383,74],[384,69],[385,73],[386,74],[387,74],[388,74],[389,73],[390,69],[391,69],[392,73],[393,73],[394,73],[395,73],[396,69],[397,74],[398,69],[399,73],[400,73],[401,73],[402,72],[403,73],[404,72],[405,69],[406,69],[407,69],[408,69],[409,74],[410,69],[411,74],[412,72],[413,69],[414,69],[415,69],[416,74],[417,73],[418,74],[419,69],[421,69],[422,69],[423,73],[424,69],[425,69],[426,69],[427,69],[429,75],[428,69],[382,69],[369,76],[372,77],[365,78],[367,79],[361,80],[374,81],[360,69],[368,82],[371,83],[362,69],[338,84],[342,85],[339,86],[335,69],[343,87],[336,69],[337,69],[341,86],[347,88],[345,89],[344,90],[44,91],[327,92],[320,93],[321,94],[331,95],[329,93],[330,96],[333,97],[55,98],[51,99],[47,100],[52,101],[307,102],[308,103],[334,104],[59,105],[64,93],[60,106],[57,105],[66,107],[61,108],[58,105],[65,109],[62,109],[56,109],[63,110],[351,111],[332,112],[50,113],[68,114],[81,115],[91,96],[92,96],[93,96],[94,96],[95,96],[96,96],[97,96],[98,96],[99,96],[100,96],[101,96],[102,96],[103,96],[104,96],[106,116],[107,96],[108,96],[109,96],[110,96],[111,96],[112,96],[113,96],[114,96],[115,96],[287,96],[116,96],[117,96],[70,96],[118,96],[119,96],[120,96],[121,96],[122,96],[123,96],[124,96],[125,96],[126,96],[127,96],[128,96],[67,96],[129,116],[130,116],[131,116],[132,96],[133,96],[134,96],[135,96],[136,96],[137,96],[138,96],[139,96],[140,116],[141,94],[142,96],[143,96],[144,96],[145,96],[295,96],[146,94],[147,96],[148,96],[149,96],[150,96],[151,96],[152,96],[153,96],[154,96],[155,96],[156,96],[157,96],[158,96],[300,117],[301,118],[302,118],[303,119],[299,120],[312,121],[159,96],[294,96],[71,122],[160,96],[161,96],[162,96],[297,96],[163,96],[164,96],[165,96],[166,96],[167,96],[168,96],[169,94],[170,96],[171,96],[172,96],[173,96],[174,96],[175,96],[176,96],[177,96],[178,96],[179,96],[180,96],[181,96],[182,96],[183,116],[184,96],[185,115],[186,96],[187,96],[188,96],[189,96],[190,96],[191,96],[192,96],[193,96],[290,96],[194,96],[195,96],[196,96],[197,96],[289,96],[198,96],[199,96],[200,96],[201,96],[304,123],[340,124],[202,96],[203,96],[204,96],[205,96],[206,96],[207,96],[208,116],[209,96],[210,96],[211,94],[212,96],[213,96],[214,115],[215,96],[216,96],[217,96],[218,96],[219,96],[220,96],[221,96],[222,94],[223,96],[224,96],[225,96],[226,96],[227,96],[228,96],[229,96],[230,96],[231,96],[232,96],[233,96],[234,96],[235,96],[291,96],[72,125],[292,96],[326,122],[236,96],[237,96],[238,96],[239,96],[240,96],[296,94],[241,96],[242,96],[243,96],[244,96],[245,96],[246,96],[247,96],[73,122],[248,96],[249,96],[250,96],[293,96],[251,94],[252,94],[253,94],[254,94],[255,96],[322,125],[256,96],[257,96],[258,96],[259,96],[260,96],[261,96],[262,96],[263,96],[264,96],[265,96],[266,96],[267,96],[268,96],[269,96],[270,96],[271,96],[272,96],[273,96],[274,96],[275,96],[276,96],[288,96],[277,96],[278,96],[279,96],[280,96],[281,96],[282,96],[283,96],[284,96],[285,96],[286,96],[83,126],[84,126],[85,126],[86,126],[88,127],[82,128],[90,129],[89,126],[87,130],[46,109],[53,131],[54,100],[49,132],[43,133],[42,93],[48,94],[75,132],[76,93],[306,134],[41,135],[79,136],[77,93],[437,137],[484,138],[442,139],[485,140],[443,141],[444,142],[445,143],[446,144],[447,145],[448,146],[449,147],[450,148],[451,149],[452,150],[453,151],[454,152],[455,153],[456,154],[457,155],[486,156],[458,157],[459,158],[460,159],[461,160],[462,161],[463,162],[464,163],[465,164],[466,165],[467,166],[468,167],[469,168],[470,169],[471,170],[472,171],[473,172],[483,173],[474,174],[475,175],[476,144],[477,176],[478,177],[482,178],[479,179],[480,180],[488,181],[350,182],[356,183],[354,184],[357,185],[352,182],[358,183],[375,186],[434,187],[348,69],[349,188],[435,189]],"exportedModulesMap":[[494,1],[497,2],[708,3],[688,4],[690,5],[689,4],[692,6],[694,7],[695,8],[696,9],[697,7],[698,8],[699,7],[700,10],[701,8],[702,7],[703,11],[704,4],[705,4],[706,12],[693,13],[707,14],[691,14],[712,15],[713,16],[714,17],[716,18],[741,19],[742,20],[717,21],[720,21],[739,19],[740,19],[730,22],[729,22],[727,19],[722,19],[735,19],[733,19],[737,19],[721,19],[734,19],[738,19],[723,19],[724,19],[736,19],[718,19],[725,19],[726,19],[728,19],[732,19],[743,23],[731,19],[719,19],[756,24],[750,23],[752,25],[751,23],[744,23],[745,23],[747,23],[749,23],[753,25],[754,25],[746,25],[748,25],[757,26],[687,27],[686,28],[637,29],[635,29],[685,30],[650,31],[649,31],[550,32],[501,33],[657,32],[658,32],[660,34],[661,32],[662,35],[561,36],[663,32],[634,32],[664,32],[665,37],[666,32],[667,31],[668,38],[669,32],[670,32],[671,32],[672,32],[673,31],[674,32],[675,32],[676,32],[677,32],[678,39],[679,32],[680,32],[681,32],[682,32],[683,32],[500,30],[503,35],[504,35],[505,35],[506,35],[507,35],[508,35],[509,35],[510,32],[512,40],[513,35],[511,35],[514,35],[515,35],[516,35],[517,35],[518,35],[519,35],[520,32],[521,35],[522,35],[523,35],[524,35],[525,35],[526,32],[527,35],[528,35],[529,35],[530,35],[531,35],[532,35],[533,32],[535,41],[534,35],[536,35],[537,35],[538,35],[539,35],[540,39],[541,32],[542,32],[556,42],[544,43],[545,35],[546,35],[547,32],[548,35],[549,35],[551,44],[552,35],[553,35],[554,35],[555,35],[557,35],[558,35],[559,35],[560,35],[562,45],[563,35],[564,35],[565,35],[566,32],[567,35],[568,46],[569,46],[570,46],[571,32],[572,35],[573,35],[574,35],[579,35],[575,35],[576,32],[577,35],[578,32],[580,35],[581,35],[582,35],[583,35],[584,35],[585,35],[586,32],[587,35],[588,35],[589,35],[590,35],[591,35],[592,35],[593,35],[594,35],[595,35],[596,35],[597,35],[598,35],[599,35],[600,35],[601,35],[602,35],[603,47],[604,35],[605,35],[606,35],[607,35],[608,35],[609,35],[610,32],[611,32],[612,32],[613,32],[614,32],[615,35],[616,35],[617,35],[618,35],[636,48],[684,32],[621,49],[620,50],[644,51],[643,52],[639,53],[638,52],[640,54],[629,55],[627,56],[642,57],[641,54],[630,58],[543,59],[499,60],[498,35],[625,61],[626,62],[624,63],[622,35],[631,64],[502,65],[648,31],[646,66],[619,67],[632,68],[376,69],[431,70],[433,71],[377,72],[378,73],[379,69],[380,73],[381,72],[383,74],[384,69],[385,73],[386,74],[387,74],[388,74],[389,73],[390,69],[391,69],[392,73],[393,73],[394,73],[395,73],[396,69],[397,74],[398,69],[399,73],[400,73],[401,73],[402,72],[403,73],[404,72],[405,69],[406,69],[407,69],[408,69],[409,74],[410,69],[411,74],[412,72],[413,69],[414,69],[415,69],[416,74],[417,73],[418,74],[419,69],[421,69],[422,69],[423,73],[424,69],[425,69],[426,69],[427,69],[429,75],[428,69],[382,69],[369,76],[372,77],[365,78],[367,79],[361,80],[374,81],[360,69],[368,82],[371,83],[362,69],[338,84],[342,85],[339,86],[335,69],[343,87],[336,69],[337,69],[341,86],[347,88],[345,89],[344,90],[44,91],[327,92],[320,93],[321,94],[331,95],[329,93],[330,96],[333,97],[55,98],[51,99],[47,100],[52,101],[307,102],[308,103],[334,104],[59,105],[64,93],[60,106],[57,105],[66,107],[61,108],[58,105],[65,109],[62,109],[56,109],[63,110],[351,111],[332,112],[50,113],[68,114],[81,115],[91,96],[92,96],[93,96],[94,96],[95,96],[96,96],[97,96],[98,96],[99,96],[100,96],[101,96],[102,96],[103,96],[104,96],[106,116],[107,96],[108,96],[109,96],[110,96],[111,96],[112,96],[113,96],[114,96],[115,96],[287,96],[116,96],[117,96],[70,96],[118,96],[119,96],[120,96],[121,96],[122,96],[123,96],[124,96],[125,96],[126,96],[127,96],[128,96],[67,96],[129,116],[130,116],[131,116],[132,96],[133,96],[134,96],[135,96],[136,96],[137,96],[138,96],[139,96],[140,116],[141,94],[142,96],[143,96],[144,96],[145,96],[295,96],[146,94],[147,96],[148,96],[149,96],[150,96],[151,96],[152,96],[153,96],[154,96],[155,96],[156,96],[157,96],[158,96],[300,117],[301,118],[302,118],[303,119],[299,120],[312,121],[159,96],[294,96],[71,122],[160,96],[161,96],[162,96],[297,96],[163,96],[164,96],[165,96],[166,96],[167,96],[168,96],[169,94],[170,96],[171,96],[172,96],[173,96],[174,96],[175,96],[176,96],[177,96],[178,96],[179,96],[180,96],[181,96],[182,96],[183,116],[184,96],[185,115],[186,96],[187,96],[188,96],[189,96],[190,96],[191,96],[192,96],[193,96],[290,96],[194,96],[195,96],[196,96],[197,96],[289,96],[198,96],[199,96],[200,96],[201,96],[304,123],[340,124],[202,96],[203,96],[204,96],[205,96],[206,96],[207,96],[208,116],[209,96],[210,96],[211,94],[212,96],[213,96],[214,115],[215,96],[216,96],[217,96],[218,96],[219,96],[220,96],[221,96],[222,94],[223,96],[224,96],[225,96],[226,96],[227,96],[228,96],[229,96],[230,96],[231,96],[232,96],[233,96],[234,96],[235,96],[291,96],[72,125],[292,96],[326,122],[236,96],[237,96],[238,96],[239,96],[240,96],[296,94],[241,96],[242,96],[243,96],[244,96],[245,96],[246,96],[247,96],[73,122],[248,96],[249,96],[250,96],[293,96],[251,94],[252,94],[253,94],[254,94],[255,96],[322,125],[256,96],[257,96],[258,96],[259,96],[260,96],[261,96],[262,96],[263,96],[264,96],[265,96],[266,96],[267,96],[268,96],[269,96],[270,96],[271,96],[272,96],[273,96],[274,96],[275,96],[276,96],[288,96],[277,96],[278,96],[279,96],[280,96],[281,96],[282,96],[283,96],[284,96],[285,96],[286,96],[83,126],[84,126],[85,126],[86,126],[88,127],[82,128],[90,129],[89,126],[87,130],[46,109],[53,131],[54,100],[49,132],[43,133],[42,93],[48,94],[75,132],[76,93],[306,134],[41,135],[79,136],[77,93],[437,137],[484,138],[442,139],[485,140],[443,141],[444,142],[445,143],[446,144],[447,145],[448,146],[449,147],[450,148],[451,149],[452,150],[453,151],[454,152],[455,153],[456,154],[457,155],[486,156],[458,157],[459,158],[460,159],[461,160],[462,161],[463,162],[464,163],[465,164],[466,165],[467,166],[468,167],[469,168],[470,169],[471,170],[472,171],[473,172],[483,173],[474,174],[475,175],[476,144],[477,176],[478,177],[482,178],[479,179],[480,180],[488,181],[350,190],[354,184],[352,190],[375,191],[434,192],[348,69],[349,188],[435,193]],"semanticDiagnosticsPerFile":[491,492,494,493,495,497,708,688,690,689,692,694,695,696,697,698,699,700,701,702,703,704,705,706,693,707,691,709,710,711,496,712,713,714,716,715,741,742,717,720,739,740,730,729,727,722,735,733,737,721,734,738,723,724,736,718,725,726,728,732,743,731,719,756,755,750,752,751,744,745,747,749,753,754,746,748,757,687,686,659,637,635,685,650,649,550,501,657,658,660,661,662,561,663,634,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,500,503,504,505,506,507,508,509,510,512,513,511,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,535,534,536,537,538,539,540,541,542,556,544,545,546,547,548,549,551,552,553,554,555,557,558,559,560,562,563,564,565,566,567,568,569,570,571,572,573,574,579,575,576,577,578,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,636,684,621,620,644,643,639,638,640,629,627,642,641,628,630,543,499,498,633,625,626,623,624,622,631,502,651,652,645,648,647,653,654,646,655,656,619,632,376,431,433,377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,432,429,428,382,430,369,372,370,363,365,367,361,374,373,366,360,368,359,371,364,362,39,338,342,339,335,343,336,337,341,38,347,345,344,346,44,327,320,321,331,329,330,333,55,309,328,51,47,52,307,308,78,334,59,64,60,57,66,61,58,65,62,56,45,63,351,332,50,319,68,81,91,92,93,94,95,96,97,98,99,316,100,101,102,103,104,106,107,310,108,109,110,111,112,113,114,115,287,116,117,69,70,118,119,120,121,122,123,124,125,126,127,128,311,67,129,130,131,132,133,105,134,135,136,137,138,139,140,141,142,143,144,145,295,146,147,148,149,150,318,151,152,153,154,155,156,157,158,300,301,302,303,299,312,159,294,71,160,161,162,297,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,305,180,181,182,183,184,185,186,187,188,189,190,191,192,193,290,194,195,196,197,289,198,199,200,201,298,304,340,202,203,204,205,206,207,208,209,210,211,212,213,214,215,313,216,217,218,219,220,221,222,223,224,314,225,226,227,228,229,230,231,232,315,233,234,235,291,72,292,326,236,317,237,238,239,240,296,241,242,243,244,245,246,247,73,248,249,250,323,324,325,293,251,252,253,254,255,322,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,288,277,278,279,280,281,282,283,284,285,286,83,84,85,86,88,82,90,89,87,46,53,54,74,49,43,42,48,75,76,306,41,79,77,80,436,437,438,439,440,484,442,485,443,444,445,446,447,448,449,450,451,452,453,454,441,481,455,456,457,486,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,483,474,475,476,477,478,482,479,480,487,488,489,490,40,36,37,7,9,8,2,10,11,12,13,14,15,16,17,3,4,21,18,19,20,22,23,24,5,25,26,27,28,6,32,29,30,31,33,34,1,35,350,356,354,357,352,358,375,434,355,348,349,435,353]},"version":"5.0.4"} \ No newline at end of file diff --git a/tfjs-automl/dist/types.d.ts b/tfjs-automl/dist/types.d.ts new file mode 100644 index 00000000000..a18da647adf --- /dev/null +++ b/tfjs-automl/dist/types.d.ts @@ -0,0 +1,18 @@ +/** + * @license + * 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 + * + * 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 { Tensor3D } from '@tensorflow/tfjs-core'; +export type ImageInput = ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Tensor3D; diff --git a/tfjs-automl/dist/types.js b/tfjs-automl/dist/types.js new file mode 100644 index 00000000000..993efe19692 --- /dev/null +++ b/tfjs-automl/dist/types.js @@ -0,0 +1,18 @@ +/** + * @license + * 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 + * + * 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 {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/util.d.ts b/tfjs-automl/dist/util.d.ts new file mode 100644 index 00000000000..ab8ee3003d3 --- /dev/null +++ b/tfjs-automl/dist/util.d.ts @@ -0,0 +1,21 @@ +/** + * @license + * 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 + * + * 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 { Tensor3D } from '@tensorflow/tfjs-core'; +import { ImageInput } from './types'; +export declare function imageToTensor(img: ImageInput): Tensor3D; +/** Loads and parses the dictionary. */ +export declare function loadDictionary(modelUrl: string): Promise; diff --git a/tfjs-automl/dist/util.js b/tfjs-automl/dist/util.js new file mode 100644 index 00000000000..55571fdc797 --- /dev/null +++ b/tfjs-automl/dist/util.js @@ -0,0 +1,30 @@ +/** + * @license + * 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 + * + * 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 { browser, Tensor, util } from '@tensorflow/tfjs-core'; +export function imageToTensor(img) { + return img instanceof Tensor ? img : browser.fromPixels(img); +} +/** Loads and parses the dictionary. */ +export async function loadDictionary(modelUrl) { + const lastIndexOfSlash = modelUrl.lastIndexOf('/'); + const prefixUrl = lastIndexOfSlash >= 0 ? modelUrl.slice(0, lastIndexOfSlash + 1) : ''; + const dictUrl = `${prefixUrl}dict.txt`; + const response = await util.fetch(dictUrl); + const text = await response.text(); + return text.trim().split('\n'); +} +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/util_test.d.ts b/tfjs-automl/dist/util_test.d.ts new file mode 100644 index 00000000000..213a60d55bc --- /dev/null +++ b/tfjs-automl/dist/util_test.d.ts @@ -0,0 +1,18 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-cpu'; +import '@tensorflow/tfjs-backend-webgl'; diff --git a/tfjs-automl/dist/util_test.js b/tfjs-automl/dist/util_test.js new file mode 100644 index 00000000000..03d95a2ac14 --- /dev/null +++ b/tfjs-automl/dist/util_test.js @@ -0,0 +1,55 @@ +/** + * @license + * 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 + * + * 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 '@tensorflow/tfjs-backend-cpu'; +import '@tensorflow/tfjs-backend-webgl'; +import { util } from '@tensorflow/tfjs-core'; +import { loadDictionary } from './util'; +describe('load dictionary', () => { + it('relative url to model.json', async () => { + spyOn(util, 'fetch').and.callFake(async (dictUrl) => { + expect(dictUrl).toBe('dict.txt'); + return { text: async () => 'first\nsecond\nthird' }; + }); + const res = await loadDictionary('model.json'); + expect(res).toEqual(['first', 'second', 'third']); + }); + it('relative url to model.json with a base path', async () => { + spyOn(util, 'fetch').and.callFake(async (dictUrl) => { + expect(dictUrl).toBe('base/path/dict.txt'); + return { text: async () => 'first\nsecond\nthird' }; + }); + const res = await loadDictionary('base/path/model.json'); + expect(res).toEqual(['first', 'second', 'third']); + }); + it('absolute url to model.json', async () => { + spyOn(util, 'fetch').and.callFake(async (dictUrl) => { + expect(dictUrl).toBe('/dict.txt'); + return { text: async () => 'first\nsecond\nthird\n' }; + }); + const res = await loadDictionary('/model.json'); + expect(res).toEqual(['first', 'second', 'third']); + }); + it('absolute url to model.json with a base path', async () => { + spyOn(util, 'fetch').and.callFake(async (dictUrl) => { + expect(dictUrl).toBe('/base/path/dict.txt'); + return { text: async () => 'first\nsecond\nthird\n' }; + }); + const res = await loadDictionary('/base/path/model.json'); + expect(res).toEqual(['first', 'second', 'third']); + }); +}); +//# sourceMappingURL=util_test.js.map \ No newline at end of file diff --git a/tfjs-automl/dist/version.d.ts b/tfjs-automl/dist/version.d.ts new file mode 100644 index 00000000000..3a8e214fd2e --- /dev/null +++ b/tfjs-automl/dist/version.d.ts @@ -0,0 +1,3 @@ +/** @license See the LICENSE file. */ +declare const version = "1.2.0"; +export { version }; diff --git a/tfjs-automl/dist/version.js b/tfjs-automl/dist/version.js new file mode 100644 index 00000000000..7382aaf5fdc --- /dev/null +++ b/tfjs-automl/dist/version.js @@ -0,0 +1,5 @@ +/** @license See the LICENSE file. */ +// This code is auto-generated, do not modify this file! +const version = '1.2.0'; +export { version }; +//# sourceMappingURL=version.js.map \ No newline at end of file From 96a4ccc0af2046fb5b0ad39d4d4de3af1cf9f4e8 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Tue, 23 Apr 2024 13:05:08 -0400 Subject: [PATCH 3/6] Update package.json to resolve #8186 Updated the version of the tfjs-core dependency in tfjs-automl to resolve the ReferenceError when run from within a web worker. --- tfjs-automl/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tfjs-automl/package.json b/tfjs-automl/package.json index dca63ac78a8..6c135c197b5 100644 --- a/tfjs-automl/package.json +++ b/tfjs-automl/package.json @@ -60,6 +60,6 @@ "peerDependencies": { "@tensorflow/tfjs-backend-webgl": "^3.9.0", "@tensorflow/tfjs-converter": "^3.9.0", - "@tensorflow/tfjs-core": "^3.9.0" + "@tensorflow/tfjs-core": "^4.18.0" } } From 0c5796dd76b5a9384792a5983d990563c9ed6515 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Wed, 29 May 2024 21:50:37 -0400 Subject: [PATCH 4/6] Updated versions of all tfjs dependencies in package.json --- tfjs-automl/package.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tfjs-automl/package.json b/tfjs-automl/package.json index 982ee24b6f5..8b4a5f8640e 100644 --- a/tfjs-automl/package.json +++ b/tfjs-automl/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@babel/polyfill": "^7.8.7", - "@tensorflow/tfjs-backend-webgl": "^4.9.0", - "@tensorflow/tfjs-converter": "^4.9.0", - "@tensorflow/tfjs-core": "^4.9.0", + "@tensorflow/tfjs-backend-webgl": "^4.19.0", + "@tensorflow/tfjs-converter": "^4.19.0", + "@tensorflow/tfjs-core": "^4.19.0", "@types/jasmine": "~4.3.1", "clang-format": "~1.8.0", "jasmine": "4.5.0", @@ -58,8 +58,11 @@ "yalc": "~1.0.0-pre.21" }, "peerDependencies": { - "@tensorflow/tfjs-backend-webgl": "^4.9.0", - "@tensorflow/tfjs-converter": "^4.9.0", - "@tensorflow/tfjs-core": "^4.9.0" + "@tensorflow/tfjs-backend-webgl": "^4.19.0", + "@tensorflow/tfjs-converter": "^4.19.0", + "@tensorflow/tfjs-core": "^4.19.0" + }, + "dependencies": { + "yarn": "^1.22.22" } } From e07838970652a31297942e97361fbcb41fa9f562 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Wed, 29 May 2024 21:59:10 -0400 Subject: [PATCH 5/6] Added dist/ back to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8360f94fc37..b3a2ac1c2ab 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ clone/ coverage/ demo/train-* deps/ -#dist/ +dist/ tfjs-layers/integration_tests/tfjs2keras/test-data/ tfjs-layers/integration/typescript/yarn.lock e2e/integration_tests/create_save_predict_data From 07800f429a61a07ec0b19db83d6c11e8ab1d3a91 Mon Sep 17 00:00:00 2001 From: Praful Bhawsar Date: Wed, 29 May 2024 22:00:32 -0400 Subject: [PATCH 6/6] Remove yarn as a dependency --- tfjs-automl/package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/tfjs-automl/package.json b/tfjs-automl/package.json index 8b4a5f8640e..93eb4e1df19 100644 --- a/tfjs-automl/package.json +++ b/tfjs-automl/package.json @@ -61,8 +61,5 @@ "@tensorflow/tfjs-backend-webgl": "^4.19.0", "@tensorflow/tfjs-converter": "^4.19.0", "@tensorflow/tfjs-core": "^4.19.0" - }, - "dependencies": { - "yarn": "^1.22.22" } }