diff --git a/OJET (VDOM) - OCI Vision/.gitignore b/OJET (VDOM) - OCI Vision/.gitignore new file mode 100644 index 0000000..524f096 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/.gitignore @@ -0,0 +1,24 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* diff --git a/OJET (VDOM) - OCI Vision/CONTRIBUTING.md b/OJET (VDOM) - OCI Vision/CONTRIBUTING.md new file mode 100644 index 0000000..637430b --- /dev/null +++ b/OJET (VDOM) - OCI Vision/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing to this repository + +We welcome your contributions! There are multiple ways to contribute. + +## Opening issues + +For bugs or enhancement requests, please file a GitHub issue unless it's +security related. When filing a bug remember that the better written the bug is, +the more likely it is to be fixed. If you think you've found a security +vulnerability, do not raise a GitHub issue and follow the instructions in our +[security policy](./SECURITY.md). + +## Contributing code + +We welcome your code contributions. Before submitting code via a pull request, +you will need to have signed the [Oracle Contributor Agreement][OCA] (OCA) and +your commits need to include the following line using the name and e-mail +address you used to sign the OCA: + +```text +Signed-off-by: Your Name +``` + +This can be automatically added to pull requests by committing with `--sign-off` +or `-s`, e.g. + +```text +git commit --signoff +``` + +Only pull requests from committers that can be verified as having signed the OCA +can be accepted. + +## Pull request process + +1. Ensure there is an issue created to track and discuss the fix or enhancement + you intend to submit. +1. Fork this repository. +1. Create a branch in your fork to implement the changes. We recommend using + the issue number as part of your branch name, e.g. `1234-fixes`. +1. Ensure that any documentation is updated with the changes that are required + by your change. +1. Ensure that any samples are updated if the base image has been changed. +1. Submit the pull request. *Do not leave the pull request blank*. Explain exactly + what your changes are meant to do and provide simple steps on how to validate. + your changes. Ensure that you reference the issue you created as well. +1. We will assign the pull request to 2-3 people for review before it is merged. + +## Code of conduct + +Follow the [Golden Rule](https://en.wikipedia.org/wiki/Golden_Rule). If you'd +like more specific guidelines, see the [Contributor Covenant Code of Conduct][COC]. + +[OCA]: https://oca.opensource.oracle.com +[COC]: https://www.contributor-covenant.org/version/1/4/code-of-conduct/ diff --git a/OJET (VDOM) - OCI Vision/LICENSE.txt b/OJET (VDOM) - OCI Vision/LICENSE.txt new file mode 100644 index 0000000..9b47cfb --- /dev/null +++ b/OJET (VDOM) - OCI Vision/LICENSE.txt @@ -0,0 +1,35 @@ +Copyright (c) 2024 Oracle and/or its affiliates. + +The Universal Permissive License (UPL), Version 1.0 + +Subject to the condition set forth below, permission is hereby granted to any +person obtaining a copy of this software, associated documentation and/or data +(collectively the "Software"), free of charge and under any and all copyright +rights in the Software, and any and all patent rights owned or freely +licensable by each licensor hereunder covering either (i) the unmodified +Software as contributed to or provided by such licensor, or (ii) the Larger +Works (as defined below), to deal in both + +(a) the Software, and +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +one is included with the Software (each a "Larger Work" to which the Software +is contributed by such licensors), + +without restriction, including without limitation the rights to copy, create +derivative works of, display, perform, and distribute the Software and make, +use, sell, offer for sale, import, export, have made, and have sold the +Software and the Larger Work(s), and to sublicense the foregoing rights on +either these or other terms. + +This license is subject to the following condition: +The above copyright notice and either this complete permission notice or at +a minimum a reference to the UPL must be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/README.md b/OJET (VDOM) - OCI Vision/README.md new file mode 100644 index 0000000..b48b538 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/README.md @@ -0,0 +1,88 @@ +# Build an Application That Can “See” and “Understand” Visual Data. + +[![License: UPL](https://img.shields.io/badge/license-UPL-green)](https://img.shields.io/badge/license-UPL-green) [![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=oracle-devrel_test)](https://sonarcloud.io/dashboard?id=oracle-devrel_test) + + + +## Introduction +Oracle JET uses the Virtual DOM (VDOM) architecture and integrates OCI Vision services for enhanced functionality. The Oracle JET VDOM UI application consumes responses from the OCI Vision service. This code is for Oracle JET applications based on the Virtual DOM architecture. This project is developed for use with the Oracle JavaScript Extension Toolkit (JET) coding environment. + + +## Getting Started + +There are three parts of the application. The code for part 3 is in this repository. + +• Part 1: Upload images to OCI bucket. + +1. Login to your Oracle Cloud Account. If you don't have one yet, sign up at cloud.oracle.com. +2. Create a compartment from the OCI “Identity and Security” menu and note the CompartmentID. +3. From the Storage menu, choose the “Bucket” option. Create a bucket the compartment you created above and name it “ORACLE_DEMO_BUCKET” . +4. Upload sample images. +5. Set up an API signing key and OCI profile mentioned in OCI documentation. + +![OCI bucket](https://github.com/user-attachments/assets/d9e29dce-2088-4dc3-9b20-c3b65c0f74e5) + + +• Part 2: Integration of OCI Java SDK with OCI Vision service to handle image processing within a Spring Boot application. + + • Clone the repository below and follow its instructions mentioned in part 2 section of [oracle-jet-vdom-and-oci-vision](https://blogs.oracle.com/developers/post/oracle-jet-vdom-and-oci-vision) to run the code locally. + +[oci-sdk-java-samples](https://github.com/user-attachments/assets/c12954b7-56b5-4c86-b680-2625364ed1fb) + + +• Part 3: Developing an Oracle JET (VDOM) application to consume and display the results from OCI Vision Service. + Clone the repository below and execute the command below in the local terminal. + + + npx ojet serve +**The final application should look as follows on a localhost server:** +Our blog will feature a one-page application with Object Storage Details and OCI Vision Result sections. In the Object Storage Details section, users enter Tenancy Region and Bucket Name. After validating the inputs, the application fetches the images stored in the provided object storage, which are then displayed in object lists. Upon submission, the OCI Vision API analyzes the selected image, displaying both the object and text in the OCI Vision Result section. + +![OJET VDOM application](https://github.com/user-attachments/assets/c12954b7-56b5-4c86-b680-2625364ed1fb) + + +Note: image courtesy of pixabay.com + +### Prerequisites + + +• Nodejs + +• Java 17 + +• Integrated Development Environment (IDE) + +• Oracle Cloud Account (free oracle cloud services should be sufficient) + + + +## Contributors +Author: Kulraj Singh Chouhan +Collaborators: NA +Last Review: Sept 2024 + +## References +[oracle-jet-vdom-and-oci-vision](https://blogs.oracle.com/developers/post/oracle-jet-vdom-and-oci-vision) + +[OCI Vision ](https://docs.oracle.com/en/solutions/ai-vision-extract-data/index.html#GUID-FA774176-6223-4E78-89D0-887BB6BCA4E4) + +## Contributing + + +This project welcomes contributions from the community. Before submitting a pull +request, please [review our contribution guide](./CONTRIBUTING.md). + +## Security + +Please consult the [security guide](./SECURITY.md) for our responsible security +vulnerability disclosure process. + +## License +Copyright (c) 2024 Oracle and/or its affiliates. + +Licensed under the Universal Permissive License (UPL), Version 1.0. + +See [LICENSE](LICENSE.txt) for more details. + +ORACLE AND ITS AFFILIATES DO NOT PROVIDE ANY WARRANTY WHATSOEVER, EXPRESS OR IMPLIED, FOR ANY SOFTWARE, MATERIAL OR CONTENT OF ANY KIND CONTAINED OR PRODUCED WITHIN THIS REPOSITORY, AND IN PARTICULAR SPECIFICALLY DISCLAIM ANY AND ALL IMPLIED WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. FURTHERMORE, ORACLE AND ITS AFFILIATES DO NOT REPRESENT THAT ANY CUSTOMARY SECURITY REVIEW HAS BEEN PERFORMED WITH RESPECT TO ANY SOFTWARE, MATERIAL OR CONTENT CONTAINED OR PRODUCED WITHIN THIS REPOSITORY. IN ADDITION, AND WITHOUT LIMITING THE FOREGOING, THIRD PARTIES MAY HAVE POSTED SOFTWARE, MATERIAL OR CONTENT TO THIS REPOSITORY WITHOUT ANY REVIEW. USE AT YOUR OWN RISK. diff --git a/OJET (VDOM) - OCI Vision/SECURITY.md b/OJET (VDOM) - OCI Vision/SECURITY.md new file mode 100644 index 0000000..2ca8102 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/SECURITY.md @@ -0,0 +1,38 @@ +# Reporting security vulnerabilities + +Oracle values the independent security research community and believes that +responsible disclosure of security vulnerabilities helps us ensure the security +and privacy of all our users. + +Please do NOT raise a GitHub Issue to report a security vulnerability. If you +believe you have found a security vulnerability, please submit a report to +[secalert_us@oracle.com][1] preferably with a proof of concept. Please review +some additional information on [how to report security vulnerabilities to Oracle][2]. +We encourage people who contact Oracle Security to use email encryption using +[our encryption key][3]. + +We ask that you do not use other channels or contact the project maintainers +directly. + +Non-vulnerability related security issues including ideas for new or improved +security features are welcome on GitHub Issues. + +## Security updates, alerts and bulletins + +Security updates will be released on a regular cadence. Many of our projects +will typically release security fixes in conjunction with the +Oracle Critical Patch Update program. Additional +information, including past advisories, is available on our [security alerts][4] +page. + +## Security-related information + +We will provide security related information such as a threat model, considerations +for secure use, or any known security issues in our documentation. Please note +that labs and sample code are intended to demonstrate a concept and may not be +sufficiently hardened for production use. + +[1]: mailto:secalert_us@oracle.com +[2]: https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html +[3]: https://www.oracle.com/security-alerts/encryptionkey.html +[4]: https://www.oracle.com/security-alerts/ diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/oraclejetconfig.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/oraclejetconfig.json new file mode 100644 index 0000000..47bf115 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/oraclejetconfig.json @@ -0,0 +1,27 @@ +{ + "paths": { + "source": { + "common": "src", + "web": "src-web", + "javascript": ".", + "typescript": ".", + "styles": "styles", + "themes": "themes", + "components": "components", + "exchangeComponents": "exchange_components" + }, + "staging": { + "web": "web", + "themes": "staged-themes" + } + }, + "defaultBrowser": "chrome", + "sassVer": "8.0.0", + "defaultTheme": "redwood", + "typescriptLibraries": "typescript@5.3.2 yargs-parser@~13.1.2", + "webpackLibraries": "webpack@5.76.0 @types/node@18.16.3 webpack-dev-server style-loader css-loader sass-loader sass ts-loader@8.4.0 raw-loader noop-loader html-webpack-plugin html-replace-webpack-plugin copy-webpack-plugin @prefresh/webpack @prefresh/babel-plugin webpack-merge compression-webpack-plugin mini-css-extract-plugin clean-webpack-plugin css-fix-url-loader", + "mochaTestingLibraries": "karma mocha sinon chai coverage karma-chai@0.1.0 karma-coverage@2.2.0 karma-chrome-launcher@3.1.1 karma-mocha@2.0.1 karma-mocha-reporter@2.2.5 karma-requirejs@1.1.0 karma-fixture@0.2.6 karma-sinon@1.0.5 karma-typescript@5.5.4 @types/chai@4.3.4 @types/karma-fixture@0.2.5 @types/mocha@10.0.1 @types/sinon@10.0.13", + "jestTestingLibraries": "jest@29.6.2 @testing-library/preact@3.2.3 @types/jest@29.5.3 jest-environment-jsdom@29.6.2 @oracle/oraclejet-jest-preset@~16.0.0", + "architecture": "vdom", + "watchInterval": 1000 +} \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package-lock.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package-lock.json new file mode 100644 index 0000000..47f64c0 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package-lock.json @@ -0,0 +1,3059 @@ +{ + "name": "JET-Virtual-DOM-app", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "JET-Virtual-DOM-app", + "version": "1.0.0", + "dependencies": { + "@oracle/oraclejet": "~16.0.0", + "@oracle/oraclejet-core-pack": "~16.0.0", + "archiver": "^6.0.1" + }, + "devDependencies": { + "@oracle/ojet-cli": "~16.0.0", + "extract-zip": "^1.7.0", + "fs-extra": "^8.1.0", + "glob": "7.2.0", + "typescript": "5.3.2", + "underscore": "^1.10.2", + "yargs-parser": "13.1.2" + }, + "engines": { + "node": ">=12.21.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oracle/ojet-cli": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@oracle/ojet-cli/-/ojet-cli-16.0.0.tgz", + "integrity": "sha512-o8YJmUrYWFI+/YHuD39v3TR16jxYKDeCZ0KXFd+KscYOX7xH8+aTYT23kkCmIkNZR19L4/1iPmL2oYUaqlLFKQ==", + "dev": true, + "dependencies": { + "@oracle/oraclejet-templates": "~16.0.0", + "@oracle/oraclejet-tooling": "~16.0.0", + "adm-zip": "~0.4.7", + "fs-extra": "~8.1.0", + "glob": "7.2.0", + "inquirer": "~8.2.2", + "minimist": "~1.2.0" + }, + "bin": { + "ojet": "bin/ojet" + }, + "engines": { + "node": ">=12.21.0" + } + }, + "node_modules/@oracle/oraclejet": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet/-/oraclejet-16.0.5.tgz", + "integrity": "sha512-l9IdYmaaUbcTuremDtpsQIHY+jX+RRr3HRi9+E8MkAyzjq/90cbVkTfs+t5PItI6ZZwnhSccS1BgcFw3r+jTUw==", + "dependencies": { + "@oracle/oraclejet-preact": "16.0.5", + "@types/geojson": "7946.0.11", + "@types/signals": "1.0.2", + "hammerjs": "2.0.8", + "jquery": "3.6.4", + "jquery-ui": "1.13.2", + "knockout": "3.5.1", + "preact": "10.17.1", + "proj4": "2.9.2", + "require-css": "0.1.10", + "requirejs": "2.3.6", + "requirejs-text": "2.0.16", + "signals": "1.0.0" + } + }, + "node_modules/@oracle/oraclejet-core-pack": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet-core-pack/-/oraclejet-core-pack-16.0.5.tgz", + "integrity": "sha512-orzkSkBP4JMdO/WjCsOu1jGOkBmxNayzvfAFr6B7BnmxghdEizi7weBnhgBqpcJWpovPbdF9VbS7+ZADvOi8vA==", + "dependencies": { + "@oracle/oraclejet": "16.0.5", + "@oracle/oraclejet-preact": "16.0.5", + "@oracle/oraclejet-webdriver": "16.0.5" + }, + "peerDependencies": { + "selenium-webdriver": ">=3.6.0" + } + }, + "node_modules/@oracle/oraclejet-preact": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet-preact/-/oraclejet-preact-16.0.5.tgz", + "integrity": "sha512-vY9rT2/ZH8p0nloL7cLGvxpJ/ftb7hBACsYJcWSa9Nv1mz3hA2U4c3wtsn4mJlpJ2yi7q0t6QVwPMCNFTBRbCQ==", + "dependencies": { + "csstype": "3.1.1" + }, + "peerDependencies": { + "preact": "10.17.1" + } + }, + "node_modules/@oracle/oraclejet-templates": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet-templates/-/oraclejet-templates-16.0.0.tgz", + "integrity": "sha512-mfe+DOkJOobinaQoCp8fSGWoER6b/KR4wTEqtGrKjcXPfZ32TT2kFkZpJYe1U5ygBBCWPBE/aY/d0vqNTQwgOQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@oracle/oraclejet-tooling": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet-tooling/-/oraclejet-tooling-16.0.0.tgz", + "integrity": "sha512-ifA7sgUxQqpHpqWeyQOXUvORDa2VZpKKVh1la5vD3yeT7dCxZWWYxy+cYLKpUhv1LbzbJkjR1SB6tzk4M492xQ==", + "dev": true, + "dependencies": { + "acorn": "8.8.0", + "acorn-jsx": "5.3.2", + "archiver": "~5.2.0", + "connect-livereload": "~0.6.0", + "css-what": "~5.0.1", + "eslint-visitor-keys": "1.3.0", + "express": "~4.17.1", + "extract-zip": "~1.7.0", + "form-data": "~2.5.1", + "fs-extra": "~8.1.0", + "gaze": "~1.1.2", + "glob": "7.2.0", + "lodash.difference": "~4.5.0", + "lodash.escaperegexp": "~4.1.2", + "lodash.isfunction": "~3.0.9", + "lodash.mergewith": "~4.6.2", + "lodash.remove": "~4.7.0", + "lodash.union": "~4.6.0", + "open": "6.4.0", + "requirejs": "~2.3.6", + "serve-index": "~1.9.1", + "serve-static": "~1.13.0", + "svgo": "~2.7.0", + "terser": "~5.19.2", + "tiny-lr": "2.0.0", + "underscore": "~1.13.1" + }, + "engines": { + "node": ">=12.21.0" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/archiver": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.2.0.tgz", + "integrity": "sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.0", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.1.4", + "zip-stream": "^4.0.4" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@oracle/oraclejet-tooling/node_modules/zip-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@oracle/oraclejet-webdriver": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@oracle/oraclejet-webdriver/-/oraclejet-webdriver-16.0.5.tgz", + "integrity": "sha512-BS+n90IjfUfU0WyXuV4dp0eiRjdtjoUXHIVFEk1wqO7g4pv8tnJtWBzFXHZDGbp8Edurq+tG3NRhb7KqwbQP1Q==", + "dependencies": { + "@oracle/oraclejet": "16.0.5" + }, + "bin": { + "ojwd-generate": "bin/generate" + }, + "peerDependencies": { + "@types/selenium-webdriver": ">=3.6.0", + "selenium-webdriver": ">=3.6.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.11", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", + "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==" + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/selenium-webdriver": { + "version": "4.1.22", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.22.tgz", + "integrity": "sha512-MCL4l7q8dwxejr2Q2NXLyNwHWMPdlWE0Kpn6fFwJtvkJF7PTkG5jkvbH/X1IAAQxgt/L1dA8u2GtDeekvSKvOA==", + "peer": true, + "dependencies": { + "@types/ws": "*" + } + }, + "node_modules/@types/signals": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/signals/-/signals-1.0.2.tgz", + "integrity": "sha512-jQp1ZX78SbU0CckJ0ydnwp5abfoWjcP9St1ON3rd3YVESlj3Xn3DaFxRHfssvKWYpq4WwPY1VG/4qfoLMCm2zA==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/archiver": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz", + "integrity": "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==", + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", + "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "node_modules/body/node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz", + "integrity": "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz", + "integrity": "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "peer": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jquery": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz", + "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ==" + }, + "node_modules/jquery-ui": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz", + "integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "peer": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "peer": true + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/knockout": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz", + "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q==" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "peer": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.remove": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.remove/-/lodash.remove-4.7.0.tgz", + "integrity": "sha512-GnwkSsEXGXirSxh3YI+jc/qvptE2DV8ZjA4liK0NT1MJ3mNDMFhX3bY+4Wr8onlNItYuPp7/4u19Fi55mvzkTw==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mgrs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", + "integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "peer": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/preact": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", + "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proj4": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.9.2.tgz", + "integrity": "sha512-bdyfNmtlWjQN/rHEHEiqFvpTUHhuzDaeQ6Uu1G4sPGqk+Xkxae6ahh865fClJokSGPBmlDOQWWaO6465TCfv5Q==", + "dependencies": { + "mgrs": "1.0.0", + "wkt-parser": "^1.3.3" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/require-css": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/require-css/-/require-css-0.1.10.tgz", + "integrity": "sha512-v9XczgOfDKMkHdndAwuEDEasYNJPbL3aVDTM9tbRoAefjLm3kUZdt/Fg6Xi+0HJzliL21gGPWTXDV87XuOwCIQ==" + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/requirejs-text": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/requirejs-text/-/requirejs-text-2.0.16.tgz", + "integrity": "sha512-XrzjeTb1pwzIWmkz8qnUiM20gENgiwB+66IciNuziwlaPAJsYQsQPSYyQ1kD4tGKGZxTisIfDbOHk02DpI/76Q==" + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/selenium-webdriver": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.20.0.tgz", + "integrity": "sha512-s/G44lGQ1xB3tmtX6NNPomlkpL6CxLdmAvp/AGWWwi4qv5Te1+qji7tPSyr6gyuoPpdYiof1rKnWe3luy0MrYA==", + "peer": true, + "dependencies": { + "jszip": "^3.10.1", + "tmp": "^0.2.3", + "ws": ">=8.16.0" + }, + "engines": { + "node": ">= 14.20.0" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "peer": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-static/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "peer": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/signals": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signals/-/signals-1.0.0.tgz", + "integrity": "sha512-dE3lBiqgrgIvpGHYBy6/kiYKfh0HXRmbg0ocakBKiOefbal6ZeTtNlQlxsu9ADkNzv5OmRwRKu+IaTPSqJdZDg==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.7.0.tgz", + "integrity": "sha512-aDLsGkre4fTDCWvolyW+fs8ZJFABpzLXbtdK1y71CKnHzAnpDxKXPj2mNKj+pyOXUCzFHzuxRJ94XOFygOWV3w==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "nanocolors": "^0.1.12", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tiny-lr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-2.0.0.tgz", + "integrity": "sha512-f6nh0VMRvhGx4KCeK1lQ/jaL0Zdb5WdR+Jk8q9OSUQnaSDxAEGH1fgqLZ+cMl5EW3F2MGnCsalBO1IsnnogW1Q==", + "dev": true, + "dependencies": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "^0.11.3", + "livereload-js": "^3.3.1", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/tiny-lr/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "peer": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/wkt-parser": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.3.tgz", + "integrity": "sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", + "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + } + } +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package.json new file mode 100644 index 0000000..5a40f87 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/package.json @@ -0,0 +1,27 @@ +{ + "name": "JET-Virtual-DOM-app", + "version": "1.0.0", + "description": "An Oracle JavaScript Extension Toolkit(JET) web app", + "scripts": { + "build": "npx ojet build", + "serve": "npx ojet serve" + }, + "dependencies": { + "@oracle/oraclejet": "~16.0.0", + "@oracle/oraclejet-core-pack": "~16.0.0", + "archiver": "^6.0.1" + }, + "devDependencies": { + "@oracle/ojet-cli": "~16.0.0", + "extract-zip": "^1.7.0", + "fs-extra": "^8.1.0", + "glob": "7.2.0", + "typescript": "5.3.2", + "underscore": "^1.10.2", + "yargs-parser": "13.1.2" + }, + "engines": { + "node": ">=12.21.0" + }, + "private": true +} \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/path_mapping.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/path_mapping.json new file mode 100644 index 0000000..c4779f6 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/path_mapping.json @@ -0,0 +1,457 @@ +{ + "use": "local", + "cdns": { + "jet": { + "prefix": "https://static.oracle.com/cdn/jet/16.0.0/default/js", + "css": "https://static.oracle.com/cdn/jet/16.0.0/default/css", + "csspreact": "https://static.oracle.com/cdn/jet/16.0.0/3rdparty/oraclejet-preact/amd", + "config": "bundles-config.js" + }, + "3rdparty": "https://static.oracle.com/cdn/jet/16.0.0/3rdparty" + }, + "libs": { + "knockout": { + "cdn": "3rdparty", + "cwd": "node_modules/knockout/build/output", + "debug": { + "src": "knockout-latest.debug.js", + "path": "libs/knockout/knockout-#{version}.debug.js", + "cdnPath": "knockout/knockout-3.5.1.debug" + }, + "release": { + "src": "knockout-latest.js", + "path": "libs/knockout/knockout-#{version}.js", + "cdnPath": "knockout/knockout-3.5.1" + } + }, + "jquery": { + "cdn": "3rdparty", + "cwd": "node_modules/jquery/dist", + "debug": { + "src": "jquery.js", + "path": "libs/jquery/jquery-#{version}.js", + "cdnPath": "jquery/jquery-3.6.4" + }, + "release": { + "src": "jquery.min.js", + "path": "libs/jquery/jquery-#{version}.min.js", + "cdnPath": "jquery/jquery-3.6.4.min" + } + }, + "jqueryui-amd": { + "cdn": "3rdparty", + "cwd": "node_modules/jquery-ui/ui", + "debug": { + "src": [ + "*.js", + "widgets/draggable.js", + "widgets/mouse.js", + "widgets/sortable.js", + "vendor/jquery-color/jquery.color.js" + ], + "path": "libs/jquery/jqueryui-amd-#{version}", + "cdnPath": "jquery/jqueryui-amd-1.13.2" + }, + "release": { + "src": [ + "*.js", + "widgets/draggable.js", + "widgets/mouse.js", + "widgets/sortable.js", + "vendor/jquery-color/jquery.color.js" + ], + "path": "libs/jquery/jqueryui-amd-#{version}.min", + "cdnPath": "jquery/jqueryui-amd-1.13.2.min" + } + }, + "hammerjs": { + "cdn": "3rdparty", + "cwd": "node_modules/hammerjs", + "debug": { + "src": "hammer.js", + "path": "libs/hammer/hammer-#{version}.js", + "cdnPath": "hammer/hammer-2.0.8" + }, + "release": { + "src": "hammer.min.js", + "path": "libs/hammer/hammer-#{version}.min.js", + "cdnPath": "hammer/hammer-2.0.8.min" + } + }, + "ojdnd": { + "cdn": "3rdparty", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/dnd-polyfill", + "debug": { + "src": "dnd-polyfill-1.0.2.js", + "path": "libs/dnd-polyfill/dnd-polyfill-1.0.2.js", + "cdnPath": "dnd-polyfill/dnd-polyfill-1.0.2" + }, + "release": { + "src": "dnd-polyfill-1.0.2.min.js", + "path": "libs/dnd-polyfill/dnd-polyfill-1.0.2.min.js", + "cdnPath": "dnd-polyfill/dnd-polyfill-1.0.2.min" + } + }, + "ojs": { + "cdn": "jet", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/oj", + "debug": { + "src": [ + "debug*/**" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/debug'", + "cdnPath": "" + }, + "release": { + "src": [ + "min*/**" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/min'", + "cdnPath": "" + } + }, + "ojL10n": { + "cdn": "jet", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/oj", + "debug": { + "src": "ojL10n.js", + "path": "libs/oj/#{version}/ojL10n.js", + "cdnPath": "ojL10n" + }, + "release": { + "src": "ojL10n.js", + "path": "libs/oj/#{version}/ojL10n.js", + "cdnPath": "ojL10n" + } + }, + "ojtranslations": { + "cdn": "jet", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/oj/resources", + "debug": { + "src": [ + "**" + ], + "path": "libs/oj/#{version}/resources", + "cdnPath": "resources" + }, + "release": { + "src": [ + "**" + ], + "path": "libs/oj/#{version}/resources", + "cdnPath": "resources" + } + }, + "@oracle/oraclejet-preact": { + "cdn": "3rdparty", + "cwd": "node_modules/@oracle/oraclejet-preact/amd", + "debug": { + "src": [ + "**" + ], + "path": "libs/oraclejet-preact/amd", + "cdnPath": "oraclejet-preact/amd" + }, + "release": { + "src": [ + "**" + ], + "path": "libs/oraclejet-preact/amd", + "cdnPath": "oraclejet-preact/amd" + } + }, + "oj-c": { + "cdn": "3rdparty", + "cwd": "node_modules/@oracle/oraclejet-core-pack/oj-c", + "debug": { + "src": [ + "**" + ], + "path": "libs/packs/oj-c", + "cdnPath": "../../packs/oj-c/#{version}/min" + }, + "release": { + "src": [ + "**" + ], + "path": "libs/packs/oj-c/min", + "cdnPath": "../../packs/oj-c/#{version}/min" + } + }, + "persist": { + "cdn": "3rdparty", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/persist", + "debug": { + "cwd": "debug", + "src": [ + "**" + ], + "path": "libs/persist/debug", + "cdnPath": "persist/debug" + }, + "release": { + "cwd": "min", + "src": [ + "**" + ], + "path": "libs/persist/min", + "cdnPath": "persist/min" + } + }, + "text": { + "cdn": "3rdparty", + "cwd": "node_modules/requirejs-text", + "debug": { + "src": "text.js", + "path": "libs/require/text.js", + "cdnPath": "require/text" + }, + "release": { + "src": "text.js", + "path": "libs/require/text.js", + "cdnPath": "require/text" + } + }, + "signals": { + "cdn": "3rdparty", + "cwd": "node_modules/signals/dist", + "debug": { + "src": "signals.js", + "path": "libs/js-signals/signals.js", + "cdnPath": "js-signals/signals" + }, + "release": { + "src": "signals.min.js", + "path": "libs/js-signals/signals.min.js", + "cdnPath": "js-signals/signals.min" + } + }, + "touchr": { + "cdn": "3rdparty", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/touchr", + "debug": { + "src": "touchr.js", + "path": "libs/touchr/touchr.js", + "cdnPath": "touchr/touchr" + }, + "release": { + "src": "touchr.js", + "path": "libs/touchr/touchr.js", + "cdnPath": "touchr/touchr" + } + }, + "preact": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/dist", + "debug": { + "src": [ + "preact.umd.js", + "preact.umd.js.map" + ], + "path": "libs/preact/dist/preact.umd.js", + "cdnPath": "preact/dist/preact.umd" + }, + "release": { + "src": [ + "preact.umd.js", + "preact.umd.js.map" + ], + "path": "libs/preact/dist/preact.umd.js", + "cdnPath": "preact/dist/preact.umd" + } + }, + "preact/hooks": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/hooks/dist", + "debug": { + "src": [ + "hooks.umd.js", + "hooks.umd.js.map" + ], + "path": "libs/preact/hooks/dist/hooks.umd.js", + "cdnPath": "preact/hooks/dist/hooks.umd" + }, + "release": { + "src": [ + "hooks.umd.js", + "hooks.umd.js.map" + ], + "path": "libs/preact/hooks/dist/hooks.umd.js", + "cdnPath": "preact/hooks/dist/hooks.umd" + } + }, + "preact/compat": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/compat/dist", + "debug": { + "src": [ + "compat.umd.js", + "compat.umd.js.map" + ], + "path": "libs/preact/compat/dist/compat.umd.js", + "cdnPath": "preact/compat/dist/compat.umd" + }, + "release": { + "src": [ + "compat.umd.js", + "compat.umd.js.map" + ], + "path": "libs/preact/compat/dist/compat.umd.js", + "cdnPath": "preact/compat/dist/compat.umd" + }, + "requireMap": "react" + }, + "preact/jsx-runtime": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/jsx-runtime/dist", + "debug": { + "src": [ + "jsxRuntime.umd.js", + "jsxRuntime.umd.js.map" + ], + "path": "libs/preact/jsx-runtime/dist/jsxRuntime.umd.js", + "cdnPath": "preact/jsx-runtime/dist/jsxRuntime.umd" + }, + "release": { + "src": [ + "jsxRuntime.umd.js", + "jsxRuntime.umd.js.map" + ], + "path": "libs/preact/jsx-runtime/dist/jsxRuntime.umd.js", + "cdnPath": "preact/jsx-runtime/dist/jsxRuntime.umd" + } + }, + "preact/debug": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/debug/dist", + "debug": { + "src": [ + "debug.umd.js", + "debug.umd.js.map" + ], + "path": "libs/preact/debug/dist/debug.umd.js", + "cdnPath": "preact/debug/dist/debug.umd" + }, + "release": { + "src": [ + "debug.umd.js", + "debug.umd.js.map" + ], + "path": "libs/preact/debug/dist/debug.umd.js", + "cdnPath": "preact/debug/dist/debug.umd" + } + }, + "preact/devtools": { + "cdn": "3rdparty", + "cwd": "node_modules/preact/devtools/dist", + "debug": { + "src": [ + "devtools.umd.js", + "devtools.umd.js.map" + ], + "path": "libs/preact/devtools/dist/devtools.umd.js", + "cdnPath": "preact/devtools/dist/devtools.umd" + }, + "release": { + "src": [ + "devtools.umd.js", + "devtools.umd.js.map" + ], + "path": "libs/preact/devtools/dist/devtools.umd.js", + "cdnPath": "preact/devtools/dist/devtools.umd" + } + }, + "proj4": { + "cdn": "3rdparty", + "cwd": "node_modules/proj4/dist", + "debug": { + "src": "proj4-src.js", + "path": "libs/proj4js/dist/proj4-src.js", + "cdnPath": "proj4js/dist/proj4" + }, + "release": { + "src": "proj4", + "path": "libs/proj4js/dist/proj4.js", + "cdnPath": "proj4js/dist/proj4" + } + }, + "css": { + "cdn": "3rdparty", + "cwd": "node_modules/require-css", + "debug": { + "src": [ + "css.js", + "css-builder.js", + "normalize.js" + ], + "path": "libs/require-css/css.js", + "cdnPath": "require-css/css" + }, + "release": { + "src": [ + "css.min.js", + "css-builder.js", + "normalize.js" + ], + "path": "libs/require-css/css.min.js", + "cdnPath": "require-css/css.min" + } + }, + "ojcss": { + "cdn": "jet", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/oj", + "debug": { + "src": [ + "debug/ojcss.js" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/debug/ojcss'", + "cdnPath": "ojcss" + }, + "release": { + "src": [ + "min/ojcss.js" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/min/ojcss'", + "cdnPath": "ojcss" + } + }, + "ojs/ojcss": { + "cdn": "jet", + "cwd": "node_modules/@oracle/oraclejet/dist/js/libs/oj", + "debug": { + "src": [ + "debug/ojcss.js" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/debug/ojcss'", + "cdnPath": "ojcss" + }, + "release": { + "src": [ + "min/ojcss.js" + ], + "path": "libs/oj/#{version}", + "pathSuffix": "/min/ojcss'", + "cdnPath": "ojcss" + } + }, + "chai": { + "cdn": "3rdparty", + "cwd": "node_modules/chai/", + "debug": { + "src": "chai.js", + "path": "libs/chai/chai.js", + "cdnPath": "chai/chai-4.3.10" + }, + "release": { + "src": "chai.js", + "path": "libs/chai/chai.js", + "cdnPath": "chai/chai-4.3.10.min" + } + } + } +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_create.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_create.js new file mode 100644 index 0000000..1067365 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_create.js @@ -0,0 +1,14 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function () { + return new Promise((resolve) => { + console.log('Running after_app_create hook.'); + resolve(); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_restore.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_restore.js new file mode 100644 index 0000000..dfce3c2 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_restore.js @@ -0,0 +1,14 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function () { + return new Promise((resolve) => { + console.log('Running after_app_restore hook.'); + resolve(); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_typescript.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_typescript.js new file mode 100644 index 0000000..16758d0 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_app_typescript.js @@ -0,0 +1,14 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log("Running after_app_typescript hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_build.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_build.js new file mode 100644 index 0000000..cf3ccc6 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_build.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running after_build hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_build.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_build.js new file mode 100644 index 0000000..f4152d5 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_build.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running after_component_build hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_create.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_create.js new file mode 100644 index 0000000..28d5783 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_create.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log('Running after_component_create hook.'); + // const componentPath = configObj.componentPath; + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_package.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_package.js new file mode 100644 index 0000000..fd4703e --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_package.js @@ -0,0 +1,13 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log('Running after_component_package hook.'); + // const componentName = configObj.component. + resolve(configObj); + }); + }; \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_typescript.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_typescript.js new file mode 100644 index 0000000..b0ad3ef --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_component_typescript.js @@ -0,0 +1,14 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log("Running after_component_typescript hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_serve.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_serve.js new file mode 100644 index 0000000..de8fffd --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_serve.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running after_serve hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_watch.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_watch.js new file mode 100644 index 0000000..920c2c4 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/after_watch.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running after_watch hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_app_typescript.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_app_typescript.js new file mode 100644 index 0000000..9ca119e --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_app_typescript.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log("Running before_app_typescript hook."); + //const { tsconfigJson } = configObj.typescript; + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_build.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_build.js new file mode 100644 index 0000000..fe9f818 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_build.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_build hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_optimize.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_optimize.js new file mode 100644 index 0000000..5564692 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_optimize.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_component_optimize hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_package.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_package.js new file mode 100644 index 0000000..c3d9858 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_package.js @@ -0,0 +1,13 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log('Running before_component_package hook.'); + // const componentName = configObj.component. + resolve(configObj); + }); + }; \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_typescript.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_typescript.js new file mode 100644 index 0000000..41f2935 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_component_typescript.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve) => { + console.log("Running before_component_typescript hook."); + //const { tsconfigJson } = configObj.typescript; + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_injection.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_injection.js new file mode 100644 index 0000000..8e48960 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_injection.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_injection hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_optimize.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_optimize.js new file mode 100644 index 0000000..257a847 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_optimize.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_optimize hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_release_build.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_release_build.js new file mode 100644 index 0000000..9f96528 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_release_build.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_release_build hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_serve.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_serve.js new file mode 100644 index 0000000..2f00deb --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_serve.js @@ -0,0 +1,37 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log('Running before_serve hook.'); + // ojet custom connect and serve options + // { connectOpts, serveOpts } = configObj; + // const express = require('express'); + // const http = require('http'); + // pass back custom http + // configObj['http'] = http; + // pass back custom express app + // configObj['express'] = express(); + // pass back custom options for http.createServer + // const serverOptions = {...}; + // configObj['serverOptions'] = serverOptions; + // pass back custom server + // configObj['server'] = http.createServer(serverOptions, express()); + // const tinylr = require('tiny-lr'); + // pass back custom live reload server + // configObj['liveReloadServer'] = tinylr({ port: PORT }); + // pass back a replacement set of middleware + // configObj['middleware'] = [...]; + // pass back a set of middleware that goes before the default middleware + // configObj['preMiddleware'] = [...]; + // pass back a set of middleware that goes after the default middleware + // configObj['postMiddleware'] = [...]; + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_watch.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_watch.js new file mode 100644 index 0000000..1215911 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_watch.js @@ -0,0 +1,15 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_watch hook."); + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_webpack.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_webpack.js new file mode 100644 index 0000000..1985f88 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/before_webpack.js @@ -0,0 +1,16 @@ +/** + Copyright (c) 2015, 2024, Oracle and/or its affiliates. + Licensed under The Universal Permissive License (UPL), Version 1.0 + as shown at https://oss.oracle.com/licenses/upl/ + +*/ + +'use strict'; + +module.exports = function (configObj) { + return new Promise((resolve, reject) => { + console.log("Running before_webpack hook."); + // const { config } = configObj.webpack; + resolve(configObj); + }); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/hooks.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/hooks.json new file mode 100644 index 0000000..3d06b2a --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/scripts/hooks/hooks.json @@ -0,0 +1,27 @@ +{ + "description": "OJET-CLI hooks configuration file", + "hooks": { + "after_app_create": "scripts/hooks/after_app_create.js", + "after_app_restore": "scripts/hooks/after_app_restore.js", + "after_component_create": "scripts/hooks/after_component_create.js", + "after_component_package": "scripts/hooks/after_component_package.js", + "before_build": "scripts/hooks/before_build.js", + "before_injection": "scripts/hooks/before_injection.js", + "before_optimize": "scripts/hooks/before_optimize.js", + "before_component_optimize": "scripts/hooks/before_component_optimize.js", + "before_component_package": "scripts/hooks/before_component_package.js", + "before_release": "scripts/hooks/before_release.js", + "before_watch": "scripts/hooks/before_watch.js", + "after_build": "scripts/hooks/after_build.js", + "after_component_build": "scripts/hooks/after_component_build.js", + "before_release_build": "scripts/hooks/before_release_build.js", + "before_serve": "scripts/hooks/before_serve.js", + "after_serve": "scripts/hooks/after_serve.js", + "after_watch": "scripts/hooks/after_watch.js", + "before_app_typescript": "scripts/hooks/before_app_typescript.js", + "before_component_typescript": "scripts/hooks/before_component_typescript.js", + "after_app_typescript": "scripts/hooks/after_app_typescript.js", + "after_component_typescript": "scripts/hooks/after_component_typescript.js", + "before_webpack": "scripts/hooks/before_webpack.js" + } +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/app.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/app.tsx new file mode 100644 index 0000000..fa07736 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/app.tsx @@ -0,0 +1,36 @@ +/** + * @license + * Copyright (c) 2014, 2023, Oracle and/or its affiliates. + * Licensed under The Universal Permissive License (UPL), Version 1.0 + * as shown at https://oss.oracle.com/licenses/upl/ + * @ignore + */ +import { registerCustomElement } from "ojs/ojvcomponent"; +import { h } from "preact"; +import { useEffect } from "preact/hooks"; +import Context = require("ojs/ojcontext"); +import { Footer } from "./footer"; +import { Header } from "./header"; +import {ParentContainer} from "./content/ParentContainer"; +type Props = Readonly<{ + appName?: string; +}>; + +export const App = registerCustomElement( + "app-root", + ({ appName = "Ojet VDOM + Vision AI" }: Props) => { + useEffect(() => { + Context.getPageContext().getBusyContext().applicationBootstrapComplete(); + }, []); + + return ( +
+
+ +
+
+ ); + } +); diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ObjectStorageForm.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ObjectStorageForm.tsx new file mode 100644 index 0000000..ff37aff --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ObjectStorageForm.tsx @@ -0,0 +1,194 @@ +import { h, ComponentProps } from "preact"; +import { useState, useRef} from "preact/hooks"; +import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); +import "ojs/ojbutton"; +import "ojs/ojcheckboxset"; +import "ojs/ojformlayout"; +import "ojs/ojinputtext"; +import "ojs/ojdatetimepicker"; +import "ojs/ojselectsingle"; +import "ojs/ojdialog"; +import "ojs/ojprogress-bar"; +import { ojButton } from "ojs/ojbutton"; +import { ojDialog } from "ojs/ojdialog"; +import { ojSelectSingle } from "ojs/ojselectsingle"; + + +type Props = { + onActivityChanged: (event: any) => void; +}; +const images: Array = []; + +type ImageObjectList = { + id: number; + value: string; + label: string; +}; + +type EnvirmentDetails = { + id: number; + name: string; + title: string; + imageUrl: string; +}; +let serviceUrl = + "http://localhost:8080/ai/vision/objectlist?" + +type InputTextProps = ComponentProps<"oj-input-text">; + +type FormLayoutProps = ComponentProps<"oj-form-layout">; + +const hintDefinition: InputTextProps["helpHints"] = { + definition: "Enter Bucket Name", +}; +const placeholder: InputTextProps["placeholder"] = "Enter Bucket Name"; +const lblHint: InputTextProps["labelHint"] = "Bucket Name"; + +let value: string = "Your Bucket Name"; +let name: string = "Your Region"; + +export function ObjectStorageForm(props: Props){ + const imageData = useRef( + new MutableArrayDataProvider([{ id: 1, value: "All", label: "All" }], { + keyAttributes: "value" , + }) + ); + const [formData, setFormData] = useState({ + regionName: name, + selectImage: "", + bucketName: value, + }); + + const [isDisabled, setIsDisabled] = useState(true); + const [isBucketNameDisabled, setIsBucketNameDisabled] = useState(true); + const [isSelectImageDisabled, setIsSelectImageDisabled] = useState(true); + const [density, setDensity] = + useState("efficient"); + const [imageUrl, setImageUrl] = useState(""); + const dialogRef = useRef(null); + const bucketNameValuechange = (event:any) =>{ + const newValue = event.detail.value; + if(newValue){ + setFormData(prevState => ({ + ...prevState, + bucketName: newValue + })); + + serviceUrl = serviceUrl+`bucket=${event.detail.value}®ion=${formData.regionName}`; + fetch(serviceUrl) + .then((response) => response.json()) + .then((result) => { + const lovData = result.map((item:EnvirmentDetails) => ({ + id: item.id, + value: item.imageUrl, + label: item.name, + })); + imageData.current.data = lovData; + setIsSelectImageDisabled(false); + }) + .catch((error) => { + event.preventDefault(); + dialogRef.current!.open(); + }); + } + } + const regionChange=(event:any)=>{ + if(event.detail.value){ + setIsBucketNameDisabled(false); + setFormData(prevState => ({ + ...prevState, + regionName: event.detail.value + })); +}else{ + setIsBucketNameDisabled(true); + setIsSelectImageDisabled(true); + setFormData(prevState => ({ + ...prevState, + bucketName: value, + selectImage:"" +})); +} + }; + + const onChange = (event: any) => { + const { id, value } = event.currentTarget; + if(id && value && id =="selectImage"){ + setImageUrl(value); + setIsDisabled(false); + }else{ + setIsDisabled(true); + } + setFormData({ + ...formData, + [event.currentTarget.id]: event.detail.value, + }); + + } + const onSubmit = async (event: ojButton.ojAction) => { + try { + await props.onActivityChanged(formData); + } catch (error) { + console.error("Error:", error); + dialogRef.current!.open(); + } + }; + + const close = () => { + dialogRef.current!.close(); + }; + + return ( +
+
Object Storage Details
+ + + + + + {!isDisabled && ( + placeholder + )} + + Submit + + + + +
+ + Please provide correct Bucket Name + +
+
+
+
+ + OK + +
+
+
+ ); +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ParentContainer.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ParentContainer.tsx new file mode 100644 index 0000000..291b74f --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/ParentContainer.tsx @@ -0,0 +1,28 @@ +import { h } from "preact"; +import { useState } from "preact/hooks"; +import { ResultsView } from "./VisionAIResultView"; +import { ObjectStorageForm } from "./ObjectStorageForm"; +type attr = { + bucketName?: string | undefined; + selectImage?: string| undefined; + regionName?: string| undefined; +}; +type Props = { + onActivityChanged: (event: any) => void; +}; + +export function ParentContainer(){ +const [formData, setFormData] = useState({ + }); + const activityChangedHandler = (data: any) => { + setFormData(data); + }; +return ( +
+
+ + {formData && } + +
+ ); +}; diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/VisionAIResultView.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/VisionAIResultView.tsx new file mode 100644 index 0000000..66e3e10 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/content/VisionAIResultView.tsx @@ -0,0 +1,143 @@ +import { h, ComponentProps } from "preact"; +import { useRef, useState, useEffect } from "preact/hooks"; +import "ojs/ojlistview"; +import "ojs/ojkeyset"; +import MutableArrayDataProvider = require("ojs/ojmutablearraydataprovider"); +import { ojListView } from "ojs/ojlistview"; +import "ojs/ojinputtext"; +import { ojInputText } from "ojs/ojinputtext"; +import { CTextAreaElement } from "oj-c/text-area" +import "oj-c/text-area"; +import { ojSelectSingle } from "ojs/ojselectsingle"; + +const initialState = { + objectNames: [], + words: [], + combinedText: '' +}; +type Props = { + activity: Item | null; +}; +type Item = { + bucketName?: string | undefined; + selectImage?: string; + regionName?: string; +}; +type ListViewProps = ComponentProps<"oj-list-view">; +const gridlinesItemVisible: ListViewProps["gridlines"] = { item: "visible" }; +const scrollPolicyOpts: ListViewProps["scrollPolicyOptions"] = { fetchSize: 10 }; +const listItemRenderer = (item: ojListView.ItemTemplateContext) => { + return (
+
+
+ {item.index + 1}. {item.data} +
+
+
+ ); +}; +export function ResultsView(props: Props) { + const [data, setData] = useState(initialState); + const [lovData, setLovData] = useState({ + selectedValue: "" + }); + const url = props.activity?.selectImage; + const regionName = props.activity?.regionName; + const bucketName = props.activity?.bucketName; + let imageName: string = ""; + if (url) { + let parts = url.split("/"); + imageName = parts.length > 0 ? parts[parts.length - 1] : "No image name found"; + } + if (imageName) { + const serviceUrl = `http://localhost:8080/ai/vision/image?object=${imageName}&bucket=${bucketName}®ion=${regionName}`; + useEffect(() => { + fetch(serviceUrl) + .then((response) => response.json()) + .then((result) => { + setData({ + objectNames: result.imageObjects ? result.imageObjects.map((obj: { name: any; }) => obj.name) : [], + words: result.imageText?.words || [], + combinedText: result.imageText?.words ? result.imageText.words.map((word: { text: any; }) => word.text).join(' ') : '' + }); + + }) + .catch((error) => { + console.error("Error fetching LOV data:", error); + }); + }, [imageName]); + } + const { objectNames, combinedText } = data; + const dataProvider = new MutableArrayDataProvider(objectNames, { + keyAttributes: "name", + }); + + const highlightNumbers = (text: string) => { + // Use regex to find all numbers in the text + const regex = /\b\d+\b/g; + // Replace each number with a span containing the number, styled to be yellow + return text.replace(regex, (match) => `${match}`); + }; + const [filteredText, setFilteredText] = useState(combinedText); + const filterText = (value: string) => { + if (value === "numbersOnly") { + // Filter only numbers from the combined text + const regex = /\b\d+\b/g; + const numbersOnly = combinedText.match(regex)?.join(" ") || ""; + setFilteredText(numbersOnly); + } else { + // Reset to the original combined text + setFilteredText(combinedText); + } + }; + const selectRef = useRef(null); + const onFilterChange = (event: any) => { + const value = event.detail.value; + setLovData(prevState => ({ + ...prevState, + selectedValue: value + })) + filterText(value); + }; + const optionsDataProvider = new MutableArrayDataProvider( + [{ value: "", label: "All" }, { value: "numbersOnly", label: "Numbers Only" }], + { keyAttributes: "value" } + ); + + return ( + <> +
+

Vision AI Result

+
+
Object detection({objectNames.length})
+
+ + + +
+
Text detection
+
+
+ + +
+
+
+
+
+
+
+ );} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/footer.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/footer.tsx new file mode 100644 index 0000000..9a6bb02 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/footer.tsx @@ -0,0 +1,67 @@ +/** + * @license + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. + * Licensed under The Universal Permissive License (UPL), Version 1.0 + * as shown at https://oss.oracle.com/licenses/upl/ + * @ignore + */ +import { h } from "preact"; + +type Props = { + links?: FooterLink[] +} + +type FooterLink = { + name: string; + linkId: string; + linkTarget: string; +} + +const _DEFAULT_LINKS: FooterLink[] = [ + { + name: "About Oracle", + linkId: "aboutOracle", + linkTarget: "http://www.oracle.com/us/corporate/index.html#menu-about" + }, + { + name: "Contact Us", + linkId: "contactUs", + linkTarget: "http://www.oracle.com/us/corporate/contact/index.html" + }, + { + name: "Legal Notices", + linkId: "legalNotices", + linkTarget: "http://www.oracle.com/us/legal/index.html" + }, + { + name: "Terms Of Use", + linkId: "termsOfUse", + linkTarget: "http://www.oracle.com/us/legal/terms/index.html" + }, + { + name: "Your Privacy Rights", + linkId: "yourPrivacyRights", + linkTarget: "http://www.oracle.com/us/legal/privacy/index.html" + } +] + +export function Footer({ links = _DEFAULT_LINKS } : Props ) { + return ( +
+ + +
+ ); +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/header.tsx b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/header.tsx new file mode 100644 index 0000000..af3f4a3 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/components/header.tsx @@ -0,0 +1,59 @@ +/** + * @license + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. + * Licensed under The Universal Permissive License (UPL), Version 1.0 + * as shown at https://oss.oracle.com/licenses/upl/ + * @ignore + */ +import { h } from "preact"; +import { useRef, useState, useEffect } from "preact/hooks"; +import * as ResponsiveUtils from "ojs/ojresponsiveutils"; +import "ojs/ojtoolbar"; +import "ojs/ojmenu"; +import "ojs/ojbutton"; + +type Props = Readonly<{ + appName: string +}>; + +export function Header({ appName }: Props) { + const mediaQueryRef = useRef(window.matchMedia(ResponsiveUtils.getFrameworkQuery("sm-only")!)); + + const [isSmallWidth, setIsSmallWidth] = useState(mediaQueryRef.current.matches); + + useEffect(() => { + mediaQueryRef.current.addEventListener("change", handleMediaQueryChange); + return (() => mediaQueryRef.current.removeEventListener("change", handleMediaQueryChange)); + }, [mediaQueryRef]); + + function handleMediaQueryChange(e: MediaQueryListEvent) { + setIsSmallWidth(e.matches); + } + + function getDisplayType() { + return (isSmallWidth ? "icons" : "all"); + }; + + function getEndIconClass() { + return (isSmallWidth ? "oj-icon demo-appheader-avatar" : "oj-component-icon oj-button-menu-dropdown-icon"); + } + + return ( + + ); +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.html b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.html new file mode 100644 index 0000000..f2830cd --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.html @@ -0,0 +1,48 @@ + + + + + + + Oracle JET VDOM Starter Template - Basic + + + + + + + + + + + + + + + + + + + diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.ts b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.ts new file mode 100644 index 0000000..5edc65f --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/index.ts @@ -0,0 +1,10 @@ +/** + * @license + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. + * Licensed under The Universal Permissive License (UPL), Version 1.0 + * as shown at https://oss.oracle.com/licenses/upl/ + * @ignore + */ +// injector:preactDebugImport +// endinjector +import './components/app'; \ No newline at end of file diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/main.js b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/main.js new file mode 100644 index 0000000..2da46da --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/main.js @@ -0,0 +1,59 @@ +/** + * @license + * Copyright (c) 2014, 2024, Oracle and/or its affiliates. + * Licensed under The Universal Permissive License (UPL), Version 1.0 + * as shown at https://oss.oracle.com/licenses/upl/ + * @ignore + */ +'use strict'; + +/** + * Example of Require.js boostrap javascript + */ + + +(function () { + requirejs.config( + { + // injector:baseUrl + baseUrl: '.', + // endinjector + paths: + /* DO NOT MODIFY + ** All paths are dynamicaly generated from the path_mappings.json file. + ** Add any new library dependencies in path_mappings json file + */ + // injector:mainReleasePaths + { + 'ojs': 'libs/oj/16.0.0/debug', + 'ojL10n': 'libs/oj/16.0.0/ojL10n', + 'ojtranslations': 'libs/oj/16.0.0/resources', + 'knockout': 'libs/knockout/knockout-3.5.1.debug', + 'jquery': 'libs/jquery/jquery-3.6.4', + 'jqueryui-amd': 'libs/jquery/jqueryui-amd-1.13.2', + 'text': 'libs/require/text', + 'hammerjs': 'libs/hammer/hammer-2.0.8', + 'signals': 'libs/js-signals/signals', + 'ojdnd': 'libs/dnd-polyfill/dnd-polyfill-1.0.2', + 'css': 'libs/require-css/css.min', + 'css-builder': 'libs/require-css/css-builder', + 'normalize': 'libs/require-css/normalize', + '@oracle/oraclejet-preact': 'libs/oraclejet-preact/amd', + 'preact': 'libs/preact/dist/preact.umd', + 'preact/hooks': 'libs/preact/hooks/dist/hooks.umd', + 'preact/compat': 'libs/preact/compat/dist/compat.umd', + 'preact/jsx-runtime': 'libs/preact/jsx-runtime/dist/jsxRuntime.umd', + 'proj4': 'libs/proj4js/dist/proj4-src', + 'touchr': 'libs/touchr/touchr' + , + 'chai': 'libs/chai/chai-4.3.10' + } + // endinjector + } + ); +}()); + +/** + * Load the application's entry point file + */ +require(['./index']); diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/app.css b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/app.css new file mode 100644 index 0000000..0929fe8 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/app.css @@ -0,0 +1,135 @@ +/* + Document : override + Created on : + Author : + Description: + This is where any of your application specific styles should be included +*/ +.demo-oracle-icon { + width:137px; + height:18px +} + +.demo-oracle-icon:before { + content:url("images/oracle_logo.svg") +} + +html:not([dir="rtl"]) .demo-oracle-icon { + padding-right:4px +} + +html[dir="rtl"] .demo-oracle-icon { + padding-left:4px +} + +.demo-oracle-icon:before { + display:inline +} + +.demo-appheader-avatar { + width:24px; + height:24px +} + +.demo-appheader-avatar:before { + content:url("images/avatar_24px.png") +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) { + .demo-appheader-avatar:before { + content:url("images/avatar_24px_2x.png"); + -webkit-transform:translate(-25%, -25%) scale(0.5); + transform:translate(-25%, -25%) scale(0.5) + } +} + + .no-wrap { + flex-wrap: nowrap; + } + + .parent-container { + position: relative; + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-left: 100px; + background-color: #f9f9f9; /* Light gray background */ + padding: 20px; /* Add some padding */ + font-family: Arial, sans-serif; /* Set a fallback font */ + color: #333; /* Dark text color */ +} +/* ListView Styles */ +.item-display { + border: 1px solid #ccc; + border-radius: 5px; + padding: 10px; + margin-bottom: 20px; +} + +.item-display .oj-listview-item { + padding: 10px; + margin-bottom: 5px; + background-color: #f9f9f9; + border-radius: 3px; +} + +/* Filter Select Styles */ +.oj-select-single { + max-width: 200px; + padding-left: 14px; +} + +.oj-select-single select { + width: 100%; + height: 30px; + border: 1px solid #ccc; + border-radius: 3px; + padding: 5px; + font-size: 14px; + background-color: #fff; + cursor: pointer; +} + +.oj-select-single select:focus { + outline: none; + border-color: #007bff; +} +.separator-line { + position: absolute; + top: 0; + bottom: 0; + left: calc(50% - 1px); /* Adjust position to center the line */ + width: 1px; /* Adjust thickness as needed */ + background-color: #ccc; /* Adjust color as needed */ + content: ""; +} +.list-view-container { + margin-left: 20px; /* Add space between the line and ListView */ +} +.bold-text { + font-weight: bold; +} + +.heading-small { + font-size: 1.1em; +} + +.margin-left-20 { + margin-left: 20px; +} + +.label { + font-size: 14px; + margin-bottom: 10px; +} +.select-single-style{ + padding-left: 14px; + max-width: 200px; +} + +.background-yellow{ + background-color: yellow; +} + +.parent-container-margin{ + margin-left: 100px; +} diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/fonts/App_iconfont.woff b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/fonts/App_iconfont.woff new file mode 100644 index 0000000..11e71bc Binary files /dev/null and b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/fonts/App_iconfont.woff differ diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/JET-Favicon-Red-32x32.png b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/JET-Favicon-Red-32x32.png new file mode 100644 index 0000000..841c7c1 Binary files /dev/null and b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/JET-Favicon-Red-32x32.png differ diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px.png b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px.png new file mode 100644 index 0000000..2838dc1 Binary files /dev/null and b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px.png differ diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px_2x.png b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px_2x.png new file mode 100644 index 0000000..d4dd789 Binary files /dev/null and b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/avatar_24px_2x.png differ diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/oracle_logo.svg b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/oracle_logo.svg new file mode 100644 index 0000000..b4a3b6a --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/src/styles/images/oracle_logo.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/tsconfig.json b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/tsconfig.json new file mode 100644 index 0000000..4ba2a08 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/jet_virtual_dom_app/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "baseUrl": ".", + "target": "es6", + "strict": true, + "module": "amd", + "moduleResolution": "node", + "jsx": "react-jsx", + "jsxImportSource": "preact", + "lib": [ + "es2021", + "dom", + "esnext.asynciterable" + ], + "typeRoots": [ + "./node_modules/@oracle/oraclejet/dist/types", + "./node_modules/@types" + ], + "paths": { + "ojs/*": [ + "./node_modules/@oracle/oraclejet/dist/types/*" + ], + "@oracle/oraclejet-preact/*": [ + "./node_modules/@oracle/oraclejet-preact/*" + ], + "oj-c/*": [ + "./node_modules/@oracle/oraclejet-core-pack/oj-c/types/*" + ], + "preact": [ + "./node_modules/preact" + ] + }, + "declaration": true, + "noEmitOnError": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "removeComments": true + }, + "include": [ + "./src/**/*" + ] +} diff --git a/OJET (VDOM) - OCI Vision/license_policy.yml b/OJET (VDOM) - OCI Vision/license_policy.yml new file mode 100644 index 0000000..3e7a1d3 --- /dev/null +++ b/OJET (VDOM) - OCI Vision/license_policy.yml @@ -0,0 +1,25 @@ +license_policies: +- license_key: upl-1.0 + label: Approved License + color_code: '#00800' + icon: icon-ok-circle +- license_key: bsd-simplified + label: Approved License + color_code: '#00800' + icon: icon-ok-circle +- license_key: bsd-new + label: Approved License + color_code: '#00800' + icon: icon-ok-circle +- license_key: mit + label: Approved License + color_code: '#00800' + icon: icon-ok-circle +- license_key: apache-1.1 + label: Approved License + color_code: '#00800' + icon: icon-ok-circle +- license_key: apache-2.0 + label: Approved License + color_code: '#00800' + icon: icon-ok-circle diff --git a/ai-meetings/AImeetings-md/ak1.png b/ai-meetings/AImeetings-md/ak1.png new file mode 100644 index 0000000..4abc5db Binary files /dev/null and b/ai-meetings/AImeetings-md/ak1.png differ diff --git a/ai-meetings/AImeetings-md/ak2.png b/ai-meetings/AImeetings-md/ak2.png new file mode 100644 index 0000000..3fb3131 Binary files /dev/null and b/ai-meetings/AImeetings-md/ak2.png differ diff --git a/ai-meetings/AImeetings-md/ak3.png b/ai-meetings/AImeetings-md/ak3.png new file mode 100644 index 0000000..40f3ce0 Binary files /dev/null and b/ai-meetings/AImeetings-md/ak3.png differ diff --git a/ai-meetings/AImeetings-md/ak4.png b/ai-meetings/AImeetings-md/ak4.png new file mode 100644 index 0000000..576edb2 Binary files /dev/null and b/ai-meetings/AImeetings-md/ak4.png differ diff --git a/ai-meetings/AImeetings-md/ak5.png b/ai-meetings/AImeetings-md/ak5.png new file mode 100644 index 0000000..3c8b579 Binary files /dev/null and b/ai-meetings/AImeetings-md/ak5.png differ diff --git a/ai-meetings/AImeetings-md/ak6.jpg b/ai-meetings/AImeetings-md/ak6.jpg new file mode 100644 index 0000000..627d0c4 Binary files /dev/null and b/ai-meetings/AImeetings-md/ak6.jpg differ diff --git a/ai-meetings/AImeetings-md/drop.jpg b/ai-meetings/AImeetings-md/drop.jpg new file mode 100644 index 0000000..d85c4c8 Binary files /dev/null and b/ai-meetings/AImeetings-md/drop.jpg differ diff --git a/ai-meetings/AImeetings-md/meetingAI.html b/ai-meetings/AImeetings-md/meetingAI.html new file mode 100644 index 0000000..3594f23 --- /dev/null +++ b/ai-meetings/AImeetings-md/meetingAI.html @@ -0,0 +1,1853 @@ + + + +meetingAI.md + + + + + + + + + + + + +

AI Meetings

+

Welcome to this tutorial on building a web application using Visual Builder Cloud Service! In this tutorial, we'll embark on an exciting journey of leveraging cutting-edge technologies to enhances team meetings by using Oracle 23AI and OCI AI Services for seamless real-time audio transcription, efficient summarization, and easy interrogation of transcriptions. It extracts sentiment, reduces administrative tasks, and provides data-driven insights. This solution, turns meeting data into actionable intelligence and boosts overall productivity.

+

1. Prepare your user

+

In Oracle Cloud Infrastructure (OCI), API keys are used for secure authentication when accessing OCI resources through REST APIs. OCI API keys consist of two parts: a Public key and a Private key. You use the OCI console to generate the Private/Public key pair. +Generate API Keys using OCI Console +To Generate the API Keys using OCI Console:

+
    +
  • Login into your OCI Account. +alt text
  • +
  • Click on the Profile icon at the top-right corner and select your Profile hyperlink. +alt text
  • +
  • Under Resources section at the bottom-left, select API Keys and then click Add API Key. +alt text
  • +
  • The Add API Key dialog is displayed. Select Generate API Key Pair to create a new key pair. +alt text
  • +
  • Click Download Private Key. A .pem file is saved to your local device. You do not need to download the public key and click Add button. +alt text
  • +
+

2.Pick you compartment

+

Identify the compartment you're currently working within. Navigate to 'Identity' -> 'Compartments'. Locate your compartment and make a note of its OCID (Oracle Cloud Identifier)

+

3.Create a bucket to store your meetings

+

Create a bucket in your compartment. Navigate to 'Storage' -> 'Object Storage & Archive Storage' -> 'Buckets, Click on "Create bucket" button, provide for instance AI_Meetings and click on "Create". +alt text

+

4.Open Visual Builder

+

Configure access to REST APIs

+
    +
  • +

    Open Visual Builder and click on the "New" button. Provide a name and an ID, for example "AI_Meetings". Click on finish. +alt text

    +
  • +
  • +

    Now we are going to create a web application. Click on the first icon (web applications) +alt text

    +
  • +
  • +

    Now, click on the "+ Web Application" button
    +alt text

    +
  • +
  • +

    Provide an Application name, for example "AI_Meetings"
    +alt text

    +
  • +
  • +

    Let's do the REST Service definition. Click on "+ Service Connection" button

    +
  • +
  • +

    alt text

    +
  • +
  • +

    Choose source "Define by Endpoint"
    +alt text

    +
  • +
  • +

    Provide the OCI Object Storage API Endpoint, being xx-xxxxxx-x your region (example: eu-frankfurt-1). For instance https://objectstorage.xx-xxxxxx-x.oraclecloud.com/n/{namespace}/b/AI_Meetings/o/{objectName} +Enter the Backend Name and select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu. Then, click on the pencil icon to proceed +alt text

    +
  • +
  • +

    Enter the data obtained in step 1 in the format ocid.tenancy/ocid.user/key_fingerprint. Paste the content of the Private key file that you downloaded in the first step, then click the 'Save' button. Afterward, proceed by clicking on the 'Next' button +alt text

    +
  • +
  • +

    Include a "service name" and choose "Method" GET and set "Action Hint" to "Get one"
    +alt text

    +
  • +
  • +

    Click on create to finish the wizard. Now, you have an Object Storage backend.

    +
  • +
+

Let's go to add a new service to the recently created backend OCI Storage API to upload objects and create Preauthenticated requests.

+

So, add a new service to the storage backend +[URL]: vb-catalog://backends/objectStorage +/n/{object_storage_namespace}/b/{bucket}/o/{object_name}

+
    +
  • "Method": PUT
  • +
  • "Action hint": CREATE
  • +
  • Dynamic Headers: +
      +
    • Content-Type required, type String
    • +
    • Contetn-Disposition required as String
    • +
    +
  • +
  • Request body media type: application/octect-stream
  • +
+

Again, add a new service to the storage backend +vb-catalog://backends/objectStorage +/n/{object_storage_namespace}/b/{bucket}/p/

+
    +
  • +

    "Method": POST

    +
  • +
  • +

    "Action hint": CREATE

    +
  • +
  • +

    Dynamic Headers:

    +
      +
    • Content-Type required, type String
    • +
    • Content-Disposition required as String
    • +
    +
  • +
  • +

    Request body media type: application/octect-stream

    +

    Repeat the same operation to provide access to the OCI GenAI API to do summarization (select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends) +So, add a new backend and set the URL

    +

    https://inference.generativeai.xx-xxxxxx-x.oci.oraclecloud.com/20231130/actions/generateText

    +
  • +
  • +

    "Method": POST

    +
  • +
  • +

    "Action hint": CREATE

    +
  • +
  • +

    Request body:

    +
  • +
+
{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaxxxxxnauu3aajpx6pfgtwrxq", +"extractiveness": "AUTO", +"format": "AUTO", +"input": "From the deluge on that election Sunday of 28 March, just one year ago today, to the sweltering epilogue of this scorching May, with the European elections on the horizon.........", +"length": "AUTO", + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, +"temperature": 0.1 +} +
+
    +
  • Response body:
  • +
+
{ + "id": "0fa30f70-xxxx-xxxx-xxxx-a1697b0d4d68", + "summary": "A year on from the 28th February coup attempt in Spain, the country is gearing up for European elections while the government continues to push through controversial legislation, such as the Amnesty Law, despite widespread opposition and protests. .........", + "modelId": "cohere.command", + "modelVersion": "15.6" +} +
+
    +
  • Repeat the same operation to provide access to the OCI Speech API to carry out the transcription. On this case we will be able to get transcription status (select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends) +So, add a new backend and set the URL +(https://speech.aiservice.xx-xxxxxxxxx-x.oci.oraclecloud.com/20220101/transcriptionJobs/{transcriptionJobId})
  • +
+
    +
  • "Method": GET
  • +
  • "Action hint": Get Many
  • +
  • Request body:
  • +
+
{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaxxxxxnauu3aajpx6pfgtwrxq", +"extractiveness": "AUTO", +"format": "AUTO", +"input": "From the deluge on that election Sunday of 28 March, just one year ago today, to the sweltering epilogue of this scorching May, with the European elections on the horizon.........", +"length": "AUTO", + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, +"temperature": 0.1 +} +
+
    +
  • Response body:
  • +
+
{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaxxxxxxxxxthlmzclnsoq", + "displayName": "job-3b63a754-xxxx-xxxx-839e-d9c3cec24eac.mp3", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p3xxxxxxxlnauu3aajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-05-23T10:35:27.390Z", + "timeStarted": "2024-05-23T10:35:27.656Z", + "timeFinished": "2024-05-23T10:37:55.651Z", + "totalTasks": 1, + "outstandingTasks": 0, + "successfulTasks": 1, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "3b63a754-xxxx-xxxx-xxxx-d9c3cec24eac.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "xxxxxxxx", + "bucketName": "AI_Meetings", + "prefix": "id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqxxxxxxxxxxxxjqh2x3fthlmzclnsoq/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwxxxxxqf5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "SUCCEEDED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Audit": { + "creator": "oracleidentitycloudservice/xxxxxxxx@oracle.com at 2024-05-23T10:35:27.251Z" + } + }, + "systemTags": {} +} +
+

Now let's goign to add a new service to the recently created backend OCI Speech API to request the transcription status.

+
    +
  • Now, add a new service connection using (vb-catalog://backends/speech/transcriptionJobs)
  • +
+
    +
  • "Method": POST
  • +
  • "Action hint": Create
  • +
  • Request body:
  • +
+
{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxxxxxxnauu3aajpx6pfgtwrxq", +"displayName":"name", +"inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":"AI_Meetings", "namespaceName":"xxxxx", "objectNames": ["f93d5e52-xxxx-xxxx-xxxxx-907dd0e2cacc.mp3"] + }] + + }, +"modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": {"isDiarizationEnabled": true, "numberOfSpeakers":2} + } + }, +"outputLocation": { + "bucketName":"AI_Meetings", "namespaceName":"xxxxxxx", "prefix": "idxxx" + } +} +
+
    +
  • Response body:
  • +
+
{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaaaavfig65yack6kixxxxxxxxxqe3v6wedleiawpbufaa", + "displayName": "name", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaaxxxxxwxxxxxxxxxxajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-03-18T18:36:29.364Z", + "timeStarted": null, + "timeFinished": null, + "totalTasks": 1, + "outstandingTasks": 1, + "successfulTasks": 0, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "idxxx/f93d5e52-b1fb-xxxx-xxxxx-907dd0e2cacc.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "prefix": "idxxx/job-amaaaaaavfig65yaxxxxxx5zohqe3v6wedleiawpbufaa/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwuvo3enpxxxxxxx5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "ACCEPTED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Oracle-Tags": { + "CreatedBy": "default/xxxxxxx@oracle.com", + "CreatedOn": "2024-03-18T18:36:29.266Z" + } + }, + "systemTags": {} +} +
+
    +
  • Repeat the same operation to provide access to the OCI Language API to analyze the transcription.Select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends. +So, add a new backend and set the URL +(https://language.aiservice.xx-xxxxxx-x.oci.oraclecloud.com/20221001/actions/batchDetectLanguageSentiments)
  • +
+
    +
  • "Method": POST
  • +
  • "Action hint": Create
  • +
  • Request body:
  • +
+
{ +"documents": [ + { + "key" : "doc1", + "text" : "OCI recently added new services to existing compliance program including SOC, HIPAA, and ISO to enable our customers to solve their use cases. We also released new white papers and guidance documents related to Object Storage, the Australian Prudential Regulation Authority (APRA), and the Central Bank of Brazil. These resources help regulated customers better understand how OCI supports their regional and industry-specific compliance requirements. Not only are we expanding our number of compliance offerings and regulatory alignments, we continue to add regions and services at a faster clip." + } +] +} +
+
    +
  • Response body:
  • +
+
{ + "documents": [ + { + "key": "doc1", + "documentSentiment": "", + "documentScores": {}, + "sentences": [], + "aspects": [ + { + "offset": 322, + "length": 9, + "text": "resources", + "sentiment": "Positive", + "scores": { + "Positive": 0.9814186299929331, + "Negative": 0.016609141881639276, + "Neutral": 0, + "Mixed": 0.001972228125427651 + } + } + ], + "languageCode": "en" + } + ], + "errors": [] +} +
+
    +
  • Finally let's go to add a new service to the recently created backend OCI Language API to detect pre-trained entities: (vb-catalog://backends/Language/batchDetectLanguageEntities)
  • +
+
    +
  • "Method": POST
  • +
  • "Action hint": Get Many
  • +
  • Request body:
  • +
+
{ + "documents": [ + { + "key": "doc1", + "text": " The video demonstrates the capabilities of the Oracle Cloud Language Service. Language detection and text classification capabilities are shown using pre-trained models. The named entity recognition capability can extract entities like .........." + } + ] +} +
+
    +
  • Response body example:
  • +
+
{ + "documents": [ + { + "key": "doc1", + "entities": [ + { + "offset": 1, + "length": 15, + "text": "Red Bull Racing", + "type": "ORGANIZATION", + "subType": null, + "score": 0.9914557536443075, + "metaInfo": null + }, + { + "offset": 17, + "length": 5, + "text": "Honda", + "type": "ORGANIZATION", + "subType": null, + "score": 0.6515498757362366, + "metaInfo": null + }, + { + "offset": 28, + "length": 9, + "text": "four-time", + "type": "QUANTITY", + "subType": null, + "score": 0.9998091459274292, + "metaInfo": [ + { + "offset": 28, + "length": 9, + "text": "four-time", + "subType": "UNIT", + "score": 0.9998091459274292 + } + ] + }, + { + "offset": 48, + "length": 5, + "text": "World", + "type": "LOCATION", + "subType": "NON_GPE", + "score": 0.582543671131134, + "metaInfo": null + }, + ... + ] + +
+
    +
  • +

    Lastly add a custom endpoint to provide RAG capabilities around the transcription.

    +
      +
    • Add the endpoint http://xxx.xx.xxx.xxx:8888/v2/answer/?conv_id={id}
    • +
    • We will cover in another session how to create a RAG solution.
    • +
    +
  • +
  • +

    So, finally your service connections will be something similar to this image:

    +

    alt text

    +
  • +
+

Create business objects

+
    +
  • Choose business objects panel and add two tables: +
      +
    • Meetings: add a string field like meetingName
    • +
    • Transcriptions: add some string fields: jobID, jobName and status
    • +
    +
  • +
+

alt text

+

Build the Web App

+
    +
  • +

    First of all you must create some types & variables:

    +
      +
    • Type tokenType is a object of spearkerIndex (number) and token (string)
    • +
    • Define also following variables: +
        +
      • String type: filename, meetingName, jobIdName, jobStatus, parURL, outputlocation, transcriptionText, summaryText, mention, ...
      • +
      • Boolean type: loading, uploadSuccess, meetingCreated, transcriptionTask, summaryStatus, summary, spareTime, ragResponse, query,...
      • +
      • Number: fileSize, nParticipants,meetingID, transcriptionID, jobId, positive, negative, mixed, neutral, ...
      • +
      • String array: requirements, ...
      • +
      • tokenType array: tokenArray, ...
      • +
      +
    • +
    +
  • +
  • +

    In the components panel, search for "file picker" and drag it onto your canvas. To enhance its appearance, click on the grid layout and switch it to "Flex" mode (found in the properties panel). Set the "Direction" to "vertical" and justify it both "center" and "middle". Next, navigate to the "All" tab, type "style" into the search bar, and provide some CSS styling such as "margin-top:30px;" to achieve the desired spacing. Drop a few components like images and texts. +alt text

    +
  • +
  • +

    In the File Picker properties panel provided the supported files that your application will support.
    +alt text

    +
  • +
  • +

    In the file picker create an event. On this event, you will manage the file upload to the object storage.

    +
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class FilePickerSelectChain extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {object[]} params.files + */ + async run(context, { files }) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + let size=""; + if(files[0].size === 0) size= '0 Bytes'; + var k = 1000, + dm = 2, + sizes = ['Bytes', 'KB', 'MB', 'GB','TB', 'PB', 'EB', 'ZB', 'YB'], + i = Math.floor(Math.log(files[0].size) / Math.log(k)); + size= parseFloat((files[0].size / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; + $page.variables.fileSize = size; + + + function getExtension(fileName) { + if (typeof fileName !== 'string' || !fileName) { + return ''; // Returns an empty string if the input is invalid + } + const ultimoPunto = fileName.lastIndexOf("."); + if (ultimoPunto === -1) return ''; // Returns an empty string if there is no dot in the filename + return fileName.slice(ultimoPunto + 1); + } + + function generateUUID() { + let dt = new Date().getTime(); + const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = (dt + Math.random()*16)%16 | 0; + dt = Math.floor(dt/16); + return (c == 'x' ? r : (r&0x3|0x8)).toString(16); + }); + return uuid; + } + + let uuid = generateUUID(); + + let ext = getExtension(files[0].name); + + $page.variables.filename = uuid+"."+ext; + + + const callRestStoragePutObjectResult = await Actions.callRest(context, { + endpoint: 'Storage/putObject', + uriParams: { + bucket: 'AI_Meetings', + 'object_storage_namespace': '{your_namespace}', + 'object_name': $page.variables.filename, + }, + body: files[0], + }); + + if (callRestStoragePutObjectResult.status===200) { + + $page.variables.uploadSuccess = true; + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was an error uploading the file', + displayMode: 'transient', + type: 'error', + }); + } + $page.variables.loading = false; + return; + } + } + + return FilePickerSelectChain; +}); +
+
    +
  • Drop a inpunt text to capture the meeting name and a button to create the meeting. So, you can associate a string variable to the input text (example meetingName). We will create the meeting metadata on the business object
  • +
  • Associate an ojAction event to the button (it's the action chain):
  • +
+
+define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createMeeting extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($application.functions.isFormValid('oj-validation-group-upload')) { + $page.variables.loading = true; + let transcription = true; + let summarization = true; + let sentiment = true; + let temp = ""; + let internalM = true; + let meetingDesc =""; + $page.variables.requirements.push("transcription","summarization","sentiment_analysis"); + + + + const callRestBusinessObjectsCreateMeetingResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Meetings', + body: { + "internalMeeting": internalM , + "meetingName": $page.variables.meetingName , + "meetingDesc": meetingDesc , + "speakersN": $page.variables.nParticipants , + "speakersInvolved": temp , + "transcription": transcription , + "summarization": summarization, + "sentiment": sentiment , + "fname" : $page.variables.filename, + }, + }); + + if (callRestBusinessObjectsCreateMeetingResult.status===201) { + + $page.variables.currentRequest = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingID = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingCreated = true; + + $page.variables.transcriptionID = $page.variables.meetingID; + await Actions.callChain(context, { + chain: 'createTranscriptionJob', + }); + + await Actions.fireNotificationEvent(context, { + summary: 'Your meeting has been created successfully', + displayMode: 'transient', + type: 'confirmation', + }); + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was a problem creating your meeting', + type: 'warning', + displayMode: 'transient', + }); + } + } else { + await Actions.fireNotificationEvent(context, { + summary: 'The Meeting name is mandatory', + displayMode: 'transient', + type: 'warning', + }); + } + + $page.variables.loading = false; + + return; + } + } + + return createMeeting; +}); + +
+
    +
  • Now we will create another Action chain to create the transcription job using the Speech service. +We will provide information as the compartment, bucket, object and we will update the Transcription table with the relevant information.
  • +
+
+define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createTranscriptionJob extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callRestCreateJobPostTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/postTranscriptionJobs', + body: { + "compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bxxxxxxauu3aajpx6pfgtwrxq", + "displayName":"job-"+$page.variables.filename, + "inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":"AI_Meetings", "namespaceName":"<<your_namespace>>", "objectNames": [$page.variables.filename] + }] + + }, + "modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true + } + } + }, + "outputLocation": { + "bucketName":"AI_Meetings", "namespaceName":"<your_namespace>", "prefix": "id"+$application.user.userId + } + }, + }); + + if (callRestCreateJobPostTranscriptionJobsResult.status===200 || callRestCreateJobPostTranscriptionJobsResult.status===201) { + $page.variables.jobIdName = callRestCreateJobPostTranscriptionJobsResult.body.displayName; + $page.variables.jobStatus = callRestCreateJobPostTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobId = callRestCreateJobPostTranscriptionJobsResult.body.id; + + const callRestBusinessObjectsCreateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Transcriptions', + body: { + "jobID": $page.variables.jobId, + "jobNAME": $page.variables.jobIdName, + "status": $page.variables.jobStatus + }, + }); + + const callRestBusinessObjectsUpdateMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.currentRequest, + }, + body: { + "transcriptionId": callRestBusinessObjectsCreateTranscriptionsResult.body.id + }, + }); + + await Actions.fireNotificationEvent(context, { + summary: 'We are processing your request. It will take a while...', + type: 'info', + displayMode: 'transient', + }); + + return; + } else { + return; + } + } + } + + return createTranscriptionJob; +}); + +
+
    +
  • Due to it's a sync request, we are going to create a refresh button to check the current transcription status. +alt text +Crate an ojAction event asociated to the button to refresh the page
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionRefresh extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + window.location.href = window.location.href; + } + } + + return ButtonActionRefresh; +}); +
+
    +
  • It's time to create an event listener to get the status also when your open the page. So create a vbEnter event with an Action Chain named loadData. +alt text
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class loadData extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($page.variables.meetingID >0 || $page.variables.parURL) { + + + $page.variables.loading = true; + $page.variables.uploadSuccess = true; + $page.variables.meetingCreated = true; + + await Actions.callChain(context, { + chain: 'loadMeeting', + }); + + if (!($page.variables.transcriptionID >0)) { + await Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'You are trying to access a meeting that doesn\'t exist.', + displayMode: 'transient', + type: 'error', + }); + + const navigateToPageMainBrowseResult = await Actions.navigateToPage(context, { + page: 'main-browse', + }); + } + + const callRestBusinessObjectsGetTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/get_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + }); + + $page.variables.jobId = callRestBusinessObjectsGetTranscriptionsResult.body.jobID; + + const callRestCreateJobGetTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/getTranscriptionJobs', + uriParams: { + transcriptionJobId: $page.variables.jobId, + }, + }); + + $page.variables.jobStatus = callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobCompletion = callRestCreateJobGetTranscriptionJobsResult.body.percentComplete; + $page.variables.outputlocation = callRestCreateJobGetTranscriptionJobsResult.body.outputLocation.prefix; + + + if (callRestBusinessObjectsGetTranscriptionsResult.body.status!==callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState) { + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + body: { + "status": $page.variables.jobStatus, + }, + }); + } + + if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='SUCCEEDED') { + + const currentDate = new Date(); + // Add 3 hours to the current time + currentDate.setHours(currentDate.getHours() + 3); + // Convert the date to RFC 3339 format + const rfc3339Date = currentDate.toISOString(); + // Remove the milliseconds and 'Z' at the end, then append the timezone offset + const expirationTime = rfc3339Date.split('.')[0] + currentDate.toISOString().slice(19); + + let urlTemp = $page.variables.outputlocation +'<namespace>_AI_Meetings_'+ callRestCreateJobGetTranscriptionJobsResult.body.inputLocation.objectLocations[0].objectNames[0]+'.json'; + const callRestStorageCreatePARResult = await Actions.callRest(context, { + endpoint: 'Storage/createPAR', + uriParams: { + bucketName: 'AI_Meetings', + namespaceName: '<namespace>', + }, + body: { + "accessType": "ObjectRead", + "name": "PARTest", + "objectName": urlTemp, + "timeExpires": expirationTime + }, + }); + + $page.variables.spareTime = false; + + $page.variables.parURL = callRestStorageCreatePARResult.body.fullPath; + let tokens=[]; + + + async function procesarTranscripciones() { + try { + // Get the JSON from the URL + const respuesta = await fetch($page.variables.parURL); + const datos = await respuesta.json(); + // Check if the JSON is in the expected format + if (!datos.transcriptions || !Array.isArray(datos.transcriptions)) { + console.error('The JSON is not in the expected format.'); + return; + } + const conversation = datos.transcriptions[0].transcription; + $page.variables.transcriptionText = conversation; + + + + + const speakers = datos.transcriptions[0].speakerCount; + $page.variables.nParticipants = speakers; + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.meetingID, + }, + body: { + "speakersN": Number(speakers), + }, + }); + + // Initialise an object to separate tokens by speaker + const tokensBySpeaker = {}; + for (let i = 0; i < speakers; i++) { + tokensBySpeaker[`Speaker${i}`] = []; + } + + + tokens = datos.transcriptions[0].tokens; + + if (!tokens) { + console.error('No tokens were found in the transcription'); + return; + } + + // Iterate through tokens and sort them out + for (const token of tokens) { + if (tokensBySpeaker.hasOwnProperty(`Speaker${token.speakerIndex}`)) { + tokensBySpeaker[`Speaker${token.speakerIndex}`].push(token.token); + } + } + + + // Print the results + for (let i = 0; i < speakers; i++) { + console.log(`Tokens Speaker ${i}:`, tokensBySpeaker[`Speaker${i}`].join(' ')); + } + + return; + + } catch (error) { + // Error handling (e.g. network or parse problem) + console.error('Error getting or processing JSON:', error); + return false; + } + } + + let result = await procesarTranscripciones(); + let groupWords = await agruparPorSpeaker(tokens); + $page.variables.tokenArray=groupWords; + $page.variables.transcriptionTask = true; + + function agruparPorSpeaker(tokens) { + const agrupados = []; + let currentSpeaker = null; + let currentText = ""; + + tokens.forEach(token => { + if (token.speakerIndex !== currentSpeaker) { + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + currentSpeaker = token.speakerIndex; + currentText = token.token; + } else { + currentText += " " + token.token; + } + }); + + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + + return agrupados; + } + + await Actions.callChain(context, { + chain: 'sentimentDetection', + }); + + await Actions.callChain(context, { + chain: 'summarization', + }); + + await Actions.callChain(context, { + chain: 'ActionPeopleMentions', + }); + + $page.variables.loading=false; + + } else if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='IN_PROGRESS') { + $page.variables.loading = true; + $page.variables.spareTime = true; + + } + + + + } + } + } + + return loadData; +}); + +
+
    +
  • +

    We need to create a few more action chains to request sentiment analysis, summarization and mentions. +Please note that there are limitations on the size of the text to be summarised or analysed. So we will do chunking when necessary.

    +
  • +
  • +

    Action chain for sentiment detection

    +
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class sentimentDetection extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + await processSentimentAnalysis(); + $page.variables.loading = false; + + + async function processSentimentAnalysis() { + const text = $page.variables.transcriptionText; + const chunkSize = 4999; // Adjust based on API limits + const chunks = splitText(text, chunkSize); + + const sentimentResults = await Promise.all(chunks.map(async (chunk, index) => { + return callSentimentAnalysisAPI(chunk, index); + })); + + compileSentimentResults(sentimentResults); + } + + function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function callSentimentAnalysisAPI(text, index) { + return Actions.callRest(context, { + endpoint: 'SentimentAnalysis/postBatchDetectLanguageSentiments', + body: { + documents: [ + { + key: `doc${index}`, + text: text, + }, + ], + }, + uriParams: { + level: 'SENTENCE', + }, + }); + } + + +function compileSentimentResults(results) { + let allSentiments = []; + let totalPositive = 0; + let totalNegative = 0; + let totalNeutral = 0; + let totalMixed = 0; + let count = 0; + + results.forEach(result => { + if (result.status === 200) { + try { + const documentSentiment = result.body.documents[0].documentSentiment; + const scores = result.body.documents[0].documentScores; + + totalPositive += scores.Positive; + totalNegative += scores.Negative; + totalNeutral += scores.Neutral; + totalMixed += scores.Mixed; + count++; + + const data = result.body.documents[0].sentences; + const processedData = data.map(item => { + const scores = item.scores; + const highestScore = Object.keys(scores).reduce((a, b) => scores[a] > scores[b] ? a : b); + return { + sentence: item.text, + sentiment: item.sentiment, + value: (scores[highestScore] * 100).toFixed(2) // Convert to percentage and round to two decimals + }; + }); + allSentiments = allSentiments.concat(processedData); + } catch (error) { + Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'There was an error processing the sentiment data', + displayMode: 'transient', + type: 'warning', + }); + } + } + }); + + // Calculate averages + if (count > 0) { + $page.variables.positive = (totalPositive / count).toFixed(2); + $page.variables.negative = (totalNegative / count).toFixed(2); + $page.variables.neutral = (totalNeutral / count).toFixed(2); + $page.variables.mixed = (totalMixed / count).toFixed(2); + + $page.variables.chartDataArray[0].value = $page.variables.positive ; + $page.variables.chartDataArray[1].value = $page.variables.negative ; + $page.variables.chartDataArray[2].value = $page.variables.neutral ; + $page.variables.chartDataArray[3].value = $page.variables.mixed ; + + } + + $page.variables.tableArray = allSentiments; +} + + } + } + return sentimentDetection; +}); + +
+
    +
  • Action chain for summarization. We will do chunking too.
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class SummarizationChunks extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function summarizeText(text) { + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const summaries = await Promise.all(chunks.map(async chunk => { + return await summarizeChunk(chunk); + })); + + const combinedSummary = summaries.join(' '); + return combinedSummary; + } + + async function summarizeChunk(text) { + const callRestSummarizationPostSummarizeTextResult = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxxx5jmm5gtlnauu3aajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": text, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + return callRestSummarizationPostSummarizeTextResult.body.summary; + } + + async function startSummarization() { + const text = $page.variables.transcriptionText; + let result = await summarizeText(text); + console.log("Result: " + result); + $page.variables.summaryText=result; + } + + + + const size = $page.variables.transcriptionText.length; + if (size < 250) { + $page.variables.minimumSize = true; + $page.variables.summaryStatus = true; + return; + } + + + if (size < 3500) { + $page.variables.loading = true; + const callRestSummarizationPostSummarizeTextResult3 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xcxxxxxxajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.transcriptionText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult3.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + }else{ + $page.variables.loading = true; + await startSummarization(context); + const callRestSummarizationPostSummarizeTextResult2 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxx5gtlnauu3aajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.summaryText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult2.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + } + } + } + return SummarizationChunks; + +}); + +
+
    +
  • Action chain for mentions using AI Language
  • +
+
define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ActionPeopleMentions extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function startMentioning() { + const text = $page.variables.transcriptionText; // Ensure this is properly initialized and accessible + let result = await analyzeText(text); + + console.log("Result: " + result); + } + await startMentioning(); + $page.variables.languageProcessingFinish=true; + $page.variables.loading =false; + + async function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + + async function analyzeText(text) { + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const analysis = await Promise.all(chunks.map(async chunk => { + return mentionAnalysis(chunk); + })); + return; + } + + + function processEntities(data) { + try{ + data.documents[0].entities.forEach(entity => { + if ((entity.type === "PERSON") && (entity.score>0.7)) { + $page.variables.arrayMention.push(entity.text); + } else if ((entity.type === "ORGANIZATION") && (entity.score>0.8)) { + $page.variables.arrayOrg.push(entity.text); + } else if ((entity.type === "PRODUCT") && (entity.score>0.8)) { + $page.variables.arrayProduct.push(entity.text); + } else if ((entity.type === "DATETIME") && (entity.score>0.8)) { + $page.variables.arrayDatetime.push(entity.text); + }else if ((entity.type === "LOCATION") && (entity.score>0.8)) { + $page.variables.arrayLocation.push(entity.text); + } + }) + } catch (error) { + console.error(error); + } + + $page.variables.arrayMention = [...new Set($page.variables.arrayMention)]; + $page.variables.arrayOrg = [...new Set($page.variables.arrayOrg)]; + $page.variables.arrayProduct = [...new Set($page.variables.arrayProduct)]; + $page.variables.arrayLocation = [...new Set($page.variables.arrayLocation)]; + $page.variables.arrayDatetime = [...new Set($page.variables.arrayDatetime)]; + + let json = {"personEntities": $page.variables.arrayMention, "orgEntities": $page.variables.arrayOrg}; + return json; +} + + async function mentionAnalysis(text) { + const callRestSentimentAnalysisDetectLanguageEntitiesResult = await Actions.callRest(context, { + endpoint: 'SentimentAnalysis/DetectLanguageEntities', + body: { + "documents": [ + { "key": "doc1", "text": text + } + ] + }, + }); + const callFunctionResult = processEntities(callRestSentimentAnalysisDetectLanguageEntitiesResult.body); + return true; + + } + + return; + } + } + + return ActionPeopleMentions; +}); + +
+
    +
  • +

    Now, let's drop and configure some components to show the information. +alt text

    +
  • +
  • +

    Sample use case: +alt text

    +
  • +
  • +

    If you want to import my project and start to use it, please first of all you must do some configurations.

    +
      +
    • Edit server configurations to add your credentials (user ocid, user fingerprint, tenant ocid and your private certificate)
    • +
    • Provide values to application variables: namespace, bucket & your ocid compartmment.
    • +
    +
  • +
+

I hope you liked it. From today you can make your meetings smarter!

+

Author: Jesús Brasero

+ + + diff --git a/ai-meetings/AImeetings-md/meetingAI.md b/ai-meetings/AImeetings-md/meetingAI.md new file mode 100644 index 0000000..5224ef6 --- /dev/null +++ b/ai-meetings/AImeetings-md/meetingAI.md @@ -0,0 +1,1452 @@ +# AI Meetings +Welcome to this tutorial on building a web application using Visual Builder Cloud Service! In this tutorial, we'll embark on an exciting journey of leveraging cutting-edge technologies to enhances team meetings by using Oracle 23AI and OCI AI Services for seamless real-time audio transcription, efficient summarization, and easy interrogation of transcriptions. It extracts sentiment, reduces administrative tasks, and provides data-driven insights. This solution, turns meeting data into actionable intelligence and boosts overall productivity. + +# **1. Prepare your user** + + In Oracle Cloud Infrastructure (OCI), API keys are used for secure authentication when accessing OCI resources through REST APIs. OCI API keys consist of two parts: a Public key and a Private key. You use the OCI console to generate the Private/Public key pair. + Generate API Keys using OCI Console + To Generate the API Keys using OCI Console: + + - Login into your OCI Account. + ![alt text](ak1.png) + - Click on the Profile icon at the top-right corner and select your Profile hyperlink. + ![alt text](ak2.png) + - Under Resources section at the bottom-left, select API Keys and then click Add API Key. + ![alt text](ak3.png) + - The Add API Key dialog is displayed. Select Generate API Key Pair to create a new key pair. + ![alt text](ak4.png) + - Click Download Private Key. A .pem file is saved to your local device. You do not need to download the public key and click Add button. + ![alt text](ak5.png) + + + + +# **2.Pick you compartment** +Identify the compartment you're currently working within. Navigate to 'Identity' -> 'Compartments'. Locate your compartment and make a note of its OCID (Oracle Cloud Identifier) + + + +# **3.Create a bucket to store your meetings** +Create a bucket in your compartment. Navigate to 'Storage' -> 'Object Storage & Archive Storage' -> 'Buckets, Click on "Create bucket" button, provide for instance AI_Meetings and click on "Create". + ![alt text](ak6.jpg) + + +# **4.Open Visual Builder** +## Configure access to REST APIs +* Open Visual Builder and click on the "New" button. Provide a name and an ID, for example "AI_Meetings". Click on finish. + ![alt text](vbcs1.jpg) + +* Now we are going to create a web application. Click on the first icon (web applications) + ![alt text](vbcs2.jpg) +* Now, click on the "+ Web Application" button + ![alt text](vbcs3.jpg) +* Provide an Application name, for example "AI_Meetings" + ![alt text](vbcs4.jpg) +* Let's do the REST Service definition. Click on "+ Service Connection" button +* + ![alt text](vbcs5.jpg) +* Choose source "Define by Endpoint" + ![alt text](vbcs6.jpg) +* Provide the OCI Object Storage API Endpoint, being xx-xxxxxx-x your region (example: eu-frankfurt-1). For instance https://objectstorage.xx-xxxxxx-x.oraclecloud.com/n/{namespace}/b/AI_Meetings/o/{objectName} +Enter the Backend Name and select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu. Then, click on the pencil icon to proceed + ![alt text](vbcs7.jpg) +* Enter the data obtained in step 1 in the format ocid.tenancy/ocid.user/key_fingerprint. Paste the content of the Private key file that you downloaded in the first step, then click the 'Save' button. Afterward, proceed by clicking on the 'Next' button +![alt text](vbcs8.jpg) +* Include a "service name" and choose "Method" GET and set "Action Hint" to "Get one" + ![alt text](vbcs9.jpg) + +* Click on create to finish the wizard. Now, you have an Object Storage backend. + +Let's go to add a new service to the recently created backend OCI Storage API to upload objects and create Preauthenticated requests. + +So, add a new service to the storage backend +[URL]: vb-catalog://backends/objectStorage +/n/{object_storage_namespace}/b/{bucket}/o/{object_name} + +- "Method": PUT +- "Action hint": CREATE +- Dynamic Headers: + - Content-Type required, type String + - Contetn-Disposition required as String +- Request body media type: application/octect-stream + +Again, add a new service to the storage backend + vb-catalog://backends/objectStorage +/n/{object_storage_namespace}/b/{bucket}/p/ + +- "Method": POST +- "Action hint": CREATE +- Dynamic Headers: + - Content-Type required, type String + - Content-Disposition required as String +- Request body media type: application/octect-stream + + + Repeat the same operation to provide access to the OCI GenAI API to do summarization (select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends) +So, add a new backend and set the URL + + https://inference.generativeai.xx-xxxxxx-x.oci.oraclecloud.com/20231130/actions/generateText + +- "Method": POST +- "Action hint": CREATE +- Request body: +~~~ +{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaxxxxxnauu3aajpx6pfgtwrxq", +"extractiveness": "AUTO", +"format": "AUTO", +"input": "From the deluge on that election Sunday of 28 March, just one year ago today, to the sweltering epilogue of this scorching May, with the European elections on the horizon.........", +"length": "AUTO", + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, +"temperature": 0.1 +} +~~~ + +- Response body: +~~~ +{ + "id": "0fa30f70-xxxx-xxxx-xxxx-a1697b0d4d68", + "summary": "A year on from the 28th February coup attempt in Spain, the country is gearing up for European elections while the government continues to push through controversial legislation, such as the Amnesty Law, despite widespread opposition and protests. .........", + "modelId": "cohere.command", + "modelVersion": "15.6" +} +~~~ + +* Repeat the same operation to provide access to the OCI Speech API to carry out the transcription. On this case we will be able to get transcription status (select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends) +So, add a new backend and set the URL + (https://speech.aiservice.xx-xxxxxxxxx-x.oci.oraclecloud.com/20220101/transcriptionJobs/{transcriptionJobId}) + +- "Method": GET +- "Action hint": Get Many +- Request body: +~~~ +{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaxxxxxnauu3aajpx6pfgtwrxq", +"extractiveness": "AUTO", +"format": "AUTO", +"input": "From the deluge on that election Sunday of 28 March, just one year ago today, to the sweltering epilogue of this scorching May, with the European elections on the horizon.........", +"length": "AUTO", + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, +"temperature": 0.1 +} +~~~ + +- Response body: +~~~ +{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaxxxxxxxxxthlmzclnsoq", + "displayName": "job-3b63a754-xxxx-xxxx-839e-d9c3cec24eac.mp3", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p3xxxxxxxlnauu3aajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-05-23T10:35:27.390Z", + "timeStarted": "2024-05-23T10:35:27.656Z", + "timeFinished": "2024-05-23T10:37:55.651Z", + "totalTasks": 1, + "outstandingTasks": 0, + "successfulTasks": 1, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "3b63a754-xxxx-xxxx-xxxx-d9c3cec24eac.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "xxxxxxxx", + "bucketName": "AI_Meetings", + "prefix": "id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqxxxxxxxxxxxxjqh2x3fthlmzclnsoq/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwxxxxxqf5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "SUCCEEDED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Audit": { + "creator": "oracleidentitycloudservice/xxxxxxxx@oracle.com at 2024-05-23T10:35:27.251Z" + } + }, + "systemTags": {} +} +~~~ + +Now let's goign to add a new service to the recently created backend OCI Speech API to request the transcription status. + +* Now, add a new service connection using (vb-catalog://backends/speech/transcriptionJobs) + +- "Method": POST +- "Action hint": Create +- Request body: +~~~ +{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxxxxxxnauu3aajpx6pfgtwrxq", +"displayName":"name", +"inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":"AI_Meetings", "namespaceName":"xxxxx", "objectNames": ["f93d5e52-xxxx-xxxx-xxxxx-907dd0e2cacc.mp3"] + }] + + }, +"modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": {"isDiarizationEnabled": true, "numberOfSpeakers":2} + } + }, +"outputLocation": { + "bucketName":"AI_Meetings", "namespaceName":"xxxxxxx", "prefix": "idxxx" + } +} +~~~ + +- Response body: +~~~ +{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaaaavfig65yack6kixxxxxxxxxqe3v6wedleiawpbufaa", + "displayName": "name", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaaxxxxxwxxxxxxxxxxajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-03-18T18:36:29.364Z", + "timeStarted": null, + "timeFinished": null, + "totalTasks": 1, + "outstandingTasks": 1, + "successfulTasks": 0, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "idxxx/f93d5e52-b1fb-xxxx-xxxxx-907dd0e2cacc.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "prefix": "idxxx/job-amaaaaaavfig65yaxxxxxx5zohqe3v6wedleiawpbufaa/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwuvo3enpxxxxxxx5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "ACCEPTED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Oracle-Tags": { + "CreatedBy": "default/xxxxxxx@oracle.com", + "CreatedOn": "2024-03-18T18:36:29.266Z" + } + }, + "systemTags": {} +} +~~~ + + +* Repeat the same operation to provide access to the OCI Language API to analyze the transcription.Select 'Oracle Cloud Infrastructure API Signature 1.0' from the Authentication dropdown menu as you have done with other backends. +So, add a new backend and set the URL + (https://language.aiservice.xx-xxxxxx-x.oci.oraclecloud.com/20221001/actions/batchDetectLanguageSentiments) + +- "Method": POST +- "Action hint": Create +- Request body: +~~~ +{ +"documents": [ + { + "key" : "doc1", + "text" : "OCI recently added new services to existing compliance program including SOC, HIPAA, and ISO to enable our customers to solve their use cases. We also released new white papers and guidance documents related to Object Storage, the Australian Prudential Regulation Authority (APRA), and the Central Bank of Brazil. These resources help regulated customers better understand how OCI supports their regional and industry-specific compliance requirements. Not only are we expanding our number of compliance offerings and regulatory alignments, we continue to add regions and services at a faster clip." + } +] +} +~~~ + +- Response body: +~~~ +{ + "documents": [ + { + "key": "doc1", + "documentSentiment": "", + "documentScores": {}, + "sentences": [], + "aspects": [ + { + "offset": 322, + "length": 9, + "text": "resources", + "sentiment": "Positive", + "scores": { + "Positive": 0.9814186299929331, + "Negative": 0.016609141881639276, + "Neutral": 0, + "Mixed": 0.001972228125427651 + } + } + ], + "languageCode": "en" + } + ], + "errors": [] +} +~~~ + +* Finally let's go to add a new service to the recently created backend OCI Language API to detect pre-trained entities: (vb-catalog://backends/Language/batchDetectLanguageEntities) + +- "Method": POST +- "Action hint": Get Many +- Request body: +~~~ +{ + "documents": [ + { + "key": "doc1", + "text": " The video demonstrates the capabilities of the Oracle Cloud Language Service. Language detection and text classification capabilities are shown using pre-trained models. The named entity recognition capability can extract entities like .........." + } + ] +} +~~~ + +- Response body example: + +~~~ +{ + "documents": [ + { + "key": "doc1", + "entities": [ + { + "offset": 1, + "length": 15, + "text": "Red Bull Racing", + "type": "ORGANIZATION", + "subType": null, + "score": 0.9914557536443075, + "metaInfo": null + }, + { + "offset": 17, + "length": 5, + "text": "Honda", + "type": "ORGANIZATION", + "subType": null, + "score": 0.6515498757362366, + "metaInfo": null + }, + { + "offset": 28, + "length": 9, + "text": "four-time", + "type": "QUANTITY", + "subType": null, + "score": 0.9998091459274292, + "metaInfo": [ + { + "offset": 28, + "length": 9, + "text": "four-time", + "subType": "UNIT", + "score": 0.9998091459274292 + } + ] + }, + { + "offset": 48, + "length": 5, + "text": "World", + "type": "LOCATION", + "subType": "NON_GPE", + "score": 0.582543671131134, + "metaInfo": null + }, + ... + ] + +~~~ + +* Lastly add a custom endpoint to provide RAG capabilities around the transcription. + - Add the endpoint http://xxx.xx.xxx.xxx:8888/v2/answer/?conv_id={id} + - We will cover in another session how to create a RAG solution. + +* So, finally your service connections will be something similar to this image: + + ![alt text](vbcs10.jpg) + + +## Create business objects + +* Choose business objects panel and add two tables: + * Meetings: add a string field like meetingName + * Transcriptions: add some string fields: jobID, jobName and status + +![alt text](vbcs10b.jpg) + +## Build the Web App + +- First of all you must create some types & variables: + * Type tokenType is a object of spearkerIndex (number) and token (string) + * Define also following variables: + * String type: filename, meetingName, jobIdName, jobStatus, parURL, outputlocation, transcriptionText, summaryText, mention, ... + * Boolean type: loading, uploadSuccess, meetingCreated, transcriptionTask, summaryStatus, summary, spareTime, ragResponse, query,... + * Number: fileSize, nParticipants,meetingID, transcriptionID, jobId, positive, negative, mixed, neutral, ... + * String array: requirements, ... + * tokenType array: tokenArray, ... + + +- In the components panel, search for "file picker" and drag it onto your canvas. To enhance its appearance, click on the grid layout and switch it to "Flex" mode (found in the properties panel). Set the "Direction" to "vertical" and justify it both "center" and "middle". Next, navigate to the "All" tab, type "style" into the search bar, and provide some CSS styling such as "margin-top:30px;" to achieve the desired spacing. Drop a few components like images and texts. +![alt text](vbcs11.jpg) + +- In the File Picker properties panel provided the supported files that your application will support. +![alt text](vbcs12.jpg) + +- In the file picker create an event. On this event, you will manage the file upload to the object storage. + +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class FilePickerSelectChain extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {object[]} params.files + */ + async run(context, { files }) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + let size=""; + if(files[0].size === 0) size= '0 Bytes'; + var k = 1000, + dm = 2, + sizes = ['Bytes', 'KB', 'MB', 'GB','TB', 'PB', 'EB', 'ZB', 'YB'], + i = Math.floor(Math.log(files[0].size) / Math.log(k)); + size= parseFloat((files[0].size / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; + $page.variables.fileSize = size; + + + function getExtension(fileName) { + if (typeof fileName !== 'string' || !fileName) { + return ''; // Returns an empty string if the input is invalid + } + const ultimoPunto = fileName.lastIndexOf("."); + if (ultimoPunto === -1) return ''; // Returns an empty string if there is no dot in the filename + return fileName.slice(ultimoPunto + 1); + } + + function generateUUID() { + let dt = new Date().getTime(); + const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = (dt + Math.random()*16)%16 | 0; + dt = Math.floor(dt/16); + return (c == 'x' ? r : (r&0x3|0x8)).toString(16); + }); + return uuid; + } + + let uuid = generateUUID(); + + let ext = getExtension(files[0].name); + + $page.variables.filename = uuid+"."+ext; + + + const callRestStoragePutObjectResult = await Actions.callRest(context, { + endpoint: 'Storage/putObject', + uriParams: { + bucket: 'AI_Meetings', + 'object_storage_namespace': '{your_namespace}', + 'object_name': $page.variables.filename, + }, + body: files[0], + }); + + if (callRestStoragePutObjectResult.status===200) { + + $page.variables.uploadSuccess = true; + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was an error uploading the file', + displayMode: 'transient', + type: 'error', + }); + } + $page.variables.loading = false; + return; + } + } + + return FilePickerSelectChain; +}); +~~~ + +- Drop a inpunt text to capture the meeting name and a button to create the meeting. So, you can associate a string variable to the input text (example meetingName). We will create the meeting metadata on the business object +- Associate an ojAction event to the button (it's the action chain): + +~~~ + +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createMeeting extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($application.functions.isFormValid('oj-validation-group-upload')) { + $page.variables.loading = true; + let transcription = true; + let summarization = true; + let sentiment = true; + let temp = ""; + let internalM = true; + let meetingDesc =""; + $page.variables.requirements.push("transcription","summarization","sentiment_analysis"); + + + + const callRestBusinessObjectsCreateMeetingResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Meetings', + body: { + "internalMeeting": internalM , + "meetingName": $page.variables.meetingName , + "meetingDesc": meetingDesc , + "speakersN": $page.variables.nParticipants , + "speakersInvolved": temp , + "transcription": transcription , + "summarization": summarization, + "sentiment": sentiment , + "fname" : $page.variables.filename, + }, + }); + + if (callRestBusinessObjectsCreateMeetingResult.status===201) { + + $page.variables.currentRequest = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingID = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingCreated = true; + + $page.variables.transcriptionID = $page.variables.meetingID; + await Actions.callChain(context, { + chain: 'createTranscriptionJob', + }); + + await Actions.fireNotificationEvent(context, { + summary: 'Your meeting has been created successfully', + displayMode: 'transient', + type: 'confirmation', + }); + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was a problem creating your meeting', + type: 'warning', + displayMode: 'transient', + }); + } + } else { + await Actions.fireNotificationEvent(context, { + summary: 'The Meeting name is mandatory', + displayMode: 'transient', + type: 'warning', + }); + } + + $page.variables.loading = false; + + return; + } + } + + return createMeeting; +}); + +~~~ + +* Now we will create another Action chain to create the transcription job using the Speech service. +We will provide information as the compartment, bucket, object and we will update the Transcription table with the relevant information. + + +~~~ + +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createTranscriptionJob extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callRestCreateJobPostTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/postTranscriptionJobs', + body: { + "compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bxxxxxxauu3aajpx6pfgtwrxq", + "displayName":"job-"+$page.variables.filename, + "inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":"AI_Meetings", "namespaceName":"<>", "objectNames": [$page.variables.filename] + }] + + }, + "modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true + } + } + }, + "outputLocation": { + "bucketName":"AI_Meetings", "namespaceName":"", "prefix": "id"+$application.user.userId + } + }, + }); + + if (callRestCreateJobPostTranscriptionJobsResult.status===200 || callRestCreateJobPostTranscriptionJobsResult.status===201) { + $page.variables.jobIdName = callRestCreateJobPostTranscriptionJobsResult.body.displayName; + $page.variables.jobStatus = callRestCreateJobPostTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobId = callRestCreateJobPostTranscriptionJobsResult.body.id; + + const callRestBusinessObjectsCreateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Transcriptions', + body: { + "jobID": $page.variables.jobId, + "jobNAME": $page.variables.jobIdName, + "status": $page.variables.jobStatus + }, + }); + + const callRestBusinessObjectsUpdateMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.currentRequest, + }, + body: { + "transcriptionId": callRestBusinessObjectsCreateTranscriptionsResult.body.id + }, + }); + + await Actions.fireNotificationEvent(context, { + summary: 'We are processing your request. It will take a while...', + type: 'info', + displayMode: 'transient', + }); + + return; + } else { + return; + } + } + } + + return createTranscriptionJob; +}); + +~~~ + +- Due to it's a sync request, we are going to create a refresh button to check the current transcription status. +![alt text](vbcs13.jpg) +Crate an ojAction event asociated to the button to refresh the page + +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionRefresh extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + window.location.href = window.location.href; + } + } + + return ButtonActionRefresh; +}); +~~~ + + +- It's time to create an event listener to get the status also when your open the page. So create a vbEnter event with an Action Chain named loadData. + ![alt text](vbcs14.jpg) + + +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class loadData extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($page.variables.meetingID >0 || $page.variables.parURL) { + + + $page.variables.loading = true; + $page.variables.uploadSuccess = true; + $page.variables.meetingCreated = true; + + await Actions.callChain(context, { + chain: 'loadMeeting', + }); + + if (!($page.variables.transcriptionID >0)) { + await Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'You are trying to access a meeting that doesn\'t exist.', + displayMode: 'transient', + type: 'error', + }); + + const navigateToPageMainBrowseResult = await Actions.navigateToPage(context, { + page: 'main-browse', + }); + } + + const callRestBusinessObjectsGetTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/get_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + }); + + $page.variables.jobId = callRestBusinessObjectsGetTranscriptionsResult.body.jobID; + + const callRestCreateJobGetTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/getTranscriptionJobs', + uriParams: { + transcriptionJobId: $page.variables.jobId, + }, + }); + + $page.variables.jobStatus = callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobCompletion = callRestCreateJobGetTranscriptionJobsResult.body.percentComplete; + $page.variables.outputlocation = callRestCreateJobGetTranscriptionJobsResult.body.outputLocation.prefix; + + + if (callRestBusinessObjectsGetTranscriptionsResult.body.status!==callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState) { + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + body: { + "status": $page.variables.jobStatus, + }, + }); + } + + if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='SUCCEEDED') { + + const currentDate = new Date(); + // Add 3 hours to the current time + currentDate.setHours(currentDate.getHours() + 3); + // Convert the date to RFC 3339 format + const rfc3339Date = currentDate.toISOString(); + // Remove the milliseconds and 'Z' at the end, then append the timezone offset + const expirationTime = rfc3339Date.split('.')[0] + currentDate.toISOString().slice(19); + + let urlTemp = $page.variables.outputlocation +'_AI_Meetings_'+ callRestCreateJobGetTranscriptionJobsResult.body.inputLocation.objectLocations[0].objectNames[0]+'.json'; + const callRestStorageCreatePARResult = await Actions.callRest(context, { + endpoint: 'Storage/createPAR', + uriParams: { + bucketName: 'AI_Meetings', + namespaceName: '', + }, + body: { + "accessType": "ObjectRead", + "name": "PARTest", + "objectName": urlTemp, + "timeExpires": expirationTime + }, + }); + + $page.variables.spareTime = false; + + $page.variables.parURL = callRestStorageCreatePARResult.body.fullPath; + let tokens=[]; + + + async function procesarTranscripciones() { + try { + // Get the JSON from the URL + const respuesta = await fetch($page.variables.parURL); + const datos = await respuesta.json(); + // Check if the JSON is in the expected format + if (!datos.transcriptions || !Array.isArray(datos.transcriptions)) { + console.error('The JSON is not in the expected format.'); + return; + } + const conversation = datos.transcriptions[0].transcription; + $page.variables.transcriptionText = conversation; + + + + + const speakers = datos.transcriptions[0].speakerCount; + $page.variables.nParticipants = speakers; + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.meetingID, + }, + body: { + "speakersN": Number(speakers), + }, + }); + + // Initialise an object to separate tokens by speaker + const tokensBySpeaker = {}; + for (let i = 0; i < speakers; i++) { + tokensBySpeaker[`Speaker${i}`] = []; + } + + + tokens = datos.transcriptions[0].tokens; + + if (!tokens) { + console.error('No tokens were found in the transcription'); + return; + } + + // Iterate through tokens and sort them out + for (const token of tokens) { + if (tokensBySpeaker.hasOwnProperty(`Speaker${token.speakerIndex}`)) { + tokensBySpeaker[`Speaker${token.speakerIndex}`].push(token.token); + } + } + + + // Print the results + for (let i = 0; i < speakers; i++) { + console.log(`Tokens Speaker ${i}:`, tokensBySpeaker[`Speaker${i}`].join(' ')); + } + + return; + + } catch (error) { + // Error handling (e.g. network or parse problem) + console.error('Error getting or processing JSON:', error); + return false; + } + } + + let result = await procesarTranscripciones(); + let groupWords = await agruparPorSpeaker(tokens); + $page.variables.tokenArray=groupWords; + $page.variables.transcriptionTask = true; + + function agruparPorSpeaker(tokens) { + const agrupados = []; + let currentSpeaker = null; + let currentText = ""; + + tokens.forEach(token => { + if (token.speakerIndex !== currentSpeaker) { + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + currentSpeaker = token.speakerIndex; + currentText = token.token; + } else { + currentText += " " + token.token; + } + }); + + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + + return agrupados; + } + + await Actions.callChain(context, { + chain: 'sentimentDetection', + }); + + await Actions.callChain(context, { + chain: 'summarization', + }); + + await Actions.callChain(context, { + chain: 'ActionPeopleMentions', + }); + + $page.variables.loading=false; + + } else if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='IN_PROGRESS') { + $page.variables.loading = true; + $page.variables.spareTime = true; + + } + + + + } + } + } + + return loadData; +}); + +~~~ + + +- We need to create a few more action chains to request sentiment analysis, summarization and mentions. +Please note that there are limitations on the size of the text to be summarised or analysed. So we will do chunking when necessary. + +- Action chain for sentiment detection + +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class sentimentDetection extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + await processSentimentAnalysis(); + $page.variables.loading = false; + + + async function processSentimentAnalysis() { + const text = $page.variables.transcriptionText; + const chunkSize = 4999; // Adjust based on API limits + const chunks = splitText(text, chunkSize); + + const sentimentResults = await Promise.all(chunks.map(async (chunk, index) => { + return callSentimentAnalysisAPI(chunk, index); + })); + + compileSentimentResults(sentimentResults); + } + + function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function callSentimentAnalysisAPI(text, index) { + return Actions.callRest(context, { + endpoint: 'SentimentAnalysis/postBatchDetectLanguageSentiments', + body: { + documents: [ + { + key: `doc${index}`, + text: text, + }, + ], + }, + uriParams: { + level: 'SENTENCE', + }, + }); + } + + +function compileSentimentResults(results) { + let allSentiments = []; + let totalPositive = 0; + let totalNegative = 0; + let totalNeutral = 0; + let totalMixed = 0; + let count = 0; + + results.forEach(result => { + if (result.status === 200) { + try { + const documentSentiment = result.body.documents[0].documentSentiment; + const scores = result.body.documents[0].documentScores; + + totalPositive += scores.Positive; + totalNegative += scores.Negative; + totalNeutral += scores.Neutral; + totalMixed += scores.Mixed; + count++; + + const data = result.body.documents[0].sentences; + const processedData = data.map(item => { + const scores = item.scores; + const highestScore = Object.keys(scores).reduce((a, b) => scores[a] > scores[b] ? a : b); + return { + sentence: item.text, + sentiment: item.sentiment, + value: (scores[highestScore] * 100).toFixed(2) // Convert to percentage and round to two decimals + }; + }); + allSentiments = allSentiments.concat(processedData); + } catch (error) { + Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'There was an error processing the sentiment data', + displayMode: 'transient', + type: 'warning', + }); + } + } + }); + + // Calculate averages + if (count > 0) { + $page.variables.positive = (totalPositive / count).toFixed(2); + $page.variables.negative = (totalNegative / count).toFixed(2); + $page.variables.neutral = (totalNeutral / count).toFixed(2); + $page.variables.mixed = (totalMixed / count).toFixed(2); + + $page.variables.chartDataArray[0].value = $page.variables.positive ; + $page.variables.chartDataArray[1].value = $page.variables.negative ; + $page.variables.chartDataArray[2].value = $page.variables.neutral ; + $page.variables.chartDataArray[3].value = $page.variables.mixed ; + + } + + $page.variables.tableArray = allSentiments; +} + + } + } + return sentimentDetection; +}); + +~~~ + + + +- Action chain for summarization. We will do chunking too. +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class SummarizationChunks extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function summarizeText(text) { + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const summaries = await Promise.all(chunks.map(async chunk => { + return await summarizeChunk(chunk); + })); + + const combinedSummary = summaries.join(' '); + return combinedSummary; + } + + async function summarizeChunk(text) { + const callRestSummarizationPostSummarizeTextResult = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxxx5jmm5gtlnauu3aajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": text, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + return callRestSummarizationPostSummarizeTextResult.body.summary; + } + + async function startSummarization() { + const text = $page.variables.transcriptionText; + let result = await summarizeText(text); + console.log("Result: " + result); + $page.variables.summaryText=result; + } + + + + const size = $page.variables.transcriptionText.length; + if (size < 250) { + $page.variables.minimumSize = true; + $page.variables.summaryStatus = true; + return; + } + + + if (size < 3500) { + $page.variables.loading = true; + const callRestSummarizationPostSummarizeTextResult3 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xcxxxxxxajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.transcriptionText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult3.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + }else{ + $page.variables.loading = true; + await startSummarization(context); + const callRestSummarizationPostSummarizeTextResult2 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wxxxxxxx5gtlnauu3aajpx6pfgtwrxq", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.summaryText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult2.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + } + } + } + return SummarizationChunks; + +}); + +~~~ + + +- Action chain for mentions using AI Language +~~~ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ActionPeopleMentions extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function startMentioning() { + const text = $page.variables.transcriptionText; // Ensure this is properly initialized and accessible + let result = await analyzeText(text); + + console.log("Result: " + result); + } + await startMentioning(); + $page.variables.languageProcessingFinish=true; + $page.variables.loading =false; + + async function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + + async function analyzeText(text) { + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const analysis = await Promise.all(chunks.map(async chunk => { + return mentionAnalysis(chunk); + })); + return; + } + + + function processEntities(data) { + try{ + data.documents[0].entities.forEach(entity => { + if ((entity.type === "PERSON") && (entity.score>0.7)) { + $page.variables.arrayMention.push(entity.text); + } else if ((entity.type === "ORGANIZATION") && (entity.score>0.8)) { + $page.variables.arrayOrg.push(entity.text); + } else if ((entity.type === "PRODUCT") && (entity.score>0.8)) { + $page.variables.arrayProduct.push(entity.text); + } else if ((entity.type === "DATETIME") && (entity.score>0.8)) { + $page.variables.arrayDatetime.push(entity.text); + }else if ((entity.type === "LOCATION") && (entity.score>0.8)) { + $page.variables.arrayLocation.push(entity.text); + } + }) + } catch (error) { + console.error(error); + } + + $page.variables.arrayMention = [...new Set($page.variables.arrayMention)]; + $page.variables.arrayOrg = [...new Set($page.variables.arrayOrg)]; + $page.variables.arrayProduct = [...new Set($page.variables.arrayProduct)]; + $page.variables.arrayLocation = [...new Set($page.variables.arrayLocation)]; + $page.variables.arrayDatetime = [...new Set($page.variables.arrayDatetime)]; + + let json = {"personEntities": $page.variables.arrayMention, "orgEntities": $page.variables.arrayOrg}; + return json; +} + + async function mentionAnalysis(text) { + const callRestSentimentAnalysisDetectLanguageEntitiesResult = await Actions.callRest(context, { + endpoint: 'SentimentAnalysis/DetectLanguageEntities', + body: { + "documents": [ + { "key": "doc1", "text": text + } + ] + }, + }); + const callFunctionResult = processEntities(callRestSentimentAnalysisDetectLanguageEntitiesResult.body); + return true; + + } + + return; + } + } + + return ActionPeopleMentions; +}); + +~~~ + + + +- Now, let's drop and configure some components to show the information. + ![alt text](drop.jpg) + + +- Sample use case: +![alt text](sample.png) + + +- If you want to import my project and start to use it, please first of all you must do some configurations. + * Edit server configurations to add your credentials (user ocid, user fingerprint, tenant ocid and your private certificate) + * Provide values to application variables: namespace, bucket & your ocid compartmment. + +## I hope you liked it. From today you can make your meetings smarter! +Author: Jesús Brasero \ No newline at end of file diff --git a/ai-meetings/AImeetings-md/sample.png b/ai-meetings/AImeetings-md/sample.png new file mode 100644 index 0000000..a906e05 Binary files /dev/null and b/ai-meetings/AImeetings-md/sample.png differ diff --git a/ai-meetings/AImeetings-md/screenCapture_withoutBlur.png b/ai-meetings/AImeetings-md/screenCapture_withoutBlur.png new file mode 100644 index 0000000..31ff88f Binary files /dev/null and b/ai-meetings/AImeetings-md/screenCapture_withoutBlur.png differ diff --git a/ai-meetings/AImeetings-md/vbcs1.jpg b/ai-meetings/AImeetings-md/vbcs1.jpg new file mode 100644 index 0000000..ba8e309 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs1.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs10.jpg b/ai-meetings/AImeetings-md/vbcs10.jpg new file mode 100644 index 0000000..df7cdd2 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs10.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs10b.jpg b/ai-meetings/AImeetings-md/vbcs10b.jpg new file mode 100644 index 0000000..bbfdde7 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs10b.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs11.jpg b/ai-meetings/AImeetings-md/vbcs11.jpg new file mode 100644 index 0000000..40f2d8b Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs11.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs12.jpg b/ai-meetings/AImeetings-md/vbcs12.jpg new file mode 100644 index 0000000..6227166 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs12.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs13.jpg b/ai-meetings/AImeetings-md/vbcs13.jpg new file mode 100644 index 0000000..4138220 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs13.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs14.jpg b/ai-meetings/AImeetings-md/vbcs14.jpg new file mode 100644 index 0000000..c3c3fba Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs14.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs2.jpg b/ai-meetings/AImeetings-md/vbcs2.jpg new file mode 100644 index 0000000..3fe6d89 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs2.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs3.jpg b/ai-meetings/AImeetings-md/vbcs3.jpg new file mode 100644 index 0000000..f35c3fa Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs3.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs4.jpg b/ai-meetings/AImeetings-md/vbcs4.jpg new file mode 100644 index 0000000..cbb63b6 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs4.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs5.jpg b/ai-meetings/AImeetings-md/vbcs5.jpg new file mode 100644 index 0000000..bb9ec1f Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs5.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs6.jpg b/ai-meetings/AImeetings-md/vbcs6.jpg new file mode 100644 index 0000000..7d4130f Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs6.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs7.jpg b/ai-meetings/AImeetings-md/vbcs7.jpg new file mode 100644 index 0000000..bfcea27 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs7.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs7b.jpg b/ai-meetings/AImeetings-md/vbcs7b.jpg new file mode 100644 index 0000000..396c3b0 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs7b.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs7c.jpg b/ai-meetings/AImeetings-md/vbcs7c.jpg new file mode 100644 index 0000000..b85b932 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs7c.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs8.jpg b/ai-meetings/AImeetings-md/vbcs8.jpg new file mode 100644 index 0000000..aa72ddd Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs8.jpg differ diff --git a/ai-meetings/AImeetings-md/vbcs9.jpg b/ai-meetings/AImeetings-md/vbcs9.jpg new file mode 100644 index 0000000..a4a1e63 Binary files /dev/null and b/ai-meetings/AImeetings-md/vbcs9.jpg differ diff --git a/ai-meetings/README.md b/ai-meetings/README.md new file mode 100644 index 0000000..5e3cb41 --- /dev/null +++ b/ai-meetings/README.md @@ -0,0 +1,26 @@ +# AI Meetings + +[![License: UPL](https://img.shields.io/badge/license-UPL-green)](https://img.shields.io/badge/license-UPL-green) [![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=oracle-devrel_test)](https://sonarcloud.io/dashboard?id=oracle-devrel_test) + +## Introduction +In this tutorial, we'll embark on an exciting journey of leveraging cutting-edge technologies to enhances team meetings by using Oracle 23AI and OCI AI Services for seamless real-time audio transcription, efficient summarization, and easy interrogation of transcriptions. It extracts sentiment, reduces administrative tasks, and provides data-driven insights. This solution, turns meeting data into actionable intelligence and boosts overall productivity. + + + +### Prerequisites +An OCI Account and privileges to use AI Speech, AI Language & Generative AI. +Also you will need access to a Visual Builder Cloud Service instance to deploy the web app. + +## Notes/Issues +RAG capabilities are not in this project. We will share it later. + + + +## License +Copyright (c) 2024 Oracle and/or its affiliates. + +Licensed under the Universal Permissive License (UPL), Version 1.0. + +See [LICENSE](LICENSE.txt) for more details. + +ORACLE AND ITS AFFILIATES DO NOT PROVIDE ANY WARRANTY WHATSOEVER, EXPRESS OR IMPLIED, FOR ANY SOFTWARE, MATERIAL OR CONTENT OF ANY KIND CONTAINED OR PRODUCED WITHIN THIS REPOSITORY, AND IN PARTICULAR SPECIFICALLY DISCLAIM ANY AND ALL IMPLIED WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. FURTHERMORE, ORACLE AND ITS AFFILIATES DO NOT REPRESENT THAT ANY CUSTOMARY SECURITY REVIEW HAS BEEN PERFORMED WITH RESPECT TO ANY SOFTWARE, MATERIAL OR CONTENT CONTAINED OR PRODUCED WITHIN THIS REPOSITORY. IN ADDITION, AND WITHOUT LIMITING THE FOREGOING, THIRD PARTIES MAY HAVE POSTED SOFTWARE, MATERIAL OR CONTENT TO THIS REPOSITORY WITHOUT ANY REVIEW. USE AT YOUR OWN RISK. diff --git a/ai-meetings/VBCS Project/AI_Meetings-1.0.zip b/ai-meetings/VBCS Project/AI_Meetings-1.0.zip new file mode 100644 index 0000000..7112892 Binary files /dev/null and b/ai-meetings/VBCS Project/AI_Meetings-1.0.zip differ diff --git a/ai-meetings/VBCS Project/Gruntfile.js b/ai-meetings/VBCS Project/Gruntfile.js new file mode 100644 index 0000000..3068ea0 --- /dev/null +++ b/ai-meetings/VBCS Project/Gruntfile.js @@ -0,0 +1,11 @@ +'use strict'; + +/** + * Visual Builder project build script. + * For details about the application build and Visual Builder-specific grunt tasks + * provided by the grunt-vb-build npm dependency, please refer to + * https://www.oracle.com/pls/topic/lookup?ctx=en/cloud/paas/app-builder-cloud&id=visual-application-build + */ +module.exports = (grunt) => { + require('load-grunt-tasks')(grunt); +}; diff --git a/ai-meetings/VBCS Project/businessObjects/default/businessObjects.json b/ai-meetings/VBCS Project/businessObjects/default/businessObjects.json new file mode 100644 index 0000000..db83f22 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/businessObjects.json @@ -0,0 +1,3 @@ +{ + "type": "default" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/diagrams/diagram/diagram.json b/ai-meetings/VBCS Project/businessObjects/default/diagrams/diagram/diagram.json new file mode 100644 index 0000000..125acc6 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/diagrams/diagram/diagram.json @@ -0,0 +1,6 @@ +{ + "boNames": [ + "Meetings" , + "Transcriptions" + ] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity-data.csv b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity-data.csv new file mode 100644 index 0000000..1e401c5 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity-data.csv @@ -0,0 +1 @@ +id,creationDate,lastUpdateDate,createdBy,lastUpdatedBy,meetingName,meetingDesc,internalMeeting,fname,sentiment,speakersInvolved,speakersN,summarization,transcription,transcriptionId diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity.json new file mode 100644 index 0000000..4b4a8ea --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/entity.json @@ -0,0 +1,129 @@ +{ + "fields": [ + { + "type": "number", + "name": "id", + "internal": false, + "key": true, + "oid": "96a32f29-2c8a-4bbc-8fc5-7412d01203c6", + "required": true, + "unique": true, + "displayLabel": "Id" + }, + { + "type": "datetime", + "name": "creationDate", + "internal": false, + "oid": "4ec690f3-7c3d-448b-82b1-f493aa2e1fd8", + "displayLabel": "Created", + "historyType": "timeCreated" + }, + { + "type": "datetime", + "name": "lastUpdateDate", + "internal": false, + "oid": "ebec113e-da32-488b-a2e4-04a4273f83bb", + "displayLabel": "Last Updated", + "historyType": "timeUpdated" + }, + { + "type": "string", + "name": "createdBy", + "internal": false, + "oid": "4994943a-267e-4492-97f6-fce3e6bc2e02", + "displayLabel": "Created By", + "historyType": "createdBy" + }, + { + "type": "string", + "name": "lastUpdatedBy", + "internal": false, + "oid": "374ffd7d-a756-412c-aaa8-8844302cf970", + "displayLabel": "Last Updated By", + "historyType": "updatedBy" + }, + { + "type": "number", + "name": "versionNumber", + "internal": false, + "oid": "ad4b36e3-0144-4993-8f01-20989a80a946", + "displayLabel": "Version Number", + "historyType": "versionNumber" + }, + { + "type": "string", + "name": "meetingName", + "oid": "2f1dd76b-1e99-43f8-b1fd-356b21fb9b03", + "displayLabel": "meetingName" + }, + { + "type": "string", + "name": "meetingDesc", + "oid": "9d7c3f58-e00b-495c-9dc5-17ab25f56b64", + "displayLabel": "meetingDesc" + }, + { + "type": "boolean", + "name": "internalMeeting", + "oid": "5024b1d1-8a49-4c91-8067-ebc0149c535b", + "displayLabel": "internalMeeting" + }, + { + "type": "string", + "name": "fname", + "oid": "9fabb08c-c4b8-4bcd-842f-3ec352216ba7", + "displayLabel": "fname" + }, + { + "type": "boolean", + "name": "sentiment", + "oid": "7df2694b-e188-4001-975d-d5e688b17623", + "displayLabel": "sentiment" + }, + { + "type": "string", + "name": "speakersInvolved", + "oid": "3b17e0ef-8526-4824-8b79-b34e006dc3ea", + "displayLabel": "speakersInvolved" + }, + { + "type": "number", + "name": "speakersN", + "oid": "7be8ff3e-6d79-4af1-a7b9-c77b1b0b6e07", + "displayLabel": "speakersN" + }, + { + "type": "boolean", + "name": "summarization", + "oid": "54fe2bdb-04a8-4216-9c14-66e3c6f33916", + "displayLabel": "summarization" + }, + { + "type": "boolean", + "name": "transcription", + "oid": "81bdc586-6537-4092-aaa9-a7c1300e2c4b", + "displayLabel": "transcription" + }, + { + "type": "number", + "name": "transcriptionId", + "oid": "a135ef2f-d5a5-4054-93cd-59b29705ac2d", + "displayLabel": "transcriptionId", + "unique": true + } + ], + "name": "Meetings", + "oid": "99e92c92-8aa2-43be-9ae4-ee61b7924983", + "displayLabel": "Meetings", + "relationships": [ + { + "name": "transcriptionIdObject", + "reverseRelationship": "meetingsCollection", + "targetEntity": "Transcriptions", + "type": "outgoing", + "exposeAccessor": true, + "mappingField": "transcriptionId", + "deleteRule": "restrict" + } + ] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/resources/Meetings.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/resources/Meetings.json new file mode 100644 index 0000000..be1262e --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Meetings/resources/Meetings.json @@ -0,0 +1,6 @@ +{ + "resources": { + "transcriptionIdObject": { + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity-data.csv b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity-data.csv new file mode 100644 index 0000000..1d0eb38 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity-data.csv @@ -0,0 +1 @@ +id,creationDate,lastUpdateDate,createdBy,lastUpdatedBy,rate,feedback diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity.json new file mode 100644 index 0000000..4f2c4f5 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/entity.json @@ -0,0 +1,69 @@ +{ + "fields": [ + { + "type": "number", + "name": "id", + "internal": false, + "key": true, + "oid": "29ab525c-72b3-4146-b51c-4640c45516e4", + "required": true, + "unique": true, + "displayLabel": "Id" + }, + { + "type": "datetime", + "name": "creationDate", + "internal": false, + "oid": "5ef94f0b-3732-42f3-a8af-4c6c2317ba0e", + "displayLabel": "Created", + "historyType": "timeCreated" + }, + { + "type": "datetime", + "name": "lastUpdateDate", + "internal": false, + "oid": "8b8af324-249f-47b8-a05d-472c5377033d", + "displayLabel": "Last Updated", + "historyType": "timeUpdated" + }, + { + "type": "string", + "name": "createdBy", + "internal": false, + "oid": "7852322d-c0e6-4f70-ab5d-2cebdebebcf4", + "displayLabel": "Created By", + "historyType": "createdBy" + }, + { + "type": "string", + "name": "lastUpdatedBy", + "internal": false, + "oid": "8125a5de-4432-4208-85e4-c2b555adb316", + "displayLabel": "Last Updated By", + "historyType": "updatedBy" + }, + { + "type": "number", + "name": "versionNumber", + "internal": false, + "oid": "8b9b5a65-2577-48e0-9401-796fa0865adf", + "displayLabel": "Version Number", + "historyType": "versionNumber" + }, + { + "type": "number", + "name": "rate", + "oid": "60546998-b7c5-4ffa-a1ba-3233e92fa03d", + "displayLabel": "rate" + }, + { + "type": "string", + "name": "feedback", + "oid": "95ede8a8-9907-4b6d-9124-30ccafe4a7f9", + "displayLabel": "feedback" + } + ], + "name": "Rate", + "oid": "47a0aaaa-6bef-482b-941b-306bc53dd8a3", + "displayLabel": "Rate" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/resources/Rate.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/resources/Rate.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Rate/resources/Rate.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity-data.csv b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity-data.csv new file mode 100644 index 0000000..1ec413e --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity-data.csv @@ -0,0 +1 @@ +id,creationDate,lastUpdateDate,createdBy,lastUpdatedBy,tContent,jobID,jobNAME,status diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity.json new file mode 100644 index 0000000..ce023fd --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/entity.json @@ -0,0 +1,90 @@ +{ + "fields": [ + { + "type": "number", + "name": "id", + "internal": false, + "key": true, + "oid": "426fd097-5c34-465c-ab8f-eb7e03d4b323", + "required": true, + "unique": true, + "displayLabel": "Id" + }, + { + "type": "datetime", + "name": "creationDate", + "internal": false, + "oid": "9c333e93-9abe-4ffd-944a-1a0428c96a6d", + "displayLabel": "Created", + "historyType": "timeCreated" + }, + { + "type": "datetime", + "name": "lastUpdateDate", + "internal": false, + "oid": "8888532d-4903-4be5-956f-ee6229f57613", + "displayLabel": "Last Updated", + "historyType": "timeUpdated" + }, + { + "type": "string", + "name": "createdBy", + "internal": false, + "oid": "7dcbdfce-e336-46af-ab4f-67f750f577f0", + "displayLabel": "Created By", + "historyType": "createdBy" + }, + { + "type": "string", + "name": "lastUpdatedBy", + "internal": false, + "oid": "c1972ae6-ba94-4a4b-966e-7bc67a6ad5b0", + "displayLabel": "Last Updated By", + "historyType": "updatedBy" + }, + { + "type": "number", + "name": "versionNumber", + "internal": false, + "oid": "9dcab739-4528-4baa-b932-d4ae721b17bd", + "displayLabel": "Version Number", + "historyType": "versionNumber" + }, +{ + "type": "string", + "name": "tContent", + "oid": "fb308ad9-12e7-48c7-b636-93652a97ab37", + "displayLabel": "tContent" + }, + { + "type": "string", + "name": "jobID", + "oid": "dd1f6cef-3185-4469-a54b-0b140ec501fa", + "displayLabel": "jobID" + } , + { + "type": "string", + "name": "jobNAME", + "oid": "18c02173-0272-4cf6-a61d-155636bb7d3b", + "displayLabel": "jobNAME" + } , + { + "type": "string", + "name": "status", + "oid": "4c12927b-2b5e-4699-a863-9e362a7c6dc1", + "displayLabel": "status" + } + ], + "name": "Transcriptions", + "oid": "3dba1cd7-64f7-42d4-a005-f0d3c35752e5", + "relationships": [ + { + "name": "meetingsCollection", + "reverseRelationship": "transcriptionIdObject", + "targetEntity": "Meetings", + "type": "incoming", + "displayField": "id" + } + ], + "displayLabel": "Transcriptions" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/resources/Transcriptions.json b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/resources/Transcriptions.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/ai-meetings/VBCS Project/businessObjects/default/objects/Transcriptions/resources/Transcriptions.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/package.json b/ai-meetings/VBCS Project/package.json new file mode 100644 index 0000000..9f266d9 --- /dev/null +++ b/ai-meetings/VBCS Project/package.json @@ -0,0 +1,15 @@ +{ + "name": "vb-application", + "version": "1.0.0", + "description": "Visual Builder Application", + "devDependencies": { + "grunt": "^1.6.1", + "grunt-cli": "^1.4.3", + "load-grunt-tasks": "^5.1.0", + "@oracle/grunt-vb-build": "https://static.oracle.com/cdn/vb/tools/npm/grunt-vb-build/grunt-vb-build-2404.0.21.tar.gz", + "@oracle/grunt-vb-audit": "https://static.oracle.com/cdn/vb/tools/npm/grunt-vb-audit/grunt-vb-audit-2404.0.6.tar.gz" + }, + "com_oracle_visual_builder": { + "upgrade": "micro" + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/request_application_json_vb.json b/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/request_application_json_vb.json new file mode 100644 index 0000000..fe20796 --- /dev/null +++ b/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/request_application_json_vb.json @@ -0,0 +1,4 @@ +{ + "query": "how is Julia Flores", + "documents": ["Julia Flores is in the process of purchasing debt from two of her credits and is being offered a more suitable fee from the bank than the original 19% fee that she had been given. Mrs. Flores is currently selling beer and a mix called sarchipapa on weekends out of her own home. She also raises chickens and pups to sell for extra income. Her husband works as a teacher but also makes and sells guitars. The couple owns the property title under both their names. Mrs. Flores buys her beer stock from her sister-in-law, who has the supplier code, and buys each box for 63.30 soles although she sells each unit for 78 soles and each box for 650 soles. Mrs. Flores has been living in the area for 27 years and is well known by her neighbors, who often ask her to cook them paus, which she sells for 33 pesos per kilo. She spends 120 pesos a month on food for her 35 animals, who she raises to sell. She also helps her neighbors out by giving them leftover food for their animals. Her husband works in Tambo Grande but also sells guitars that he makes himself. A woman is discussing business opportunities with a bank representative. She is interested in investing in a house made of noble materials to rent it out in the future, but she is advised to invest in a business instead since it would grant her a faster profit. The bank offers her the possibility of buying debt portfolios from other clients and purchasing debt purchases for 4000 soles with the possibility of obtaining 2000 soles in capital to invest in her business. She would need to pay back the debt purchases in order to withdraw the difference. The bank offers her favorable conditions due to her good previous collaboration with Iván, which is linked to punctuality."] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/response_default_application_json_vb.json new file mode 100644 index 0000000..9eabfb8 --- /dev/null +++ b/ai-meetings/VBCS Project/services/AIIMeetings/examples/post/response_default_application_json_vb.json @@ -0,0 +1 @@ +"Julia Flores is doing well and actively manages her small business. She's been seeking a bank loan with favourable interest rates to consolidate her debts and grow her business. Flores is a determined and enterprising individual who's been able to secure good terms from the bank due to her previous collaborations." \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize/request_application_json_vb.json b/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize/request_application_json_vb.json new file mode 100644 index 0000000..4a410b8 --- /dev/null +++ b/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize/request_application_json_vb.json @@ -0,0 +1,3 @@ +{ +"documents": ["Indias LGBTQ population saw few of its concerns addressed ahead of the countrys general elections. In 2018 the Supreme Court decriminalized homosexuality, scrapping a colonial-era law in a move the ruling Bharatiya Janata Party (BJP) takes credit for. But last year, the Supreme Court of India ruled against a petition to legalize same-sex marriage, and activists say LGBTQ people in India continue to face discrimination and abuse. What the ruling party says: The Bharatiya Janata Party (BJP), expected to secure another five years in power, has failed to adequately address this community on the campaign trail. In its manifesto, it promised to expand India's network of shelters for transgender people and promised to give them national ID cards. But transgender activists say the BJP government claims to provide rights for transgender people, but it has made it hard for them to live as equals in India.In parliament, 151 members have been vocal on LGBTQ issues, and fewer than 20 of these were from the BJP, according to PinkList, a national archive of politicians supporting LGBTQ rights. What the opposition says: the Indian National Congress has said in its manifesto that it would legalize civil unions between LGBTQ couples if elected. "] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize2/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize2/response_default_application_json_vb.json new file mode 100644 index 0000000..11877ec --- /dev/null +++ b/ai-meetings/VBCS Project/services/AIIMeetings/examples/postV2Summarize2/response_default_application_json_vb.json @@ -0,0 +1 @@ +"India's LGBTQ+ population has expressed disappointment at the lack of attention their concerns received ahead of the country's general elections. While the Supreme Court decriminalized homosexuality in 2018, the court recently ruled against legalizing same-sex marriage, and activists argue that discrimination and abuse against LGBTQ+ individuals persist. The ruling Bharatiya Janata Party (BJP), expected to remain in power, has been criticized for not doing enough to support the community during their campaign, despite promises to expand transgender shelters and provide national ID cards. The opposition Indian National Congress has pledged to legalize civil unions for LGBTQ+ couples if elected." \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/AIIMeetings/openapi3.json b/ai-meetings/VBCS Project/services/AIIMeetings/openapi3.json new file mode 100644 index 0000000..d7ba326 --- /dev/null +++ b/ai-meetings/VBCS Project/services/AIIMeetings/openapi3.json @@ -0,0 +1,128 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "RAG", + "version": "1.0.0" + }, + "servers": [ + { + "url": "vb-catalog://backends/ragLuigi" + } + ], + "paths": { + "/v2/answer/": { + "post": { + "operationId": "post", + "parameters": [ + { + "name": "conv_id", + "in": "query", + "required": true, + "schema": { + "type": "number" + }, + "x-vb": { + "defaultValue": "1" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/post/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Default response", + "content": { + "application/json": { + "examples": { + "vb": { + "externalValue": "./examples/post/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "getOne" + } + } + }, + "/v2/summarize/": { + "post": { + "operationId": "postV2Summarize2", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostV2SummarizeRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/postV2Summarize/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Default response", + "content": { + "application/json": { + "examples": { + "vb": { + "externalValue": "./examples/postV2Summarize2/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "custom" + } + } + } + }, + "components": { + "schemas": { + "PostRequest": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "documents": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PostV2SummarizeRequest": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/CreateJob/examples/getTranscriptionJobs/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/CreateJob/examples/getTranscriptionJobs/response_default_application_json_vb.json new file mode 100644 index 0000000..0121ffb --- /dev/null +++ b/ai-meetings/VBCS Project/services/CreateJob/examples/getTranscriptionJobs/response_default_application_json_vb.json @@ -0,0 +1,58 @@ +{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq", + "displayName": "job-3b63a754-8214-4955-839e-d9c3cec24eac.mp3", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wvhqvxr65s22xmp5jmm5gtlnauu3aajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-05-23T10:35:27.390Z", + "timeStarted": "2024-05-23T10:35:27.656Z", + "timeFinished": "2024-05-23T10:37:55.651Z", + "totalTasks": 1, + "outstandingTasks": 0, + "successfulTasks": 1, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "3b63a754-8214-4955-839e-d9c3cec24eac.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "prefix": "id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwuvo3enpyxhncmhumlpwvjl5suvh2oqf5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "SUCCEEDED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Audit": { + "creator": "oracleidentitycloudservice/jesus.brasero@oracle.com at 2024-05-23T10:35:27.251Z" + } + }, + "systemTags": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/request_application_json_vb.json b/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/request_application_json_vb.json new file mode 100644 index 0000000..1064a74 --- /dev/null +++ b/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/request_application_json_vb.json @@ -0,0 +1,23 @@ +{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wvhqvxr65s22xmp5jmm5gtlnauu3aajpx6pfgtwrxq", +"displayName":"name", +"inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":"AI_Meetings", "namespaceName":"wedoinfra", "objectNames": ["f93d5e52-b1fb-4981-8467-907dd0e2cacc.mp3"] + }] + + }, +"modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": {"isDiarizationEnabled": true, "numberOfSpeakers":2} + } + }, +"outputLocation": { + "bucketName":"AI_Meetings", "namespaceName":"wedoinfra", "prefix": "idxxx" + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/response_default_application_json_vb.json new file mode 100644 index 0000000..8bb69c7 --- /dev/null +++ b/ai-meetings/VBCS Project/services/CreateJob/examples/postTranscriptionJobs/response_default_application_json_vb.json @@ -0,0 +1,59 @@ +{ + "id": "ocid1.aispeechtranscriptionjob.oc1.eu-frankfurt-1.amaaaaaavfig65yack6kiwu3eetpqlxebmqhp5zohqe3v6wedleiawpbufaa", + "displayName": "name", + "compartmentId": "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wvhqvxr65s22xmp5jmm5gtlnauu3aajpx6pfgtwrxq", + "description": null, + "modelDetails": { + "modelType": "WHISPER_MEDIUM", + "domain": "GENERIC", + "languageCode": "en", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, + "numberOfSpeakers": 2 + }, + "additionalSettings": null + } + }, + "normalization": { + "isPunctuationEnabled": true, + "filters": [] + }, + "timeAccepted": "2024-03-18T18:36:29.364Z", + "timeStarted": null, + "timeFinished": null, + "totalTasks": 1, + "outstandingTasks": 1, + "successfulTasks": 0, + "ttlInDays": 90, + "percentComplete": 0, + "inputLocation": { + "locationType": "OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": [ + { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "objectNames": [ + "idxxx/f93d5e52-b1fb-4981-8467-907dd0e2cacc.mp3" + ] + } + ] + }, + "outputLocation": { + "namespaceName": "wedoinfra", + "bucketName": "AI_Meetings", + "prefix": "idxxx/job-amaaaaaavfig65yack6kiwu3eetpqlxebmqhp5zohqe3v6wedleiawpbufaa/" + }, + "createdBy": "ocid1.user.oc1..aaaaaaaaexwuvo3enpyxhncmhumlpwvjl5suvh2oqf5ahow5hgf3tj4upskq", + "additionalTranscriptionFormats": [], + "lifecycleState": "ACCEPTED", + "lifecycleDetails": null, + "freeformTags": {}, + "definedTags": { + "Oracle-Tags": { + "CreatedBy": "default/jesus.brasero@oracle.com", + "CreatedOn": "2024-03-18T18:36:29.266Z" + } + }, + "systemTags": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/CreateJob/openapi3.json b/ai-meetings/VBCS Project/services/CreateJob/openapi3.json new file mode 100644 index 0000000..0813662 --- /dev/null +++ b/ai-meetings/VBCS Project/services/CreateJob/openapi3.json @@ -0,0 +1,496 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "20220101", + "version": "1.0.0" + }, + "servers": [ + { + "url": "vb-catalog://backends/speech" + } + ], + "paths": { + "/transcriptionJobs": { + "post": { + "operationId": "postTranscriptionJobs", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTranscriptionJobsRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/postTranscriptionJobs/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Default response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostTranscriptionJobsResponse" + }, + "examples": { + "vb": { + "externalValue": "./examples/postTranscriptionJobs/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "create" + } + } + }, + "/transcriptionJobs/{transcriptionJobId}": { + "parameters": [ + { + "name": "transcriptionJobId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "operationId": "getTranscriptionJobs", + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTranscriptionJobsTranscriptionJobId" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/getTranscriptionJobs/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "getMany" + } + } + } + }, + "components": { + "schemas": { + "PostTranscriptionJobsRequest": { + "type": "object", + "properties": { + "compartmentId": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "inputLocation": { + "type": "object", + "properties": { + "locationType": { + "type": "string" + }, + "objectLocations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "bucketName": { + "type": "string" + }, + "namespaceName": { + "type": "string" + }, + "objectNames": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "modelDetails": { + "type": "object", + "properties": { + "languageCode": { + "type": "string" + }, + "modelType": { + "type": "string" + }, + "transcriptionSettings": { + "type": "object", + "properties": { + "diarization": { + "type": "object", + "properties": { + "isDiarizationEnabled": { + "type": "boolean" + }, + "numberOfSpeakers": { + "type": "integer" + } + } + } + } + } + } + }, + "outputLocation": { + "type": "object", + "properties": { + "bucketName": { + "type": "string" + }, + "namespaceName": { + "type": "string" + }, + "prefix": { + "type": "string" + } + } + } + } + }, + "PostTranscriptionJobsResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "compartmentId": { + "type": "string" + }, + "description": { + "nullable": true + }, + "modelDetails": { + "type": "object", + "properties": { + "modelType": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "languageCode": { + "type": "string" + }, + "transcriptionSettings": { + "type": "object", + "properties": { + "diarization": { + "type": "object", + "properties": { + "isDiarizationEnabled": { + "type": "boolean" + }, + "numberOfSpeakers": { + "type": "integer" + } + } + }, + "additionalSettings": { + "nullable": true + } + } + } + } + }, + "normalization": { + "type": "object", + "properties": { + "isPunctuationEnabled": { + "type": "boolean" + }, + "filters": { + "type": "array", + "items": {} + } + } + }, + "timeAccepted": { + "type": "string" + }, + "timeStarted": { + "nullable": true + }, + "timeFinished": { + "nullable": true + }, + "totalTasks": { + "type": "integer" + }, + "outstandingTasks": { + "type": "integer" + }, + "successfulTasks": { + "type": "integer" + }, + "ttlInDays": { + "type": "integer" + }, + "percentComplete": { + "type": "integer" + }, + "inputLocation": { + "type": "object", + "properties": { + "locationType": { + "type": "string" + }, + "objectLocations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "namespaceName": { + "type": "string" + }, + "bucketName": { + "type": "string" + }, + "objectNames": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "outputLocation": { + "type": "object", + "properties": { + "namespaceName": { + "type": "string" + }, + "bucketName": { + "type": "string" + }, + "prefix": { + "type": "string" + } + } + }, + "createdBy": { + "type": "string" + }, + "additionalTranscriptionFormats": { + "type": "array", + "items": {} + }, + "lifecycleState": { + "type": "string" + }, + "lifecycleDetails": { + "nullable": true + }, + "freeformTags": { + "type": "object" + }, + "definedTags": { + "type": "object", + "properties": { + "Oracle-Tags": { + "type": "object", + "properties": { + "CreatedBy": { + "type": "string" + }, + "CreatedOn": { + "type": "string" + } + } + } + } + }, + "systemTags": { + "type": "object" + } + } + }, + "GetTranscriptionJobsTranscriptionJobId": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "compartmentId": { + "type": "string" + }, + "description": { + "nullable": true + }, + "modelDetails": { + "type": "object", + "properties": { + "modelType": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "languageCode": { + "type": "string" + }, + "transcriptionSettings": { + "type": "object", + "properties": { + "diarization": { + "type": "object", + "properties": { + "isDiarizationEnabled": { + "type": "boolean" + }, + "numberOfSpeakers": { + "type": "integer" + } + } + }, + "additionalSettings": { + "nullable": true + } + } + } + } + }, + "normalization": { + "type": "object", + "properties": { + "isPunctuationEnabled": { + "type": "boolean" + }, + "filters": { + "type": "array", + "items": {} + } + } + }, + "timeAccepted": { + "type": "string" + }, + "timeStarted": { + "type": "string" + }, + "timeFinished": { + "type": "string" + }, + "totalTasks": { + "type": "integer" + }, + "outstandingTasks": { + "type": "integer" + }, + "successfulTasks": { + "type": "integer" + }, + "ttlInDays": { + "type": "integer" + }, + "percentComplete": { + "type": "integer" + }, + "inputLocation": { + "type": "object", + "properties": { + "locationType": { + "type": "string" + }, + "objectLocations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "namespaceName": { + "type": "string" + }, + "bucketName": { + "type": "string" + }, + "objectNames": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "outputLocation": { + "type": "object", + "properties": { + "namespaceName": { + "type": "string" + }, + "bucketName": { + "type": "string" + }, + "prefix": { + "type": "string" + } + } + }, + "createdBy": { + "type": "string" + }, + "additionalTranscriptionFormats": { + "type": "array", + "items": {} + }, + "lifecycleState": { + "type": "string" + }, + "lifecycleDetails": { + "nullable": true + }, + "freeformTags": { + "type": "object" + }, + "definedTags": { + "type": "object", + "properties": { + "Audit": { + "type": "object", + "properties": { + "creator": { + "type": "string" + } + } + } + } + }, + "systemTags": { + "type": "object" + } + } + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/request_application_json_vb.json b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/request_application_json_vb.json new file mode 100644 index 0000000..ed2c316 --- /dev/null +++ b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/request_application_json_vb.json @@ -0,0 +1,7 @@ +{ + "documents": [ + + +{ "key": "doc1", "text": " The video demonstrates the capabilities of the Oracle Cloud Language Service. Language detection and text classification capabilities are shown using pre-trained models. The named entity recognition capability can extract entities like organization names, product names, and geographic locations. The key phrase extraction capability identifies important terms and can be used to generate tags for documents. The sentiment analysis capability scores the sentiment of a text, identifying positive or negative sentiments. Custom models can be created to detect entities of interest. The Language Service also enables text translation for both plain and HTML text. Would you like me to help you with anything else regarding this demonstration? The text analysis features of Oracle Cloud Interface (OCI) include sentiment analysis, which determines how positive or negative a text is, and named entity recognition, which identifies entities such as people, places, and things. These features can be used to analyze customer feedback and survey results to track product and feature performance and drive improvements. The interface also has a text translation feature that can translate text from one language to another, while retaining HTML formatting. Additionally, OCI can identify and mask personal identifiable information in text. OCI also enables you to create custom models for text classification, which can be tailored to your specific needs. You can train these models on your own dataset and they will perform better on classification tasks specific to your domain compared to pre-trained models. Overall, OCI's text analysis capabilities can help businesses and developers gain valuable insights from text data and make informed decisions. Would you like help with anything else regarding OCI, or text analysis? Companies may require specific language models for their industry or use case, which cannot be covered by general models. To train a custom language model, companies must first prepare a training dataset specific to their use case. For a custom text classification model, this comes in the form of a CSV file, with one column containing the text to be classified and another column containing the labels or categories to which the text should be classified. Once the dataset is prepared, it needs to be uploaded to object storage. Then, a project must be created in the OCI Language Console, followed by the creation of a text classification model. The training data for the model should be selected from object storage, and the model should be named. After reviewing the training details, the model will begin training, and users can monitor its progress. Once training is complete, users can review metrics such as precision, recall, and F1 score to determine if the model is ready for production. If the model is accurate enough, a model endpoint is created, and the model is ready to run inference. For example, the model can categorize an email requesting a refund for a cancelled flight as a cancellation and predict that the customer is asking for a refund, identifying two categories accurately. Companies can use the Object Storage, Data Labelling Service, and Language Services available through Oracle Cloud Infrastructure (OCI) to create and run a named entity recognition (NER) model to identify and extract specific data points from offer letters, such as position names, hire names, and hiring managers. After labelling the training data set using the Data Labelling Service, upload it to Object Storage and create the NER model within the Language Service. You can then create a model endpoint and use the Text Classification feature to analyse and extract information from new documents. Ready-to-use models are available through the Language Service for text analysis and classification, but custom models can also be created without prior machine learning or data science experience. The service also provides translation APIs for text and HTML content. Businesses can utilise OCI's Language Service to automate the extraction of important data from documents such as offer letters, minimising manual labour and reducing the risk of errors. This summary provides an overview of how to use OCI's Language Service to create an NER model for processing offer letters and extracting relevant data points. It also highlights the benefits of using ready-to-use models and translation APIs within the Language Service" } + ] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/response_default_application_json_vb.json new file mode 100644 index 0000000..e023184 --- /dev/null +++ b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/DetectLanguageEntities/response_default_application_json_vb.json @@ -0,0 +1,73 @@ +{ + "documents": [ + { + "key": "doc1", + "entities": [ + { + "offset": 1, + "length": 15, + "text": "Red Bull Racing", + "type": "ORGANIZATION", + "subType": null, + "score": 0.9914557536443075, + "metaInfo": null + }, + { + "offset": 17, + "length": 5, + "text": "Honda", + "type": "ORGANIZATION", + "subType": null, + "score": 0.6515498757362366, + "metaInfo": null + }, + { + "offset": 28, + "length": 9, + "text": "four-time", + "type": "QUANTITY", + "subType": null, + "score": 0.9998091459274292, + "metaInfo": [ + { + "offset": 28, + "length": 9, + "text": "four-time", + "subType": "UNIT", + "score": 0.9998091459274292 + } + ] + }, + { + "offset": 48, + "length": 5, + "text": "World", + "type": "LOCATION", + "subType": "NON_GPE", + "score": 0.582543671131134, + "metaInfo": null + }, + { + "offset": 80, + "length": 27, + "text": "Oracle Cloud Infrastructure", + "type": "ORGANIZATION", + "subType": null, + "score": 0.998045802116394, + "metaInfo": null + }, + { + "offset": 109, + "length": 3, + "text": "OCI", + "type": "ORGANIZATION", + "subType": null, + "score": 0.9986366033554077, + "metaInfo": null + } + ], + "languageCode": "en" + } + ], + "errors": [] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postBatchDetectLanguageSentiments/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postBatchDetectLanguageSentiments/response_default_application_json_vb.json new file mode 100644 index 0000000..4357445 --- /dev/null +++ b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postBatchDetectLanguageSentiments/response_default_application_json_vb.json @@ -0,0 +1,26 @@ +{ + "documents": [ + { + "key": "doc1", + "documentSentiment": "", + "documentScores": {}, + "sentences": [], + "aspects": [ + { + "offset": 322, + "length": 9, + "text": "resources", + "sentiment": "Positive", + "scores": { + "Positive": 0.9814186299929331, + "Negative": 0.016609141881639276, + "Neutral": 0, + "Mixed": 0.001972228125427651 + } + } + ], + "languageCode": "en" + } + ], + "errors": [] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postDetectLanguageSentiments/request_application_json_vb.json b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postDetectLanguageSentiments/request_application_json_vb.json new file mode 100644 index 0000000..8c9ed23 --- /dev/null +++ b/ai-meetings/VBCS Project/services/SentimentAnalysis/examples/postDetectLanguageSentiments/request_application_json_vb.json @@ -0,0 +1,8 @@ +{ +"documents": [ + { + "key" : "doc1", + "text" : "OCI recently added new services to existing compliance program including SOC, HIPAA, and ISO to enable our customers to solve their use cases. We also released new white papers and guidance documents related to Object Storage, the Australian Prudential Regulation Authority (APRA), and the Central Bank of Brazil. These resources help regulated customers better understand how OCI supports their regional and industry-specific compliance requirements. Not only are we expanding our number of compliance offerings and regulatory alignments, we continue to add regions and services at a faster clip." + } +] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/SentimentAnalysis/openapi3.json b/ai-meetings/VBCS Project/services/SentimentAnalysis/openapi3.json new file mode 100644 index 0000000..104f9cc --- /dev/null +++ b/ai-meetings/VBCS Project/services/SentimentAnalysis/openapi3.json @@ -0,0 +1,289 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Sentiment Analysis", + "version": "1.0.0" + }, + "servers": [ + { + "url": "vb-catalog://backends/Language" + } + ], + "paths": { + "/batchDetectLanguageSentiments": { + "post": { + "operationId": "postBatchDetectLanguageSentiments", + "parameters": [ + { + "name": "level", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostDetectLanguageSentimentsRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/postDetectLanguageSentiments/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostBatchDetectLanguageSentimentsResponse" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/postBatchDetectLanguageSentiments/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "create", + "queryParameters": {} + } + } + }, + "/batchDetectLanguageEntities": { + "post": { + "operationId": "DetectLanguageEntities", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostBatchDetectLanguageEntitiesRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/DetectLanguageEntities/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostBatchDetectLanguageEntitiesResponse" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/DetectLanguageEntities/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "getMany" + } + } + } + }, + "components": { + "schemas": { + "PostDetectLanguageSentimentsRequest": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + } + } + }, + "PostBatchDetectLanguageSentimentsResponse": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "documentSentiment": { + "type": "string" + }, + "documentScores": { + "type": "object" + }, + "sentences": { + "type": "array", + "items": {} + }, + "aspects": { + "type": "array", + "items": { + "type": "object", + "properties": { + "offset": { + "type": "integer" + }, + "length": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "sentiment": { + "type": "string" + }, + "scores": { + "type": "object", + "properties": { + "Positive": { + "type": "number" + }, + "Negative": { + "type": "number" + }, + "Neutral": { + "type": "integer" + }, + "Mixed": { + "type": "number" + } + } + } + } + } + }, + "languageCode": { + "type": "string" + } + } + } + }, + "errors": { + "type": "array", + "items": {} + } + } + }, + "PostBatchDetectLanguageEntitiesRequest": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + } + } + }, + "PostBatchDetectLanguageEntitiesResponse": { + "type": "object", + "properties": { + "documents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "entities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "offset": { + "type": "integer" + }, + "length": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string" + }, + "subType": { + "type": "string" + }, + "score": { + "type": "number" + }, + "metaInfo": { + "type": "array", + "items": { + "type": "object", + "properties": { + "offset": { + "type": "integer" + }, + "length": { + "type": "integer" + }, + "text": { + "type": "string" + }, + "subType": { + "type": "string" + }, + "score": { + "type": "number" + } + } + } + } + } + } + }, + "languageCode": { + "type": "string" + } + } + } + }, + "errors": { + "type": "array", + "items": {} + } + } + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Storage/examples/createPAR/request_application_json_vb.json b/ai-meetings/VBCS Project/services/Storage/examples/createPAR/request_application_json_vb.json new file mode 100644 index 0000000..c2025be --- /dev/null +++ b/ai-meetings/VBCS Project/services/Storage/examples/createPAR/request_application_json_vb.json @@ -0,0 +1,6 @@ +{ +"accessType": "ObjectRead", +"name": "PARTest", +"objectName": "id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/wedoinfra_AI_Meetings_3b63a754-8214-4955-839e-d9c3cec24eac.mp3.json", +"timeExpires": "2024-08-13T16:08:44+02:00" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Storage/examples/createPAR/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/Storage/examples/createPAR/response_default_application_json_vb.json new file mode 100644 index 0000000..41b3f21 --- /dev/null +++ b/ai-meetings/VBCS Project/services/Storage/examples/createPAR/response_default_application_json_vb.json @@ -0,0 +1,12 @@ +{ + "accessUri": "/p/sc4Sw0PCw59zmUbV8Gw35QARMHPBmHiGffJeIte03ixWfdSwrb5E15_hQePJi4vH/n/wedoinfra/b/AI_Meetings/o/id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/wedoinfra_AI_Meetings_3b63a754-8214-4955-839e-d9c3cec24eac.mp3.json", + "id": "qR3qHebpM4JjDCZHnyL/oDMJyvWgxR0ozsorqWsfveKn60ea0YcDqy1U+2uOMxHA:id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/wedoinfra_AI_Meetings_3b63a754-8214-4955-839e-d9c3cec24eac.mp3.json", + "name": "PARTest", + "accessType": "ObjectRead", + "bucketListingAction": null, + "objectName": "id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/wedoinfra_AI_Meetings_3b63a754-8214-4955-839e-d9c3cec24eac.mp3.json", + "timeCreated": "2024-05-27T09:57:37.471Z", + "timeExpires": "2024-08-13T14:08:44Z", + "queryObjectDetails": null, + "fullPath": "https://wedoinfra.objectstorage.eu-frankfurt-1.oci.customer-oci.com/p/sc4Sw0PCw59zmUbV8Gw35QARMHPBmHiGffJeIte03ixWfdSwrb5E15_hQePJi4vH/n/wedoinfra/b/AI_Meetings/o/id8bb87ba3aa3f403c8fcd0ee3e924bf9b/job-amaaaaaaqtij3maawinnrnqbu6jhuft3r472crmi6wjqh2x3fthlmzclnsoq/wedoinfra_AI_Meetings_3b63a754-8214-4955-839e-d9c3cec24eac.mp3.json" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Storage/examples/getObject/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/Storage/examples/getObject/response_default_application_json_vb.json new file mode 100644 index 0000000..90757ed --- /dev/null +++ b/ai-meetings/VBCS Project/services/Storage/examples/getObject/response_default_application_json_vb.json @@ -0,0 +1 @@ +"{\"status\":\"SUCCESS\",\"timeCreated\":\"2024-05-23 10:37:40.027\",\"modelDetails\":{\"domain\":\"GENERIC\",\"languageCode\":\"en\"},\"audioFormatDetails\":{\"format\":\"MPEG\",\"numberOfChannels\":2,\"encoding\":\"MPEG\",\"sampleRateInHz\":44100},\"transcriptions\":[{\"transcription\":\"Well, so Mrs. Julia, right? Julia Flores, you have credit with my bank right now. We are going to make the purchase of debt of these two credits. They have given me a fee here to 19. We are going to offer you a more suitable fee. Now, your business tells me what you have, what activities you do. What is the name of the beer sale? How many boxes do you work with? I started with 20 boxes. Where do you buy them? I buy them... Well, right now I'm not taking them directly to where they sell them. I buy them from my sister-in-law. Your sister-in-law who has the code? Yes, the one who has the code. And what price does your aunt sell it to you? The same as the car? Yes, the same. Ah, yes. I'm just going to write it down. Ah, that's what I need. Yes, there are also the vouchers. Yes, there are also the vouchers. And do you sell those by unit or by box? By unit and if you want by box, also by box. Ah, how do you sell it per unit? It's 78... Ah, by unit it's 650. 650? Yes, the box is 78 soles. And do you buy them? I buy the box at 63 .30. And tell me, apart from your beer, what else do you do? As I told you, I make this mix, but it's just to deliver. To deliver? Yes. What day? Sundays? Sundays. Sundays. And on Saturdays, I make this mix, what is it? How do you call it? Sarchipapa. Only on Saturdays? On Saturdays and Sundays. Friday and Saturday at night? Yes, Friday and Saturday. What time do you go out? Alas, I've been a car, I took the car, and now I'm in the car. Yes, that's That's it. It's 19 .70, that's good. Your chips on weekends, your fries on Sundays, your beer. What else? And my animals, as I told you, I have chickens. What do you raise? Chickens and pups. Are those for raising or just to fatten up and sell? To fatten up and sell. How long have you been here? I've been living here for 27 years. Where do you sell your animals? In the market. The lady asks me to bring her two pigs. For example, I lost my mother. How much do you sell your pigs? 33 pesos per kilo. How much do you spend on food? Well, I buy them a sack of concentrate for everyone. Almost a month. A month. And how much does the sack cost? It costs $120. $120. And how many animals do you get for animals do you have? I have 25 chickens and 10 pigs. I have like 35 animals. 35 animals. And that's what I've killed. Of course. And that's what you reinforce with food from the newspaper, right? Vegetables, all that stuff. That's fine. Yes, because it is also expensive to buy a lot of food, right? Concentrated, all that. Yes, that too. There you help it with all the permission. With alfalfa, yes. I help them with alfalfa, food that I have left. Sometimes they also come to me and say, I want lunch so that they have me, for example, on Saturdays or Sundays, and on Saturdays, just what they ask me for, and I bring it. And here you mainly sell it to your neighbors or some other company around here? No, me for example, well sometimes my neighbors and in the market also the ladies who know me want lunch and they already let me know, they bring me lunch and I take them. How long have you been here? Since Saturday and Sunday. You are already known? Yes, I am already known. This is your own house, right? Yes, this is my own house. What document do you have? The title of the property. In your name and your husband's? Yes, both of them. What does your husband do? He works, he is a teacher. But he is hired. What does he do? He works in Tambo Grande and also makes his guitars. And he sells them here in the market? Also. At the university, sometimes the guys from the university come and make a contract with a guitar and they sell the guitar for $350. And how much material will be spent? Material? I don't know, but yes, that's how it is. Because he buys the wood in quantity so that it works for him too. He buys the tail, Big bowls, big dinners, big bottles, big It's like a small workshop. Of course, it's a small workshop. It's up there. Yes, yes, Rubia showed us the pictures. Tell me, these loans from my bank, how did you invest them? Well, to finish building the walls of the second floor. Since I still had material that I had left from this light roof, we completed it there, and then we took it out. All of your house is new material, right? How much is it? It's 7x7, I think it has... 7x7, there it is. More, more. In the property estate, it's there. In the property estate, I have the other ones. You will not need a little more money to invest in your lucir, because we are practically buying it from Ivanko, but what are you going to get? 2 ,000 soles. You will not need more to invest in your business and you will end up with the thing is that I don't get almost the same pay as at the bar. So it's fine there, because look, you're only working, your husband has consumption. Because it's going to be more or less like 4 ,500. Oh yeah, so it's going to be left. The idea is the following, right? With this debt purchase, for example, it has been for construction, right? But you later, suddenly you want a capital of work, it is not necessary that you go to my bank, we can give you a parallel of a small amount, 1 ,000 soles, 2 ,000 soles, for your business, right? Of course. For you to turn your business around, because we know that in the end you move everything, Your business with capital like this, with, I don't know, for you to buy beer, for you to buy cigarettes, and that is fast. Unlike a credit that is for construction, that sometimes takes time, it is silver, so to speak, it is not a dead investment, so to speak, because the house is not going to give you to pay. On the other hand, businesses do need money so that you give them any case, if you need it that way, we are going to make the purchase of debt, you cancel it and then withdraw the difference. Right there, on the same day, there is no problem, just bring us the vouchers because the lady has to enter them into the system. And if you later, two or three months, you want a parallel, a small amount, a thousand or two thousand soles for your business, We can also see you. Only punctuality, as you have been working with Iván. Here we are going to give you a special fee. That would be all for our visit. We have to take a picture. Thank you. Come here to take a picture please.\",\"confidence\":\"0.6764\",\"speakerCount\":2,\"tokens\":[{\"token\":\"Well,\",\"startTime\":\"5.040s\",\"endTime\":\"5.720s\",\"confidence\":\"0.1159\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"so\",\"startTime\":\"6.120s\",\"endTime\":\"6.160s\",\"confidence\":\"0.4029\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Mrs.\",\"startTime\":\"6.160s\",\"endTime\":\"6.780s\",\"confidence\":\"0.4180\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Julia,\",\"startTime\":\"8.260s\",\"endTime\":\"8.360s\",\"confidence\":\"0.8270\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"right?\",\"startTime\":\"8.580s\",\"endTime\":\"8.640s\",\"confidence\":\"0.7829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Julia\",\"startTime\":\"8.980s\",\"endTime\":\"9.220s\",\"confidence\":\"0.4050\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Flores,\",\"startTime\":\"9.220s\",\"endTime\":\"9.460s\",\"confidence\":\"0.9409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"9.800s\",\"endTime\":\"10.080s\",\"confidence\":\"0.7739\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"10.080s\",\"endTime\":\"10.560s\",\"confidence\":\"0.9390\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"credit\",\"startTime\":\"10.560s\",\"endTime\":\"11.040s\",\"confidence\":\"0.7850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"11.040s\",\"endTime\":\"11.280s\",\"confidence\":\"0.8659\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"my\",\"startTime\":\"11.280s\",\"endTime\":\"11.500s\",\"confidence\":\"0.9470\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"bank\",\"startTime\":\"11.500s\",\"endTime\":\"11.700s\",\"confidence\":\"0.9729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right\",\"startTime\":\"11.700s\",\"endTime\":\"11.900s\",\"confidence\":\"0.4339\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"now.\",\"startTime\":\"11.900s\",\"endTime\":\"11.960s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"We\",\"startTime\":\"12.000s\",\"endTime\":\"12.160s\",\"confidence\":\"0.5799\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"12.160s\",\"endTime\":\"12.220s\",\"confidence\":\"0.6800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"12.220s\",\"endTime\":\"12.230s\",\"confidence\":\"0.9819\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"12.230s\",\"endTime\":\"12.340s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"make\",\"startTime\":\"12.340s\",\"endTime\":\"12.460s\",\"confidence\":\"0.4920\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"12.460s\",\"endTime\":\"12.700s\",\"confidence\":\"0.8989\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"purchase\",\"startTime\":\"12.700s\",\"endTime\":\"12.840s\",\"confidence\":\"0.2890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"12.840s\",\"endTime\":\"13.000s\",\"confidence\":\"0.8759\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"debt\",\"startTime\":\"13.000s\",\"endTime\":\"13.100s\",\"confidence\":\"0.5279\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"13.100s\",\"endTime\":\"13.320s\",\"confidence\":\"0.7519\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"these\",\"startTime\":\"13.320s\",\"endTime\":\"13.540s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"two\",\"startTime\":\"13.540s\",\"endTime\":\"13.840s\",\"confidence\":\"0.8190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"credits.\",\"startTime\":\"13.840s\",\"endTime\":\"14.140s\",\"confidence\":\"0.8090\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"They\",\"startTime\":\"14.440s\",\"endTime\":\"14.680s\",\"confidence\":\"0.6690\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"14.680s\",\"endTime\":\"14.720s\",\"confidence\":\"0.7979\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"given\",\"startTime\":\"14.720s\",\"endTime\":\"15.040s\",\"confidence\":\"0.7889\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"me\",\"startTime\":\"15.040s\",\"endTime\":\"15.360s\",\"confidence\":\"0.4510\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"15.360s\",\"endTime\":\"15.370s\",\"confidence\":\"0.7839\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fee\",\"startTime\":\"15.370s\",\"endTime\":\"15.440s\",\"confidence\":\"0.4180\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here\",\"startTime\":\"15.440s\",\"endTime\":\"15.880s\",\"confidence\":\"0.6930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"15.880s\",\"endTime\":\"16.920s\",\"confidence\":\"0.4029\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"19.\",\"startTime\":\"16.920s\",\"endTime\":\"18.060s\",\"confidence\":\"0.5910\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"We\",\"startTime\":\"19.260s\",\"endTime\":\"19.740s\",\"confidence\":\"0.5199\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"19.740s\",\"endTime\":\"20.080s\",\"confidence\":\"0.8500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"20.080s\",\"endTime\":\"20.160s\",\"confidence\":\"0.8980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"20.160s\",\"endTime\":\"20.260s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"offer\",\"startTime\":\"20.260s\",\"endTime\":\"20.440s\",\"confidence\":\"0.9490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"20.440s\",\"endTime\":\"20.560s\",\"confidence\":\"0.9750\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"20.560s\",\"endTime\":\"20.620s\",\"confidence\":\"0.4720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"more\",\"startTime\":\"20.620s\",\"endTime\":\"21.660s\",\"confidence\":\"0.5820\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"suitable\",\"startTime\":\"21.660s\",\"endTime\":\"22.840s\",\"confidence\":\"0.4399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fee.\",\"startTime\":\"22.840s\",\"endTime\":\"22.850s\",\"confidence\":\"0.7480\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Now,\",\"startTime\":\"25.040s\",\"endTime\":\"25.520s\",\"confidence\":\"0.6959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"25.760s\",\"endTime\":\"25.800s\",\"confidence\":\"0.7039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business\",\"startTime\":\"25.800s\",\"endTime\":\"26.160s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"tells\",\"startTime\":\"26.160s\",\"endTime\":\"26.560s\",\"confidence\":\"0.7210\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"me\",\"startTime\":\"26.560s\",\"endTime\":\"26.880s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"26.880s\",\"endTime\":\"27.280s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"27.280s\",\"endTime\":\"27.400s\",\"confidence\":\"0.5559\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have,\",\"startTime\":\"27.400s\",\"endTime\":\"27.900s\",\"confidence\":\"0.9010\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"28.240s\",\"endTime\":\"28.400s\",\"confidence\":\"0.9179\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"activities\",\"startTime\":\"28.400s\",\"endTime\":\"28.900s\",\"confidence\":\"0.6729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"28.900s\",\"endTime\":\"28.960s\",\"confidence\":\"0.8330\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do.\",\"startTime\":\"28.960s\",\"endTime\":\"29.400s\",\"confidence\":\"0.6090\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"What\",\"startTime\":\"30.330s\",\"endTime\":\"31.050s\",\"confidence\":\"0.0520\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"31.050s\",\"endTime\":\"31.290s\",\"confidence\":\"0.5329\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"31.290s\",\"endTime\":\"31.670s\",\"confidence\":\"0.8019\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"name\",\"startTime\":\"31.670s\",\"endTime\":\"31.680s\",\"confidence\":\"0.7879\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"of\",\"startTime\":\"31.680s\",\"endTime\":\"31.670s\",\"confidence\":\"0.9409\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"31.670s\",\"endTime\":\"31.970s\",\"confidence\":\"0.5690\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"beer\",\"startTime\":\"31.970s\",\"endTime\":\"32.430s\",\"confidence\":\"0.8930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sale?\",\"startTime\":\"32.430s\",\"endTime\":\"32.440s\",\"confidence\":\"0.1080\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"33.250s\",\"endTime\":\"33.590s\",\"confidence\":\"0.4129\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"many\",\"startTime\":\"33.590s\",\"endTime\":\"34.810s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"boxes\",\"startTime\":\"34.810s\",\"endTime\":\"34.910s\",\"confidence\":\"0.9039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"34.910s\",\"endTime\":\"34.950s\",\"confidence\":\"0.3459\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"34.950s\",\"endTime\":\"34.970s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"work\",\"startTime\":\"34.970s\",\"endTime\":\"35.090s\",\"confidence\":\"0.3190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with?\",\"startTime\":\"35.090s\",\"endTime\":\"35.100s\",\"confidence\":\"0.8669\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"I\",\"startTime\":\"35.110s\",\"endTime\":\"35.120s\",\"confidence\":\"0.7549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"started\",\"startTime\":\"35.120s\",\"endTime\":\"35.350s\",\"confidence\":\"0.4810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"with\",\"startTime\":\"35.350s\",\"endTime\":\"35.470s\",\"confidence\":\"0.8190\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"20\",\"startTime\":\"35.470s\",\"endTime\":\"35.890s\",\"confidence\":\"0.8349\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"boxes.\",\"startTime\":\"35.890s\",\"endTime\":\"36.750s\",\"confidence\":\"0.9120\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Where\",\"startTime\":\"39.210s\",\"endTime\":\"39.670s\",\"confidence\":\"0.3540\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"39.670s\",\"endTime\":\"39.680s\",\"confidence\":\"0.9169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"39.680s\",\"endTime\":\"39.870s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"buy\",\"startTime\":\"39.870s\",\"endTime\":\"40.250s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them?\",\"startTime\":\"40.250s\",\"endTime\":\"40.260s\",\"confidence\":\"0.8870\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"I\",\"startTime\":\"40.770s\",\"endTime\":\"41.250s\",\"confidence\":\"0.6330\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buy\",\"startTime\":\"41.250s\",\"endTime\":\"41.570s\",\"confidence\":\"0.8180\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them...\",\"startTime\":\"41.570s\",\"endTime\":\"41.710s\",\"confidence\":\"0.6129\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Well,\",\"startTime\":\"41.710s\",\"endTime\":\"42.230s\",\"confidence\":\"0.2590\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"right\",\"startTime\":\"42.470s\",\"endTime\":\"42.490s\",\"confidence\":\"0.2770\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"now\",\"startTime\":\"42.490s\",\"endTime\":\"42.790s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I'm\",\"startTime\":\"42.790s\",\"endTime\":\"43.330s\",\"confidence\":\"0.7120\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"not\",\"startTime\":\"43.330s\",\"endTime\":\"43.340s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"taking\",\"startTime\":\"43.340s\",\"endTime\":\"43.670s\",\"confidence\":\"0.1829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them\",\"startTime\":\"43.670s\",\"endTime\":\"43.680s\",\"confidence\":\"0.9570\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"directly\",\"startTime\":\"43.680s\",\"endTime\":\"44.370s\",\"confidence\":\"0.5590\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"44.370s\",\"endTime\":\"45.050s\",\"confidence\":\"0.3659\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"where\",\"startTime\":\"45.050s\",\"endTime\":\"46.190s\",\"confidence\":\"0.4280\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"46.190s\",\"endTime\":\"46.230s\",\"confidence\":\"0.9210\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sell\",\"startTime\":\"46.230s\",\"endTime\":\"46.490s\",\"confidence\":\"0.6930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them.\",\"startTime\":\"46.490s\",\"endTime\":\"46.630s\",\"confidence\":\"0.7179\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"47.570s\",\"endTime\":\"47.930s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buy\",\"startTime\":\"47.930s\",\"endTime\":\"48.210s\",\"confidence\":\"0.8989\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them\",\"startTime\":\"48.210s\",\"endTime\":\"48.370s\",\"confidence\":\"0.7900\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"from\",\"startTime\":\"48.370s\",\"endTime\":\"48.380s\",\"confidence\":\"0.5360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"my\",\"startTime\":\"48.380s\",\"endTime\":\"48.530s\",\"confidence\":\"0.7990\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sister-in-law.\",\"startTime\":\"48.530s\",\"endTime\":\"48.810s\",\"confidence\":\"0.7749\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Your\",\"startTime\":\"49.530s\",\"endTime\":\"49.590s\",\"confidence\":\"0.5030\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sister-in-law\",\"startTime\":\"49.590s\",\"endTime\":\"49.910s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"who\",\"startTime\":\"49.910s\",\"endTime\":\"50.030s\",\"confidence\":\"0.4830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"has\",\"startTime\":\"50.030s\",\"endTime\":\"50.270s\",\"confidence\":\"0.8470\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"50.270s\",\"endTime\":\"50.410s\",\"confidence\":\"0.9419\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"code?\",\"startTime\":\"50.410s\",\"endTime\":\"50.570s\",\"confidence\":\"0.7870\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"50.730s\",\"endTime\":\"51.090s\",\"confidence\":\"0.7929\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"51.090s\",\"endTime\":\"51.370s\",\"confidence\":\"0.1780\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"one\",\"startTime\":\"51.370s\",\"endTime\":\"51.390s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"who\",\"startTime\":\"51.390s\",\"endTime\":\"51.470s\",\"confidence\":\"0.6850\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"has\",\"startTime\":\"51.470s\",\"endTime\":\"51.750s\",\"confidence\":\"0.9629\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"51.750s\",\"endTime\":\"51.760s\",\"confidence\":\"0.5080\",\"type\":\"WORD\"},{\"token\":\"code.\",\"startTime\":\"51.760s\",\"endTime\":\"51.750s\",\"confidence\":\"0.9810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"51.870s\",\"endTime\":\"51.990s\",\"confidence\":\"0.7390\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"51.990s\",\"endTime\":\"52.290s\",\"confidence\":\"0.4160\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"price\",\"startTime\":\"52.290s\",\"endTime\":\"52.570s\",\"confidence\":\"0.8370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"does\",\"startTime\":\"52.570s\",\"endTime\":\"52.580s\",\"confidence\":\"0.8270\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"52.580s\",\"endTime\":\"52.630s\",\"confidence\":\"0.5960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"aunt\",\"startTime\":\"52.630s\",\"endTime\":\"52.640s\",\"confidence\":\"0.7459\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"52.640s\",\"endTime\":\"52.970s\",\"confidence\":\"0.7340\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"52.970s\",\"endTime\":\"52.980s\",\"confidence\":\"0.7500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"52.980s\",\"endTime\":\"53.010s\",\"confidence\":\"0.7789\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you?\",\"startTime\":\"53.010s\",\"endTime\":\"53.020s\",\"confidence\":\"0.5830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"The\",\"startTime\":\"54.200s\",\"endTime\":\"54.640s\",\"confidence\":\"0.0160\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"same\",\"startTime\":\"54.640s\",\"endTime\":\"54.650s\",\"confidence\":\"0.3479\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"as\",\"startTime\":\"54.650s\",\"endTime\":\"54.760s\",\"confidence\":\"0.4250\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"54.760s\",\"endTime\":\"55.680s\",\"confidence\":\"0.7450\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"car?\",\"startTime\":\"55.680s\",\"endTime\":\"55.900s\",\"confidence\":\"0.4760\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"56.080s\",\"endTime\":\"56.260s\",\"confidence\":\"0.4099\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"56.340s\",\"endTime\":\"56.560s\",\"confidence\":\"0.6240\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"same.\",\"startTime\":\"56.560s\",\"endTime\":\"56.570s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Ah,\",\"startTime\":\"58.042s\",\"endTime\":\"58.782s\",\"confidence\":\"0.1099\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"yes.\",\"startTime\":\"58.782s\",\"endTime\":\"59.182s\",\"confidence\":\"0.7730\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I'm\",\"startTime\":\"59.282s\",\"endTime\":\"59.862s\",\"confidence\":\"0.4070\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"just\",\"startTime\":\"59.862s\",\"endTime\":\"59.872s\",\"confidence\":\"0.4420\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"going\",\"startTime\":\"59.872s\",\"endTime\":\"60.042s\",\"confidence\":\"0.7039\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"60.042s\",\"endTime\":\"60.722s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"write\",\"startTime\":\"60.722s\",\"endTime\":\"60.732s\",\"confidence\":\"0.6999\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"60.732s\",\"endTime\":\"60.922s\",\"confidence\":\"0.2140\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"down.\",\"startTime\":\"60.922s\",\"endTime\":\"60.932s\",\"confidence\":\"0.5870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Ah,\",\"startTime\":\"61.202s\",\"endTime\":\"61.542s\",\"confidence\":\"0.2579\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that's\",\"startTime\":\"61.542s\",\"endTime\":\"61.842s\",\"confidence\":\"0.8429\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"what\",\"startTime\":\"61.842s\",\"endTime\":\"61.882s\",\"confidence\":\"0.9589\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"61.882s\",\"endTime\":\"62.162s\",\"confidence\":\"0.7450\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"need.\",\"startTime\":\"62.162s\",\"endTime\":\"62.242s\",\"confidence\":\"0.1720\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"62.622s\",\"endTime\":\"63.222s\",\"confidence\":\"0.1159\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"there\",\"startTime\":\"63.222s\",\"endTime\":\"63.232s\",\"confidence\":\"0.4219\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"are\",\"startTime\":\"63.232s\",\"endTime\":\"63.222s\",\"confidence\":\"0.7469\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"also\",\"startTime\":\"63.222s\",\"endTime\":\"63.232s\",\"confidence\":\"0.4950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"63.232s\",\"endTime\":\"63.562s\",\"confidence\":\"0.8199\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"vouchers.\",\"startTime\":\"63.562s\",\"endTime\":\"63.902s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"63.902s\",\"endTime\":\"63.912s\",\"confidence\":\"0.2370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"there\",\"startTime\":\"64.522s\",\"endTime\":\"64.582s\",\"confidence\":\"0.6470\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"are\",\"startTime\":\"64.582s\",\"endTime\":\"64.802s\",\"confidence\":\"0.9309\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"also\",\"startTime\":\"64.802s\",\"endTime\":\"64.902s\",\"confidence\":\"0.8759\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"64.902s\",\"endTime\":\"65.042s\",\"confidence\":\"0.9700\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"vouchers.\",\"startTime\":\"65.042s\",\"endTime\":\"65.402s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"66.602s\",\"endTime\":\"67.202s\",\"confidence\":\"0.5339\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"67.202s\",\"endTime\":\"67.422s\",\"confidence\":\"0.3019\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"67.422s\",\"endTime\":\"67.542s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"67.542s\",\"endTime\":\"67.902s\",\"confidence\":\"0.9729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"those\",\"startTime\":\"67.902s\",\"endTime\":\"67.912s\",\"confidence\":\"0.4839\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"by\",\"startTime\":\"67.912s\",\"endTime\":\"68.042s\",\"confidence\":\"0.3389\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"unit\",\"startTime\":\"68.042s\",\"endTime\":\"68.402s\",\"confidence\":\"0.7419\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"or\",\"startTime\":\"68.402s\",\"endTime\":\"68.622s\",\"confidence\":\"0.8539\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"by\",\"startTime\":\"68.622s\",\"endTime\":\"68.882s\",\"confidence\":\"0.6510\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"box?\",\"startTime\":\"68.882s\",\"endTime\":\"68.922s\",\"confidence\":\"0.7720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"By\",\"startTime\":\"68.922s\",\"endTime\":\"69.202s\",\"confidence\":\"0.9290\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"unit\",\"startTime\":\"69.202s\",\"endTime\":\"69.642s\",\"confidence\":\"0.9599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"69.642s\",\"endTime\":\"70.162s\",\"confidence\":\"0.4339\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"if\",\"startTime\":\"70.162s\",\"endTime\":\"70.262s\",\"confidence\":\"0.7080\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"70.262s\",\"endTime\":\"70.282s\",\"confidence\":\"0.4729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"want\",\"startTime\":\"70.282s\",\"endTime\":\"70.602s\",\"confidence\":\"0.9599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"by\",\"startTime\":\"70.602s\",\"endTime\":\"70.742s\",\"confidence\":\"0.5310\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"box,\",\"startTime\":\"70.742s\",\"endTime\":\"70.982s\",\"confidence\":\"0.9290\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"also\",\"startTime\":\"71.162s\",\"endTime\":\"71.362s\",\"confidence\":\"0.6399\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"by\",\"startTime\":\"71.362s\",\"endTime\":\"71.482s\",\"confidence\":\"0.9210\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"box.\",\"startTime\":\"71.482s\",\"endTime\":\"71.762s\",\"confidence\":\"0.9689\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Ah,\",\"startTime\":\"71.822s\",\"endTime\":\"72.042s\",\"confidence\":\"0.4819\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"how\",\"startTime\":\"72.102s\",\"endTime\":\"72.222s\",\"confidence\":\"0.9629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"72.222s\",\"endTime\":\"72.282s\",\"confidence\":\"0.8849\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"72.282s\",\"endTime\":\"72.602s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"72.602s\",\"endTime\":\"72.612s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"72.612s\",\"endTime\":\"72.642s\",\"confidence\":\"0.4040\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"per\",\"startTime\":\"72.642s\",\"endTime\":\"72.842s\",\"confidence\":\"0.3370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"unit?\",\"startTime\":\"72.842s\",\"endTime\":\"73.142s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"It's\",\"startTime\":\"73.422s\",\"endTime\":\"73.822s\",\"confidence\":\"0.4959\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"78...\",\"startTime\":\"73.822s\",\"endTime\":\"74.842s\",\"confidence\":\"0.5360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Ah,\",\"startTime\":\"74.842s\",\"endTime\":\"75.022s\",\"confidence\":\"0.3170\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"by\",\"startTime\":\"75.702s\",\"endTime\":\"76.802s\",\"confidence\":\"0.1909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"unit\",\"startTime\":\"76.802s\",\"endTime\":\"77.162s\",\"confidence\":\"0.8970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it's\",\"startTime\":\"77.162s\",\"endTime\":\"77.502s\",\"confidence\":\"0.6679\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"650.\",\"startTime\":\"77.502s\",\"endTime\":\"78.302s\",\"confidence\":\"0.3930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"650?\",\"startTime\":\"78.642s\",\"endTime\":\"79.242s\",\"confidence\":\"0.8349\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"79.422s\",\"endTime\":\"79.722s\",\"confidence\":\"0.9499\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"79.802s\",\"endTime\":\"79.842s\",\"confidence\":\"0.8939\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"box\",\"startTime\":\"79.842s\",\"endTime\":\"80.142s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"80.142s\",\"endTime\":\"80.602s\",\"confidence\":\"0.6140\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"78\",\"startTime\":\"80.602s\",\"endTime\":\"81.362s\",\"confidence\":\"0.9670\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"soles.\",\"startTime\":\"81.362s\",\"endTime\":\"81.982s\",\"confidence\":\"0.7239\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"82.022s\",\"endTime\":\"82.342s\",\"confidence\":\"0.9330\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"82.342s\",\"endTime\":\"82.762s\",\"confidence\":\"0.4720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"82.762s\",\"endTime\":\"82.772s\",\"confidence\":\"0.9990\",\"type\":\"WORD\"},{\"token\":\"buy\",\"startTime\":\"82.772s\",\"endTime\":\"82.762s\",\"confidence\":\"0.9739\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them?\",\"startTime\":\"82.762s\",\"endTime\":\"82.772s\",\"confidence\":\"0.7120\",\"type\":\"WORD\"},{\"token\":\"I\",\"startTime\":\"84.122s\",\"endTime\":\"84.722s\",\"confidence\":\"0.9010\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buy\",\"startTime\":\"84.722s\",\"endTime\":\"85.402s\",\"confidence\":\"0.9210\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"85.402s\",\"endTime\":\"85.412s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"box\",\"startTime\":\"85.412s\",\"endTime\":\"85.402s\",\"confidence\":\"0.9520\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"at\",\"startTime\":\"85.402s\",\"endTime\":\"85.842s\",\"confidence\":\"0.8450\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"63\",\"startTime\":\"85.842s\",\"endTime\":\"86.522s\",\"confidence\":\"0.9480\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\".30.\",\"startTime\":\"86.522s\",\"endTime\":\"87.522s\",\"confidence\":\"0.9829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"90.842s\",\"endTime\":\"91.362s\",\"confidence\":\"0.0460\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"tell\",\"startTime\":\"91.362s\",\"endTime\":\"91.882s\",\"confidence\":\"0.4300\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"me,\",\"startTime\":\"91.882s\",\"endTime\":\"92.222s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"apart\",\"startTime\":\"93.342s\",\"endTime\":\"93.802s\",\"confidence\":\"0.5360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"from\",\"startTime\":\"93.802s\",\"endTime\":\"94.022s\",\"confidence\":\"0.9350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"94.022s\",\"endTime\":\"94.102s\",\"confidence\":\"0.8669\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"beer,\",\"startTime\":\"94.102s\",\"endTime\":\"94.382s\",\"confidence\":\"0.9580\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"94.422s\",\"endTime\":\"94.602s\",\"confidence\":\"0.9700\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"else\",\"startTime\":\"94.602s\",\"endTime\":\"94.762s\",\"confidence\":\"0.8889\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"94.762s\",\"endTime\":\"94.962s\",\"confidence\":\"0.9079\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"94.962s\",\"endTime\":\"95.062s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do?\",\"startTime\":\"95.062s\",\"endTime\":\"95.102s\",\"confidence\":\"0.7020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"As\",\"startTime\":\"95.462s\",\"endTime\":\"95.742s\",\"confidence\":\"0.4779\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"95.742s\",\"endTime\":\"96.002s\",\"confidence\":\"0.9419\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"told\",\"startTime\":\"96.002s\",\"endTime\":\"96.102s\",\"confidence\":\"0.2790\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"you,\",\"startTime\":\"96.102s\",\"endTime\":\"96.422s\",\"confidence\":\"0.7120\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"96.422s\",\"endTime\":\"96.642s\",\"confidence\":\"0.9340\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"make\",\"startTime\":\"96.642s\",\"endTime\":\"96.652s\",\"confidence\":\"0.6549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"this\",\"startTime\":\"96.652s\",\"endTime\":\"96.802s\",\"confidence\":\"0.2849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"mix,\",\"startTime\":\"96.802s\",\"endTime\":\"97.102s\",\"confidence\":\"0.3740\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"but\",\"startTime\":\"97.402s\",\"endTime\":\"97.822s\",\"confidence\":\"0.6830\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it's\",\"startTime\":\"97.822s\",\"endTime\":\"98.262s\",\"confidence\":\"0.5479\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"just\",\"startTime\":\"98.262s\",\"endTime\":\"98.272s\",\"confidence\":\"0.4480\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"98.272s\",\"endTime\":\"98.282s\",\"confidence\":\"0.5860\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"deliver.\",\"startTime\":\"98.282s\",\"endTime\":\"98.702s\",\"confidence\":\"0.6880\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"To\",\"startTime\":\"99.202s\",\"endTime\":\"99.402s\",\"confidence\":\"0.4970\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"deliver?\",\"startTime\":\"99.402s\",\"endTime\":\"99.762s\",\"confidence\":\"0.9599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes.\",\"startTime\":\"99.842s\",\"endTime\":\"100.222s\",\"confidence\":\"0.5910\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"What\",\"startTime\":\"100.402s\",\"endTime\":\"100.522s\",\"confidence\":\"0.8190\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"day?\",\"startTime\":\"100.522s\",\"endTime\":\"100.702s\",\"confidence\":\"0.9440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sundays?\",\"startTime\":\"100.802s\",\"endTime\":\"101.142s\",\"confidence\":\"0.6880\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Sundays.\",\"startTime\":\"101.342s\",\"endTime\":\"101.862s\",\"confidence\":\"0.7400\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sundays.\",\"startTime\":\"102.402s\",\"endTime\":\"102.922s\",\"confidence\":\"0.2689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"104.262s\",\"endTime\":\"104.542s\",\"confidence\":\"0.5849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"on\",\"startTime\":\"104.542s\",\"endTime\":\"104.642s\",\"confidence\":\"0.7639\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturdays,\",\"startTime\":\"104.642s\",\"endTime\":\"105.182s\",\"confidence\":\"0.9390\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"105.242s\",\"endTime\":\"105.482s\",\"confidence\":\"0.7549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"make\",\"startTime\":\"105.482s\",\"endTime\":\"105.492s\",\"confidence\":\"0.5370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"this\",\"startTime\":\"105.492s\",\"endTime\":\"105.882s\",\"confidence\":\"0.8249\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"mix,\",\"startTime\":\"105.882s\",\"endTime\":\"106.222s\",\"confidence\":\"0.4810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"what\",\"startTime\":\"106.442s\",\"endTime\":\"106.542s\",\"confidence\":\"0.1500\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"106.542s\",\"endTime\":\"106.842s\",\"confidence\":\"0.4839\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it?\",\"startTime\":\"106.842s\",\"endTime\":\"107.022s\",\"confidence\":\"0.6430\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"107.302s\",\"endTime\":\"107.312s\",\"confidence\":\"0.3149\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"do\",\"startTime\":\"107.312s\",\"endTime\":\"107.582s\",\"confidence\":\"0.5080\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"you\",\"startTime\":\"107.582s\",\"endTime\":\"107.592s\",\"confidence\":\"0.8029\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"call\",\"startTime\":\"107.592s\",\"endTime\":\"107.662s\",\"confidence\":\"0.5400\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it?\",\"startTime\":\"107.662s\",\"endTime\":\"108.062s\",\"confidence\":\"0.9309\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sarchipapa.\",\"startTime\":\"109.782s\",\"endTime\":\"110.302s\",\"confidence\":\"0.4880\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Only\",\"startTime\":\"110.682s\",\"endTime\":\"110.962s\",\"confidence\":\"0.6959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"on\",\"startTime\":\"110.962s\",\"endTime\":\"111.102s\",\"confidence\":\"0.9490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Saturdays?\",\"startTime\":\"111.102s\",\"endTime\":\"111.362s\",\"confidence\":\"0.9520\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"On\",\"startTime\":\"111.382s\",\"endTime\":\"111.782s\",\"confidence\":\"0.3650\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturdays\",\"startTime\":\"111.782s\",\"endTime\":\"112.742s\",\"confidence\":\"0.6269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"112.742s\",\"endTime\":\"112.862s\",\"confidence\":\"0.8330\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sundays.\",\"startTime\":\"112.862s\",\"endTime\":\"113.282s\",\"confidence\":\"0.3849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Friday\",\"startTime\":\"113.622s\",\"endTime\":\"113.882s\",\"confidence\":\"0.8220\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"113.882s\",\"endTime\":\"114.042s\",\"confidence\":\"0.9010\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Saturday\",\"startTime\":\"114.042s\",\"endTime\":\"114.282s\",\"confidence\":\"0.9990\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"at\",\"startTime\":\"114.282s\",\"endTime\":\"114.422s\",\"confidence\":\"0.3519\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"night?\",\"startTime\":\"114.422s\",\"endTime\":\"114.762s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"114.842s\",\"endTime\":\"114.852s\",\"confidence\":\"0.4979\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Friday\",\"startTime\":\"114.902s\",\"endTime\":\"114.912s\",\"confidence\":\"0.7170\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"114.912s\",\"endTime\":\"115.042s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturday.\",\"startTime\":\"115.042s\",\"endTime\":\"115.162s\",\"confidence\":\"0.9990\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"What\",\"startTime\":\"115.262s\",\"endTime\":\"115.542s\",\"confidence\":\"0.6039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"time\",\"startTime\":\"115.542s\",\"endTime\":\"115.822s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"115.822s\",\"endTime\":\"115.902s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"115.902s\",\"endTime\":\"116.142s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"go\",\"startTime\":\"116.142s\",\"endTime\":\"116.152s\",\"confidence\":\"0.2849\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"out?\",\"startTime\":\"116.152s\",\"endTime\":\"116.162s\",\"confidence\":\"0.8230\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Alas,\",\"startTime\":\"117.322s\",\"endTime\":\"117.882s\",\"confidence\":\"0.3140\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I've\",\"startTime\":\"117.962s\",\"endTime\":\"118.082s\",\"confidence\":\"0.5410\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"been\",\"startTime\":\"118.082s\",\"endTime\":\"118.262s\",\"confidence\":\"0.8980\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"118.262s\",\"endTime\":\"118.422s\",\"confidence\":\"0.3889\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"car,\",\"startTime\":\"118.422s\",\"endTime\":\"118.642s\",\"confidence\":\"0.1790\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"118.802s\",\"endTime\":\"118.842s\",\"confidence\":\"0.1689\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"took\",\"startTime\":\"118.842s\",\"endTime\":\"118.962s\",\"confidence\":\"0.4090\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"118.962s\",\"endTime\":\"119.122s\",\"confidence\":\"0.5000\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"car,\",\"startTime\":\"119.122s\",\"endTime\":\"119.402s\",\"confidence\":\"0.7459\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"119.502s\",\"endTime\":\"119.622s\",\"confidence\":\"0.4930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"now\",\"startTime\":\"119.622s\",\"endTime\":\"119.762s\",\"confidence\":\"0.1969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I'm\",\"startTime\":\"119.762s\",\"endTime\":\"119.962s\",\"confidence\":\"0.7919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"in\",\"startTime\":\"119.962s\",\"endTime\":\"120.162s\",\"confidence\":\"0.2269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"120.162s\",\"endTime\":\"120.222s\",\"confidence\":\"0.2689\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"car.\",\"startTime\":\"120.222s\",\"endTime\":\"120.402s\",\"confidence\":\"0.4040\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"120.882s\",\"endTime\":\"121.102s\",\"confidence\":\"0.2280\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that's\",\"startTime\":\"121.162s\",\"endTime\":\"121.302s\",\"confidence\":\"0.6380\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"That's\",\"startTime\":\"122.202s\",\"endTime\":\"123.182s\",\"confidence\":\"0.4909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it.\",\"startTime\":\"123.182s\",\"endTime\":\"123.192s\",\"confidence\":\"0.6660\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"It's\",\"startTime\":\"126.532s\",\"endTime\":\"126.812s\",\"confidence\":\"0.3330\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"19\",\"startTime\":\"126.812s\",\"endTime\":\"126.992s\",\"confidence\":\"0.1930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\".70,\",\"startTime\":\"126.992s\",\"endTime\":\"127.672s\",\"confidence\":\"0.9380\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that's\",\"startTime\":\"127.732s\",\"endTime\":\"127.872s\",\"confidence\":\"0.6129\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"good.\",\"startTime\":\"127.872s\",\"endTime\":\"128.692s\",\"confidence\":\"0.3449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Your\",\"startTime\":\"129.572s\",\"endTime\":\"130.052s\",\"confidence\":\"0.2540\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"chips\",\"startTime\":\"130.052s\",\"endTime\":\"130.412s\",\"confidence\":\"0.0790\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"on\",\"startTime\":\"130.412s\",\"endTime\":\"130.692s\",\"confidence\":\"0.4329\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"weekends,\",\"startTime\":\"130.692s\",\"endTime\":\"131.432s\",\"confidence\":\"0.6940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"131.812s\",\"endTime\":\"131.912s\",\"confidence\":\"0.7490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fries\",\"startTime\":\"131.912s\",\"endTime\":\"132.152s\",\"confidence\":\"0.5249\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"on\",\"startTime\":\"132.152s\",\"endTime\":\"132.352s\",\"confidence\":\"0.9789\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Sundays,\",\"startTime\":\"132.352s\",\"endTime\":\"132.832s\",\"confidence\":\"0.8629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"133.072s\",\"endTime\":\"133.152s\",\"confidence\":\"0.9530\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"beer.\",\"startTime\":\"133.152s\",\"endTime\":\"133.772s\",\"confidence\":\"0.8590\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"What\",\"startTime\":\"134.872s\",\"endTime\":\"135.052s\",\"confidence\":\"0.6830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"else?\",\"startTime\":\"135.052s\",\"endTime\":\"135.172s\",\"confidence\":\"0.9720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"135.372s\",\"endTime\":\"135.432s\",\"confidence\":\"0.3350\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"my\",\"startTime\":\"135.432s\",\"endTime\":\"135.632s\",\"confidence\":\"0.7089\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"animals,\",\"startTime\":\"135.632s\",\"endTime\":\"136.092s\",\"confidence\":\"0.4970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"as\",\"startTime\":\"136.272s\",\"endTime\":\"136.412s\",\"confidence\":\"0.5360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"136.412s\",\"endTime\":\"136.632s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"told\",\"startTime\":\"136.632s\",\"endTime\":\"136.832s\",\"confidence\":\"0.1819\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"you,\",\"startTime\":\"136.832s\",\"endTime\":\"136.912s\",\"confidence\":\"0.9440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"137.192s\",\"endTime\":\"137.252s\",\"confidence\":\"0.4819\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"137.252s\",\"endTime\":\"137.262s\",\"confidence\":\"0.9290\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"chickens.\",\"startTime\":\"137.262s\",\"endTime\":\"137.252s\",\"confidence\":\"0.5419\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"What\",\"startTime\":\"137.252s\",\"endTime\":\"137.262s\",\"confidence\":\"0.3230\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"137.262s\",\"endTime\":\"137.432s\",\"confidence\":\"0.2899\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"137.432s\",\"endTime\":\"137.672s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"raise?\",\"startTime\":\"137.672s\",\"endTime\":\"137.682s\",\"confidence\":\"0.4120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Chickens\",\"startTime\":\"138.552s\",\"endTime\":\"139.032s\",\"confidence\":\"0.8600\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"139.032s\",\"endTime\":\"139.232s\",\"confidence\":\"0.5860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"pups.\",\"startTime\":\"139.232s\",\"endTime\":\"139.612s\",\"confidence\":\"0.3580\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Are\",\"startTime\":\"140.052s\",\"endTime\":\"140.272s\",\"confidence\":\"0.3689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"those\",\"startTime\":\"140.272s\",\"endTime\":\"140.952s\",\"confidence\":\"0.7779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"140.952s\",\"endTime\":\"141.092s\",\"confidence\":\"0.2910\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"raising\",\"startTime\":\"141.092s\",\"endTime\":\"141.172s\",\"confidence\":\"0.8069\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"or\",\"startTime\":\"141.172s\",\"endTime\":\"141.832s\",\"confidence\":\"0.3989\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"just\",\"startTime\":\"141.832s\",\"endTime\":\"142.592s\",\"confidence\":\"0.3959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"142.592s\",\"endTime\":\"142.892s\",\"confidence\":\"0.7879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fatten\",\"startTime\":\"142.892s\",\"endTime\":\"143.352s\",\"confidence\":\"0.6169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"up\",\"startTime\":\"143.352s\",\"endTime\":\"143.412s\",\"confidence\":\"0.5860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"143.412s\",\"endTime\":\"143.452s\",\"confidence\":\"0.9639\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell?\",\"startTime\":\"143.452s\",\"endTime\":\"143.792s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"To\",\"startTime\":\"144.032s\",\"endTime\":\"144.272s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"fatten\",\"startTime\":\"144.272s\",\"endTime\":\"144.692s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"up\",\"startTime\":\"144.692s\",\"endTime\":\"144.732s\",\"confidence\":\"0.9829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"144.732s\",\"endTime\":\"144.832s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sell.\",\"startTime\":\"144.832s\",\"endTime\":\"145.152s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"145.442s\",\"endTime\":\"145.902s\",\"confidence\":\"0.3779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"long\",\"startTime\":\"145.902s\",\"endTime\":\"146.242s\",\"confidence\":\"0.6529\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"146.242s\",\"endTime\":\"146.622s\",\"confidence\":\"0.6209\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"146.622s\",\"endTime\":\"146.632s\",\"confidence\":\"0.9750\",\"type\":\"WORD\"},{\"token\":\"been\",\"startTime\":\"146.632s\",\"endTime\":\"146.622s\",\"confidence\":\"0.8109\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here?\",\"startTime\":\"146.622s\",\"endTime\":\"146.632s\",\"confidence\":\"0.2269\",\"type\":\"WORD\"},{\"token\":\"I've\",\"startTime\":\"148.462s\",\"endTime\":\"148.942s\",\"confidence\":\"0.5350\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"been\",\"startTime\":\"148.942s\",\"endTime\":\"149.322s\",\"confidence\":\"0.6719\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"living\",\"startTime\":\"149.322s\",\"endTime\":\"149.332s\",\"confidence\":\"0.4079\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"here\",\"startTime\":\"149.332s\",\"endTime\":\"151.562s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"151.562s\",\"endTime\":\"151.802s\",\"confidence\":\"0.6629\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"27\",\"startTime\":\"151.802s\",\"endTime\":\"152.282s\",\"confidence\":\"0.4979\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"years.\",\"startTime\":\"152.282s\",\"endTime\":\"153.002s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Where\",\"startTime\":\"154.402s\",\"endTime\":\"154.882s\",\"confidence\":\"0.3400\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"154.882s\",\"endTime\":\"154.962s\",\"confidence\":\"0.9300\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"154.962s\",\"endTime\":\"155.502s\",\"confidence\":\"0.9860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"155.502s\",\"endTime\":\"155.522s\",\"confidence\":\"0.9710\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"155.522s\",\"endTime\":\"155.532s\",\"confidence\":\"0.2360\",\"type\":\"WORD\"},{\"token\":\"animals?\",\"startTime\":\"155.532s\",\"endTime\":\"155.522s\",\"confidence\":\"0.6430\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"In\",\"startTime\":\"156.022s\",\"endTime\":\"156.502s\",\"confidence\":\"0.5690\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"156.502s\",\"endTime\":\"156.512s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"market.\",\"startTime\":\"156.512s\",\"endTime\":\"156.902s\",\"confidence\":\"0.9229\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"The\",\"startTime\":\"158.362s\",\"endTime\":\"158.402s\",\"confidence\":\"0.3680\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"lady\",\"startTime\":\"158.402s\",\"endTime\":\"158.682s\",\"confidence\":\"0.3260\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"asks\",\"startTime\":\"158.682s\",\"endTime\":\"159.242s\",\"confidence\":\"0.4970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"159.242s\",\"endTime\":\"159.402s\",\"confidence\":\"0.7639\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"159.402s\",\"endTime\":\"159.622s\",\"confidence\":\"0.7770\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bring\",\"startTime\":\"159.622s\",\"endTime\":\"159.632s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"her\",\"startTime\":\"159.632s\",\"endTime\":\"159.822s\",\"confidence\":\"0.4720\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"two\",\"startTime\":\"159.822s\",\"endTime\":\"160.082s\",\"confidence\":\"0.6209\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"pigs.\",\"startTime\":\"160.082s\",\"endTime\":\"160.202s\",\"confidence\":\"0.1889\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"For\",\"startTime\":\"160.302s\",\"endTime\":\"160.382s\",\"confidence\":\"0.4230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"example,\",\"startTime\":\"160.382s\",\"endTime\":\"160.682s\",\"confidence\":\"0.9530\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"160.862s\",\"endTime\":\"160.982s\",\"confidence\":\"0.7049\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"lost\",\"startTime\":\"160.982s\",\"endTime\":\"160.992s\",\"confidence\":\"0.9240\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"my\",\"startTime\":\"160.992s\",\"endTime\":\"161.122s\",\"confidence\":\"0.8980\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"mother.\",\"startTime\":\"161.122s\",\"endTime\":\"161.462s\",\"confidence\":\"0.8769\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"162.542s\",\"endTime\":\"162.782s\",\"confidence\":\"0.7149\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"much\",\"startTime\":\"162.782s\",\"endTime\":\"163.082s\",\"confidence\":\"0.8880\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"163.082s\",\"endTime\":\"163.182s\",\"confidence\":\"0.5379\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"163.182s\",\"endTime\":\"163.222s\",\"confidence\":\"0.9490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"163.222s\",\"endTime\":\"163.262s\",\"confidence\":\"0.9079\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"163.262s\",\"endTime\":\"163.382s\",\"confidence\":\"0.3359\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"pigs?\",\"startTime\":\"163.382s\",\"endTime\":\"163.562s\",\"confidence\":\"0.7929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"33\",\"startTime\":\"164.362s\",\"endTime\":\"164.842s\",\"confidence\":\"0.5090\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"pesos\",\"startTime\":\"164.842s\",\"endTime\":\"164.962s\",\"confidence\":\"0.3009\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"per\",\"startTime\":\"164.962s\",\"endTime\":\"165.182s\",\"confidence\":\"0.5889\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"kilo.\",\"startTime\":\"165.182s\",\"endTime\":\"165.462s\",\"confidence\":\"0.8420\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"167.242s\",\"endTime\":\"167.422s\",\"confidence\":\"0.7559\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"much\",\"startTime\":\"167.422s\",\"endTime\":\"167.642s\",\"confidence\":\"0.9309\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"167.642s\",\"endTime\":\"167.822s\",\"confidence\":\"0.9240\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"167.822s\",\"endTime\":\"167.982s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"spend\",\"startTime\":\"167.982s\",\"endTime\":\"168.022s\",\"confidence\":\"0.8820\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"on\",\"startTime\":\"168.022s\",\"endTime\":\"168.202s\",\"confidence\":\"0.7409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"food?\",\"startTime\":\"168.202s\",\"endTime\":\"168.722s\",\"confidence\":\"0.3980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Well,\",\"startTime\":\"169.642s\",\"endTime\":\"170.002s\",\"confidence\":\"0.2840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"170.342s\",\"endTime\":\"170.352s\",\"confidence\":\"0.9399\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buy\",\"startTime\":\"170.352s\",\"endTime\":\"170.742s\",\"confidence\":\"0.4930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them\",\"startTime\":\"170.742s\",\"endTime\":\"171.062s\",\"confidence\":\"0.4740\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"171.062s\",\"endTime\":\"171.202s\",\"confidence\":\"0.7779\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sack\",\"startTime\":\"171.202s\",\"endTime\":\"171.242s\",\"confidence\":\"0.1700\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"of\",\"startTime\":\"171.242s\",\"endTime\":\"171.442s\",\"confidence\":\"0.7969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"concentrate\",\"startTime\":\"171.442s\",\"endTime\":\"172.362s\",\"confidence\":\"0.4560\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"172.362s\",\"endTime\":\"172.702s\",\"confidence\":\"0.6970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"everyone.\",\"startTime\":\"172.702s\",\"endTime\":\"173.502s\",\"confidence\":\"0.4379\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Almost\",\"startTime\":\"173.962s\",\"endTime\":\"174.342s\",\"confidence\":\"0.1829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"174.342s\",\"endTime\":\"174.702s\",\"confidence\":\"0.6919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"month.\",\"startTime\":\"174.702s\",\"endTime\":\"175.022s\",\"confidence\":\"0.9340\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"A\",\"startTime\":\"175.122s\",\"endTime\":\"175.242s\",\"confidence\":\"0.3179\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"month.\",\"startTime\":\"175.242s\",\"endTime\":\"175.542s\",\"confidence\":\"0.9629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"175.662s\",\"endTime\":\"175.802s\",\"confidence\":\"0.6449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"how\",\"startTime\":\"175.802s\",\"endTime\":\"175.882s\",\"confidence\":\"0.8280\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"much\",\"startTime\":\"175.882s\",\"endTime\":\"176.202s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"does\",\"startTime\":\"176.202s\",\"endTime\":\"176.212s\",\"confidence\":\"0.4259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"176.212s\",\"endTime\":\"176.502s\",\"confidence\":\"0.3600\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sack\",\"startTime\":\"176.502s\",\"endTime\":\"176.782s\",\"confidence\":\"0.9549\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"cost?\",\"startTime\":\"176.782s\",\"endTime\":\"176.792s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"It\",\"startTime\":\"177.202s\",\"endTime\":\"177.222s\",\"confidence\":\"0.8230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"costs\",\"startTime\":\"177.222s\",\"endTime\":\"177.662s\",\"confidence\":\"0.8180\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"$120.\",\"startTime\":\"177.662s\",\"endTime\":\"178.322s\",\"confidence\":\"0.6840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"$120.\",\"startTime\":\"178.542s\",\"endTime\":\"179.142s\",\"confidence\":\"0.6600\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"180.102s\",\"endTime\":\"180.202s\",\"confidence\":\"0.8370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"how\",\"startTime\":\"180.202s\",\"endTime\":\"180.212s\",\"confidence\":\"0.4900\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"many\",\"startTime\":\"180.212s\",\"endTime\":\"180.202s\",\"confidence\":\"0.8769\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"animals\",\"startTime\":\"180.202s\",\"endTime\":\"180.212s\",\"confidence\":\"0.7390\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"180.212s\",\"endTime\":\"180.202s\",\"confidence\":\"0.1930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"180.202s\",\"endTime\":\"180.422s\",\"confidence\":\"0.7009\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"get\",\"startTime\":\"180.422s\",\"endTime\":\"180.682s\",\"confidence\":\"0.2520\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"180.682s\",\"endTime\":\"180.822s\",\"confidence\":\"0.4009\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"animals\",\"startTime\":\"181.322s\",\"endTime\":\"181.782s\",\"confidence\":\"0.7440\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"181.782s\",\"endTime\":\"181.882s\",\"confidence\":\"0.2489\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"181.882s\",\"endTime\":\"181.892s\",\"confidence\":\"0.7350\",\"type\":\"WORD\"},{\"token\":\"have?\",\"startTime\":\"181.892s\",\"endTime\":\"181.882s\",\"confidence\":\"0.3689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"I\",\"startTime\":\"182.142s\",\"endTime\":\"182.782s\",\"confidence\":\"0.4230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"have\",\"startTime\":\"182.782s\",\"endTime\":\"184.322s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"25\",\"startTime\":\"184.322s\",\"endTime\":\"185.262s\",\"confidence\":\"0.7149\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"chickens\",\"startTime\":\"185.262s\",\"endTime\":\"186.082s\",\"confidence\":\"0.5870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"186.082s\",\"endTime\":\"187.482s\",\"confidence\":\"0.7120\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"10\",\"startTime\":\"187.482s\",\"endTime\":\"187.782s\",\"confidence\":\"0.7440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"pigs.\",\"startTime\":\"187.782s\",\"endTime\":\"188.262s\",\"confidence\":\"0.1720\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"188.502s\",\"endTime\":\"188.642s\",\"confidence\":\"0.8240\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"have\",\"startTime\":\"188.642s\",\"endTime\":\"188.802s\",\"confidence\":\"0.9639\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"like\",\"startTime\":\"188.802s\",\"endTime\":\"188.962s\",\"confidence\":\"0.4350\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"35\",\"startTime\":\"188.962s\",\"endTime\":\"189.702s\",\"confidence\":\"0.9689\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"animals.\",\"startTime\":\"189.702s\",\"endTime\":\"190.142s\",\"confidence\":\"0.8029\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"35\",\"startTime\":\"190.182s\",\"endTime\":\"190.682s\",\"confidence\":\"0.4469\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"animals.\",\"startTime\":\"190.682s\",\"endTime\":\"191.222s\",\"confidence\":\"0.9259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"191.542s\",\"endTime\":\"191.722s\",\"confidence\":\"0.5749\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that's\",\"startTime\":\"191.722s\",\"endTime\":\"191.922s\",\"confidence\":\"0.2500\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"what\",\"startTime\":\"191.922s\",\"endTime\":\"191.962s\",\"confidence\":\"0.6380\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I've\",\"startTime\":\"191.962s\",\"endTime\":\"192.302s\",\"confidence\":\"0.5970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"killed.\",\"startTime\":\"192.302s\",\"endTime\":\"192.402s\",\"confidence\":\"0.7549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Of\",\"startTime\":\"193.382s\",\"endTime\":\"193.702s\",\"confidence\":\"0.2150\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"course.\",\"startTime\":\"193.702s\",\"endTime\":\"193.802s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"194.522s\",\"endTime\":\"194.642s\",\"confidence\":\"0.8119\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that's\",\"startTime\":\"194.642s\",\"endTime\":\"194.842s\",\"confidence\":\"0.4490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"194.842s\",\"endTime\":\"194.852s\",\"confidence\":\"0.4269\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"194.852s\",\"endTime\":\"195.162s\",\"confidence\":\"0.9639\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"reinforce\",\"startTime\":\"195.162s\",\"endTime\":\"195.222s\",\"confidence\":\"0.2529\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"195.222s\",\"endTime\":\"195.502s\",\"confidence\":\"0.9039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"food\",\"startTime\":\"195.502s\",\"endTime\":\"195.962s\",\"confidence\":\"0.4040\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"from\",\"startTime\":\"195.962s\",\"endTime\":\"197.342s\",\"confidence\":\"0.3650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"197.342s\",\"endTime\":\"197.442s\",\"confidence\":\"0.7860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"newspaper,\",\"startTime\":\"197.442s\",\"endTime\":\"197.742s\",\"confidence\":\"0.2020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"198.002s\",\"endTime\":\"198.012s\",\"confidence\":\"0.6930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Vegetables,\",\"startTime\":\"198.442s\",\"endTime\":\"198.842s\",\"confidence\":\"0.7870\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"all\",\"startTime\":\"199.062s\",\"endTime\":\"199.122s\",\"confidence\":\"0.6980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"199.122s\",\"endTime\":\"199.342s\",\"confidence\":\"0.7760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"stuff.\",\"startTime\":\"199.342s\",\"endTime\":\"199.562s\",\"confidence\":\"0.6489\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"That's\",\"startTime\":\"200.562s\",\"endTime\":\"201.202s\",\"confidence\":\"0.3759\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"fine.\",\"startTime\":\"201.202s\",\"endTime\":\"201.212s\",\"confidence\":\"0.2969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"203.712s\",\"endTime\":\"204.052s\",\"confidence\":\"0.1539\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"204.392s\",\"endTime\":\"204.402s\",\"confidence\":\"0.7850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"204.402s\",\"endTime\":\"204.852s\",\"confidence\":\"0.2399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"204.852s\",\"endTime\":\"204.932s\",\"confidence\":\"0.3939\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"also\",\"startTime\":\"204.932s\",\"endTime\":\"205.992s\",\"confidence\":\"0.2329\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"expensive\",\"startTime\":\"205.992s\",\"endTime\":\"206.002s\",\"confidence\":\"0.6779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"206.002s\",\"endTime\":\"206.452s\",\"confidence\":\"0.8840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"buy\",\"startTime\":\"206.452s\",\"endTime\":\"206.462s\",\"confidence\":\"0.8249\",\"type\":\"WORD\"},{\"token\":\"a\",\"startTime\":\"206.462s\",\"endTime\":\"206.452s\",\"confidence\":\"0.1920\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"lot\",\"startTime\":\"206.452s\",\"endTime\":\"206.462s\",\"confidence\":\"0.7549\",\"type\":\"WORD\"},{\"token\":\"of\",\"startTime\":\"206.462s\",\"endTime\":\"206.452s\",\"confidence\":\"0.9689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"food,\",\"startTime\":\"206.452s\",\"endTime\":\"206.462s\",\"confidence\":\"0.8579\",\"type\":\"WORD\"},{\"token\":\"right?\",\"startTime\":\"206.532s\",\"endTime\":\"206.542s\",\"confidence\":\"0.5979\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Concentrated,\",\"startTime\":\"207.252s\",\"endTime\":\"207.692s\",\"confidence\":\"0.5299\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"all\",\"startTime\":\"207.752s\",\"endTime\":\"207.952s\",\"confidence\":\"0.3549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that.\",\"startTime\":\"207.952s\",\"endTime\":\"208.232s\",\"confidence\":\"0.7919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"208.232s\",\"endTime\":\"208.242s\",\"confidence\":\"0.2739\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"208.252s\",\"endTime\":\"208.262s\",\"confidence\":\"0.1529\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"too.\",\"startTime\":\"208.262s\",\"endTime\":\"208.632s\",\"confidence\":\"0.8149\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"There\",\"startTime\":\"209.412s\",\"endTime\":\"209.692s\",\"confidence\":\"0.3059\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"209.692s\",\"endTime\":\"209.772s\",\"confidence\":\"0.9010\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"help\",\"startTime\":\"209.772s\",\"endTime\":\"210.092s\",\"confidence\":\"0.8650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"210.092s\",\"endTime\":\"210.152s\",\"confidence\":\"0.2169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"210.152s\",\"endTime\":\"210.552s\",\"confidence\":\"0.8809\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"all\",\"startTime\":\"210.552s\",\"endTime\":\"210.752s\",\"confidence\":\"0.5680\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"210.752s\",\"endTime\":\"210.882s\",\"confidence\":\"0.9120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"permission.\",\"startTime\":\"210.882s\",\"endTime\":\"211.192s\",\"confidence\":\"0.2189\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"With\",\"startTime\":\"211.232s\",\"endTime\":\"211.242s\",\"confidence\":\"0.3650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"alfalfa,\",\"startTime\":\"211.242s\",\"endTime\":\"211.412s\",\"confidence\":\"0.8209\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"yes.\",\"startTime\":\"211.492s\",\"endTime\":\"211.652s\",\"confidence\":\"0.7799\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"211.692s\",\"endTime\":\"211.952s\",\"confidence\":\"0.9580\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"help\",\"startTime\":\"211.952s\",\"endTime\":\"212.312s\",\"confidence\":\"0.9580\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them\",\"startTime\":\"212.312s\",\"endTime\":\"212.322s\",\"confidence\":\"0.8159\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"with\",\"startTime\":\"212.322s\",\"endTime\":\"212.492s\",\"confidence\":\"0.9710\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"alfalfa,\",\"startTime\":\"212.492s\",\"endTime\":\"213.872s\",\"confidence\":\"0.9810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"food\",\"startTime\":\"213.972s\",\"endTime\":\"214.272s\",\"confidence\":\"0.2930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"214.272s\",\"endTime\":\"214.552s\",\"confidence\":\"0.9129\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"214.552s\",\"endTime\":\"214.592s\",\"confidence\":\"0.7950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"have\",\"startTime\":\"214.592s\",\"endTime\":\"214.972s\",\"confidence\":\"0.6579\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"left.\",\"startTime\":\"214.972s\",\"endTime\":\"215.022s\",\"confidence\":\"0.8379\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sometimes\",\"startTime\":\"215.412s\",\"endTime\":\"215.432s\",\"confidence\":\"0.5950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"215.432s\",\"endTime\":\"216.372s\",\"confidence\":\"0.4850\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"also\",\"startTime\":\"216.372s\",\"endTime\":\"216.522s\",\"confidence\":\"0.5720\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"come\",\"startTime\":\"216.522s\",\"endTime\":\"216.792s\",\"confidence\":\"0.8100\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"216.792s\",\"endTime\":\"217.232s\",\"confidence\":\"0.8389\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"217.232s\",\"endTime\":\"217.272s\",\"confidence\":\"0.6349\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"217.272s\",\"endTime\":\"217.332s\",\"confidence\":\"0.3950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"say,\",\"startTime\":\"217.332s\",\"endTime\":\"217.732s\",\"confidence\":\"0.8759\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"218.012s\",\"endTime\":\"218.152s\",\"confidence\":\"0.2969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"want\",\"startTime\":\"218.152s\",\"endTime\":\"218.232s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"lunch\",\"startTime\":\"218.232s\",\"endTime\":\"218.932s\",\"confidence\":\"0.9480\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"so\",\"startTime\":\"218.932s\",\"endTime\":\"219.332s\",\"confidence\":\"0.5310\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"219.332s\",\"endTime\":\"219.492s\",\"confidence\":\"0.8069\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"219.492s\",\"endTime\":\"219.502s\",\"confidence\":\"0.4399\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"have\",\"startTime\":\"219.502s\",\"endTime\":\"219.812s\",\"confidence\":\"0.5649\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me,\",\"startTime\":\"219.812s\",\"endTime\":\"219.972s\",\"confidence\":\"0.4440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"219.972s\",\"endTime\":\"220.032s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"example,\",\"startTime\":\"220.032s\",\"endTime\":\"220.252s\",\"confidence\":\"0.9990\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"on\",\"startTime\":\"220.432s\",\"endTime\":\"220.442s\",\"confidence\":\"0.7009\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturdays\",\"startTime\":\"220.442s\",\"endTime\":\"220.872s\",\"confidence\":\"0.7540\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"or\",\"startTime\":\"220.872s\",\"endTime\":\"220.882s\",\"confidence\":\"0.5040\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sundays,\",\"startTime\":\"220.882s\",\"endTime\":\"221.192s\",\"confidence\":\"0.9810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"221.472s\",\"endTime\":\"221.512s\",\"confidence\":\"0.3589\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"on\",\"startTime\":\"221.512s\",\"endTime\":\"221.592s\",\"confidence\":\"0.5009\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturdays,\",\"startTime\":\"221.592s\",\"endTime\":\"222.052s\",\"confidence\":\"0.8610\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"just\",\"startTime\":\"222.072s\",\"endTime\":\"222.232s\",\"confidence\":\"0.2070\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"what\",\"startTime\":\"222.232s\",\"endTime\":\"222.392s\",\"confidence\":\"0.6179\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"222.392s\",\"endTime\":\"222.612s\",\"confidence\":\"0.9079\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"ask\",\"startTime\":\"222.612s\",\"endTime\":\"222.912s\",\"confidence\":\"0.8550\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"222.912s\",\"endTime\":\"223.092s\",\"confidence\":\"0.4990\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for,\",\"startTime\":\"223.092s\",\"endTime\":\"223.532s\",\"confidence\":\"0.6710\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"223.532s\",\"endTime\":\"223.832s\",\"confidence\":\"0.1870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"223.832s\",\"endTime\":\"223.872s\",\"confidence\":\"0.6959\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bring\",\"startTime\":\"223.872s\",\"endTime\":\"224.072s\",\"confidence\":\"0.6639\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it.\",\"startTime\":\"224.072s\",\"endTime\":\"224.172s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"224.902s\",\"endTime\":\"225.162s\",\"confidence\":\"0.1430\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here\",\"startTime\":\"225.162s\",\"endTime\":\"225.402s\",\"confidence\":\"0.5090\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"225.402s\",\"endTime\":\"226.242s\",\"confidence\":\"0.3600\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"mainly\",\"startTime\":\"226.242s\",\"endTime\":\"226.252s\",\"confidence\":\"0.4370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sell\",\"startTime\":\"226.252s\",\"endTime\":\"226.562s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"226.562s\",\"endTime\":\"226.622s\",\"confidence\":\"0.2150\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"226.622s\",\"endTime\":\"226.822s\",\"confidence\":\"0.9769\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"226.822s\",\"endTime\":\"226.982s\",\"confidence\":\"0.9530\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"neighbors\",\"startTime\":\"226.982s\",\"endTime\":\"227.362s\",\"confidence\":\"0.8809\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"or\",\"startTime\":\"227.362s\",\"endTime\":\"227.742s\",\"confidence\":\"0.7990\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"some\",\"startTime\":\"227.742s\",\"endTime\":\"228.142s\",\"confidence\":\"0.3449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"other\",\"startTime\":\"228.142s\",\"endTime\":\"228.482s\",\"confidence\":\"0.4930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"company\",\"startTime\":\"228.482s\",\"endTime\":\"228.502s\",\"confidence\":\"0.6970\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"around\",\"startTime\":\"228.502s\",\"endTime\":\"228.782s\",\"confidence\":\"0.5149\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here?\",\"startTime\":\"228.782s\",\"endTime\":\"228.942s\",\"confidence\":\"0.9020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"No,\",\"startTime\":\"229.122s\",\"endTime\":\"229.242s\",\"confidence\":\"0.4519\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"229.482s\",\"endTime\":\"229.502s\",\"confidence\":\"0.1539\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"229.502s\",\"endTime\":\"229.682s\",\"confidence\":\"0.7490\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"example,\",\"startTime\":\"229.682s\",\"endTime\":\"230.082s\",\"confidence\":\"0.9269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"well\",\"startTime\":\"230.602s\",\"endTime\":\"230.842s\",\"confidence\":\"0.4539\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sometimes\",\"startTime\":\"230.842s\",\"endTime\":\"231.122s\",\"confidence\":\"0.8309\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"my\",\"startTime\":\"231.122s\",\"endTime\":\"231.282s\",\"confidence\":\"0.6019\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"neighbors\",\"startTime\":\"231.282s\",\"endTime\":\"231.742s\",\"confidence\":\"0.9729\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"231.742s\",\"endTime\":\"232.302s\",\"confidence\":\"0.4699\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"in\",\"startTime\":\"232.302s\",\"endTime\":\"232.342s\",\"confidence\":\"0.5180\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"232.342s\",\"endTime\":\"232.562s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"market\",\"startTime\":\"232.562s\",\"endTime\":\"232.842s\",\"confidence\":\"0.9440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"also\",\"startTime\":\"232.842s\",\"endTime\":\"233.202s\",\"confidence\":\"0.6320\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"233.202s\",\"endTime\":\"233.302s\",\"confidence\":\"0.8410\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"ladies\",\"startTime\":\"233.302s\",\"endTime\":\"233.522s\",\"confidence\":\"0.7990\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"who\",\"startTime\":\"233.522s\",\"endTime\":\"233.702s\",\"confidence\":\"0.4869\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"know\",\"startTime\":\"233.702s\",\"endTime\":\"234.222s\",\"confidence\":\"0.8679\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"234.222s\",\"endTime\":\"234.502s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"want\",\"startTime\":\"234.502s\",\"endTime\":\"235.042s\",\"confidence\":\"0.1949\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"lunch\",\"startTime\":\"235.042s\",\"endTime\":\"235.442s\",\"confidence\":\"0.7239\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"235.442s\",\"endTime\":\"235.702s\",\"confidence\":\"0.7549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"235.702s\",\"endTime\":\"235.802s\",\"confidence\":\"0.5350\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"already\",\"startTime\":\"235.802s\",\"endTime\":\"235.862s\",\"confidence\":\"0.4909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"let\",\"startTime\":\"235.862s\",\"endTime\":\"236.082s\",\"confidence\":\"0.2370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"236.082s\",\"endTime\":\"236.102s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"know,\",\"startTime\":\"236.102s\",\"endTime\":\"236.322s\",\"confidence\":\"0.9100\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"236.402s\",\"endTime\":\"236.482s\",\"confidence\":\"0.3840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bring\",\"startTime\":\"236.482s\",\"endTime\":\"236.542s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"me\",\"startTime\":\"236.542s\",\"endTime\":\"236.662s\",\"confidence\":\"0.6510\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"lunch\",\"startTime\":\"236.662s\",\"endTime\":\"237.282s\",\"confidence\":\"0.0970\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"237.282s\",\"endTime\":\"238.062s\",\"confidence\":\"0.6710\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"238.062s\",\"endTime\":\"238.222s\",\"confidence\":\"0.5199\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"take\",\"startTime\":\"238.222s\",\"endTime\":\"238.722s\",\"confidence\":\"0.4930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"them.\",\"startTime\":\"238.722s\",\"endTime\":\"238.822s\",\"confidence\":\"0.8420\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"239.082s\",\"endTime\":\"239.322s\",\"confidence\":\"0.7170\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"long\",\"startTime\":\"239.322s\",\"endTime\":\"239.682s\",\"confidence\":\"0.6940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"239.682s\",\"endTime\":\"239.692s\",\"confidence\":\"0.5080\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"239.692s\",\"endTime\":\"239.802s\",\"confidence\":\"0.7699\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"been\",\"startTime\":\"239.802s\",\"endTime\":\"239.822s\",\"confidence\":\"0.8270\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here?\",\"startTime\":\"239.822s\",\"endTime\":\"240.042s\",\"confidence\":\"0.7020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Since\",\"startTime\":\"240.222s\",\"endTime\":\"240.242s\",\"confidence\":\"0.1889\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Saturday\",\"startTime\":\"240.242s\",\"endTime\":\"240.542s\",\"confidence\":\"0.9549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"240.542s\",\"endTime\":\"240.762s\",\"confidence\":\"0.8109\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Sunday.\",\"startTime\":\"241.162s\",\"endTime\":\"241.172s\",\"confidence\":\"0.9739\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"You\",\"startTime\":\"241.562s\",\"endTime\":\"241.762s\",\"confidence\":\"0.5320\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"241.762s\",\"endTime\":\"241.962s\",\"confidence\":\"0.5270\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"already\",\"startTime\":\"241.962s\",\"endTime\":\"241.972s\",\"confidence\":\"0.3610\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"known?\",\"startTime\":\"241.972s\",\"endTime\":\"242.302s\",\"confidence\":\"0.4499\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"242.562s\",\"endTime\":\"243.122s\",\"confidence\":\"0.8999\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"243.142s\",\"endTime\":\"243.382s\",\"confidence\":\"0.6050\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"am\",\"startTime\":\"243.382s\",\"endTime\":\"243.392s\",\"confidence\":\"0.4580\",\"type\":\"WORD\"},{\"token\":\"already\",\"startTime\":\"243.392s\",\"endTime\":\"243.382s\",\"confidence\":\"0.4269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"known.\",\"startTime\":\"243.382s\",\"endTime\":\"243.922s\",\"confidence\":\"0.9029\",\"type\":\"WORD\"},{\"token\":\"This\",\"startTime\":\"244.822s\",\"endTime\":\"245.142s\",\"confidence\":\"0.3499\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"245.142s\",\"endTime\":\"245.162s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"245.162s\",\"endTime\":\"245.342s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"own\",\"startTime\":\"245.342s\",\"endTime\":\"245.902s\",\"confidence\":\"0.6959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"house,\",\"startTime\":\"245.902s\",\"endTime\":\"245.912s\",\"confidence\":\"0.5500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"246.162s\",\"endTime\":\"246.322s\",\"confidence\":\"0.8280\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"246.382s\",\"endTime\":\"246.602s\",\"confidence\":\"0.7739\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"this\",\"startTime\":\"246.602s\",\"endTime\":\"246.722s\",\"confidence\":\"0.5870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"246.722s\",\"endTime\":\"246.882s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"my\",\"startTime\":\"246.882s\",\"endTime\":\"246.902s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"own\",\"startTime\":\"246.902s\",\"endTime\":\"247.262s\",\"confidence\":\"0.9399\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"house.\",\"startTime\":\"247.262s\",\"endTime\":\"247.272s\",\"confidence\":\"0.9440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"What\",\"startTime\":\"247.282s\",\"endTime\":\"247.442s\",\"confidence\":\"0.8920\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"document\",\"startTime\":\"247.442s\",\"endTime\":\"247.902s\",\"confidence\":\"0.5830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"247.902s\",\"endTime\":\"247.912s\",\"confidence\":\"0.8379\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"247.912s\",\"endTime\":\"248.282s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have?\",\"startTime\":\"248.282s\",\"endTime\":\"248.402s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"The\",\"startTime\":\"249.042s\",\"endTime\":\"249.222s\",\"confidence\":\"0.2049\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"title\",\"startTime\":\"249.222s\",\"endTime\":\"249.322s\",\"confidence\":\"0.7929\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"of\",\"startTime\":\"249.322s\",\"endTime\":\"249.562s\",\"confidence\":\"0.9269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"249.562s\",\"endTime\":\"249.622s\",\"confidence\":\"0.5870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"property.\",\"startTime\":\"249.622s\",\"endTime\":\"249.982s\",\"confidence\":\"0.8709\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"In\",\"startTime\":\"250.362s\",\"endTime\":\"250.482s\",\"confidence\":\"0.5410\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"250.482s\",\"endTime\":\"250.822s\",\"confidence\":\"0.9020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"name\",\"startTime\":\"250.822s\",\"endTime\":\"250.832s\",\"confidence\":\"0.7969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"250.832s\",\"endTime\":\"250.982s\",\"confidence\":\"0.3910\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"250.982s\",\"endTime\":\"251.102s\",\"confidence\":\"0.7440\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"husband's?\",\"startTime\":\"251.102s\",\"endTime\":\"251.602s\",\"confidence\":\"0.8960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Yes,\",\"startTime\":\"251.602s\",\"endTime\":\"251.922s\",\"confidence\":\"0.9200\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"both\",\"startTime\":\"251.922s\",\"endTime\":\"252.282s\",\"confidence\":\"0.5350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"252.282s\",\"endTime\":\"252.292s\",\"confidence\":\"0.4679\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them.\",\"startTime\":\"252.292s\",\"endTime\":\"252.462s\",\"confidence\":\"0.8960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"What\",\"startTime\":\"252.542s\",\"endTime\":\"252.682s\",\"confidence\":\"0.9079\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"does\",\"startTime\":\"252.682s\",\"endTime\":\"252.692s\",\"confidence\":\"0.6740\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"252.692s\",\"endTime\":\"252.762s\",\"confidence\":\"0.9789\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"husband\",\"startTime\":\"252.762s\",\"endTime\":\"253.142s\",\"confidence\":\"0.9990\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do?\",\"startTime\":\"253.142s\",\"endTime\":\"253.742s\",\"confidence\":\"0.9710\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"He\",\"startTime\":\"254.302s\",\"endTime\":\"254.702s\",\"confidence\":\"0.9819\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"works,\",\"startTime\":\"254.702s\",\"endTime\":\"255.062s\",\"confidence\":\"0.9060\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"he\",\"startTime\":\"255.162s\",\"endTime\":\"255.222s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"255.222s\",\"endTime\":\"255.362s\",\"confidence\":\"0.5440\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"255.362s\",\"endTime\":\"255.802s\",\"confidence\":\"0.9819\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"teacher.\",\"startTime\":\"255.802s\",\"endTime\":\"255.812s\",\"confidence\":\"0.9330\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"But\",\"startTime\":\"256.342s\",\"endTime\":\"256.802s\",\"confidence\":\"0.6779\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"he\",\"startTime\":\"256.802s\",\"endTime\":\"256.962s\",\"confidence\":\"0.8930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"256.962s\",\"endTime\":\"257.222s\",\"confidence\":\"0.8560\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"hired.\",\"startTime\":\"257.222s\",\"endTime\":\"257.642s\",\"confidence\":\"0.6579\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"What\",\"startTime\":\"258.722s\",\"endTime\":\"259.282s\",\"confidence\":\"0.1350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"does\",\"startTime\":\"259.282s\",\"endTime\":\"259.292s\",\"confidence\":\"0.7379\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"he\",\"startTime\":\"259.292s\",\"endTime\":\"259.802s\",\"confidence\":\"0.5460\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do?\",\"startTime\":\"259.802s\",\"endTime\":\"260.162s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"He\",\"startTime\":\"260.302s\",\"endTime\":\"260.402s\",\"confidence\":\"0.7580\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"works\",\"startTime\":\"260.402s\",\"endTime\":\"260.412s\",\"confidence\":\"0.8750\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"in\",\"startTime\":\"260.412s\",\"endTime\":\"260.622s\",\"confidence\":\"0.6539\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Tambo\",\"startTime\":\"260.622s\",\"endTime\":\"261.022s\",\"confidence\":\"0.5809\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Grande\",\"startTime\":\"261.022s\",\"endTime\":\"261.322s\",\"confidence\":\"0.9649\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"261.322s\",\"endTime\":\"261.802s\",\"confidence\":\"0.6209\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"also\",\"startTime\":\"261.802s\",\"endTime\":\"262.142s\",\"confidence\":\"0.5080\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"makes\",\"startTime\":\"262.142s\",\"endTime\":\"262.222s\",\"confidence\":\"0.2240\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"his\",\"startTime\":\"262.222s\",\"endTime\":\"262.782s\",\"confidence\":\"0.5120\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"guitars.\",\"startTime\":\"262.782s\",\"endTime\":\"263.422s\",\"confidence\":\"0.9139\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"264.202s\",\"endTime\":\"264.762s\",\"confidence\":\"0.5529\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"he\",\"startTime\":\"264.762s\",\"endTime\":\"264.962s\",\"confidence\":\"0.5860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sells\",\"startTime\":\"264.962s\",\"endTime\":\"265.082s\",\"confidence\":\"0.9430\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them\",\"startTime\":\"265.082s\",\"endTime\":\"265.092s\",\"confidence\":\"0.9629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here\",\"startTime\":\"265.092s\",\"endTime\":\"265.282s\",\"confidence\":\"0.6809\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"in\",\"startTime\":\"265.282s\",\"endTime\":\"265.342s\",\"confidence\":\"0.3140\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"265.342s\",\"endTime\":\"265.642s\",\"confidence\":\"0.7400\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"market?\",\"startTime\":\"265.642s\",\"endTime\":\"265.662s\",\"confidence\":\"0.8339\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Also.\",\"startTime\":\"266.402s\",\"endTime\":\"266.962s\",\"confidence\":\"0.2829\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"At\",\"startTime\":\"267.452s\",\"endTime\":\"267.912s\",\"confidence\":\"0.1150\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"267.912s\",\"endTime\":\"267.972s\",\"confidence\":\"0.7189\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"university,\",\"startTime\":\"267.972s\",\"endTime\":\"268.632s\",\"confidence\":\"0.7810\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sometimes\",\"startTime\":\"269.172s\",\"endTime\":\"269.392s\",\"confidence\":\"0.5170\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"269.392s\",\"endTime\":\"271.192s\",\"confidence\":\"0.3519\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"guys\",\"startTime\":\"271.192s\",\"endTime\":\"271.512s\",\"confidence\":\"0.3240\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"from\",\"startTime\":\"271.512s\",\"endTime\":\"271.612s\",\"confidence\":\"0.5370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"271.612s\",\"endTime\":\"271.772s\",\"confidence\":\"0.8960\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"university\",\"startTime\":\"271.772s\",\"endTime\":\"272.472s\",\"confidence\":\"0.9499\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"come\",\"startTime\":\"272.472s\",\"endTime\":\"272.482s\",\"confidence\":\"0.6909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"272.482s\",\"endTime\":\"273.852s\",\"confidence\":\"0.5799\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"make\",\"startTime\":\"273.852s\",\"endTime\":\"274.352s\",\"confidence\":\"0.5090\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"274.352s\",\"endTime\":\"274.752s\",\"confidence\":\"0.5780\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"contract\",\"startTime\":\"274.752s\",\"endTime\":\"274.762s\",\"confidence\":\"0.9139\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"with\",\"startTime\":\"274.762s\",\"endTime\":\"275.012s\",\"confidence\":\"0.8119\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"a\",\"startTime\":\"275.012s\",\"endTime\":\"275.312s\",\"confidence\":\"0.4620\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"guitar\",\"startTime\":\"275.312s\",\"endTime\":\"275.532s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"275.532s\",\"endTime\":\"276.212s\",\"confidence\":\"0.2800\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"they\",\"startTime\":\"276.212s\",\"endTime\":\"276.952s\",\"confidence\":\"0.4219\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"sell\",\"startTime\":\"276.952s\",\"endTime\":\"277.412s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"277.412s\",\"endTime\":\"277.892s\",\"confidence\":\"0.3709\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"guitar\",\"startTime\":\"277.892s\",\"endTime\":\"278.292s\",\"confidence\":\"0.5009\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"278.292s\",\"endTime\":\"278.592s\",\"confidence\":\"0.5490\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"$350.\",\"startTime\":\"278.592s\",\"endTime\":\"279.552s\",\"confidence\":\"0.6620\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"And\",\"startTime\":\"281.612s\",\"endTime\":\"281.732s\",\"confidence\":\"0.4219\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"how\",\"startTime\":\"281.732s\",\"endTime\":\"282.372s\",\"confidence\":\"0.3540\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"much\",\"startTime\":\"282.372s\",\"endTime\":\"282.452s\",\"confidence\":\"0.9810\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"material\",\"startTime\":\"282.452s\",\"endTime\":\"282.462s\",\"confidence\":\"0.4040\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"will\",\"startTime\":\"282.462s\",\"endTime\":\"282.452s\",\"confidence\":\"0.3030\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"be\",\"startTime\":\"282.452s\",\"endTime\":\"282.972s\",\"confidence\":\"0.3120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"spent?\",\"startTime\":\"282.972s\",\"endTime\":\"282.982s\",\"confidence\":\"0.8500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Material?\",\"startTime\":\"283.532s\",\"endTime\":\"284.332s\",\"confidence\":\"0.7549\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"285.172s\",\"endTime\":\"285.672s\",\"confidence\":\"0.6940\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"don't\",\"startTime\":\"285.672s\",\"endTime\":\"286.032s\",\"confidence\":\"0.9049\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"know,\",\"startTime\":\"286.032s\",\"endTime\":\"286.592s\",\"confidence\":\"0.9459\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"but\",\"startTime\":\"286.612s\",\"endTime\":\"287.352s\",\"confidence\":\"0.3230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"yes,\",\"startTime\":\"287.352s\",\"endTime\":\"288.352s\",\"confidence\":\"0.4379\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that's\",\"startTime\":\"288.432s\",\"endTime\":\"288.912s\",\"confidence\":\"0.5950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"how\",\"startTime\":\"288.912s\",\"endTime\":\"289.112s\",\"confidence\":\"0.4889\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"289.112s\",\"endTime\":\"289.122s\",\"confidence\":\"0.7910\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is.\",\"startTime\":\"289.122s\",\"endTime\":\"289.272s\",\"confidence\":\"0.4280\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Because\",\"startTime\":\"289.532s\",\"endTime\":\"289.732s\",\"confidence\":\"0.6230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"he\",\"startTime\":\"289.732s\",\"endTime\":\"289.872s\",\"confidence\":\"0.8159\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buys\",\"startTime\":\"289.872s\",\"endTime\":\"290.552s\",\"confidence\":\"0.9039\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"290.552s\",\"endTime\":\"290.792s\",\"confidence\":\"0.8040\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"wood\",\"startTime\":\"290.792s\",\"endTime\":\"291.212s\",\"confidence\":\"0.9789\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"in\",\"startTime\":\"291.212s\",\"endTime\":\"291.452s\",\"confidence\":\"0.8370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"quantity\",\"startTime\":\"291.452s\",\"endTime\":\"292.052s\",\"confidence\":\"0.5559\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"so\",\"startTime\":\"292.052s\",\"endTime\":\"293.172s\",\"confidence\":\"0.3449\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"293.172s\",\"endTime\":\"293.412s\",\"confidence\":\"0.7360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"293.412s\",\"endTime\":\"293.452s\",\"confidence\":\"0.8579\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"works\",\"startTime\":\"293.452s\",\"endTime\":\"293.912s\",\"confidence\":\"0.2380\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"for\",\"startTime\":\"293.912s\",\"endTime\":\"294.272s\",\"confidence\":\"0.3019\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"him\",\"startTime\":\"294.272s\",\"endTime\":\"294.312s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"too.\",\"startTime\":\"294.312s\",\"endTime\":\"294.452s\",\"confidence\":\"0.2939\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"He\",\"startTime\":\"294.512s\",\"endTime\":\"295.312s\",\"confidence\":\"0.5469\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"buys\",\"startTime\":\"295.312s\",\"endTime\":\"295.432s\",\"confidence\":\"0.9449\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"295.432s\",\"endTime\":\"295.792s\",\"confidence\":\"0.9559\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"tail,\",\"startTime\":\"295.792s\",\"endTime\":\"296.192s\",\"confidence\":\"0.3170\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Big\",\"startTime\":\"296.802s\",\"endTime\":\"297.542s\",\"confidence\":\"0.0149\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bowls,\",\"startTime\":\"297.542s\",\"endTime\":\"297.552s\",\"confidence\":\"0.2090\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"big\",\"startTime\":\"298.862s\",\"endTime\":\"299.082s\",\"confidence\":\"0.3079\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"dinners,\",\"startTime\":\"299.082s\",\"endTime\":\"299.602s\",\"confidence\":\"0.7269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"big\",\"startTime\":\"300.342s\",\"endTime\":\"300.962s\",\"confidence\":\"0.1940\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bottles,\",\"startTime\":\"300.962s\",\"endTime\":\"301.202s\",\"confidence\":\"0.6940\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"big\",\"startTime\":\"301.202s\",\"endTime\":\"301.212s\",\"confidence\":\"0.6520\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"It's\",\"startTime\":\"304.462s\",\"endTime\":\"304.882s\",\"confidence\":\"0.3100\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"like\",\"startTime\":\"304.882s\",\"endTime\":\"304.942s\",\"confidence\":\"0.6359\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"304.942s\",\"endTime\":\"305.022s\",\"confidence\":\"0.9850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"small\",\"startTime\":\"305.022s\",\"endTime\":\"305.362s\",\"confidence\":\"0.8450\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"workshop.\",\"startTime\":\"305.362s\",\"endTime\":\"305.722s\",\"confidence\":\"0.8960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Of\",\"startTime\":\"305.722s\",\"endTime\":\"305.732s\",\"confidence\":\"0.1389\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"course,\",\"startTime\":\"305.732s\",\"endTime\":\"306.202s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it's\",\"startTime\":\"306.202s\",\"endTime\":\"306.482s\",\"confidence\":\"0.7360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"306.482s\",\"endTime\":\"306.502s\",\"confidence\":\"0.8249\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"small\",\"startTime\":\"306.502s\",\"endTime\":\"306.882s\",\"confidence\":\"0.8719\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"workshop.\",\"startTime\":\"306.882s\",\"endTime\":\"307.242s\",\"confidence\":\"0.8669\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"It's\",\"startTime\":\"307.402s\",\"endTime\":\"307.602s\",\"confidence\":\"0.3529\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"up\",\"startTime\":\"307.602s\",\"endTime\":\"307.612s\",\"confidence\":\"0.4679\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"there.\",\"startTime\":\"307.612s\",\"endTime\":\"308.302s\",\"confidence\":\"0.6909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Yes,\",\"startTime\":\"308.742s\",\"endTime\":\"309.122s\",\"confidence\":\"0.5659\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"yes,\",\"startTime\":\"309.242s\",\"endTime\":\"309.252s\",\"confidence\":\"0.4189\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Rubia\",\"startTime\":\"309.782s\",\"endTime\":\"310.242s\",\"confidence\":\"0.5180\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"showed\",\"startTime\":\"310.242s\",\"endTime\":\"310.622s\",\"confidence\":\"0.6560\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"us\",\"startTime\":\"310.622s\",\"endTime\":\"310.762s\",\"confidence\":\"0.9340\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"310.762s\",\"endTime\":\"310.802s\",\"confidence\":\"0.9039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"pictures.\",\"startTime\":\"310.802s\",\"endTime\":\"311.122s\",\"confidence\":\"0.5350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Tell\",\"startTime\":\"312.622s\",\"endTime\":\"312.822s\",\"confidence\":\"0.5450\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"me,\",\"startTime\":\"312.822s\",\"endTime\":\"313.022s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"these\",\"startTime\":\"313.062s\",\"endTime\":\"313.222s\",\"confidence\":\"0.5899\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"loans\",\"startTime\":\"313.222s\",\"endTime\":\"313.582s\",\"confidence\":\"0.2409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"from\",\"startTime\":\"313.582s\",\"endTime\":\"313.742s\",\"confidence\":\"0.7570\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"my\",\"startTime\":\"313.742s\",\"endTime\":\"313.902s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"bank,\",\"startTime\":\"313.902s\",\"endTime\":\"314.122s\",\"confidence\":\"0.9850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"how\",\"startTime\":\"314.242s\",\"endTime\":\"314.342s\",\"confidence\":\"0.2189\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"did\",\"startTime\":\"314.342s\",\"endTime\":\"314.482s\",\"confidence\":\"0.8629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"314.482s\",\"endTime\":\"315.122s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"invest\",\"startTime\":\"315.122s\",\"endTime\":\"315.132s\",\"confidence\":\"0.8709\",\"type\":\"WORD\"},{\"token\":\"them?\",\"startTime\":\"315.132s\",\"endTime\":\"315.122s\",\"confidence\":\"0.6209\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Well,\",\"startTime\":\"315.762s\",\"endTime\":\"316.342s\",\"confidence\":\"0.1899\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"316.982s\",\"endTime\":\"317.342s\",\"confidence\":\"0.5460\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"finish\",\"startTime\":\"317.342s\",\"endTime\":\"318.182s\",\"confidence\":\"0.8700\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"building\",\"startTime\":\"318.182s\",\"endTime\":\"318.782s\",\"confidence\":\"0.1630\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"318.782s\",\"endTime\":\"319.122s\",\"confidence\":\"0.3249\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"walls\",\"startTime\":\"319.122s\",\"endTime\":\"319.362s\",\"confidence\":\"0.8799\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"of\",\"startTime\":\"319.362s\",\"endTime\":\"319.562s\",\"confidence\":\"0.3849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"319.562s\",\"endTime\":\"320.082s\",\"confidence\":\"0.6269\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"second\",\"startTime\":\"320.082s\",\"endTime\":\"320.122s\",\"confidence\":\"0.2370\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"floor.\",\"startTime\":\"320.122s\",\"endTime\":\"320.522s\",\"confidence\":\"0.9599\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Since\",\"startTime\":\"320.802s\",\"endTime\":\"321.202s\",\"confidence\":\"0.2310\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"321.202s\",\"endTime\":\"321.502s\",\"confidence\":\"0.8259\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"still\",\"startTime\":\"321.502s\",\"endTime\":\"321.782s\",\"confidence\":\"0.6690\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"had\",\"startTime\":\"321.782s\",\"endTime\":\"321.802s\",\"confidence\":\"0.8500\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"material\",\"startTime\":\"321.802s\",\"endTime\":\"322.202s\",\"confidence\":\"0.4909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"322.202s\",\"endTime\":\"322.402s\",\"confidence\":\"0.2849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"322.402s\",\"endTime\":\"322.462s\",\"confidence\":\"0.3400\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"had\",\"startTime\":\"322.462s\",\"endTime\":\"322.822s\",\"confidence\":\"0.6909\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"left\",\"startTime\":\"322.822s\",\"endTime\":\"323.122s\",\"confidence\":\"0.7799\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"from\",\"startTime\":\"323.122s\",\"endTime\":\"323.642s\",\"confidence\":\"0.6309\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"this\",\"startTime\":\"323.642s\",\"endTime\":\"324.062s\",\"confidence\":\"0.3869\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"light\",\"startTime\":\"324.062s\",\"endTime\":\"324.522s\",\"confidence\":\"0.5479\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"roof,\",\"startTime\":\"324.522s\",\"endTime\":\"324.542s\",\"confidence\":\"0.3300\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"we\",\"startTime\":\"325.062s\",\"endTime\":\"325.742s\",\"confidence\":\"0.1360\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"completed\",\"startTime\":\"325.742s\",\"endTime\":\"327.242s\",\"confidence\":\"0.3389\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"327.242s\",\"endTime\":\"327.252s\",\"confidence\":\"0.8379\",\"type\":\"WORD\"},{\"token\":\"there,\",\"startTime\":\"327.252s\",\"endTime\":\"327.242s\",\"confidence\":\"0.4880\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"and\",\"startTime\":\"327.562s\",\"endTime\":\"327.802s\",\"confidence\":\"0.5009\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"then\",\"startTime\":\"327.802s\",\"endTime\":\"327.922s\",\"confidence\":\"0.6779\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"we\",\"startTime\":\"327.922s\",\"endTime\":\"328.222s\",\"confidence\":\"0.6510\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"took\",\"startTime\":\"328.222s\",\"endTime\":\"328.282s\",\"confidence\":\"0.8230\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"328.282s\",\"endTime\":\"328.302s\",\"confidence\":\"0.8610\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"out.\",\"startTime\":\"328.302s\",\"endTime\":\"328.522s\",\"confidence\":\"0.8629\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"All\",\"startTime\":\"328.582s\",\"endTime\":\"328.802s\",\"confidence\":\"0.5049\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"328.802s\",\"endTime\":\"328.812s\",\"confidence\":\"0.2960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"328.812s\",\"endTime\":\"329.082s\",\"confidence\":\"0.9720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"house\",\"startTime\":\"329.082s\",\"endTime\":\"329.122s\",\"confidence\":\"0.5210\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"329.122s\",\"endTime\":\"329.322s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"new\",\"startTime\":\"329.322s\",\"endTime\":\"329.922s\",\"confidence\":\"0.1040\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"material,\",\"startTime\":\"329.922s\",\"endTime\":\"329.932s\",\"confidence\":\"0.8230\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"330.182s\",\"endTime\":\"330.202s\",\"confidence\":\"0.7870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"How\",\"startTime\":\"330.342s\",\"endTime\":\"330.702s\",\"confidence\":\"0.4769\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"much\",\"startTime\":\"330.702s\",\"endTime\":\"331.322s\",\"confidence\":\"0.8619\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"331.322s\",\"endTime\":\"331.332s\",\"confidence\":\"0.8019\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it?\",\"startTime\":\"331.332s\",\"endTime\":\"332.282s\",\"confidence\":\"0.7310\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"It's\",\"startTime\":\"332.282s\",\"endTime\":\"332.602s\",\"confidence\":\"0.4990\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"7x7,\",\"startTime\":\"332.602s\",\"endTime\":\"334.702s\",\"confidence\":\"0.4930\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"334.702s\",\"endTime\":\"334.712s\",\"confidence\":\"0.7189\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"think\",\"startTime\":\"334.712s\",\"endTime\":\"335.102s\",\"confidence\":\"0.9319\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"335.102s\",\"endTime\":\"335.142s\",\"confidence\":\"0.5509\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"has...\",\"startTime\":\"335.142s\",\"endTime\":\"336.922s\",\"confidence\":\"0.5299\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"7x7,\",\"startTime\":\"336.922s\",\"endTime\":\"338.402s\",\"confidence\":\"0.9160\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"there\",\"startTime\":\"339.282s\",\"endTime\":\"339.292s\",\"confidence\":\"0.1640\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it\",\"startTime\":\"339.292s\",\"endTime\":\"339.662s\",\"confidence\":\"0.5989\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is.\",\"startTime\":\"339.662s\",\"endTime\":\"339.782s\",\"confidence\":\"0.9219\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"More,\",\"startTime\":\"340.042s\",\"endTime\":\"340.442s\",\"confidence\":\"0.3089\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"more.\",\"startTime\":\"340.542s\",\"endTime\":\"340.702s\",\"confidence\":\"0.6809\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"In\",\"startTime\":\"340.702s\",\"endTime\":\"340.942s\",\"confidence\":\"0.2849\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"340.942s\",\"endTime\":\"341.982s\",\"confidence\":\"0.9470\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"property\",\"startTime\":\"341.982s\",\"endTime\":\"342.722s\",\"confidence\":\"0.6060\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"estate,\",\"startTime\":\"342.722s\",\"endTime\":\"342.732s\",\"confidence\":\"0.1040\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it's\",\"startTime\":\"342.732s\",\"endTime\":\"343.122s\",\"confidence\":\"0.6340\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"there.\",\"startTime\":\"343.122s\",\"endTime\":\"343.162s\",\"confidence\":\"0.8000\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"In\",\"startTime\":\"343.162s\",\"endTime\":\"343.172s\",\"confidence\":\"0.1490\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"343.172s\",\"endTime\":\"343.382s\",\"confidence\":\"0.7289\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"property\",\"startTime\":\"343.382s\",\"endTime\":\"343.392s\",\"confidence\":\"0.4550\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"estate,\",\"startTime\":\"343.392s\",\"endTime\":\"343.502s\",\"confidence\":\"0.8629\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"343.622s\",\"endTime\":\"343.682s\",\"confidence\":\"0.8199\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"have\",\"startTime\":\"343.682s\",\"endTime\":\"343.782s\",\"confidence\":\"0.8659\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"343.782s\",\"endTime\":\"343.962s\",\"confidence\":\"0.8080\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"other\",\"startTime\":\"343.962s\",\"endTime\":\"344.122s\",\"confidence\":\"0.0689\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"ones.\",\"startTime\":\"344.122s\",\"endTime\":\"344.162s\",\"confidence\":\"0.3919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"You\",\"startTime\":\"345.442s\",\"endTime\":\"345.862s\",\"confidence\":\"0.0509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"will\",\"startTime\":\"345.862s\",\"endTime\":\"346.102s\",\"confidence\":\"0.1519\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"not\",\"startTime\":\"346.102s\",\"endTime\":\"346.112s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"need\",\"startTime\":\"346.112s\",\"endTime\":\"346.562s\",\"confidence\":\"0.9399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"346.562s\",\"endTime\":\"346.572s\",\"confidence\":\"0.2870\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"little\",\"startTime\":\"346.572s\",\"endTime\":\"346.982s\",\"confidence\":\"0.8080\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"more\",\"startTime\":\"346.982s\",\"endTime\":\"347.382s\",\"confidence\":\"0.8349\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"money\",\"startTime\":\"347.382s\",\"endTime\":\"347.822s\",\"confidence\":\"0.9509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"347.822s\",\"endTime\":\"348.442s\",\"confidence\":\"0.5230\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"invest\",\"startTime\":\"348.442s\",\"endTime\":\"349.002s\",\"confidence\":\"0.7839\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"in\",\"startTime\":\"349.002s\",\"endTime\":\"349.942s\",\"confidence\":\"0.7760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"349.942s\",\"endTime\":\"350.082s\",\"confidence\":\"0.6060\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"lucir,\",\"startTime\":\"350.082s\",\"endTime\":\"350.582s\",\"confidence\":\"0.4199\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"350.682s\",\"endTime\":\"351.242s\",\"confidence\":\"0.4339\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"we\",\"startTime\":\"351.242s\",\"endTime\":\"352.162s\",\"confidence\":\"0.6660\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"352.162s\",\"endTime\":\"352.542s\",\"confidence\":\"0.8080\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"practically\",\"startTime\":\"352.542s\",\"endTime\":\"352.562s\",\"confidence\":\"0.2680\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"buying\",\"startTime\":\"352.562s\",\"endTime\":\"352.822s\",\"confidence\":\"0.9300\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"352.822s\",\"endTime\":\"352.982s\",\"confidence\":\"0.4149\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"from\",\"startTime\":\"352.982s\",\"endTime\":\"353.322s\",\"confidence\":\"0.7599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Ivanko,\",\"startTime\":\"353.322s\",\"endTime\":\"354.462s\",\"confidence\":\"0.6380\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"but\",\"startTime\":\"354.502s\",\"endTime\":\"355.222s\",\"confidence\":\"0.8790\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"what\",\"startTime\":\"355.222s\",\"endTime\":\"355.842s\",\"confidence\":\"0.6850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"355.842s\",\"endTime\":\"355.862s\",\"confidence\":\"0.2689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"355.862s\",\"endTime\":\"355.872s\",\"confidence\":\"0.9309\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"355.872s\",\"endTime\":\"355.982s\",\"confidence\":\"0.9509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"355.982s\",\"endTime\":\"355.992s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"get?\",\"startTime\":\"355.992s\",\"endTime\":\"356.162s\",\"confidence\":\"0.3449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"2\",\"startTime\":\"356.382s\",\"endTime\":\"356.522s\",\"confidence\":\"0.2930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\",000\",\"startTime\":\"356.522s\",\"endTime\":\"356.762s\",\"confidence\":\"0.8960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"soles.\",\"startTime\":\"356.762s\",\"endTime\":\"357.302s\",\"confidence\":\"0.9700\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"You\",\"startTime\":\"357.422s\",\"endTime\":\"357.622s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"will\",\"startTime\":\"357.622s\",\"endTime\":\"357.702s\",\"confidence\":\"0.6409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"not\",\"startTime\":\"357.702s\",\"endTime\":\"357.712s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"need\",\"startTime\":\"357.712s\",\"endTime\":\"357.942s\",\"confidence\":\"0.9720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"more\",\"startTime\":\"357.942s\",\"endTime\":\"358.102s\",\"confidence\":\"0.7570\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"358.102s\",\"endTime\":\"358.482s\",\"confidence\":\"0.4110\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"invest\",\"startTime\":\"358.482s\",\"endTime\":\"359.342s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"in\",\"startTime\":\"359.342s\",\"endTime\":\"359.582s\",\"confidence\":\"0.9729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"359.582s\",\"endTime\":\"359.722s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business\",\"startTime\":\"359.722s\",\"endTime\":\"360.182s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"360.182s\",\"endTime\":\"361.142s\",\"confidence\":\"0.5149\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"361.142s\",\"endTime\":\"361.282s\",\"confidence\":\"0.8690\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"will\",\"startTime\":\"361.282s\",\"endTime\":\"361.422s\",\"confidence\":\"0.8220\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"end\",\"startTime\":\"361.422s\",\"endTime\":\"361.602s\",\"confidence\":\"0.1689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"up\",\"startTime\":\"361.602s\",\"endTime\":\"361.642s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"361.642s\",\"endTime\":\"361.762s\",\"confidence\":\"0.9750\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"362.542s\",\"endTime\":\"363.202s\",\"confidence\":\"0.5640\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"thing\",\"startTime\":\"363.202s\",\"endTime\":\"363.442s\",\"confidence\":\"0.7950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"is\",\"startTime\":\"363.442s\",\"endTime\":\"363.842s\",\"confidence\":\"0.9819\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"that\",\"startTime\":\"363.842s\",\"endTime\":\"364.002s\",\"confidence\":\"0.4280\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"I\",\"startTime\":\"364.002s\",\"endTime\":\"364.662s\",\"confidence\":\"0.5619\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"don't\",\"startTime\":\"364.662s\",\"endTime\":\"365.182s\",\"confidence\":\"0.7450\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"get\",\"startTime\":\"365.182s\",\"endTime\":\"365.682s\",\"confidence\":\"0.5320\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"almost\",\"startTime\":\"365.682s\",\"endTime\":\"366.002s\",\"confidence\":\"0.2919\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"366.002s\",\"endTime\":\"366.682s\",\"confidence\":\"0.9340\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"same\",\"startTime\":\"366.682s\",\"endTime\":\"367.322s\",\"confidence\":\"0.9729\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"pay\",\"startTime\":\"367.322s\",\"endTime\":\"367.542s\",\"confidence\":\"0.3280\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"as\",\"startTime\":\"367.542s\",\"endTime\":\"367.782s\",\"confidence\":\"0.4480\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"at\",\"startTime\":\"367.782s\",\"endTime\":\"368.362s\",\"confidence\":\"0.1700\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"the\",\"startTime\":\"368.362s\",\"endTime\":\"368.562s\",\"confidence\":\"0.7870\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"bar.\",\"startTime\":\"368.562s\",\"endTime\":\"368.702s\",\"confidence\":\"0.4399\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"So\",\"startTime\":\"371.272s\",\"endTime\":\"371.732s\",\"confidence\":\"0.2310\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it's\",\"startTime\":\"371.732s\",\"endTime\":\"371.972s\",\"confidence\":\"0.4850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fine\",\"startTime\":\"371.972s\",\"endTime\":\"372.152s\",\"confidence\":\"0.2509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"there,\",\"startTime\":\"372.152s\",\"endTime\":\"372.312s\",\"confidence\":\"0.3770\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"372.572s\",\"endTime\":\"372.582s\",\"confidence\":\"0.8019\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"look,\",\"startTime\":\"372.582s\",\"endTime\":\"372.732s\",\"confidence\":\"0.1480\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you're\",\"startTime\":\"372.892s\",\"endTime\":\"372.992s\",\"confidence\":\"0.6449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"only\",\"startTime\":\"372.992s\",\"endTime\":\"373.492s\",\"confidence\":\"0.4749\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"working,\",\"startTime\":\"373.492s\",\"endTime\":\"373.502s\",\"confidence\":\"0.9380\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"373.852s\",\"endTime\":\"373.952s\",\"confidence\":\"0.7319\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"husband\",\"startTime\":\"373.952s\",\"endTime\":\"374.212s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"has\",\"startTime\":\"374.212s\",\"endTime\":\"374.592s\",\"confidence\":\"0.7509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"consumption.\",\"startTime\":\"374.592s\",\"endTime\":\"375.092s\",\"confidence\":\"0.1729\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Because\",\"startTime\":\"375.112s\",\"endTime\":\"375.272s\",\"confidence\":\"0.2660\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"it's\",\"startTime\":\"375.272s\",\"endTime\":\"375.432s\",\"confidence\":\"0.5159\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"going\",\"startTime\":\"375.432s\",\"endTime\":\"375.512s\",\"confidence\":\"0.8259\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"to\",\"startTime\":\"375.512s\",\"endTime\":\"375.752s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"be\",\"startTime\":\"375.752s\",\"endTime\":\"375.792s\",\"confidence\":\"0.6330\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"more\",\"startTime\":\"375.792s\",\"endTime\":\"375.952s\",\"confidence\":\"0.3910\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"or\",\"startTime\":\"375.952s\",\"endTime\":\"376.092s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"less\",\"startTime\":\"376.092s\",\"endTime\":\"376.432s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"like\",\"startTime\":\"376.432s\",\"endTime\":\"376.772s\",\"confidence\":\"0.6999\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"4\",\"startTime\":\"376.772s\",\"endTime\":\"376.892s\",\"confidence\":\"0.3709\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\",500.\",\"startTime\":\"376.892s\",\"endTime\":\"377.212s\",\"confidence\":\"0.8750\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Oh\",\"startTime\":\"377.292s\",\"endTime\":\"377.572s\",\"confidence\":\"0.4199\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"yeah,\",\"startTime\":\"377.572s\",\"endTime\":\"377.652s\",\"confidence\":\"0.4140\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"so\",\"startTime\":\"377.792s\",\"endTime\":\"377.992s\",\"confidence\":\"0.7210\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it's\",\"startTime\":\"377.992s\",\"endTime\":\"378.192s\",\"confidence\":\"0.7480\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"378.192s\",\"endTime\":\"378.292s\",\"confidence\":\"0.8759\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"378.292s\",\"endTime\":\"378.492s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"be\",\"startTime\":\"378.492s\",\"endTime\":\"378.552s\",\"confidence\":\"0.5609\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"left.\",\"startTime\":\"378.552s\",\"endTime\":\"378.562s\",\"confidence\":\"0.2669\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"The\",\"startTime\":\"379.172s\",\"endTime\":\"379.572s\",\"confidence\":\"0.3829\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"idea\",\"startTime\":\"379.572s\",\"endTime\":\"379.912s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"379.912s\",\"endTime\":\"380.112s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"380.112s\",\"endTime\":\"380.292s\",\"confidence\":\"0.6539\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"following,\",\"startTime\":\"380.292s\",\"endTime\":\"380.592s\",\"confidence\":\"0.9430\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"380.832s\",\"endTime\":\"380.842s\",\"confidence\":\"0.2890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"With\",\"startTime\":\"380.852s\",\"endTime\":\"381.032s\",\"confidence\":\"0.8849\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"this\",\"startTime\":\"381.032s\",\"endTime\":\"381.232s\",\"confidence\":\"0.9380\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"debt\",\"startTime\":\"381.232s\",\"endTime\":\"381.852s\",\"confidence\":\"0.9350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"purchase,\",\"startTime\":\"381.852s\",\"endTime\":\"381.862s\",\"confidence\":\"0.7390\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"382.032s\",\"endTime\":\"382.172s\",\"confidence\":\"0.6250\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"example,\",\"startTime\":\"382.172s\",\"endTime\":\"382.572s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"382.612s\",\"endTime\":\"382.632s\",\"confidence\":\"0.7490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"has\",\"startTime\":\"382.632s\",\"endTime\":\"382.712s\",\"confidence\":\"0.6420\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"been\",\"startTime\":\"382.712s\",\"endTime\":\"382.852s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"382.852s\",\"endTime\":\"383.052s\",\"confidence\":\"0.8849\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"construction,\",\"startTime\":\"383.052s\",\"endTime\":\"383.612s\",\"confidence\":\"0.9739\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"383.892s\",\"endTime\":\"384.252s\",\"confidence\":\"0.4790\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"But\",\"startTime\":\"384.632s\",\"endTime\":\"384.972s\",\"confidence\":\"0.9549\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"384.972s\",\"endTime\":\"385.152s\",\"confidence\":\"0.5640\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"later,\",\"startTime\":\"385.152s\",\"endTime\":\"385.492s\",\"confidence\":\"0.7400\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"suddenly\",\"startTime\":\"385.632s\",\"endTime\":\"385.992s\",\"confidence\":\"0.7160\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"385.992s\",\"endTime\":\"386.212s\",\"confidence\":\"0.6100\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"want\",\"startTime\":\"386.212s\",\"endTime\":\"386.272s\",\"confidence\":\"0.3860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"386.272s\",\"endTime\":\"386.492s\",\"confidence\":\"0.7879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"capital\",\"startTime\":\"386.492s\",\"endTime\":\"386.732s\",\"confidence\":\"0.7490\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"386.732s\",\"endTime\":\"386.932s\",\"confidence\":\"0.6370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"work,\",\"startTime\":\"386.932s\",\"endTime\":\"387.312s\",\"confidence\":\"0.8750\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"387.612s\",\"endTime\":\"387.622s\",\"confidence\":\"0.7020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"387.622s\",\"endTime\":\"387.832s\",\"confidence\":\"0.5469\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"not\",\"startTime\":\"387.832s\",\"endTime\":\"387.872s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"necessary\",\"startTime\":\"387.872s\",\"endTime\":\"388.212s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"388.212s\",\"endTime\":\"388.372s\",\"confidence\":\"0.7829\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"388.372s\",\"endTime\":\"388.632s\",\"confidence\":\"0.9919\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"go\",\"startTime\":\"388.632s\",\"endTime\":\"388.642s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"388.642s\",\"endTime\":\"388.732s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"my\",\"startTime\":\"388.732s\",\"endTime\":\"388.912s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"bank,\",\"startTime\":\"388.912s\",\"endTime\":\"389.252s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"we\",\"startTime\":\"389.512s\",\"endTime\":\"389.712s\",\"confidence\":\"0.9399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"can\",\"startTime\":\"389.712s\",\"endTime\":\"390.112s\",\"confidence\":\"0.9610\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"give\",\"startTime\":\"390.112s\",\"endTime\":\"390.232s\",\"confidence\":\"0.9720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"390.232s\",\"endTime\":\"390.372s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"390.372s\",\"endTime\":\"390.552s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"parallel\",\"startTime\":\"390.552s\",\"endTime\":\"390.932s\",\"confidence\":\"0.7649\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"390.932s\",\"endTime\":\"391.772s\",\"confidence\":\"0.2860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"391.772s\",\"endTime\":\"391.992s\",\"confidence\":\"0.6470\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"small\",\"startTime\":\"391.992s\",\"endTime\":\"392.412s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"amount,\",\"startTime\":\"392.412s\",\"endTime\":\"392.422s\",\"confidence\":\"0.9499\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"1\",\"startTime\":\"392.652s\",\"endTime\":\"392.752s\",\"confidence\":\"0.1969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\",000\",\"startTime\":\"392.752s\",\"endTime\":\"392.872s\",\"confidence\":\"0.9689\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"soles,\",\"startTime\":\"392.872s\",\"endTime\":\"393.172s\",\"confidence\":\"0.6320\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"2\",\"startTime\":\"393.192s\",\"endTime\":\"393.372s\",\"confidence\":\"0.9700\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\",000\",\"startTime\":\"393.372s\",\"endTime\":\"393.512s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"soles,\",\"startTime\":\"393.512s\",\"endTime\":\"393.812s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"393.852s\",\"endTime\":\"393.992s\",\"confidence\":\"0.9210\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"393.992s\",\"endTime\":\"394.172s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business,\",\"startTime\":\"394.172s\",\"endTime\":\"394.452s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"right?\",\"startTime\":\"394.512s\",\"endTime\":\"394.592s\",\"confidence\":\"0.9369\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"Of\",\"startTime\":\"394.592s\",\"endTime\":\"394.672s\",\"confidence\":\"0.3799\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"course.\",\"startTime\":\"394.672s\",\"endTime\":\"394.952s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":1},{\"token\":\"For\",\"startTime\":\"395.212s\",\"endTime\":\"395.432s\",\"confidence\":\"0.4140\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"395.432s\",\"endTime\":\"395.632s\",\"confidence\":\"0.9070\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"395.632s\",\"endTime\":\"395.672s\",\"confidence\":\"0.9639\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"turn\",\"startTime\":\"395.672s\",\"endTime\":\"395.872s\",\"confidence\":\"0.3190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"395.872s\",\"endTime\":\"396.072s\",\"confidence\":\"0.4810\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business\",\"startTime\":\"396.072s\",\"endTime\":\"396.332s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"around,\",\"startTime\":\"396.332s\",\"endTime\":\"396.342s\",\"confidence\":\"0.7879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"396.392s\",\"endTime\":\"396.592s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"we\",\"startTime\":\"396.592s\",\"endTime\":\"396.912s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"know\",\"startTime\":\"396.912s\",\"endTime\":\"397.432s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"397.432s\",\"endTime\":\"397.592s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"in\",\"startTime\":\"397.592s\",\"endTime\":\"397.612s\",\"confidence\":\"0.9120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"397.612s\",\"endTime\":\"397.852s\",\"confidence\":\"0.9990\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"end\",\"startTime\":\"397.852s\",\"endTime\":\"398.392s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"398.392s\",\"endTime\":\"398.612s\",\"confidence\":\"0.7369\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"move\",\"startTime\":\"398.612s\",\"endTime\":\"398.952s\",\"confidence\":\"0.9250\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"everything,\",\"startTime\":\"398.952s\",\"endTime\":\"399.312s\",\"confidence\":\"0.7680\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Your\",\"startTime\":\"400.072s\",\"endTime\":\"400.412s\",\"confidence\":\"0.3089\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business\",\"startTime\":\"400.412s\",\"endTime\":\"400.652s\",\"confidence\":\"0.7120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"400.652s\",\"endTime\":\"401.052s\",\"confidence\":\"0.5419\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"capital\",\"startTime\":\"401.052s\",\"endTime\":\"401.532s\",\"confidence\":\"0.9049\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"like\",\"startTime\":\"401.532s\",\"endTime\":\"401.752s\",\"confidence\":\"0.2049\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"this,\",\"startTime\":\"401.752s\",\"endTime\":\"402.152s\",\"confidence\":\"0.4650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with,\",\"startTime\":\"403.772s\",\"endTime\":\"403.832s\",\"confidence\":\"0.3089\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"I\",\"startTime\":\"403.832s\",\"endTime\":\"404.032s\",\"confidence\":\"0.5640\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"don't\",\"startTime\":\"404.032s\",\"endTime\":\"404.132s\",\"confidence\":\"0.9409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"know,\",\"startTime\":\"404.132s\",\"endTime\":\"404.172s\",\"confidence\":\"0.9980\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"404.452s\",\"endTime\":\"404.472s\",\"confidence\":\"0.2000\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"404.472s\",\"endTime\":\"404.492s\",\"confidence\":\"0.5500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"404.492s\",\"endTime\":\"404.912s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"buy\",\"startTime\":\"404.912s\",\"endTime\":\"404.922s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"beer,\",\"startTime\":\"404.922s\",\"endTime\":\"405.412s\",\"confidence\":\"0.9300\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"405.612s\",\"endTime\":\"405.622s\",\"confidence\":\"0.2860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"405.622s\",\"endTime\":\"405.692s\",\"confidence\":\"0.9629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"405.692s\",\"endTime\":\"405.912s\",\"confidence\":\"0.9800\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"buy\",\"startTime\":\"405.912s\",\"endTime\":\"406.012s\",\"confidence\":\"0.9879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"cigarettes,\",\"startTime\":\"406.012s\",\"endTime\":\"406.452s\",\"confidence\":\"0.0970\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"406.832s\",\"endTime\":\"406.992s\",\"confidence\":\"0.6259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"406.992s\",\"endTime\":\"407.272s\",\"confidence\":\"0.7649\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"407.272s\",\"endTime\":\"407.572s\",\"confidence\":\"0.3899\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fast.\",\"startTime\":\"407.572s\",\"endTime\":\"408.072s\",\"confidence\":\"0.3459\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Unlike\",\"startTime\":\"409.052s\",\"endTime\":\"409.452s\",\"confidence\":\"0.7020\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"409.452s\",\"endTime\":\"409.692s\",\"confidence\":\"0.7839\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"credit\",\"startTime\":\"409.692s\",\"endTime\":\"409.852s\",\"confidence\":\"0.6650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"409.852s\",\"endTime\":\"410.012s\",\"confidence\":\"0.4390\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"410.012s\",\"endTime\":\"410.192s\",\"confidence\":\"0.8460\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"410.192s\",\"endTime\":\"410.372s\",\"confidence\":\"0.7699\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"construction,\",\"startTime\":\"410.372s\",\"endTime\":\"410.872s\",\"confidence\":\"0.9620\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"411.312s\",\"endTime\":\"411.512s\",\"confidence\":\"0.5320\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"sometimes\",\"startTime\":\"411.512s\",\"endTime\":\"411.892s\",\"confidence\":\"0.9430\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"takes\",\"startTime\":\"411.892s\",\"endTime\":\"412.572s\",\"confidence\":\"0.7059\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"time,\",\"startTime\":\"412.572s\",\"endTime\":\"412.952s\",\"confidence\":\"0.6190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"413.372s\",\"endTime\":\"413.432s\",\"confidence\":\"0.6250\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"413.432s\",\"endTime\":\"413.712s\",\"confidence\":\"0.5220\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"silver,\",\"startTime\":\"413.712s\",\"endTime\":\"413.952s\",\"confidence\":\"0.3919\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"so\",\"startTime\":\"414.052s\",\"endTime\":\"414.172s\",\"confidence\":\"0.2440\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"414.172s\",\"endTime\":\"414.182s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"speak,\",\"startTime\":\"414.182s\",\"endTime\":\"414.392s\",\"confidence\":\"0.9399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"414.512s\",\"endTime\":\"414.522s\",\"confidence\":\"0.8190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"414.522s\",\"endTime\":\"414.772s\",\"confidence\":\"0.9169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"not\",\"startTime\":\"414.772s\",\"endTime\":\"414.852s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"414.852s\",\"endTime\":\"414.872s\",\"confidence\":\"0.8349\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"dead\",\"startTime\":\"414.872s\",\"endTime\":\"414.882s\",\"confidence\":\"0.8510\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"investment,\",\"startTime\":\"414.882s\",\"endTime\":\"415.652s\",\"confidence\":\"0.9449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"so\",\"startTime\":\"415.732s\",\"endTime\":\"415.932s\",\"confidence\":\"0.8780\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"415.932s\",\"endTime\":\"416.032s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"speak,\",\"startTime\":\"416.032s\",\"endTime\":\"416.172s\",\"confidence\":\"0.9670\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"416.312s\",\"endTime\":\"416.812s\",\"confidence\":\"0.9649\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"416.812s\",\"endTime\":\"417.012s\",\"confidence\":\"0.8949\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"house\",\"startTime\":\"417.012s\",\"endTime\":\"417.192s\",\"confidence\":\"0.9570\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"417.192s\",\"endTime\":\"417.212s\",\"confidence\":\"0.3670\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"not\",\"startTime\":\"417.212s\",\"endTime\":\"417.412s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"417.412s\",\"endTime\":\"417.592s\",\"confidence\":\"0.9850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"417.592s\",\"endTime\":\"417.652s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"give\",\"startTime\":\"417.652s\",\"endTime\":\"417.752s\",\"confidence\":\"0.5059\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"417.752s\",\"endTime\":\"418.112s\",\"confidence\":\"0.9559\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"418.112s\",\"endTime\":\"418.292s\",\"confidence\":\"0.7319\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"pay.\",\"startTime\":\"418.292s\",\"endTime\":\"418.572s\",\"confidence\":\"0.9840\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"On\",\"startTime\":\"419.012s\",\"endTime\":\"419.032s\",\"confidence\":\"0.2599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"419.032s\",\"endTime\":\"419.072s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"other\",\"startTime\":\"419.072s\",\"endTime\":\"419.082s\",\"confidence\":\"0.9259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"hand,\",\"startTime\":\"419.082s\",\"endTime\":\"419.272s\",\"confidence\":\"0.9639\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"businesses\",\"startTime\":\"419.392s\",\"endTime\":\"419.632s\",\"confidence\":\"0.5170\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"do\",\"startTime\":\"419.632s\",\"endTime\":\"419.912s\",\"confidence\":\"0.4790\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"need\",\"startTime\":\"419.912s\",\"endTime\":\"420.352s\",\"confidence\":\"0.8629\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"money\",\"startTime\":\"420.352s\",\"endTime\":\"420.752s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"so\",\"startTime\":\"420.752s\",\"endTime\":\"421.232s\",\"confidence\":\"0.3449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"421.232s\",\"endTime\":\"421.332s\",\"confidence\":\"0.6489\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"421.332s\",\"endTime\":\"421.512s\",\"confidence\":\"0.6940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"give\",\"startTime\":\"421.512s\",\"endTime\":\"421.612s\",\"confidence\":\"0.3219\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them\",\"startTime\":\"421.612s\",\"endTime\":\"421.632s\",\"confidence\":\"0.7760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"any\",\"startTime\":\"422.022s\",\"endTime\":\"422.502s\",\"confidence\":\"0.3429\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"case,\",\"startTime\":\"422.502s\",\"endTime\":\"424.502s\",\"confidence\":\"0.9739\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"if\",\"startTime\":\"424.782s\",\"endTime\":\"424.922s\",\"confidence\":\"0.4320\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"424.922s\",\"endTime\":\"425.162s\",\"confidence\":\"0.8679\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"need\",\"startTime\":\"425.162s\",\"endTime\":\"425.602s\",\"confidence\":\"0.7379\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"425.602s\",\"endTime\":\"425.612s\",\"confidence\":\"0.2750\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"that\",\"startTime\":\"425.612s\",\"endTime\":\"425.922s\",\"confidence\":\"0.3420\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"way,\",\"startTime\":\"425.922s\",\"endTime\":\"426.382s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"we\",\"startTime\":\"426.902s\",\"endTime\":\"427.122s\",\"confidence\":\"0.8590\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"427.122s\",\"endTime\":\"427.642s\",\"confidence\":\"0.1449\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"427.642s\",\"endTime\":\"427.782s\",\"confidence\":\"0.9610\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"427.782s\",\"endTime\":\"428.182s\",\"confidence\":\"0.9779\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"make\",\"startTime\":\"428.182s\",\"endTime\":\"428.422s\",\"confidence\":\"0.4040\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"428.422s\",\"endTime\":\"428.432s\",\"confidence\":\"0.6999\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"purchase\",\"startTime\":\"428.432s\",\"endTime\":\"428.642s\",\"confidence\":\"0.3240\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"of\",\"startTime\":\"428.642s\",\"endTime\":\"428.702s\",\"confidence\":\"0.5960\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"debt,\",\"startTime\":\"428.702s\",\"endTime\":\"428.862s\",\"confidence\":\"0.5149\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"428.982s\",\"endTime\":\"429.262s\",\"confidence\":\"0.6460\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"cancel\",\"startTime\":\"429.262s\",\"endTime\":\"429.642s\",\"confidence\":\"0.4769\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"it\",\"startTime\":\"429.642s\",\"endTime\":\"429.762s\",\"confidence\":\"0.6470\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"and\",\"startTime\":\"429.762s\",\"endTime\":\"429.842s\",\"confidence\":\"0.8169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"then\",\"startTime\":\"429.842s\",\"endTime\":\"430.102s\",\"confidence\":\"0.8299\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"withdraw\",\"startTime\":\"430.102s\",\"endTime\":\"430.402s\",\"confidence\":\"0.5649\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"430.402s\",\"endTime\":\"430.582s\",\"confidence\":\"0.9580\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"difference.\",\"startTime\":\"430.582s\",\"endTime\":\"431.402s\",\"confidence\":\"0.8360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Right\",\"startTime\":\"432.062s\",\"endTime\":\"432.282s\",\"confidence\":\"0.1250\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"there,\",\"startTime\":\"432.282s\",\"endTime\":\"432.382s\",\"confidence\":\"0.7609\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"on\",\"startTime\":\"432.442s\",\"endTime\":\"432.452s\",\"confidence\":\"0.3889\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"432.452s\",\"endTime\":\"432.482s\",\"confidence\":\"0.9750\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"same\",\"startTime\":\"432.482s\",\"endTime\":\"432.702s\",\"confidence\":\"0.9829\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"day,\",\"startTime\":\"432.702s\",\"endTime\":\"432.962s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"there\",\"startTime\":\"433.042s\",\"endTime\":\"433.052s\",\"confidence\":\"0.6959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"is\",\"startTime\":\"433.052s\",\"endTime\":\"433.102s\",\"confidence\":\"0.7739\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"no\",\"startTime\":\"433.102s\",\"endTime\":\"433.262s\",\"confidence\":\"0.9599\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"problem,\",\"startTime\":\"433.262s\",\"endTime\":\"433.722s\",\"confidence\":\"0.9909\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"just\",\"startTime\":\"434.142s\",\"endTime\":\"434.282s\",\"confidence\":\"0.2680\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"bring\",\"startTime\":\"434.282s\",\"endTime\":\"434.602s\",\"confidence\":\"0.8180\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"us\",\"startTime\":\"434.602s\",\"endTime\":\"434.762s\",\"confidence\":\"0.8220\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"434.762s\",\"endTime\":\"434.842s\",\"confidence\":\"0.9359\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"vouchers\",\"startTime\":\"434.842s\",\"endTime\":\"435.082s\",\"confidence\":\"0.9539\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"because\",\"startTime\":\"435.082s\",\"endTime\":\"435.502s\",\"confidence\":\"0.4370\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"435.502s\",\"endTime\":\"435.902s\",\"confidence\":\"0.6169\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"lady\",\"startTime\":\"435.902s\",\"endTime\":\"435.912s\",\"confidence\":\"0.9120\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"has\",\"startTime\":\"435.912s\",\"endTime\":\"436.062s\",\"confidence\":\"0.8989\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"436.062s\",\"endTime\":\"436.242s\",\"confidence\":\"0.9950\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"enter\",\"startTime\":\"436.242s\",\"endTime\":\"436.662s\",\"confidence\":\"0.6209\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"them\",\"startTime\":\"436.662s\",\"endTime\":\"436.842s\",\"confidence\":\"0.7379\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"into\",\"startTime\":\"436.842s\",\"endTime\":\"436.942s\",\"confidence\":\"0.5360\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"the\",\"startTime\":\"436.942s\",\"endTime\":\"437.062s\",\"confidence\":\"0.9860\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"system.\",\"startTime\":\"437.062s\",\"endTime\":\"437.302s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"And\",\"startTime\":\"439.302s\",\"endTime\":\"439.482s\",\"confidence\":\"0.6029\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"if\",\"startTime\":\"439.482s\",\"endTime\":\"439.762s\",\"confidence\":\"0.9129\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"439.762s\",\"endTime\":\"439.982s\",\"confidence\":\"0.5590\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"later,\",\"startTime\":\"439.982s\",\"endTime\":\"440.602s\",\"confidence\":\"0.6480\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"two\",\"startTime\":\"441.202s\",\"endTime\":\"441.462s\",\"confidence\":\"0.3829\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"or\",\"startTime\":\"441.462s\",\"endTime\":\"441.582s\",\"confidence\":\"0.5260\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"three\",\"startTime\":\"441.582s\",\"endTime\":\"441.742s\",\"confidence\":\"0.9969\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"months,\",\"startTime\":\"441.742s\",\"endTime\":\"442.002s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"442.102s\",\"endTime\":\"442.322s\",\"confidence\":\"0.4399\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"want\",\"startTime\":\"442.322s\",\"endTime\":\"442.442s\",\"confidence\":\"0.9760\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"442.442s\",\"endTime\":\"443.242s\",\"confidence\":\"0.9509\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"parallel,\",\"startTime\":\"443.242s\",\"endTime\":\"443.582s\",\"confidence\":\"0.7189\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"443.842s\",\"endTime\":\"444.042s\",\"confidence\":\"0.6830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"small\",\"startTime\":\"444.042s\",\"endTime\":\"444.542s\",\"confidence\":\"0.9670\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"amount,\",\"startTime\":\"444.542s\",\"endTime\":\"444.552s\",\"confidence\":\"0.9419\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"445.502s\",\"endTime\":\"445.512s\",\"confidence\":\"0.1580\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"thousand\",\"startTime\":\"445.512s\",\"endTime\":\"445.802s\",\"confidence\":\"0.9589\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"or\",\"startTime\":\"445.802s\",\"endTime\":\"445.842s\",\"confidence\":\"0.5239\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"two\",\"startTime\":\"445.842s\",\"endTime\":\"446.002s\",\"confidence\":\"0.9409\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"thousand\",\"startTime\":\"446.002s\",\"endTime\":\"446.122s\",\"confidence\":\"0.9890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"soles\",\"startTime\":\"446.122s\",\"endTime\":\"446.382s\",\"confidence\":\"0.9089\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"446.382s\",\"endTime\":\"446.922s\",\"confidence\":\"0.9110\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"your\",\"startTime\":\"446.922s\",\"endTime\":\"447.102s\",\"confidence\":\"0.9900\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"business,\",\"startTime\":\"447.102s\",\"endTime\":\"447.422s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"We\",\"startTime\":\"447.672s\",\"endTime\":\"448.032s\",\"confidence\":\"0.0500\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"can\",\"startTime\":\"448.032s\",\"endTime\":\"448.352s\",\"confidence\":\"0.7770\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"also\",\"startTime\":\"448.352s\",\"endTime\":\"448.412s\",\"confidence\":\"0.5569\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"see\",\"startTime\":\"448.412s\",\"endTime\":\"448.652s\",\"confidence\":\"0.2820\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you.\",\"startTime\":\"448.652s\",\"endTime\":\"448.772s\",\"confidence\":\"0.8830\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Only\",\"startTime\":\"450.192s\",\"endTime\":\"450.712s\",\"confidence\":\"0.0890\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"punctuality,\",\"startTime\":\"450.712s\",\"endTime\":\"452.252s\",\"confidence\":\"0.7730\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"as\",\"startTime\":\"452.752s\",\"endTime\":\"452.992s\",\"confidence\":\"0.2259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"452.992s\",\"endTime\":\"453.252s\",\"confidence\":\"0.9039\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"453.252s\",\"endTime\":\"453.292s\",\"confidence\":\"0.4569\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"been\",\"startTime\":\"453.292s\",\"endTime\":\"453.352s\",\"confidence\":\"0.9570\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"working\",\"startTime\":\"453.352s\",\"endTime\":\"453.772s\",\"confidence\":\"0.9309\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"with\",\"startTime\":\"453.772s\",\"endTime\":\"454.032s\",\"confidence\":\"0.9620\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Iván.\",\"startTime\":\"454.032s\",\"endTime\":\"454.572s\",\"confidence\":\"0.6700\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Here\",\"startTime\":\"455.032s\",\"endTime\":\"455.392s\",\"confidence\":\"0.1190\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"we\",\"startTime\":\"455.392s\",\"endTime\":\"455.672s\",\"confidence\":\"0.7879\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"are\",\"startTime\":\"455.672s\",\"endTime\":\"455.732s\",\"confidence\":\"0.5740\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"going\",\"startTime\":\"455.732s\",\"endTime\":\"455.772s\",\"confidence\":\"0.7829\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"455.772s\",\"endTime\":\"455.812s\",\"confidence\":\"0.9959\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"give\",\"startTime\":\"455.812s\",\"endTime\":\"455.932s\",\"confidence\":\"0.9350\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you\",\"startTime\":\"455.932s\",\"endTime\":\"456.152s\",\"confidence\":\"0.9649\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"456.152s\",\"endTime\":\"456.162s\",\"confidence\":\"0.9290\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"special\",\"startTime\":\"456.162s\",\"endTime\":\"456.672s\",\"confidence\":\"0.9850\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"fee.\",\"startTime\":\"456.672s\",\"endTime\":\"456.682s\",\"confidence\":\"0.1140\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"That\",\"startTime\":\"457.592s\",\"endTime\":\"458.112s\",\"confidence\":\"0.0930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"would\",\"startTime\":\"458.112s\",\"endTime\":\"458.532s\",\"confidence\":\"0.5519\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"be\",\"startTime\":\"458.532s\",\"endTime\":\"458.572s\",\"confidence\":\"0.9869\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"all\",\"startTime\":\"458.572s\",\"endTime\":\"458.792s\",\"confidence\":\"0.6420\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"for\",\"startTime\":\"458.792s\",\"endTime\":\"459.032s\",\"confidence\":\"0.8650\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"our\",\"startTime\":\"459.032s\",\"endTime\":\"459.192s\",\"confidence\":\"0.7659\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"visit.\",\"startTime\":\"459.192s\",\"endTime\":\"459.492s\",\"confidence\":\"0.9710\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"We\",\"startTime\":\"459.632s\",\"endTime\":\"459.642s\",\"confidence\":\"0.3849\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"have\",\"startTime\":\"459.642s\",\"endTime\":\"459.772s\",\"confidence\":\"0.7229\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"459.772s\",\"endTime\":\"459.892s\",\"confidence\":\"0.9929\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"take\",\"startTime\":\"459.892s\",\"endTime\":\"460.032s\",\"confidence\":\"0.9720\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"460.032s\",\"endTime\":\"460.212s\",\"confidence\":\"0.6389\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"picture.\",\"startTime\":\"460.212s\",\"endTime\":\"460.492s\",\"confidence\":\"0.5529\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Thank\",\"startTime\":\"463.072s\",\"endTime\":\"463.372s\",\"confidence\":\"0.3479\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"you.\",\"startTime\":\"463.372s\",\"endTime\":\"464.132s\",\"confidence\":\"0.9940\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"Come\",\"startTime\":\"464.392s\",\"endTime\":\"464.612s\",\"confidence\":\"0.2259\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"here\",\"startTime\":\"464.612s\",\"endTime\":\"464.892s\",\"confidence\":\"0.6930\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"to\",\"startTime\":\"464.892s\",\"endTime\":\"465.012s\",\"confidence\":\"0.5019\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"take\",\"startTime\":\"465.012s\",\"endTime\":\"465.192s\",\"confidence\":\"0.9539\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"a\",\"startTime\":\"465.192s\",\"endTime\":\"465.412s\",\"confidence\":\"0.9620\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"picture\",\"startTime\":\"465.412s\",\"endTime\":\"465.692s\",\"confidence\":\"0.8309\",\"type\":\"WORD\",\"speakerIndex\":0},{\"token\":\"please.\",\"startTime\":\"465.692s\",\"endTime\":\"466.032s\",\"confidence\":\"0.4009\",\"type\":\"WORD\",\"speakerIndex\":0}]}]}" \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Storage/openapi3.json b/ai-meetings/VBCS Project/services/Storage/openapi3.json new file mode 100644 index 0000000..1877e4a --- /dev/null +++ b/ai-meetings/VBCS Project/services/Storage/openapi3.json @@ -0,0 +1,355 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Objectstorage Eu Frankfurt 1 Oraclecloud Com", + "version": "1.0.0" + }, + "servers": [ + { + "url": "vb-catalog://backends/objectStorage" + } + ], + "paths": { + "/n/{object_storage_namespace}/b/{bucket}/o/{object_name}": { + "parameters": [ + { + "name": "object_storage_namespace", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + "defaultValue": "wedoinfra" + } + }, + { + "name": "bucket", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + "defaultValue": "AI_Meetings" + } + }, + { + "name": "object_name", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + "defaultValue": "test.mp3" + } + } + ], + "put": { + "operationId": "putObject", + "parameters": [ + { + "name": "Content-Disposition", + "in": "header", + "schema": { + "type": "string" + }, + "required": true, + "x-vb": { + "defaultValue": "audio/mpeg" + } + }, + { + "name": "content-type", + "in": "header", + "schema": { + "type": "string" + }, + "x-vb": { + "defaultValue": "application/json" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "$ref": "#/components/schemas/PutNObject_storage_namespaceBBucketOObject_nameRequest" + } + } + } + }, + "responses": {}, + "x-vb": { + "actionHint": "create" + } + } + }, + "/n/{namespaceName}/b/{bucketName}/o/{objectName}": { + "parameters": [ + { + "name": "namespaceName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + } + }, + { + "name": "bucketName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + } + }, + { + "name": "objectName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "get": { + "operationId": "getObject", + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetNNamespaceNameBBucketNameOObjectName" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/getObject/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "getOne", + "headers": { + "Content-Type": "application/json", + "Accept": "application/json" + } + }, + "parameters": [] + } + }, + "/n/{namespaceName}/b/{bucketName}/p/": { + "parameters": [ + { + "name": "namespaceName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + } + }, + { + "name": "bucketName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vb": { + } + } + ], + "post": { + "operationId": "createPAR", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostNNamespaceNameBBucketNamePRequest" + }, + "examples": { + "vb": { + "externalValue": "./examples/createPAR/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostNNamespaceNameBBucketNamePResponse" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/createPAR/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "create" + } + } + } + }, + "components": { + "schemas": { + "PutNObject_storage_namespaceBBucketOObject_nameRequest": { + "type": "string", + "format": "binary" + }, + "GetNNamespaceNameBBucketNameOObjectName": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "timeCreated": { + "type": "string" + }, + "modelDetails": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "languageCode": { + "type": "string" + } + } + }, + "audioFormatDetails": { + "type": "object", + "properties": { + "format": { + "type": "string" + }, + "numberOfChannels": { + "type": "integer" + }, + "encoding": { + "type": "string" + }, + "sampleRateInHz": { + "type": "integer" + } + } + }, + "transcriptions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "transcription": { + "type": "string" + }, + "confidence": { + "type": "string" + }, + "speakerCount": { + "type": "integer" + }, + "tokens": { + "type": "array", + "items": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "startTime": { + "type": "string" + }, + "endTime": { + "type": "string" + }, + "confidence": { + "type": "string" + }, + "type": { + "type": "string" + }, + "speakerIndex": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "PostNNamespaceNameBBucketNamePRequest": { + "type": "object", + "properties": { + "accessType": { + "type": "string" + }, + "name": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "timeExpires": { + "type": "string" + } + } + }, + "PostNNamespaceNameBBucketNamePResponse": { + "type": "object", + "properties": { + "accessUri": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "accessType": { + "type": "string" + }, + "bucketListingAction": { + "nullable": true + }, + "objectName": { + "type": "string" + }, + "timeCreated": { + "type": "string" + }, + "timeExpires": { + "type": "string" + }, + "queryObjectDetails": { + "nullable": true + }, + "fullPath": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/request_application_json_vb.json b/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/request_application_json_vb.json new file mode 100644 index 0000000..6418ae0 --- /dev/null +++ b/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/request_application_json_vb.json @@ -0,0 +1,12 @@ +{ +"compartmentId":"ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wvhqvxr65s22xmp5jmm5gtlnauu3aajpx6pfgtwrxq", +"extractiveness": "AUTO", +"format": "AUTO", +"input": "Del diluvio en aquel domingo electoral del 28-M, hace hoy justo un año, al sofocante epílogo de este mayo abrasador, con los comicios europeos en el horizonte. Sentado en la privilegiada terraza del Café del Río,José Luis Martínez-Almeida (Madrid, 1975) mira de refilón su reloj de correa roja durante su cita con GRAN MADRID. El motivo: asoma una cita en el Palacio Real, ante la visita del mandatario ucraniano, Volodimir Zelenski.Bajo los pies del alcalde, a unos metros de profundidad, esa A-5 soterrada por Gallardón, cuyo ejemplo seguirá, para dicha de los vecinos, unos kilómetros más adelante. «Les pedí disculpas por no hacerlo la legislatura pasada y les garanticé que esta vez saldría». Y Almeida pasa a limpio este año natural donde Pedro Sánchez, cómo no, es protagonista. ¿Cuál es su valoración sobre la concentración que su partido organizó el domingo? Positiva. Entre otras circunstancias porque creo que la cifra de asistencia, ya fueran los 20.000 que dice la delegación del Gobierno, que ya sabemos de su generosidad, o ya sean los 80.000, que defendemos nosotros, fue el acto de campaña en el ámbito de unas elecciones europeas más grande que ha habido en la historia de las elecciones europeas en España. Por tanto, creo que habla de dos cuestiones. En primer lugar, de la capacidad de movilización del PP, pues llevamos ya concentraciones masivas y siguen siendo así. Hay un hartazgo social muy importante con Pedro Sánchez en la semana más dura para la democracia española, ya que se va a aprobar la Ley de Amnistía.", +"length": "AUTO", + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, +"temperature": 0.1 +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/response_default_application_json_vb.json b/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/response_default_application_json_vb.json new file mode 100644 index 0000000..39c85ed --- /dev/null +++ b/ai-meetings/VBCS Project/services/Summarization/examples/postSummarizeText/response_default_application_json_vb.json @@ -0,0 +1,6 @@ +{ + "id": "0fa30f70-6e27-4ee6-8db2-a1697b0d4d68", + "summary": "A year on from the 28th February coup attempt in Spain, the country is gearing up for European elections while the government continues to push through controversial legislation, such as the Amnesty Law, despite widespread opposition and protests. Against this backdrop, José Luis Martínez-Almeida, Mayor of Madrid and leader of the conservative People's Party (PP), reflects on the success of the PP's 20,000-strong demonstration in the capital on Sunday, believing it demonstrates the party's ability to mobilize people as well as highlighting discontent with the government and Pedro Sánchez. He also suggests the high attendance figure, whether the true number was 20,000 or 80,000, demonstrates the strength of feeling among Spaniards ahead of important European elections.", + "modelId": "cohere.command", + "modelVersion": "15.6" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/Summarization/openapi3.json b/ai-meetings/VBCS Project/services/Summarization/openapi3.json new file mode 100644 index 0000000..a438847 --- /dev/null +++ b/ai-meetings/VBCS Project/services/Summarization/openapi3.json @@ -0,0 +1,110 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Summarization", + "version": "1.0.0" + }, + "servers": [ + { + "url": "vb-catalog://backends/GenAI" + } + ], + "paths": { + "/summarizeText": { + "post": { + "operationId": "postSummarizeText", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostSummarizeTextRequest" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/postSummarizeText/request_application_json_vb.json" + } + } + } + } + }, + "responses": { + "default": { + "description": "Response for default", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostSummarizeTextResponse" + }, + "examples": { + "vb": { + "summary": "Example stored by VB User", + "externalValue": "./examples/postSummarizeText/response_default_application_json_vb.json" + } + } + } + } + } + }, + "x-vb": { + "actionHint": "create" + } + } + } + }, + "components": { + "schemas": { + "PostSummarizeTextRequest": { + "type": "object", + "properties": { + "compartmentId": { + "type": "string" + }, + "extractiveness": { + "type": "string" + }, + "format": { + "type": "string" + }, + "input": { + "type": "string" + }, + "length": { + "type": "string" + }, + "servingMode": { + "type": "object", + "properties": { + "modelId": { + "type": "string" + }, + "servingType": { + "type": "string" + } + } + }, + "temperature": { + "type": "number" + } + } + }, + "PostSummarizeTextResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "modelId": { + "type": "string" + }, + "modelVersion": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/services/catalog.json b/ai-meetings/VBCS Project/services/catalog.json new file mode 100644 index 0000000..5ff6084 --- /dev/null +++ b/ai-meetings/VBCS Project/services/catalog.json @@ -0,0 +1,98 @@ +{ + "backends": { + "objectStorage": { + "description": "objectStorage", + "servers": [ + { + "url": "https://objectstorage.eu-frankfurt-1.oraclecloud.com", + "description": "Objectstorage Eu Frankfurt 1 Oraclecloud Com", + "x-vb": { + "authentication": { + "authenticated": { + "type": "http_signature_oci", + "credentials": "vb_4c205fc4-cbba-43c4-8ce2-9799639da86a" + } + } + } + }, + { + "url": "https://objectstorage.eu-frankfurt-1.oraclecloud.com", + "description": "storage2", + "x-vb": { + "profiles": [ + "base_configuration" + ], + "authentication": { + "authenticated": { + "type": "http_signature_oci", + "credentials": "vb_c58fb4c5-5b07-4047-b712-74fd9eda2a09" + } + } + } + } + ] + }, + "speech": { + "description": "speech backend", + "servers": [ + { + "url": "https://speech.aiservice.eu-frankfurt-1.oci.oraclecloud.com/20220101", + "description": "20220101", + "x-vb": { + "authentication": { + "authenticated": { + "type": "http_signature_oci", + "credentials": "vb_a966e0b1-df57-4ea2-af36-44529de5bafa" + } + } + } + } + ] + }, + "Language": { + "description": "Language", + "servers": [ + { + "url": "https://language.aiservice.eu-frankfurt-1.oci.oraclecloud.com/20221001/actions", + "description": "20221001 Actions", + "x-vb": { + "authentication": { + "authenticated": { + "type": "http_signature_oci", + "credentials": "vb_ee3e2c84-8d5b-4cfd-8bdc-53b8bdf10941" + } + } + } + } + ] + }, + "GenAI": { + "description": "GenAI", + "servers": [ + { + "url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions", + "description": "20231130 Actions", + "x-vb": { + "authentication": { + "authenticated": { + "type": "http_signature_oci", + "credentials": "vb_32d5d5ca-af98-4bde-8aee-47c5d6a0a948" + } + } + } + } + ] + }, + "ragLuigi": { + "servers": [ + { + "url": "http://xxx.xx.xxx.xxx:8888", + "description": "RAG machine", + "x-vb": { + "anonymousAccess": true + } + } + ] + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/settings/dependencies-lock.json b/ai-meetings/VBCS Project/settings/dependencies-lock.json new file mode 100644 index 0000000..d89df60 --- /dev/null +++ b/ai-meetings/VBCS Project/settings/dependencies-lock.json @@ -0,0 +1,19 @@ +{ + "component-dependencies": { + "oj-dyn": { + "version": "15.1.7", + "components": { + "form": "15.1.7", + "bind-field": "15.1.7" + } + }, + "oj-dynamic": { + "version": "15.1.7", + "components": { + "shared": "15.1.7", + "utils": "15.1.7", + "providers": "15.1.7" + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/settings/dependencies.json b/ai-meetings/VBCS Project/settings/dependencies.json new file mode 100644 index 0000000..4da8521 --- /dev/null +++ b/ai-meetings/VBCS Project/settings/dependencies.json @@ -0,0 +1,10 @@ +{ + "component-dependencies": { + "oj-dyn": { + "version": "15.1.7", + "components": { + "form": "15.1.7" + } + } + } +} diff --git a/ai-meetings/VBCS Project/settings/deployment-profiles.json b/ai-meetings/VBCS Project/settings/deployment-profiles.json new file mode 100644 index 0000000..b175728 --- /dev/null +++ b/ai-meetings/VBCS Project/settings/deployment-profiles.json @@ -0,0 +1,14 @@ +{ + "profiles": [ + { + "displayName": "Base configuration", + "id": "base_configuration", + "description": "Default development profile in VBCS" + } + ], + "defaults": { + "dev": "base_configuration", + "stage": "base_configuration", + "publish": "base_configuration" + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/visual-application.json b/ai-meetings/VBCS Project/visual-application.json new file mode 100644 index 0000000..e93970e --- /dev/null +++ b/ai-meetings/VBCS Project/visual-application.json @@ -0,0 +1,13 @@ +{ + "vbcs.dt.version": "20231205-24.04.3", + "dependencies": { + "upgrade": "micro", + "paths": { + "jet": "https://static.oracle.com/cdn/jet/15.1.5", + "telemetry": "https://static.oracle.com/cdn/trace/8.0.0", + "oracleImageGallery": "https://static.oracle.com/cdn/fnd/gallery/2404.0.1", + "visualRuntime": "https://static.oracle.com/cdn/vb/2404.5.0" + } + }, + "source.version": "2404" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.js b/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.js new file mode 100644 index 0000000..a408a38 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.js @@ -0,0 +1,20 @@ +define([], () => { + 'use strict'; + + class AppModule { + } + + + AppModule.prototype.isFormValid = function(form) { + var tracker = document.getElementById(form); + if (tracker.valid === "valid") { + return true; + } else { + tracker.showMessages(); + tracker.focusOn("@firstInvalidShown"); + return false; + } + }; + + return AppModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.json b/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.json new file mode 100644 index 0000000..b05f5a1 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/app-flow.json @@ -0,0 +1,139 @@ +{ + "id": "ai_meetings", + "description": "A new VB app", + "defaultPage": "nice", + "services": {}, + "translations": { + "app": { + "path": "./resources/strings/app/nls/app-strings" + } + }, + "events": { + "navigateToItem": { + "payloadType": { + "item": "string" + }, + "description": "Event to configure navigation between items/tabs." + }, + "toggleDrawer": { + "description": "Event to toggle the drawer." + } + }, + "types": { + "navigationItem": { + "id": "string", + "name": "string", + "iconClass": "string" + }, + "globalHeaderItem": { + "id": "string", + "name": "string", + "iconClass": "string" + }, + "avatarMenuItem": { + "id": "string", + "name": "string", + "iconClass": "string" + } + }, + "variables": { + "bucketName": { + "type": "string", + "persisted": "session" + }, + "compartment_id": { + "type": "string", + "persisted": "session" + }, + "globalHeadersADP": { + "type": "vb/ArrayDataProvider2", + "description": "The model describing the Global Applications headers", + "defaultValue": { + "keyAttributes": "id", + "data": "{{ $variables.globalHeadersData }}", + "itemType": "navigationItem" + } + }, + "namespace": { + "type": "string", + "persisted": "session" + }, + "navigationADP": { + "type": "vb/ArrayDataProvider2", + "description": "The model describing the flows in the app", + "defaultValue": { + "keyAttributes": "id", + "data": "{{ $variables.navigationData }}", + "itemType": "navigationItem" + } + }, + "avatarItems": { + "type": "avatarMenuItem[]", + "defaultValue": [ + { + "name": "Sign Out", + "id": "signout", + "iconClass": "oj-ux-ico-logout" + } + ] + }, + "globalHeadersData": { + "type": "globalHeaderItem[]", + "defaultValue": [ + { + "name": "Example 1", + "id": "settings", + "iconClass": "oj-ux-ico-settings" + }, + { + "name": "Example 2", + "id": "like", + "iconClass": "oj-ux-ico-thumbs-up" + }, + { + "name": "Example 3", + "id": "bookmark", + "iconClass": "oj-ux-ico-bookmark-add" + } + ] + }, + "navigationData": { + "type": "navigationItem[]", + "defaultValue": [] + } + + }, + "eventListeners": { + "vbResourceChanged": { + "chains": [ + { + "parameters": { + "event": "{{ $event }}" + }, + "chain": "resourceChangedHandler" + } + ] + } + }, + "userConfig": { + "type": "vb/DefaultSecurityProvider", + "configuration": { + "authentication": { + "type": "oraclecloud" + } + }, + "embedding": "deny" + }, + "security": {}, + "imports": { + "css": [ + "/resources/css/app.css" + ] + }, + "settings": { + "formDataAccess": "resources/formData/{vbFormDataId}" + }, + "@dt": { + "applicationTemplateType": "redwood" + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/chains/resourceChangedHandler.js b/ai-meetings/VBCS Project/webApps/ai_meetings/chains/resourceChangedHandler.js new file mode 100644 index 0000000..9c63eaa --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/chains/resourceChangedHandler.js @@ -0,0 +1,30 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class resourceChangedHandler extends ActionChain { + + /** + * Displays a notification message when application has been updated and needs to be refreshed. + * @param {Object} context + * @param {Object} params + * @param {{error: {detail: string}}} params.event + */ + async run(context, { event = {} }) { + const { $application } = context; + + await Actions.fireNotificationEvent(context, { + summary: event.error.detail, + }); + } + } + + return resourceChangedHandler; +}); \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/chains/toggleDrawerHandler.js b/ai-meetings/VBCS Project/webApps/ai_meetings/chains/toggleDrawerHandler.js new file mode 100644 index 0000000..9649fc2 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/chains/toggleDrawerHandler.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class toggleDrawerHandler extends ActionChain { + + /** + * Toggles the navigation drawer for the page + * @param {Object} context + */ + async run(context) { + const { $application } = context; + + const fireEventToggleDrawerResult = await Actions.fireEvent(context, { + event: 'application:toggleDrawer', + }); + } + } + + return toggleDrawerHandler; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.js new file mode 100644 index 0000000..d4bac3c --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class FlowModule { + } + + return FlowModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.json b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.json new file mode 100644 index 0000000..54ea381 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/main-flow.json @@ -0,0 +1,8 @@ +{ + "id": "main", + "description": "Flow main", + "defaultPage": "main-browse", + "services": {}, + "types": {}, + "variables": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain.js new file mode 100644 index 0000000..39ff14a --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain.js @@ -0,0 +1,31 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionChain extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const navigateToPageMainStartResult = await Actions.navigateToPage(context, { + page: 'main-start', + params: { + meetingID: 0, + transcriptionID: 0, + }, + }); + } + } + + return ButtonActionChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain1.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain1.js new file mode 100644 index 0000000..881e4da --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonActionChain1.js @@ -0,0 +1,27 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionChain1 extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const navigateToPageMainRtResult = await Actions.navigateToPage(context, { + page: 'main-rt', + }); + } + } + + return ButtonActionChain1; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogRate.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogRate.js new file mode 100644 index 0000000..7594648 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogRate.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonCloseDialogRate extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogRateCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--rate', + method: 'close', + }); + } + } + + return ButtonCloseDialogRate; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogTeam.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogTeam.js new file mode 100644 index 0000000..cd5a3be --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonCloseDialogTeam.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonCloseDialogTeam extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog', + method: 'close', + }); + } + } + + return ButtonCloseDialogTeam; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonDeleteMeeting.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonDeleteMeeting.js new file mode 100644 index 0000000..2c7988e --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonDeleteMeeting.js @@ -0,0 +1,45 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonDeleteMeeting extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {any} params.key + * @param {number} params.index + * @param {any} params.current + */ + async run(context, { key, index, current }) { + const { $page, $flow, $application } = context; + + await Actions.fireNotificationEvent(context, { + summary: 'Deleting meeting', + type: 'confirmation', + displayMode: 'transient', + }); + + const callRestBusinessObjectsDeleteMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/delete_Meetings', + uriParams: { + 'Meetings_Id': key, + }, + }); + + await Actions.fireDataProviderEvent(context, { + refresh: null, + target: $page.variables.meetingsListSDP, + }); + } + } + + return ButtonDeleteMeeting; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonMeetingDetail.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonMeetingDetail.js new file mode 100644 index 0000000..e5996ff --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonMeetingDetail.js @@ -0,0 +1,41 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonMeetingDetail extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {any} params.key + * @param {number} params.index + * @param {any} params.current + */ + async run(context, { key, index, current }) { + const { $page, $flow, $application } = context; + +/* +alert("key: "+key); +alert(current.row.transcriptionId);*/ + + const navigateToPageMainStartResult = await Actions.navigateToPage(context, { + page: 'main-start', + params: { + meetingID: key, + transcriptionID: current.row.transcriptionId, + }, + }); + + // "Transcription ID: "+rowData.transcriptionId + } + } + + return ButtonMeetingDetail; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonSaveRate.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonSaveRate.js new file mode 100644 index 0000000..138cf53 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ButtonSaveRate.js @@ -0,0 +1,37 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonSaveRate extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callRestBusinessObjectsCreateRateResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Rate', + body: { + "feedback": $page.variables.feedback, + "rate": $page.variables.rate, + }, + }); + + + const callComponentMethodOjDialogRateCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--rate', + method: 'close', + }); + } + } + + return ButtonSaveRate; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ListViewSwipeActionChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ListViewSwipeActionChain.js new file mode 100644 index 0000000..21cbb44 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/ListViewSwipeActionChain.js @@ -0,0 +1,59 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ListViewSwipeActionChain extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {string} params.navigationItem + * @param {string} params.meetingsId + * @param {any} params.rowData + */ + async run(context, { navigationItem, meetingsId, rowData }) { + const { $page, $flow, $application } = context; + switch (navigationItem) { + case 'delete': + await Actions.fireNotificationEvent(context, { + summary: 'Deleting meeting', + type: 'confirmation', + displayMode: 'transient', + }); + + const callRestBusinessObjectsDeleteMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/delete_Meetings', + uriParams: { + 'Meetings_Id': meetingsId, + }, + }); + + await Actions.fireDataProviderEvent(context, { + refresh: null, + target: $page.variables.meetingsListSDP, + }); + break; + case 'view': + const navigateToPageMainStartResult = await Actions.navigateToPage(context, { + page: 'main-start', + params: { + meetingID: meetingsId, + transcriptionID: rowData.transcriptionId, + }, + }); + break; + default: + break; + } + } + } + + return ListViewSwipeActionChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogRate.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogRate.js new file mode 100644 index 0000000..9e5cf7b --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogRate.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class OpenDialogRate extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogRateOpenResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--rate', + method: 'open', + }); + } + } + + return OpenDialogRate; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogTeam.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogTeam.js new file mode 100644 index 0000000..6b3302a --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/OpenDialogTeam.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class OpenDialogTeam extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogOpenResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog', + method: 'open', + }); + } + } + + return OpenDialogTeam; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/TableFirstSelectedRowChangeChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/TableFirstSelectedRowChangeChain.js new file mode 100644 index 0000000..5f9b77f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/TableFirstSelectedRowChangeChain.js @@ -0,0 +1,41 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class TableFirstSelectedRowChangeChain extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {any} params.rowKey + * @param {any} params.rowData + */ + async run(context, { rowKey, rowData }) { + const { $page, $flow, $application } = context; + + /* await Actions.fireNotificationEvent(context, { + summary: "Meeting ID: "+rowKey, + message: "Transcription ID: "+rowData.transcriptionId, + });*/ + + //alert(JSON.stringify(rowData)); + + /* const navigateToPageMainStartResult = await Actions.navigateToPage(context, { + page: 'main-start', + params: { + meetingID: rowKey, + transcriptionID: rowData.transcriptionId, + }, + });*/ + } + } + + return TableFirstSelectedRowChangeChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/checkWidth.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/checkWidth.js new file mode 100644 index 0000000..e596ce8 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page-chains/checkWidth.js @@ -0,0 +1,34 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class checkWidth extends ActionChain { + + /** + * @param {Object} context + * @return {{cancelled:boolean}} + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($application.responsive.mdUp) { + $page.variables.width = 220; + $page.variables.widthSpeakers = 140; + $page.variables.widthCreation = 240; + } else if ($application.responsive.smOnly) { + $page.variables.width = 85; + $page.variables.widthSpeakers = 110; + $page.variables.widthCreation = 120; + } + } + } + + return checkWidth; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.html b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.html new file mode 100644 index 0000000..c8b8b78 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.html @@ -0,0 +1,236 @@ +
+
+
+
+ +
+
+ +
+
+
+
+ +

AI Meetings

+
+
+
+ +
+
+ +
+ + + + + + +
+
+
+
+
+
+ +
+
+ +
+
+
+ + + + +
+
+
+
+
+ + + + + + + + +
+
+
+ + + +
+
+
+
+ +
+
+ + +
+
+
+ Close + + + Save + + +
+
+ + + + + + + +
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ Close +
+
\ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.js new file mode 100644 index 0000000..dea0fa9 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class PageModule { + } + + return PageModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.json b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.json new file mode 100644 index 0000000..4dcc027 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-browse-page.json @@ -0,0 +1,230 @@ +{ + "title": "Browse my meetings", + "description": "", + "variables": { + "feedback": { + "type": "string" + }, + "meetingsListSDP": { + "type": "vb/ServiceDataProvider", + "defaultValue": { + "endpoint": "businessObjects/getall_Meetings", + "keyAttributes": "id", + "itemsPath": "items", + "responseType": "getallMeetingsResponse", + "filterCriterion": { + "op": "$or", + "criteria": [ + { + "op": "$eq", + "attribute": "createdBy", + "value": "{{ $application.user.email }}" + }, + { + "op": "$eq", + "attribute": "createdBy", + "value": "jesus.brasero@oracle.com" + } + ] + } + } + }, + "rate": { + "type": "number", + "defaultValue": 1 + }, + "width": { + "type": "number" + }, + "widthCreation": { + "type": "number" + }, + "widthSpeakers": { + "type": "number" + } + }, + "metadata": {}, + "types": { + "@decorators.getallMeetingsResponse": { + "endpoint": "getall_Meetings", + "service": "businessObjects", + "path": "response" + }, + "getallMeetingsResponse": { + "items": [ + { + "createdBy": "string", + "creationDate": "string", + "id": "number", + "meetingName": "string", + "speakersN": "number", + "transcriptionId": "number", + "transcriptionIdObject": { + "items": [ + { + "id": "number", + "status": "string" + } + ] + } + } + ] + } + }, + "eventListeners": { + "buttonAction": { + "chains": [ + { + "chain": "ButtonCloseDialogTeam" + } + ] + }, + "buttonAction2": { + "chains": [ + { + "chain": "ButtonCloseDialogRate" + } + ] + }, + "buttonAction3": { + "chains": [ + { + "chain": "ButtonSaveRate" + } + ] + }, + "buttonAction4": { + "chains": [ + { + "chain": "ButtonActionChain" + } + ] + }, + "buttonAction5": { + "chains": [ + { + "chain": "ButtonDeleteMeeting", + "parameters": { + "key": "{{ $current.key }}", + "index": "{{ $current.index }}", + "current": "{{ $current }}" + } + } + ] + }, + "buttonAction6": { + "chains": [ + { + "chain": "ButtonMeetingDetail", + "parameters": { + "key": "{{ $current.key }}", + "index": "{{ $current.index }}", + "current": "{{ $current }}" + } + } + ] + }, + "buttonAction7": { + "chains": [ + { + "chain": "ButtonActionChain1" + } + ] + }, + "flexClick": { + "chains": [ + { + "chain": "OpenDialogTeam" + } + ] + }, + "flexClick2": { + "chains": [ + { + "chain": "OpenDialogRate" + } + ] + }, + "ojSwipeActionsPerformed": { + "chains": [ + { + "chain": "ListViewSwipeActionChain", + "parameters": { + "navigationItem": "[[$event.target.value]]", + "meetingsId": "[[$current.key]]", + "rowData": "[[$current.data]]" + } + } + ] + }, + "tableFirstSelectedRow": { + "chains": [ + { + "chain": "TableFirstSelectedRowChangeChain", + "parameters": { + "rowKey": "{{$event.detail.value.key}}", + "rowData": "{{$event.detail.value.data}}" + } + } + ] + }, + "vbEnter": { + "chains": [ + { + "parameters": {}, + "chain": "checkWidth" + } + ] + } + + }, + "imports": { + "components": { + "oj-button": { + "path": "ojs/ojbutton" + }, + "oj-dialog": { + "path": "ojs/ojdialog" + }, + "oj-input-date": { + "path": "ojs/ojdatetimepicker" + }, + "oj-input-date-time": { + "path": "ojs/ojdatetimepicker" + }, + "oj-label": { + "path": "ojs/ojlabel" + }, + "oj-label-value": { + "path": "ojs/ojlabelvalue" + }, + "oj-list-item-layout": { + "path": "ojs/ojlistitemlayout" + }, + "oj-list-view": { + "path": "ojs/ojlistview" + }, + "oj-option": { + "path": "ojs/ojoption" + }, + "oj-rating-gauge": { + "path": "ojs/ojgauge" + }, + "oj-swipe-actions": { + "path": "ojs/ojswipeactions" + }, + "oj-table": { + "path": "ojs/ojtable" + }, + "oj-text-area": { + "path": "ojs/ojinputtext" + } + + }, + "modules": { + "ojValidationDateTime": { + "path": "ojs/ojvalidation-datetime" + } + } + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ActionPeopleMentions.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ActionPeopleMentions.js new file mode 100644 index 0000000..308a379 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ActionPeopleMentions.js @@ -0,0 +1,127 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ActionPeopleMentions extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function startMentioning() { + const text = $page.variables.transcriptionText; // Ensure this is properly initialized and accessible + let result = await analyzeText(text); + + console.log("Result: " + result); + // $page.variables.summaryText=result; + } + await startMentioning(); + $page.variables.languageProcessingFinish=true; + $page.variables.loading =false; + + async function splitText(text, chunkSize) { + // alert(text + " " + chunkSize); + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + + async function analyzeText(text) { + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const analysis = await Promise.all(chunks.map(async chunk => { + // alert("Procesando " + chunk); + return mentionAnalysis(chunk); + })); + // const combinedSummary = analysis.join(' '); + return; // combinedSummary; + } + + + function processEntities(data) { + try{ + data.documents[0].entities.forEach(entity => { + if ((entity.type === "PERSON") && (entity.score>0.7)) { + $page.variables.arrayMention.push(entity.text); + } else if ((entity.type === "ORGANIZATION") && (entity.score>0.8)) { + $page.variables.arrayOrg.push(entity.text); + } else if ((entity.type === "PRODUCT") && (entity.score>0.8)) { + $page.variables.arrayProduct.push(entity.text); + } else if ((entity.type === "DATETIME") && (entity.score>0.8)) { + $page.variables.arrayDatetime.push(entity.text); + }else if ((entity.type === "LOCATION") && (entity.score>0.8)) { + $page.variables.arrayLocation.push(entity.text); + } + }) + } catch (error) { + console.error(error); + } + +// Elimina duplicados usando Set + $page.variables.arrayMention = [...new Set($page.variables.arrayMention)]; + $page.variables.arrayOrg = [...new Set($page.variables.arrayOrg)]; + $page.variables.arrayProduct = [...new Set($page.variables.arrayProduct)]; + $page.variables.arrayLocation = [...new Set($page.variables.arrayLocation)]; + $page.variables.arrayDatetime = [...new Set($page.variables.arrayDatetime)]; + + let json = {"personEntities": $page.variables.arrayMention, "orgEntities": $page.variables.arrayOrg}; +//alert(JSON.stringify(json)); + return json; // Retorna el objeto JSON directamente +} + + + + async function mentionAnalysis(text) { + const callRestSentimentAnalysisDetectLanguageEntitiesResult = await Actions.callRest(context, { + endpoint: 'SentimentAnalysis/DetectLanguageEntities', + body: { + "documents": [ + { "key": "doc1", "text": text + } + ] + }, + }); + const callFunctionResult = processEntities(callRestSentimentAnalysisDetectLanguageEntitiesResult.body); + return true; + + } + + return; + } + } + + return ActionPeopleMentions; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionChain.js new file mode 100644 index 0000000..791a648 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionChain.js @@ -0,0 +1,27 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionChain extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + await Actions.callChain(context, { + chain: 'createMeeting', + }); + } + } + + return ButtonActionChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionRefresh.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionRefresh.js new file mode 100644 index 0000000..2e9ffee --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionRefresh.js @@ -0,0 +1,24 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionRefresh extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + window.location.href = window.location.href;//(window.location.href.indexOf('?') > -1 ? '&' : '?') + 'meetingID='+$page.variables.meetingID; + } + } + + return ButtonActionRefresh; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionSendChat.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionSendChat.js new file mode 100644 index 0000000..b67525e --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonActionSendChat.js @@ -0,0 +1,54 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonActionSendChat extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + await $page.functions.sendMessage('You', $page.variables.query); + + const callRestAIIMeetingsPostResult = await Actions.callRest(context, { + endpoint: 'AIIMeetings/post', + uriParams: { + 'conv_id': $page.variables.meetingID, + }, + body: { + query: $page.variables.query, + documents: [ + $page.variables.transcriptionText, + ], + }, + }); + + $page.variables.ragResponse = callRestAIIMeetingsPostResult.body; + const result = await $page.functions.receiveMessage('AI', callRestAIIMeetingsPostResult.body); + + if ('result') { + await Actions.resetVariables(context, { + variables: [ + '$page.variables.query', + ], + }); + } + + return; + + + + } + } + + return ButtonActionSendChat; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseConfigurationDialog.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseConfigurationDialog.js new file mode 100644 index 0000000..9f8748d --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseConfigurationDialog.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonCloseConfigurationDialog extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogConfigurationCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--configuration', + method: 'close', + }); + } + } + + return ButtonCloseConfigurationDialog; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseDialog.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseDialog.js new file mode 100644 index 0000000..c1b9e6c --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonCloseDialog.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonCloseDialog extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog', + method: 'close', + }); + } + } + + return ButtonCloseDialog; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonMyMeetings.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonMyMeetings.js new file mode 100644 index 0000000..a7918d8 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonMyMeetings.js @@ -0,0 +1,46 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonMyMeetings extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + await Actions.resetVariables(context, { + variables: [ + '$page.variables.transcriptionID', + '$page.variables.jobId', + '$page.variables.jobIdName', + '$page.variables.currentRequest', + '$page.variables.jobStatus', + '$page.variables.parURL', + '$page.variables.meetingID', + '$page.variables.filename', + '$page.variables.fileSize', + '$page.variables.negative', + '$page.variables.meetingCreated', + '$page.variables.meetingName', + '$page.variables.uploadSuccess', + '$page.variables.jobCompletion', + ], + }); + + const navigateToPageMainBrowseResult = await Actions.navigateToPage(context, { + page: 'main-browse', + }); + } + } + + return ButtonMyMeetings; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonNewMeeting.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonNewMeeting.js new file mode 100644 index 0000000..2459470 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonNewMeeting.js @@ -0,0 +1,44 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonNewMeeting extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + await Actions.resetVariables(context, { + variables: [ + '$page.variables.transcriptionID', + '$page.variables.jobId', + '$page.variables.jobIdName', + '$page.variables.currentRequest', + '$page.variables.jobStatus', + '$page.variables.parURL', + '$page.variables.meetingID', + '$page.variables.filename', + '$page.variables.fileSize', + '$page.variables.negative', + '$page.variables.meetingCreated', + '$page.variables.meetingName', + '$page.variables.uploadSuccess', + '$page.variables.jobCompletion', + ], + }); + + location.href = location.pathname; + } + } + + return ButtonNewMeeting; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonSaveConfigurationDialog.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonSaveConfigurationDialog.js new file mode 100644 index 0000000..0fed764 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ButtonSaveConfigurationDialog.js @@ -0,0 +1,32 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ButtonSaveConfigurationDialog extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogConfigurationCloseResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--configuration', + method: 'close', + }); + + await Actions.callChain(context, { + chain: 'SummarizationChunks', + }); + } + } + + return ButtonSaveConfigurationDialog; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ClickGear.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ClickGear.js new file mode 100644 index 0000000..b525680 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/ClickGear.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class ClickGear extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogConfigurationOpenResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog--configuration', + method: 'open', + }); + } + } + + return ClickGear; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/CopyTranscription.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/CopyTranscription.js new file mode 100644 index 0000000..3c7bc1c --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/CopyTranscription.js @@ -0,0 +1,37 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class CopyTranscription extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + + navigator.clipboard.writeText($page.variables.transcriptionText).then(() => { + Actions.fireNotificationEvent(context, { + summary: 'Now you have the transcription in your clipboard', + type: 'info', + displayMode: 'transient', + }); + }).catch(err => { + console.error('Failed to copy text: ', err); + }); + + + } + } + + return CopyTranscription; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FilePickerSelectChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FilePickerSelectChain.js new file mode 100644 index 0000000..420db27 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FilePickerSelectChain.js @@ -0,0 +1,86 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class FilePickerSelectChain extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {object[]} params.files + */ + async run(context, { files }) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + let size=""; + if(files[0].size === 0) size= '0 Bytes'; + var k = 1000, + dm = 2, + sizes = ['Bytes', 'KB', 'MB', 'GB','TB', 'PB', 'EB', 'ZB', 'YB'], + i = Math.floor(Math.log(files[0].size) / Math.log(k)); + size= parseFloat((files[0].size / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; + $page.variables.fileSize = size; + + + function obtenerExtension(nombreArchivo) { + if (typeof nombreArchivo !== 'string' || !nombreArchivo) { + return ''; // Retorna una cadena vacía si el input no es válido + } + const ultimoPunto = nombreArchivo.lastIndexOf("."); + if (ultimoPunto === -1) return ''; // Retorna una cadena vacía si no hay un punto en el nombre del archivo + return nombreArchivo.slice(ultimoPunto + 1); + } + + function generateUUID() { + let dt = new Date().getTime(); + const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = (dt + Math.random()*16)%16 | 0; + dt = Math.floor(dt/16); + return (c == 'x' ? r : (r&0x3|0x8)).toString(16); + }); + return uuid; + } + + let uuid = generateUUID(); + + let ext = obtenerExtension(files[0].name); + $page.variables.filename = uuid+"."+ext; + + + const callRestStoragePutObjectResult = await Actions.callRest(context, { + endpoint: 'Storage/putObject', + uriParams: { + 'object_name': $page.variables.filename, + bucket: $application.variables.bucketName, + 'object_storage_namespace': $application.variables.namespace, + }, + body: files[0], + }); + + if (callRestStoragePutObjectResult.status===200) { + + $page.variables.uploadSuccess = true; + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was an error uploading the file', + displayMode: 'transient', + type: 'error', + }); + } + + $page.variables.loading = false; + + return; + } + } + + return FilePickerSelectChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FlexClickChain.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FlexClickChain.js new file mode 100644 index 0000000..b13a5bd --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/FlexClickChain.js @@ -0,0 +1,28 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class FlexClickChain extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callComponentMethodOjDialogOpenResult = await Actions.callComponentMethod(context, { + selector: '#oj-dialog', + method: 'open', + }); + } + } + + return FlexClickChain; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/SummarizationChunks.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/SummarizationChunks.js new file mode 100644 index 0000000..563eaf9 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/SummarizationChunks.js @@ -0,0 +1,155 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class SummarizationChunks extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + async function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function summarizeText(text) { + // alert("Texto total: " + text); + const chunkSize = 3500; // Example chunk size + const chunks = await splitText(text, chunkSize); + + const summaries = await Promise.all(chunks.map(async chunk => { + // alert("Procesando " + chunk); + return await summarizeChunk(chunk); + })); + + // alert("Resúmenes intermedios: " + summaries); + const combinedSummary = summaries.join(' '); + return combinedSummary; + } + + async function summarizeChunk(text) { + const callRestSummarizationPostSummarizeTextResult = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": $application.variables.compartment_id, + // "additionalCommand":"Generate a summary", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": text, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + return callRestSummarizationPostSummarizeTextResult.body.summary; + } + + async function startSummarization() { + const text = $page.variables.transcriptionText; // Ensure this is properly initialized and accessible + let result = await summarizeText(text); + + // let result2 = await summarizeText2(result, context); + console.log("Result: " + result); + $page.variables.summaryText=result; + } + + + + const size = $page.variables.transcriptionText.length; + if (size < 250) { + $page.variables.minimumSize = true; + $page.variables.summaryStatus = true; + return; + } + + // alert(size); + if (size < 3500) { + $page.variables.loading = true; + const callRestSummarizationPostSummarizeTextResult3 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": $application.variables.compartment_id, + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.transcriptionText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult3.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + }else{ + $page.variables.loading = true; + await startSummarization(context); + const callRestSummarizationPostSummarizeTextResult2 = await Actions.callRest(context, { + endpoint: 'Summarization/postSummarizeText', + body: { + "compartmentId": $application.variables.compartment_id, + // "additionalCommand":"Maximum 10 main points", + "extractiveness": $page.variables.extractiveness, + "format": $page.variables.format, + "input": $page.variables.summaryText, + "length": $page.variables.length, + "servingMode": { + "modelId": "cohere.command", + "servingType": "ON_DEMAND" + }, + "temperature": 0.0 + }, + }); + $page.variables.summaryText=callRestSummarizationPostSummarizeTextResult2.body.summary; + $page.variables.loading = false; + $page.variables.summaryStatus = true; + return; + } + + + + + } + } + return SummarizationChunks; + +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/checkTranscriptionStatus.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/checkTranscriptionStatus.js new file mode 100644 index 0000000..fceec12 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/checkTranscriptionStatus.js @@ -0,0 +1,31 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class checkTranscriptionStatus extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + + await Actions.callChain(context, { + chain: 'loadData', + }); + + + } + + } + + return checkTranscriptionStatus; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createMeeting.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createMeeting.js new file mode 100644 index 0000000..4b989ad --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createMeeting.js @@ -0,0 +1,87 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createMeeting extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($application.functions.isFormValid('oj-validation-group-upload')) { + $page.variables.loading = true; + let transcription = true; + let summarization = true; + let sentiment = true; + let temp = "";//$page.variables.meetingParticipants.join(','); + let internalM = true; + let meetingDesc =""; + $page.variables.requirements.push("transcription","summarization","sentiment_analysis"); + // alert($page.variables.requirements[0]); + + + + + const callRestBusinessObjectsCreateMeetingResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Meetings', + body: { + "internalMeeting": internalM , + "meetingName": $page.variables.meetingName , + "meetingDesc": meetingDesc , + "speakersN": $page.variables.nParticipants , + "speakersInvolved": temp , + "transcription": transcription , + "summarization": summarization, + "sentiment": sentiment , + "fname" : $page.variables.filename, + }, + }); + + if (callRestBusinessObjectsCreateMeetingResult.status===201) { + + $page.variables.currentRequest = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingID = callRestBusinessObjectsCreateMeetingResult.body.id; + $page.variables.meetingCreated = true; + + $page.variables.transcriptionID = $page.variables.meetingID; + await Actions.callChain(context, { + chain: 'createTranscriptionJob', + }); + + await Actions.fireNotificationEvent(context, { + summary: 'Your meeting has been created successfully', + displayMode: 'transient', + type: 'confirmation', + }); + } else { + await Actions.fireNotificationEvent(context, { + summary: 'There was a problem creating your meeting', + type: 'warning', + displayMode: 'transient', + }); + } + } else { + await Actions.fireNotificationEvent(context, { + summary: 'The Meeting name is mandatory', + displayMode: 'transient', + type: 'warning', + }); + } + + $page.variables.loading = false; + + return; + } + } + + return createMeeting; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createTranscriptionJob.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createTranscriptionJob.js new file mode 100644 index 0000000..f68925a --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/createTranscriptionJob.js @@ -0,0 +1,87 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class createTranscriptionJob extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callRestCreateJobPostTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/postTranscriptionJobs', + body: { + "compartmentId":$application.variables.compartment_id, + "displayName":"job-"+$page.variables.filename, + "inputLocation": { + "locationType":"OBJECT_LIST_INLINE_INPUT_LOCATION", + "objectLocations": + [{ + "bucketName":$application.variables.bucketName, "namespaceName": $application.variables.namespace, "objectNames": [$page.variables.filename] + }] + + }, + "modelDetails": + { + "languageCode":"en", + "modelType": "WHISPER_MEDIUM", + "transcriptionSettings": { + "diarization": { + "isDiarizationEnabled": true, //"numberOfSpeakers": $page.variables.nParticipants + } + } + }, + "outputLocation": { + "bucketName":$application.variables.bucketName, "namespaceName":$application.variables.namespace, "prefix": "id"+$application.user.userId + } + }, + }); + + if (callRestCreateJobPostTranscriptionJobsResult.status===200 || callRestCreateJobPostTranscriptionJobsResult.status===201) { + $page.variables.jobIdName = callRestCreateJobPostTranscriptionJobsResult.body.displayName; + $page.variables.jobStatus = callRestCreateJobPostTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobId = callRestCreateJobPostTranscriptionJobsResult.body.id; + + const callRestBusinessObjectsCreateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/create_Transcriptions', + body: { + "jobID": $page.variables.jobId, + "jobNAME": $page.variables.jobIdName, + "status": $page.variables.jobStatus + }, + }); + + const callRestBusinessObjectsUpdateMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.currentRequest, + }, + body: { + "transcriptionId": callRestBusinessObjectsCreateTranscriptionsResult.body.id + }, + }); + + await Actions.fireNotificationEvent(context, { + summary: 'We are processing your request. It will take a while...', + type: 'info', + displayMode: 'transient', + }); + + return; + } else { + return; + } + } + } + + return createTranscriptionJob; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadData.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadData.js new file mode 100644 index 0000000..f93ae8f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadData.js @@ -0,0 +1,249 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class loadData extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + if ($page.variables.meetingID >0 || $page.variables.parURL) { + + + $page.variables.loading = true; + $page.variables.uploadSuccess = true; + $page.variables.meetingCreated = true; + + await Actions.callChain(context, { + chain: 'loadMeeting', + }); + + if (!($page.variables.transcriptionID >0)) { + await Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'You are trying to access a meeting that doesn\'t exist.', + displayMode: 'transient', + type: 'error', + }); + + const navigateToPageMainBrowseResult = await Actions.navigateToPage(context, { + page: 'main-browse', + }); + } + + const callRestBusinessObjectsGetTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/get_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + }); + + $page.variables.jobId = callRestBusinessObjectsGetTranscriptionsResult.body.jobID; + + const callRestCreateJobGetTranscriptionJobsResult = await Actions.callRest(context, { + endpoint: 'CreateJob/getTranscriptionJobs', + uriParams: { + transcriptionJobId: $page.variables.jobId, + }, + }); + + $page.variables.jobStatus = callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState; + $page.variables.jobCompletion = callRestCreateJobGetTranscriptionJobsResult.body.percentComplete; + $page.variables.outputlocation = callRestCreateJobGetTranscriptionJobsResult.body.outputLocation.prefix; + + + if (callRestBusinessObjectsGetTranscriptionsResult.body.status!==callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState) { + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Transcriptions', + uriParams: { + 'Transcriptions_Id': $page.variables.transcriptionID, + }, + body: { + "status": $page.variables.jobStatus, + // "speakersN": 1 + }, + }); + } + + if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='SUCCEEDED') { + + const currentDate = new Date(); + // Add 3 hours to the current time + currentDate.setHours(currentDate.getHours() + 3); + // Convert the date to RFC 3339 format + const rfc3339Date = currentDate.toISOString(); + // Remove the milliseconds and 'Z' at the end, then append the timezone offset + const expirationTime = rfc3339Date.split('.')[0] + currentDate.toISOString().slice(19); + + let urlTemp = $page.variables.outputlocation +'wedoinfra_AI_Meetings_'+ callRestCreateJobGetTranscriptionJobsResult.body.inputLocation.objectLocations[0].objectNames[0]+'.json'; + const callRestStorageCreatePARResult = await Actions.callRest(context, { + endpoint: 'Storage/createPAR', + uriParams: { + bucketName: $application.variables.bucketName, + namespaceName: $application.variables.namespace, + }, + body: { + accessType: 'ObjectRead', + name: 'PARTest', + objectName: urlTemp, + timeExpires: expirationTime, + }, + }); + + $page.variables.spareTime = false; + + $page.variables.parURL = callRestStorageCreatePARResult.body.fullPath; + let tokens=[]; + + + async function procesarTranscripciones() { + try { + // Get the JSON from the URL + const respuesta = await fetch($page.variables.parURL); + const datos = await respuesta.json(); + // Check if the JSON is in the expected format + if (!datos.transcriptions || !Array.isArray(datos.transcriptions)) { + console.error('The JSON is not in the expected format.'); + return; + } + const conversation = datos.transcriptions[0].transcription; + $page.variables.transcriptionText = conversation; + + + + + const speakers = datos.transcriptions[0].speakerCount; + $page.variables.nParticipants = speakers; + const callRestBusinessObjectsUpdateTranscriptionsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/update_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.meetingID, + }, + body: { + "speakersN": Number(speakers), + }, + }); + + // Initialise an object to separate tokens by speaker + const tokensBySpeaker = {}; + for (let i = 0; i < speakers; i++) { + tokensBySpeaker[`Speaker${i}`] = []; + } + + // Asumiendo que solo estamos interesados en la primera transcripción + + tokens = datos.transcriptions[0].tokens; + + + // Obtener la longitud del array de tokens + // const numTokens = datos.transcriptions[0].tokens.length; + + // Crear un array con índices desde 0 hasta numTokens - 1 + // $page.variables.tokens = Array.from({ length: numTokens }, (v, k) => k); + + // console.log("token: "+JSON.stringify(tokens)); + if (!tokens) { + console.error('No tokens were found in the transcription'); + return; + } + + // Iterate through tokens and sort them out + for (const token of tokens) { + if (tokensBySpeaker.hasOwnProperty(`Speaker${token.speakerIndex}`)) { + // $page.variables.tokenArray.push({"token":token.token,"speakerIndex":token.speakerIndex}); + tokensBySpeaker[`Speaker${token.speakerIndex}`].push(token.token); + } /*else { + console.error(`Speaker rate unknown: ${token.speakerIndex}`); + }*/ + } + + + // Print the results + for (let i = 0; i < speakers; i++) { + console.log(`Tokens Speaker ${i}:`, tokensBySpeaker[`Speaker${i}`].join(' ')); + } + + return; + + } catch (error) { + // Error handling (e.g. network or parse problem) + console.error('Error getting or processing JSON:', error); + return false; + } + } + + let result = await procesarTranscripciones(); + + let groupWords = await agruparPorSpeaker(tokens); + // alert(JSON.stringify(groupWords)); + $page.variables.tokenArray=groupWords; + $page.variables.transcriptionTask = true; + + function agruparPorSpeaker(tokens) { + const agrupados = []; + let currentSpeaker = null; + let currentText = ""; + + tokens.forEach(token => { + if (token.speakerIndex !== currentSpeaker) { + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + currentSpeaker = token.speakerIndex; + currentText = token.token; + } else { + currentText += " " + token.token; + } + }); + + if (currentSpeaker !== null) { + agrupados.push({ + speakerIndex: currentSpeaker, + token: currentText.trim() + }); + } + + return agrupados; + } + + await Actions.callChain(context, { + chain: 'sentimentDetection', + }); + + await Actions.callChain(context, { + chain: 'summarization', + }); + + await Actions.callChain(context, { + chain: 'ActionPeopleMentions', + }); + + $page.variables.loading=false; + + } else if (callRestCreateJobGetTranscriptionJobsResult.body.lifecycleState==='IN_PROGRESS') { + $page.variables.loading = true; + $page.variables.spareTime = true; + + } + + + + } + } + } + + return loadData; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadMeeting.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadMeeting.js new file mode 100644 index 0000000..eff66dd --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/loadMeeting.js @@ -0,0 +1,36 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class loadMeeting extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + const callRestBusinessObjectsGetMeetingsResult = await Actions.callRest(context, { + endpoint: 'businessObjects/get_Meetings', + uriParams: { + 'Meetings_Id': $page.variables.meetingID, + }, + }); + + $page.variables.sentiment = callRestBusinessObjectsGetMeetingsResult.body.sentiment; + $page.variables.summary = callRestBusinessObjectsGetMeetingsResult.body.summarization; + $page.variables.transcriptionID = callRestBusinessObjectsGetMeetingsResult.body.transcriptionId; + $page.variables.meetingName = callRestBusinessObjectsGetMeetingsResult.body.meetingName; + return; + } + } + + return loadMeeting; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/queryChangeListener.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/queryChangeListener.js new file mode 100644 index 0000000..e3395f1 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/queryChangeListener.js @@ -0,0 +1,35 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class queryChangeListener extends ActionChain { + + /** + * @param {Object} context + * @param {Object} params + * @param {{oldValue:string,value:string}} params.event + */ + async run(context, { event }) { + const { $page, $flow, $application } = context; + + if ($page.variables.query.length>1) { + + await Actions.callChain(context, { + chain: 'ButtonActionSendChat', + }); + + await Actions.resetDirtyDataStatus(context, { + }); + } + } + } + + return queryChangeListener; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/sentimentDetection.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/sentimentDetection.js new file mode 100644 index 0000000..3a0ccd3 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/sentimentDetection.js @@ -0,0 +1,235 @@ +/*define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + + 'use strict'; + + class sentimentDetection extends ActionChain {*/ + /** + * @param {Object} context + */ + /* async run(context) { + const { $page, $flow, $application } = context; + + + + + const callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult = await Actions.callRest(context, { + endpoint: 'SentimentAnalysis/postBatchDetectLanguageSentiments', + body: { + documents: [ + { + key: 'doc1', + text: $page.variables.transcriptionText.substr(0, 4999), + }, + ], + }, + uriParams: { + level: 'SENTENCE', + }, + }); + + if (callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.status===200) { + try { + $page.variables.meetingSentiment = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].documentSentiment; + $page.variables.positive = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].documentScores.Positive; + $page.variables.negative = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].documentScores.Negative; + $page.variables.neutral = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].documentScores.Neutral; + $page.variables.mixed = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].documentScores.Mixed; + $page.variables.chartDataArray[0].value = $page.variables.positive; + $page.variables.chartDataArray[1].value = $page.variables.negative; + $page.variables.chartDataArray[2].value = $page.variables.neutral; + $page.variables.chartDataArray[3].value = $page.variables.mixed; + + let data = callRestSentimentAnalysisPostBatchDetectLanguageSentimentsResult.body.documents[0].sentences; + // alert("original data: "+JSON.stringify(data)); + const result = data.map(item => { + const scores = item.scores; + const highestScore = Object.keys(scores).reduce((a, b) => scores[a] > scores[b] ? a : b); + return { + sentence: item.text, + sentiment: item.sentiment, + value: (scores[highestScore] * 100).toFixed(2) // Convertir a porcentaje y redondear a dos decimales + }; + }); + // alert(JSON.stringify(result)); + $page.variables.tableArray= result; + } catch (error) { + + await Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'There was an error getting the sentiment', + displayMode: 'transient', + type: 'warning', + }); + + } + + + } + + + + return; + + + } + } + + return sentimentDetection; +}); +*/ + + +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class sentimentDetection extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + await processSentimentAnalysis(); + $page.variables.loading = false; + + + async function processSentimentAnalysis() { + const text = $page.variables.transcriptionText; + const chunkSize = 4999; // Adjust based on API limits + const chunks = splitText(text, chunkSize); + + const sentimentResults = await Promise.all(chunks.map(async (chunk, index) => { + return callSentimentAnalysisAPI(chunk, index); + })); + + compileSentimentResults(sentimentResults); + } + + function splitText(text, chunkSize) { + const chunks = []; + let startIndex = 0; + + while (startIndex < text.length) { + let endIndex = startIndex + chunkSize; + if (endIndex > text.length) { + endIndex = text.length; + } else { + while (endIndex > startIndex && text[endIndex] !== ' ') { + endIndex--; + } + + if (endIndex === startIndex) { + endIndex = Math.min(startIndex + chunkSize, text.length); + } + } + + const chunk = text.slice(startIndex, endIndex).trim(); + chunks.push(chunk); + startIndex = endIndex + 1; + } + + return chunks; + } + + async function callSentimentAnalysisAPI(text, index) { + return Actions.callRest(context, { + endpoint: 'SentimentAnalysis/postBatchDetectLanguageSentiments', + body: { + documents: [ + { + key: `doc${index}`, + text: text, + }, + ], + }, + uriParams: { + level: 'SENTENCE', + }, + }); + } + + +function compileSentimentResults(results) { + let allSentiments = []; + let totalPositive = 0; + let totalNegative = 0; + let totalNeutral = 0; + let totalMixed = 0; + let count = 0; + + results.forEach(result => { + if (result.status === 200) { + try { + const documentSentiment = result.body.documents[0].documentSentiment; + const scores = result.body.documents[0].documentScores; + + totalPositive += scores.Positive; + totalNegative += scores.Negative; + totalNeutral += scores.Neutral; + totalMixed += scores.Mixed; + count++; + + const data = result.body.documents[0].sentences; + const processedData = data.map(item => { + const scores = item.scores; + const highestScore = Object.keys(scores).reduce((a, b) => scores[a] > scores[b] ? a : b); + return { + sentence: item.text, + sentiment: item.sentiment, + value: (scores[highestScore] * 100).toFixed(2) // Convert to percentage and round to two decimals + }; + }); + allSentiments = allSentiments.concat(processedData); + } catch (error) { + Actions.fireNotificationEvent(context, { + summary: 'Attention', + message: 'There was an error processing the sentiment data', + displayMode: 'transient', + type: 'warning', + }); + } + } + }); + + // Calculate averages + if (count > 0) { + $page.variables.positive = (totalPositive / count).toFixed(2); + $page.variables.negative = (totalNegative / count).toFixed(2); + $page.variables.neutral = (totalNeutral / count).toFixed(2); + $page.variables.mixed = (totalMixed / count).toFixed(2); + + $page.variables.chartDataArray[0].value = $page.variables.positive ; + $page.variables.chartDataArray[1].value = $page.variables.negative ; + $page.variables.chartDataArray[2].value = $page.variables.neutral ; + $page.variables.chartDataArray[3].value = $page.variables.mixed ; + + } + + $page.variables.tableArray = allSentiments; +} + + + + + } + } + return sentimentDetection; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/summarization.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/summarization.js new file mode 100644 index 0000000..87b1b7c --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page-chains/summarization.js @@ -0,0 +1,37 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class summarization extends ActionChain { + + /** + * @param {Object} context + */ + async run(context) { + const { $page, $flow, $application } = context; + + $page.variables.loading = true; + + const callRestAIIMeetingsPostV2Summarize2Result = await Actions.callRest(context, { + endpoint: 'AIIMeetings/postV2Summarize2', + body: { + "documents": [$page.variables.transcriptionText] + }, + }); + + + $page.variables.summaryText = callRestAIIMeetingsPostV2Summarize2Result.body; + $page.variables.summaryStatus=true; + $page.variables.loading = false; + } + } + + return summarization; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.html b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.html new file mode 100644 index 0000000..083a36c --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.html @@ -0,0 +1,515 @@ +
+
+
+ +
+ +
+
+
+
+ +

AI Meetings

+
+
+
+ + + +
+
+ +

Share your audio or video

+
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+
+ + +
+ + + + +
+
+
+
+
+ + + + + +
+ +
+ +
+
+
+ + + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+ +
+
+ +
+
+ + + + + +
+
+
+
+
+
Meeting Summary
+ + +
+
+ + +
+ +
+
+ +
+
+
+
+
+
+
+
+ + + + +
+
Chat with meeting
+ + +
+
+
+
+ +
+
+ +
+ +
+
+ + +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ +
+
Sentiment Analysis
+ + +
+
+ + + + +
+
+ + + + + +
+
+
+
+
Others Mentions
+ + +
+
+ +
+
+ + + + + +
+
+
+
+ +
+
+ + + + + +
+
+ +
+
+ +
+
+ + + + + +
+
+
+
+
+ +
+
+
Transcription
+
+ + +
+ +
+ + +
+ + +
+
+
+ +
+
+ + + + + +
+ +
+
+
+
+ + + + +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+ + + + Paragraph + Bullets + Auto + + + Short + Medium + Long + Auto + + +
+
+
+
+
+ Close + + + Save + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ Close +
+
+ + diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.js b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.js new file mode 100644 index 0000000..01d8122 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.js @@ -0,0 +1,109 @@ +define([], () => { + 'use strict'; + + + class PageModule { + + + + + + + receiveMessage(param,message) { + const chatWindow = document.getElementById('chat-window'); + const messageElement = document.createElement('div'); + messageElement.classList.add('chat-message'); + messageElement.classList.add(param === 'AI' ? 'AI' : 'You'); + messageElement.innerHTML = `${param}: ${message}`; + chatWindow.appendChild(messageElement); + chatWindow.scrollTop = chatWindow.scrollHeight; + return true; + } + + + sendMessage(param,message) { + const chatWindow = document.getElementById('chat-window'); + const messageElement = document.createElement('div'); + messageElement.classList.add('chat-message'); + messageElement.classList.add(param === 'You' ? 'You' : 'AI'); + messageElement.innerHTML = `${param}: ${message}`; + chatWindow.appendChild(messageElement); + chatWindow.scrollTop = chatWindow.scrollHeight; + } + + receiveTranscriptionMessage(param,message) { + const chatWindow = document.getElementById('chat-t-window'); + const messageElement = document.createElement('div'); + messageElement.classList.add('chat-t-message'); + messageElement.classList.add(param); + messageElement.innerHTML = `${param}: ${message}`; + chatWindow.appendChild(messageElement); + chatWindow.scrollTop = chatWindow.scrollHeight; + } + + + sendTranscriptionMessage(param,message) { + const chatWindow = document.getElementById('chat-t-window'); + const messageElement = document.createElement('div'); + messageElement.classList.add('chat-t-message'); + let title="Speaker "+param; + if (param % 2 === 0) + { + messageElement.classList.add('Speaker2'); + }else{ + messageElement.classList.add('Speaker1'); + } + + + + messageElement.innerHTML = `${title}: ${message}`; + chatWindow.appendChild(messageElement); + chatWindow.scrollTop = chatWindow.scrollHeight; + } + + +/* +processEntities(data,personEntities,orgEntities) { + let personEntities2 =personEntities; + let orgEntities2 = orgEntities; + + data.documents[0].entities.forEach(entity => { + if (entity.type === "PERSON") { + personEntities2.push(entity.text); + } else if (entity.type === "ORGANIZATION") { + orgEntities2.push(entity.text); + } + }); +// Elimina duplicados usando Set + personEntities2 = [...new Set(personEntities2)]; + orgEntities2 = [...new Set(orgEntities2)]; + + let json = {"personEntities": personEntities2, "orgEntities": orgEntities2}; +//alert(JSON.stringify(json)); + return json; // Retorna el objeto JSON directamente +} +*/ + + processText(text) { + + if (!text) { + return ''; + } + // Elimina las frases específicas + const phrasesToRemove = [ + "Would you like help with anything else involving this text?", + "Does this summary match what you were looking for?", + "Is there anything else I can extract from the text?" + ]; + + phrasesToRemove.forEach(phrase => { + text = text.replace(phrase, ''); + }); + // Reemplaza los guiones seguidos de un espacio con guiones y un salto de línea + let processedText = text.replace(/- /g, '
-'); + return processedText; + } + } + + return PageModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.json b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.json new file mode 100644 index 0000000..9d0a161 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/pages/main-start-page.json @@ -0,0 +1,461 @@ +{ + "title": "AI Meetings", + "description": "", + "variables": { + "arrayDatetime": { + "type": "string[]" + }, + "arrayLocation": { + "type": "string[]" + }, + "arrayMention": { + "type": "string[]" + }, + "arrayOrg": { + "type": "string[]" + }, + "arrayProduct": { + "type": "string[]" + }, + "currentRequest": { + "type": "number", + "persisted": "session" + }, + "enterKey": { + "type": "boolean", + "defaultValue": false, + "onValueChanged": { + "chains": [ + { + "parameters": { + "event": "{{ $event }}" + }, + "chain": "ButtonActionSendChat" + } + ] + }, + "dirtyDataBehavior": "track" + }, + "extractiveness": { + "type": "string", + "defaultValue": "AUTO", + "persisted": "session" + }, + "filename": { + "type": "string", + "persisted": "session" + }, + "fileSize": { + "type": "string" + }, + "format": { + "type": "string", + "defaultValue": "AUTO", + "persisted": "session" + }, + "internalMeeting": { + "type": "boolean", + "defaultValue": true, + "persisted": "session" + }, + "jobCompletion": { + "type": "number", + "persisted": "session" + }, + "jobId": { + "type": "string", + "persisted": "session" + }, + "jobIdName": { + "type": "string", + "persisted": "session" + }, + "jobStatus": { + "type": "string", + "persisted": "session" + }, + "languageProcessingFinish": { + "type": "boolean", + "defaultValue": false + }, + "length": { + "type": "string", + "defaultValue": "AUTO", + "persisted": "session" + }, + "loading": { + "type": "boolean", + "defaultValue": false, + "persisted": "none" + }, + "meetingCreated": { + "type": "boolean", + "defaultValue": false, + "persisted": "session" + }, + "meetingDesc": { + "type": "string" + }, + "meetingID": { + "type": "number", + "persisted": "session", + "input": "fromUrl" + }, + "meetingName": { + "type": "string", + "persisted": "session" + }, + "meetingParticipants": { + "type": "object[]" + }, + "mention": { + "type": "string" + }, + "minimumSize": { + "type": "boolean", + "defaultValue": false + }, + "nParticipants": { + "type": "number", + "defaultValue": 0 + }, + "outputlocation": { + "type": "string" + }, + "parURL": { + "type": "string", + "persisted": "session" + }, + "query": { + "type": "string", + "onValueChanged": { + "chains": [ + { + "parameters": { + "event": "{{ $event }}" + }, + "chain": "queryChangeListener" + } + ] + }, + "dirtyDataBehavior": "track" + }, + "ragResponse": { + "type": "string" + }, + "requirements": { + "type": "string[]", + "uniqueItems": true + }, + "sentiment": { + "type": "boolean" + }, + "spareTime": { + "type": "boolean" + }, + "summary": { + "type": "boolean" + }, + "summaryStatus": { + "type": "boolean", + "defaultValue": false + }, + "summaryText": { + "type": "string" + }, + "transcriptionID": { + "type": "number", + "persisted": "session", + "input": "fromUrl" + }, + "transcriptionTask": { + "type": "boolean", + "defaultValue": false, + "persisted": "none" + }, + "transcriptionText": { + "type": "string" + }, + "uploadSuccess": { + "type": "boolean", + "defaultValue": false, + "persisted": "session" + }, + "tokenArray": { + "type": "tokenType[]" + }, + "tokens": { + "type": "number[]" + }, + + "chartADP": { + "type": "vb/ArrayDataProvider2", + "defaultValue": { + "data": "{{ $variables.chartDataArray }}", + "itemType": "ChartType", + "keyAttributes": "id" + } + }, + "chartDataArray": { + "type": "ChartType[]", + "defaultValue": [ + { + "id": 1, + "series": "Positive", + "group": "Group 1", + "value": 25 + }, + { + "id": 2, + "series": "Negative", + "group": "Group 1", + "value": 25 + }, + { + "id": 3, + "series": "Neutral", + "group": "Group 1", + "value": 25 + }, + { + "id": 4, + "series": "Mixed", + "group": "Group 1", + "value": 25 + } + ] + }, + "meetingSentiment": { + "type": "string", + "defaultValue": "getting...." + }, + "mixed": { + "type": "number", + "defaultValue": 0 + }, + "negative": { + "type": "number", + "defaultValue": 0 + }, + "neutral": { + "type": "number", + "defaultValue": 0 + }, + "positive": { + "type": "number", + "defaultValue": 0 + }, + "tableADP": { + "type": "vb/ArrayDataProvider2", + "defaultValue": { + "data": "{{ $variables.tableArray }}", + "itemType": "TableType", + "keyAttributes": "@index" + } + }, + "tableArray": { + "type": "TableType[]", + "defaultValue": [ + { + "sentence": "Glad to hear all's well.", + "sentiment": "Neutral", + "value": "50.54" + }, + { + "sentence": "And yeah, I just wanted to check in with you on progress and whatnot.", + "sentiment": "Neutral", + "value": "97.42" + }, + { + "sentence": "Yes, of course.", + "sentiment": "Neutral", + "value": "94.35" + } + ] + } + + }, + "metadata": {}, + "types": { + "tokenType": { + "speakerIndex": "number", + "token": "string" + }, + "ChartType": { + "group": "string", + "id": "number", + "series": "string", + "value": "number" + }, + "TableType": { + "sentence": "string", + "sentiment": "string", + "value": "string" + } + }, + "eventListeners": { + "buttonAction": { + "chains": [ + { + "chain": "ButtonCloseDialog" + } + ] + }, + "buttonAction2": { + "chains": [ + { + "chain": "ButtonActionRefresh" + } + ] + }, + "buttonAction3": { + "chains": [ + { + "chain": "ButtonNewMeeting" + } + ] + }, + "buttonAction4": { + "chains": [ + { + "chain": "ButtonCloseDialog" + } + ] + }, + "buttonAction5": { + "chains": [ + { + "chain": "ButtonCloseConfigurationDialog" + } + ] + }, + "buttonAction6": { + "chains": [ + { + "chain": "ButtonSaveConfigurationDialog" + } + ] + }, + "buttonAction7": { + "chains": [ + { + "chain": "ButtonMyMeetings" + } + ] + }, + "buttonAction8": { + "chains": [ + { + "chain": "createMeeting" + } + ] + }, + "buttonAction9": { + "chains": [ + { + "chain": "ButtonActionSendChat" + } + ] + }, + "enterKey": { + "chains": [ + { + "parameters": {}, + "chain": "ButtonActionSendChat" + } + ] + }, + "filePickerSelect": { + "chains": [ + { + "chain": "FilePickerSelectChain", + "parameters": { + "files": "[[ Array.prototype.slice.call($event.detail.files) ]]" + } + } + ] + }, + "flexClick": { + "chains": [ + { + "chain": "FlexClickChain" + } + ] + }, + "flexClick2": { + "chains": [ + { + "chain": "ClickGear" + } + ] + }, + "iconClick": { + "chains": [ + { + "chain": "CopyTranscription" + } + ] + }, + "vbEnter": { + "chains": [ +{ + "parameters": {}, + "chain": "loadData" + } + ] + } + + }, + "imports": { + "components": { + "oj-accordion": { + "path": "ojs/ojaccordion" + }, + "oj-button": { + "path": "ojs/ojbutton" + }, + "oj-c-file-picker": { + "path": "oj-c/file-picker" + }, + "oj-chart": { + "path": "ojs/ojchart" + }, + "oj-chart-item": { + "path": "ojs/ojchart" + }, + "oj-collapsible": { + "path": "ojs/ojcollapsible" + }, + "oj-combobox-one": { + "path": "ojs/ojselectcombobox" + }, + "oj-dialog": { + "path": "ojs/ojdialog" + }, + "oj-input-text": { + "path": "ojs/ojinputtext" + }, + "oj-label": { + "path": "ojs/ojlabel" + }, + "oj-label-value": { + "path": "ojs/ojlabelvalue" + }, + "oj-option": { + "path": "ojs/ojoption" + }, + "oj-text-area": { + "path": "ojs/ojinputtext" + }, + "oj-validation-group": { + "path": "ojs/ojvalidationgroup" + } + + }, + "css": [ + "/resources/css/app.css" + ] + }, + "events": { + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker06632.gif b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker06632.gif new file mode 100644 index 0000000..154223a Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker06632.gif differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker67460.gif b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker67460.gif new file mode 100644 index 0000000..0e96521 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/3dgifmaker67460.gif differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/44307903.png b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/44307903.png new file mode 100644 index 0000000..42cb641 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/44307903.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/Marc.jpeg b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/Marc.jpeg new file mode 100644 index 0000000..674090e Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/Marc.jpeg differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/alex.jpeg b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/alex.jpeg new file mode 100644 index 0000000..af50c5d Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/alex.jpeg differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/artificial-intelligence-ai-icon.png b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/artificial-intelligence-ai-icon.png new file mode 100644 index 0000000..bb78da4 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/artificial-intelligence-ai-icon.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/jesus.jpeg b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/jesus.jpeg new file mode 100644 index 0000000..7b614e0 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/jesus.jpeg differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/luigi.jpeg b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/luigi.jpeg new file mode 100644 index 0000000..8677ded Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/flows/main/resources/images/luigi.jpeg differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.html b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.html new file mode 100644 index 0000000..a10e3d5 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.html @@ -0,0 +1,36 @@ + + + + +
+
+
+ +
+ + + +
\ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.js b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.js new file mode 100644 index 0000000..8eff264 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class FragmentModule { + } + + return FragmentModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.json b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.json new file mode 100644 index 0000000..9a1195f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/page-header/page-header-fragment.json @@ -0,0 +1,35 @@ +{ + "title": "", + "description": "", + "events": {}, + "eventListeners": { + "toggleDrawer": { + "chains": [ + { + "chain": "application:toggleDrawerHandler" + } + ] + } + }, + "imports": { + "components": { + "oj-button": { + "path": "ojs/ojbutton" + } + } + }, + "metadata": {}, + "types": {}, + "slots": { + "actions": { + "displayName": "Actions" + } + }, + "variables": { + "title": { + "type": "string", + "input": "fromCaller" + } + }, + "referenceable": "self" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/chains/openAboutDialog.js b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/chains/openAboutDialog.js new file mode 100644 index 0000000..95deb71 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/chains/openAboutDialog.js @@ -0,0 +1,29 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class openAboutDialog extends ActionChain { + + /** + * Opens About Dialog + * @param {Object} context + */ + async run(context) { + const { $application } = context; + + const callAboutDialogOpenResult = await Actions.callComponentMethod(context, { + selector: '#aboutDialog', + method: 'open', + }); + } + } + + return openAboutDialog; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.html b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.html new file mode 100644 index 0000000..07fc351 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.html @@ -0,0 +1,32 @@ +
+ + +
\ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.js b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.js new file mode 100644 index 0000000..8eff264 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class FragmentModule { + } + + return FragmentModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.json b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.json new file mode 100644 index 0000000..a93715b --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-footer/shell-footer-fragment.json @@ -0,0 +1,27 @@ +{ + "title": "Shell Footer", + "eventListeners": { + "aboutClick": { + "chains": [ + { + "chain": "openAboutDialog" + } + ], + "preventDefault": "true" + } + }, + "events": {}, + "imports": { + "components": { + "oj-dialog": { + "path": "ojs/ojdialog" + } + }, + "css": [ + "/resources/css/shell.css" + ] + }, + "metadata": {}, + "types": {}, + "variables": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/chains/openAvatarMenu.js b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/chains/openAvatarMenu.js new file mode 100644 index 0000000..3a421fd --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/chains/openAvatarMenu.js @@ -0,0 +1,32 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class openAvatarMenu extends ActionChain { + + /** + * Opens the menu invoked from avatar icon in the header + * @param {Object} context + */ + async run(context) { + const { $application } = context; + + const callHeaderAvatarMenuOpenResult = await Actions.callComponentMethod(context, { + selector: '#header-avatar-menu', + method: 'open', + params: [ + '#header-avatar' + ], + }); + } + } + + return openAvatarMenu; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.html b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.html new file mode 100644 index 0000000..6be6b7f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.js b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.js new file mode 100644 index 0000000..8eff264 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class FragmentModule { + } + + return FragmentModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.json b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.json new file mode 100644 index 0000000..332bc45 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/fragments/shell-header/shell-header-fragment.json @@ -0,0 +1,23 @@ +{ + "title": "Shell Header", + "eventListeners": { + "openAvatarMenu": { + "chains": [ + { + "chain": "openAvatarMenu" + } + ] + } + }, + "events": {}, + "imports": { + "components": { + }, + "css": [ + "/resources/css/shell.css" + ] + }, + "metadata": {}, + "types": {}, + "variables": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/index.html b/ai-meetings/VBCS Project/webApps/ai_meetings/index.html new file mode 100644 index 0000000..2f5e24f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/index.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/manifest.webmanifest b/ai-meetings/VBCS Project/webApps/ai_meetings/manifest.webmanifest new file mode 100644 index 0000000..3191682 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/manifest.webmanifest @@ -0,0 +1,41 @@ +{ + "background_color": "rgb(241, 239, 237)", + "description": "A new VB app", + "display": "standalone", + "icons": [ + { + "sizes": "128x128", + "src": "resources/icons/icon-128x128.png", + "type": "image/png", + "purpose": "any maskable" + }, + { + "sizes": "144x144", + "src": "resources/icons/icon-144x144.png", + "type": "image/png", + "purpose": "any maskable" + }, + { + "sizes": "192x192", + "src": "resources/icons/icon-192x192.png", + "type": "image/png", + "purpose": "any maskable" + }, + { + "sizes": "256x256", + "src": "resources/icons/icon-256x256.png", + "type": "image/png", + "purpose": "any maskable" + }, + { + "sizes": "512x512", + "src": "resources/icons/icon-512x512.png", + "type": "image/png", + "purpose": "any maskable" + } + ], + "name": "Oracle AI Meetings", + "short_name": "Oracle AI Meetings", + "start_url": "./", + "theme_color": "rgb(241, 239, 237)" +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/closeNotificationHandler.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/closeNotificationHandler.js new file mode 100644 index 0000000..90dd372 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/closeNotificationHandler.js @@ -0,0 +1,33 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class closeNotificationHandler extends ActionChain { + + /** + * Removes the notification message when its dismiss gesture has been invoked. + * @param {Object} context + * @param {Object} params + * @param {messageType} params.eventMessage + */ + async run(context, { eventMessage = {} }) { + const { $application, $flow, $page } = context; + + await Actions.fireDataProviderEvent(context, { + target: $page.variables.messagesADP, + remove: { + keys: [eventMessage.id], + }, + }); + } + } + + return closeNotificationHandler; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/showNotification.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/showNotification.js new file mode 100644 index 0000000..6b8b5d7 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page-chains/showNotification.js @@ -0,0 +1,33 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class showNotification extends ActionChain { + + /** + * Displays notifications sent by the Fire Notification action using the oj-messages component on this page. + * @param {Object} context + * @param {Object} params + * @param {messageType} params.eventPayload + */ + async run(context, { eventPayload = {} }) { + const { $application, $flow, $page } = context; + + await Actions.fireDataProviderEvent(context, { + target: $page.variables.messagesADP, + add: { + data: [eventPayload], + }, + }); + } + } + + return showNotification; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.html b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.html new file mode 100644 index 0000000..89f8719 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.html @@ -0,0 +1,16 @@ +
+ + + + + + + +
diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.js new file mode 100644 index 0000000..dea0fa9 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class PageModule { + } + + return PageModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.json b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.json new file mode 100644 index 0000000..bd49070 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/nice-page.json @@ -0,0 +1,59 @@ +{ + "description": "", + "routerFlow": "main", + "variables": { + + "messagesADP": { + "type": "vb/ArrayDataProvider2", + "defaultValue": { + "keyAttributes": "id", + "itemType": "page:messageType" + } + } + }, + "metadata": {}, + "types": { + "messageType": { + "id": "string", + "severity": "string", + "category": "string", + "summary": "string", + "detail": "string", + "timestamp": "string", + "autoTimeout": "number" + } + }, + "eventListeners": { + "vbNotification": { + "chains": [ + { + "chain": "showNotification", + "parameters": { + "eventPayload": "{{ { id: $event.key, summary: $event.summary, detail: $event.message, severity: $event.type, autoTimeout: $event.displayMode === 'transient' ? 0 : -1 } }}" + } + } + ] + }, + "onMessageClose": { + "chains": [ + { + "chain": "closeNotificationHandler", + "parameters": { + "eventMessage": "{{ $event.detail.message }}" + } + } + ] + } + }, + "imports": { + "components": { + "oj-messages": { + "path": "ojs/ojmessages" + } + }, + "css": [ + "/resources/css/shell.css" + ] + }, + "translations": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/closeNotificationHandler.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/closeNotificationHandler.js new file mode 100644 index 0000000..90dd372 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/closeNotificationHandler.js @@ -0,0 +1,33 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class closeNotificationHandler extends ActionChain { + + /** + * Removes the notification message when its dismiss gesture has been invoked. + * @param {Object} context + * @param {Object} params + * @param {messageType} params.eventMessage + */ + async run(context, { eventMessage = {} }) { + const { $application, $flow, $page } = context; + + await Actions.fireDataProviderEvent(context, { + target: $page.variables.messagesADP, + remove: { + keys: [eventMessage.id], + }, + }); + } + } + + return closeNotificationHandler; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/showNotification.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/showNotification.js new file mode 100644 index 0000000..6b8b5d7 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page-chains/showNotification.js @@ -0,0 +1,33 @@ +define([ + 'vb/action/actionChain', + 'vb/action/actions', + 'vb/action/actionUtils', +], ( + ActionChain, + Actions, + ActionUtils +) => { + 'use strict'; + + class showNotification extends ActionChain { + + /** + * Displays notifications sent by the Fire Notification action using the oj-messages component on this page. + * @param {Object} context + * @param {Object} params + * @param {messageType} params.eventPayload + */ + async run(context, { eventPayload = {} }) { + const { $application, $flow, $page } = context; + + await Actions.fireDataProviderEvent(context, { + target: $page.variables.messagesADP, + add: { + data: [eventPayload], + }, + }); + } + } + + return showNotification; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.html b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.html new file mode 100644 index 0000000..fc68b89 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.html @@ -0,0 +1,21 @@ +
+ + + + + + + + + + +
diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.js b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.js new file mode 100644 index 0000000..dea0fa9 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.js @@ -0,0 +1,8 @@ +define([], () => { + 'use strict'; + + class PageModule { + } + + return PageModule; +}); diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.json b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.json new file mode 100644 index 0000000..256d457 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/pages/shell-page.json @@ -0,0 +1,72 @@ +{ + "description": "", + "routerFlow": "main", + "variables": { + "avatarInfo": { + "type": "object", + "defaultValue": { + "initials": "RG", + "title": "Example Avatar", + "items": [ + { + "name": "Sign Out", + "action": "signout", + "iconClass": "oj-ux-ico-logout" + } + ] + } + }, + "messagesADP": { + "type": "vb/ArrayDataProvider2", + "defaultValue": { + "keyAttributes": "id", + "itemType": "page:messageType" + } + } + }, + "metadata": {}, + "types": { + "messageType": { + "id": "string", + "severity": "string", + "category": "string", + "summary": "string", + "detail": "string", + "timestamp": "string", + "autoTimeout": "number" + } + }, + "eventListeners": { + "vbNotification": { + "chains": [ + { + "chain": "showNotification", + "parameters": { + "eventPayload": "{{ { id: $event.key, summary: $event.summary, detail: $event.message, severity: $event.type, autoTimeout: $event.displayMode === 'transient' ? 0 : -1 } }}" + } + } + ] + }, + "onMessageClose": { + "chains": [ + { + "chain": "closeNotificationHandler", + "parameters": { + "eventMessage": "{{ $event.detail.message }}" + } + } + ] + } + }, + "imports": { + "components": { + "oj-messages": { + "path": "ojs/ojmessages" + } + }, + "css": [ + "/resources/css/shell.css" + ] + }, + "translations": {} +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/app.css b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/app.css new file mode 100644 index 0000000..c5eebe5 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/app.css @@ -0,0 +1,129 @@ +.chat-message { + padding: 10px; + margin: 5px; + border-radius: 10px; + max-width: 60%; + word-wrap: break-word; +} + +.chat-message.You { + background-color: #DCF8C6; /* Verde claro como WhatsApp */ + align-self: flex-end; + text-align: right; +} + +.chat-message.AI { + background-color: #FFFFFF; /* Blanco */ + align-self: flex-start; + text-align: left; +} + +#chat-window { + display: flex; + flex-direction: column; + height: 300px; + overflow-y: auto; + border: 1px solid #ccc; + padding: 10px; + background-color: #f9f9f9; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1), 0 6px 20px rgba(0, 0, 0, 0.1); /* Sombra bonita y elevada */ +} + +.chat-t-message { + padding: 10px; + margin: 5px; + border-radius: 10px; + max-width: 60%; + word-wrap: break-word; +} + +.chat-t-message.Speaker2 { + background-color: #DCF8C6; /* Verde claro como WhatsApp */ + align-self: flex-end; + text-align: right; +} + +.chat-t-message.Speaker1 { + background-color: #FFFFFF; /* Blanco */ + align-self: flex-start; + text-align: left; +} + +#chat-t-window { + display: flex; + flex-direction: column; + height: 300px; + overflow-y: auto; + border: 1px solid #ccc; + padding: 10px; + background-color: #f9f9f9; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1), 0 6px 20px rgba(0, 0, 0, 0.1); /* Sombra bonita y elevada */ +} + + +button { + font-size: 16px; + padding: 10px 20px; + margin: 10px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease, color 0.3s ease; +} + +#startBtn { + background-color: #4CAF50; + color: white; +} + +#startBtn:hover { + background-color: #45a049; +} + +#stopBtn { + background-color: #f44336; + color: white; +} + +#stopBtn:hover { + background-color: #e53935; +} + +#transcript { + margin-top: 20px; + font-size: 18px; + color: #333; + white-space: pre-line; + text-align: left; + margin: 0 auto; + padding: 10px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; + width:100%; + min-height: 100px; +} + +#summary { + margin-top: 20px; + font-size: 18px; + color: #333; + white-space: pre-line; + text-align: left; + margin: 0 auto; + padding: 10px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; + width:100%; + min-height: 100px; +} + +/* Media query para dispositivos móviles */ +@media (max-width: 600px) { + #transcript, #summary { + width: 90%; /* Ajusta el ancho según tus necesidades */ + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/shell.css b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/shell.css new file mode 100644 index 0000000..b485a3f --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/css/shell.css @@ -0,0 +1,159 @@ +.vb-web-applayout-body { + overflow-y: hidden; +} + +.vb-web-applayout-page { + position: relative; + min-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); + max-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); +} + +/* Sticky header on the top so that the rest of the page can scroll independent of the header */ +.vb-web-applayout-page.fixed-header { + padding-top: calc(3.25rem + env(safe-area-inset-top)); +} + +.vb-web-applayout-page.fixed-header .vb-web-applayout-header { + position: fixed; + width: 100%; + top: 0; + left: 0; +} + +.vb-web-applayout-header { + background-color: rgb(var(--oj-palette-neutral-rgb-10)); + border-bottom: 1px solid var(--oj-private-app-layout-web-header-border-color); + z-index: 1; + box-shadow: var(--oj-private-app-layout-web-header-box-shadow); +} + +.vb-content-and-footer-container { + position: relative; + overflow-y: auto; +} + +.vb-pages-module { + /* Matches the headers and footers. Extra 1em is for the padding in the offcanvas icon */ + padding-left: calc(var(--oj-core-spacing-10x) + var(--oj-core-spacing-4x)); + padding-right: var(--oj-core-spacing-10x); + position: relative; + width: 100%; +} + +.vb-pages-module > oj-module { + /* This makes sure that the content inside the page starts underneath the header */ + flex-direction: column; +} + +.vb-web-applayout-footer-image-stripe { + height: 8px; + content: ''; + background: url(../images/footer-stripe.png); + background-position: left bottom; + background-repeat: repeat-x; + background-size: 100% 100%; +} + +.vb-web-applayout-footer-content { + background-color: rgb(var(--oj-palette-neutral-rgb-170)); + padding-top: var(--oj-core-spacing-4x); + padding-bottom: var(--oj-core-spacing-4x); +} + +.vb-web-applayout-footer-content, +.vb-web-applayout-header-content { + padding-left: var(--oj-core-spacing-10x); + padding-right: var(--oj-core-spacing-10x); +} + +/* Special selectors for desktop Form factor */ +@media screen and (min-width: 600px) { + .vb-web-applayout-header { + background-color: rgb(var(--oj-palette-neutral-rgb-30)); + } + + .vb-content-header { + /* minimum height ensures that the content flex item does not bleed up */ + min-height: 7.875rem; + /* Limit the height of the content header on the top to 126px */ + max-height: 7.875rem; + /* This accounts for the image strip at the bottom */ + margin-bottom: 12px; + } + + .vb-content-header-image-stripe { + /* Matches the page header height of 7.875rem */ + top: 7.875rem; + left: 0; + position: absolute; + width: 100%; + /* height of the image strip */ + height: 12px; + content: ''; + z-index: 1; + + background: url(../images/header-stripe-desktop.png); + background-position: left bottom; + background-repeat: repeat-x; + background-size: 100% 100%; + } +} + +@media screen and (orientation: landscape) { + .vb-web-applayout-page { + /* In landscape mode for the devices, the page will occupy entire height and safe-are is contained in the bottom margins */ + min-height: 100vh; + } +} + +/* Special selectors for Phone Form factor */ +@media screen and (max-width: 599.9px) { + /* Account for addition height of the page header */ + .vb-web-applayout-page.fixed-header { + padding-top: calc(3.5rem + 6px + env(safe-area-inset-top)); + } + + /* color strip is displayed under the header region for phone form factor */ + .vb-web-applayout-header { + /* This accounts for the image strip at the bottom */ + padding-bottom: 6px; + } + + .vb-web-applayout-header-image-stripe { + position: absolute; + width: 100%; + height: 6px; + content: ''; + z-index: 1; + left: 0; + bottom: 0; + background: url(../images/header-stripe-phone.png); + background-position: left bottom; + background-repeat: repeat-x; + background-size: 100% 100%; + } + + .vb-web-applayout-header-content { + padding-left: var(--oj-core-spacing-2x); + padding-right: var(--oj-core-spacing-2x); + height: 3.5rem; + } + + .vb-web-applayout-footer-content { + /* Matches the headers. Extra 1x is for the padding in the offcanvas icon */ + padding-left: var(--oj-core-spacing-3x); + } + + .vb-pages-module { + padding-left: var(--oj-core-spacing-4x); + } + + .vb-web-applayout-footer-image-stripe { + /* height of the image strip */ + height: 6px; + } + + .vb-web-applayout-footer-content { + padding-bottom: calc(var(--oj-core-spacing-4x) + env(safe-area-inset-bottom)); + } +} diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-120x120.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-120x120.png new file mode 100644 index 0000000..69cdc0c Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-120x120.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-128x128.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-128x128.png new file mode 100644 index 0000000..fd53b60 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-128x128.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-144x144.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-144x144.png new file mode 100644 index 0000000..741554a Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-144x144.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-152x152.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-152x152.png new file mode 100644 index 0000000..88e7b4e Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-152x152.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-167x167.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-167x167.png new file mode 100644 index 0000000..a7b9b1f Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-167x167.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-180x180.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-180x180.png new file mode 100644 index 0000000..0605f30 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-180x180.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-192x192.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-192x192.png new file mode 100644 index 0000000..8cb980b Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-192x192.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-256x256.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-256x256.png new file mode 100644 index 0000000..3c94647 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-256x256.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-512x512.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-512x512.png new file mode 100644 index 0000000..fd79bdb Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/icons/icon-512x512.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-dark.ico b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-dark.ico new file mode 100644 index 0000000..ba99751 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-dark.ico differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-light.ico b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-light.ico new file mode 100644 index 0000000..a6b6015 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/favicon-light.ico differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/footer-stripe.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/footer-stripe.png new file mode 100644 index 0000000..e0909d0 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/footer-stripe.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-desktop.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-desktop.png new file mode 100644 index 0000000..dc659a1 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-desktop.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-phone.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-phone.png new file mode 100644 index 0000000..2e4cebb Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/header-stripe-phone.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/sidebar-background-pattern.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/sidebar-background-pattern.png new file mode 100644 index 0000000..b7610aa Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/images/sidebar-background-pattern.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.d.ts b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.d.ts new file mode 100644 index 0000000..8cec2e9 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.d.ts @@ -0,0 +1 @@ +export {}; \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js new file mode 100644 index 0000000..e1eccc6 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js @@ -0,0 +1,213 @@ +//sample terminal client to test the SDK +//Warning! this requires SoX to work. +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var WebSocket = __importStar(require("ws")); +var record = require("node-record-lpcm16"); +var readline = require("readline"); +readline.emitKeypressEvents(process.stdin); +if (process.stdin.isTTY) { + process.stdin.setRawMode(true); +} +var common = __importStar(require("oci-common")); +var oci_aispeech_realtime_1 = require("oci-aispeech-realtime"); +var model_1 = require("oci-aispeech/lib/model"); +var para = ""; +var serviceRegion = "us-ashburn-1"; +var compartmentId = "ocid1.compartment.oc1..aaaaaaaa4bz2p36xc2wvhqvxr65s22xmp5jmm5gtlnauu3aajpx6pfgtwrxq"; +var realtimeClientParameters = { + customizations: [], + languageCode: oci_aispeech_realtime_1.RealtimeParameters.LanguageCode.EnUs, + modelDomain: oci_aispeech_realtime_1.RealtimeParameters.ModelDomain.Generic, + partialSilenceThresholdInMs: 300, + finalSilenceThresholdInMs: 2000, + shouldIgnoreInvalidCustomizations: false, + encoding: "audio/raw;rate=16000", //try setting to "audio/raw;rate=8000" +}; +var provider = new common.ConfigFileAuthenticationDetailsProvider(); +// const provider: common.SessionAuthDetailProvider = new common.SessionAuthDetailProvider(); +// can be customized to include a custom OCI Config Path and Profile) +// const provider: common.SessionAuthDetailProvider = new common.SessionAuthDetailProvider("~/.oci/config", "US-PHOENIX-1"); +var logs = true; +var audioStream; +var recorder; +var printLogs = function (logString) { + if (logs) + console.log.apply(console, __spreadArray([new Date().toISOString()], logString, false)); +}; +var callBack = function (eventType, event) { return __awaiter(void 0, void 0, void 0, function () { + var closeMessage, messageEvent, data, len, error; + return __generator(this, function (_a) { + if (eventType === oci_aispeech_realtime_1.RealtimeWebSocketEventType.CLOSE) { + closeMessage = event; + try { + recorder.stop(); + } + catch (error) { + printLogs(["Audio Error: " + error]); + } + printLogs(["WebSocket Server Closed with code: " + closeMessage.code + " " + closeMessage.reason]); + } + else if (eventType === oci_aispeech_realtime_1.RealtimeWebSocketEventType.OPEN) { + printLogs(["WebSocket Client Connected"]); + console.log("🟢"); + recorder = record.record({ + sampleRate: 16000, + channels: 1, + }); + audioStream = recorder.stream(); + audioStream.on("data", function (d) { + if (realtimeSDK.realtimeWebSocketClient.readyState === realtimeSDK.realtimeWebSocketClient.OPEN) + realtimeSDK.realtimeWebSocketClient.send(d); + }); + } + else if (eventType === oci_aispeech_realtime_1.RealtimeWebSocketEventType.MESSAGE) { + messageEvent = event; + if (messageEvent.data) { + printLogs([messageEvent.data]); + data = JSON.parse(messageEvent.data.toString()); + if (data.event === model_1.RealtimeMessageConnect.event) { + if (!logs) { + process.stdout.write("\x1b[36mSession ID: " + data.sessionId + "\x1b[0m"); + } + else + console.log("\x1b[36mSession ID: " + data.sessionId + "\x1b[0m"); + } + else if (data.event === model_1.RealtimeMessageResult.event && !data.transcriptions[0].isFinal) { + len = para.split(/\r\n|\r|\n/).length; + if (!logs) { + console.clear(); + process.stdout.write("\r" + para + "\x1b[36m" + (para.length > 0 ? " " : "") + data.transcriptions[0].transcription + "\x1b[0m" + "\n[🟠 \x1b[36mPartial\x1b[0m]\n"); + } + else + console.log("\x1b[36mPartial: " + data.transcriptions[0].transcription + "\x1b[0m"); + } + else if (data.event === model_1.RealtimeMessageResult.event && data.transcriptions[0].isFinal) { + para = para + (para.length > 0 ? " " : "") + data.transcriptions[0].transcription; + if (!logs) { + console.clear(); + process.stdout.write("\r" + para + "\n[🟢 \x1b[32mFinal\x1b[0m]\n"); + } + else + console.log("\x1b[32mFinal: " + data.transcriptions[0].transcription + "\x1b[0m"); + } + } + } + else if (eventType === oci_aispeech_realtime_1.RealtimeWebSocketEventType.ERROR) { + error = event; + try { + audioStream.destroy(); + } + catch (err) { + printLogs([err]); + } + printLogs(["WebSocket Server Error", error.message]); + } + return [2 /*return*/]; + }); +}); }; +var startSession = function (logsEnabled) { + if ((realtimeSDK && realtimeSDK.getWebSocketState() === oci_aispeech_realtime_1.RealtimeWebSocketState.STOPPED) || !realtimeSDK) { + logs = logsEnabled; + para = ""; + realtimeSDK = new oci_aispeech_realtime_1.RealtimeClient(callBack, provider, provider.getRegion(), compartmentId, "wss://realtime.aiservice-preprod.".concat(serviceRegion, ".oci.oraclecloud.com"), realtimeClientParameters); + realtimeSDK.connect(); + } +}; +var realtimeSDK; +var instructions = function () { + console.log("Press 'e' to quit\nPress 'r' to start without logs\nPress 'l' to start with logs\nPress 's' to stop"); +}; +instructions(); +process.stdin.on("keypress", function (str, key) { + if (!key.ctrl && key.name === "e") { + process.exit(); + } + else if (!key.ctrl && key.name === "r") { + startSession(false); + } + else if (!key.ctrl && key.name === "l") { + startSession(true); + } + else if (!key.ctrl && key.name === "s") { + try { + if (realtimeSDK && realtimeSDK.getWebSocketState() !== oci_aispeech_realtime_1.RealtimeWebSocketState.STOPPED && realtimeSDK.realtimeWebSocketClient.readyState !== WebSocket.CLOSING) { + realtimeSDK.close(); + console.log("🔴 Stopped"); + instructions(); + } + } + catch (e) { + printLogs(["WebSocket Client Error", e.message]); + } + } +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js.map b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js.map new file mode 100644 index 0000000..e023d3d --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/js/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,qCAAqC;AACrC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACb,4CAAgC;AAChC,IAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC7C,IAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;IACvB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,iDAAqC;AACrC,+DAA+H;AAG/H,gDAAuF;AAEvF,IAAI,IAAI,GAAG,EAAE,CAAC;AAEd,IAAM,aAAa,GAAG,cAAc,CAAC;AACrC,IAAM,aAAa,GAAG,qFAAqF,CAAC;AAC5G,IAAM,wBAAwB,GAAuB;IACnD,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,0CAAkB,CAAC,YAAY,CAAC,IAAI;IAClD,WAAW,EAAE,0CAAkB,CAAC,WAAW,CAAC,OAAO;IACnD,2BAA2B,EAAE,GAAG;IAChC,yBAAyB,EAAE,IAAI;IAC/B,iCAAiC,EAAE,KAAK;IACxC,QAAQ,EAAE,sBAAsB,EAAE,sCAAsC;CACzE,CAAC;AAEF,IAAM,QAAQ,GAAmD,IAAI,MAAM,CAAC,uCAAuC,EAAE,CAAC;AACtH,6FAA6F;AAC7F,qEAAqE;AACrE,4HAA4H;AAE5H,IAAI,IAAI,GAAG,IAAI,CAAC;AAChB,IAAI,WAAqB,CAAC;AAC1B,IAAI,QAAa,CAAC;AAClB,IAAM,SAAS,GAAG,UAAC,SAAgB;IACjC,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,OAAX,OAAO,iBAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAK,SAAS,UAAE;AAChE,CAAC,CAAC;AAEF,IAAM,QAAQ,GAA2J,UAAO,SAAS,EAAE,KAAK;;;QAC9L,IAAI,SAAS,KAAK,kDAA0B,CAAC,KAAK,EAAE;YAC5C,YAAY,GAAG,KAA6B,CAAC;YACnD,IAAI;gBACF,QAAQ,CAAC,IAAI,EAAE,CAAC;aACjB;YAAC,OAAO,KAAK,EAAE;gBACd,SAAS,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC;aACtC;YACD,SAAS,CAAC,CAAC,qCAAqC,GAAG,YAAY,CAAC,IAAI,GAAG,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;SACpG;aAAM,IAAI,SAAS,KAAK,kDAA0B,CAAC,IAAI,EAAE;YACxD,SAAS,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;gBACvB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAEhC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,CAAC;gBACvB,IAAI,WAAW,CAAC,uBAAuB,CAAC,UAAU,KAAK,WAAW,CAAC,uBAAuB,CAAC,IAAI;oBAAE,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/I,CAAC,CAAC,CAAC;SACJ;aAAM,IAAI,SAAS,KAAK,kDAA0B,CAAC,OAAO,EAAE;YACvD,YAAY,GAAG,KAA+B,CAAC;YACnD,IAAI,YAAY,CAAC,IAAI,EAAE;gBACrB,SAAS,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;gBAE3B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpD,IAAI,IAAI,CAAC,KAAK,KAAK,8BAAsB,CAAC,KAAK,EAAE;oBAC/C,IAAI,CAAC,IAAI,EAAE;wBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;qBAC3E;;wBAAM,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;iBACzE;qBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,6BAAqB,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;oBACpF,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;oBAC1C,IAAI,CAAC,IAAI,EAAE;wBACT,OAAO,CAAC,KAAK,EAAE,CAAC;wBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAwB,GAAG,SAAS,GAAG,iCAAiC,CAAC,CAAC;qBAClL;;wBAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;iBAC5F;qBAAM,IAAI,IAAI,CAAC,KAAK,KAAK,6BAAqB,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;oBACvF,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAwB,CAAC;oBAE9F,IAAI,CAAC,IAAI,EAAE;wBACT,OAAO,CAAC,KAAK,EAAE,CAAC;wBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,+BAA+B,CAAC,CAAC;qBACrE;;wBAAM,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;iBAC5F;aACF;SACF;aAAM,IAAI,SAAS,KAAK,kDAA0B,CAAC,KAAK,EAAE;YACrD,KAAK,GAAG,KAA6B,CAAC;YAC1C,IAAI;gBACF,WAAW,CAAC,OAAO,EAAE,CAAC;aACvB;YAAC,OAAO,GAAG,EAAE;gBACZ,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aAClB;YACD,SAAS,CAAC,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SACtD;;;KACF,CAAC;AAEF,IAAM,YAAY,GAAG,UAAC,WAAoB;IACxC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE,KAAK,8CAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE;QACvG,IAAI,GAAG,WAAW,CAAC;QACnB,IAAI,GAAG,EAAE,CAAC;QACV,WAAW,GAAG,IAAI,sCAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,2CAAoC,aAAa,yBAAsB,EAAE,wBAAwB,CAAC,CAAC;QAC7L,WAAW,CAAC,OAAO,EAAE,CAAC;KACvB;AACH,CAAC,CAAC;AAEF,IAAI,WAA2B,CAAC;AAEhC,IAAM,YAAY,GAAG;IACnB,OAAO,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;AACrH,CAAC,CAAC;AACF,YAAY,EAAE,CAAC;AACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAC,GAAG,EAAE,GAAG;IACpC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;QACjC,OAAO,CAAC,IAAI,EAAE,CAAC;KAChB;SAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;QACxC,YAAY,CAAC,KAAK,CAAC,CAAC;KACrB;SAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;QACxC,YAAY,CAAC,IAAI,CAAC,CAAC;KACpB;SAAM,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;QACxC,IAAI;YACF,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE,KAAK,8CAAsB,CAAC,OAAO,IAAI,WAAW,CAAC,uBAAuB,CAAC,UAAU,KAAK,SAAS,CAAC,OAAO,EAAE;gBAC7J,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC1B,YAAY,EAAE,CAAC;aAChB;SACF;QAAC,OAAO,CAAC,EAAE;YACV,SAAS,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SAClD;KACF;AACH,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1136-640.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1136-640.png new file mode 100644 index 0000000..db5bed8 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1136-640.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1334-750.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1334-750.png new file mode 100644 index 0000000..41d8c24 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1334-750.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1620-2160.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1620-2160.png new file mode 100644 index 0000000..0415e7a Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1620-2160.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1668-2388.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1668-2388.png new file mode 100644 index 0000000..97ea548 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1668-2388.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1792-828.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1792-828.png new file mode 100644 index 0000000..d57e890 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-1792-828.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2048-1536.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2048-1536.png new file mode 100644 index 0000000..e90a18a Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2048-1536.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2160-1620.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2160-1620.png new file mode 100644 index 0000000..65cb426 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2160-1620.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2208-1242.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2208-1242.png new file mode 100644 index 0000000..d437ca6 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2208-1242.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2224-1668.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2224-1668.png new file mode 100644 index 0000000..976b8fc Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2224-1668.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2388-1668.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2388-1668.png new file mode 100644 index 0000000..2771036 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2388-1668.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2436-1125.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2436-1125.png new file mode 100644 index 0000000..f55abfb Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2436-1125.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2532-1170.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2532-1170.png new file mode 100644 index 0000000..578e936 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2532-1170.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2688-1242.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2688-1242.png new file mode 100644 index 0000000..1e21c32 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2688-1242.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2732-2048.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2732-2048.png new file mode 100644 index 0000000..8dc2feb Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2732-2048.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2778-1284.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2778-1284.png new file mode 100644 index 0000000..d5cc3f4 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-2778-1284.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-640-1136.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-640-1136.png new file mode 100644 index 0000000..a740e43 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/apple-splash-640-1136.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipad_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipad_splash.png new file mode 100644 index 0000000..5f0215e Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipad_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro1_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro1_splash.png new file mode 100644 index 0000000..3421e87 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro1_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro2_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro2_splash.png new file mode 100644 index 0000000..e482259 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/ipadpro2_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12_splash.png new file mode 100644 index 0000000..bedd9a4 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12max_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12max_splash.png new file mode 100644 index 0000000..45a248f Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone12max_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone_splash.png new file mode 100644 index 0000000..1920b2f Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphone_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphoneplus_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphoneplus_splash.png new file mode 100644 index 0000000..f36c2ab Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphoneplus_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonex_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonex_splash.png new file mode 100644 index 0000000..44b12fe Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonex_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexr_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexr_splash.png new file mode 100644 index 0000000..e07ccbe Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexr_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexsmax_splash.png b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexsmax_splash.png new file mode 100644 index 0000000..8314cd8 Binary files /dev/null and b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/iphonexsmax_splash.png differ diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/links.html b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/links.html new file mode 100644 index 0000000..9edee0e --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/splashscreens/links.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/app-strings.json b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/app-strings.json new file mode 100644 index 0000000..f4d84b3 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/app-strings.json @@ -0,0 +1,3 @@ +{ + "root": true +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/root/app-strings.json b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/root/app-strings.json new file mode 100644 index 0000000..5527387 --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/resources/strings/app/nls/root/app-strings.json @@ -0,0 +1,18 @@ +{ + "app_title_navigation_drawer": "Application Navigation Drawer", + "@app_title_navigation_drawer": { + "description": "Title for Application Navigation Drawer" + }, + "app_footer_about_link": "About", + "@app_footer_about_link": { + "description": "About link on shell footer" + }, + "app_footer_copyright": "Created with Visual Builder, Copyright © 2024", + "@app_footer_copyright": { + "description": "Copyright text on shell footer" + }, + "app_sign_out": "Sign Out", + "@app_sign_out": { + "description": "Text on menu option to log out of the application" + } +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/settings/appShellCache.json b/ai-meetings/VBCS Project/webApps/ai_meetings/settings/appShellCache.json new file mode 100644 index 0000000..4c3ebec --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/settings/appShellCache.json @@ -0,0 +1,4 @@ +{ + "appFileExclusions": [], + "files": [] +} \ No newline at end of file diff --git a/ai-meetings/VBCS Project/webApps/ai_meetings/settings/dependencies.json b/ai-meetings/VBCS Project/webApps/ai_meetings/settings/dependencies.json new file mode 100644 index 0000000..6ae08ac --- /dev/null +++ b/ai-meetings/VBCS Project/webApps/ai_meetings/settings/dependencies.json @@ -0,0 +1,3 @@ +{ + "component-dependencies": {} +} diff --git a/ai-meetings/demo/video.mp4 b/ai-meetings/demo/video.mp4 new file mode 100644 index 0000000..43045d8 Binary files /dev/null and b/ai-meetings/demo/video.mp4 differ