diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 218bea54..ec6df8fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,13 +21,14 @@ jobs: fail-fast: false matrix: build_configuration: ["Debug", "Release"] + build_platform: ["Win32", "x64"] steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4.1.1 - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 + uses: microsoft/setup-msbuild@v2 - name: Fetch nuget dependecies run: nuget restore "${{env.SOLUTION_FILE_PATH}}" @@ -36,7 +37,62 @@ jobs: working-directory: ${{env.GITHUB_WORKSPACE}} # Add additional options to the MSBuild command line here (like platform or verbosity level). # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference - run: msbuild /m /p:Configuration=${{matrix.build_configuration}} "${{env.SOLUTION_FILE_PATH}}" + run: msbuild /m /p:Configuration=${{matrix.build_configuration}} /p:Platform=${{ matrix.build_platform }} "${{env.SOLUTION_FILE_PATH}}" + + - name: List Files in Repository + run: dir /s + shell: cmd + + - uses: actions/upload-artifact@v4.3.1 + with: + name: build-artifacts-${{ matrix.build_platform }}-${{ matrix.build_configuration }} + path: | + output\${{ matrix.build_platform }}\${{ matrix.build_configuration }}\*.exe + output\${{ matrix.build_platform }}\${{ matrix.build_configuration }}\*.dll + output\${{ matrix.build_platform }}\${{ matrix.build_configuration }}\*.tlb + output\${{ matrix.build_platform }}\${{ matrix.build_configuration }}\*.config + output\MergeModules\**\*.* + retention-days: 1 + + publish_nuget: + needs: build-windows + runs-on: windows-2019 + strategy: + # Keep building other jobs even if another fails, to show what _is_ still working. + fail-fast: false + matrix: + build_configuration: ["Release"] + + steps: + - name: Checkout + uses: actions/checkout@v4.1.1 + + - name: Download all workflow run artifacts + uses: actions/download-artifact@v4.1.4 + + - name: Get Folder Names + id: get-folders + run: | + $folderNames = Get-ChildItem -Directory -Path . | Where-Object { $_.Name -like 'build-artifacts-*' } | Select-Object -ExpandProperty Name + $folderNames + foreach ($folderName in $folderNames) { + $source = "$folderName\*.*" + "xcopy /s /y $source .\" + xcopy /s /y $source .\ + } + + - name: List Files in Repository + run: dir /s + shell: cmd + + - name: Create NuGet Package + run: nuget pack ./Package.${{matrix.build_configuration}}.nuspec -OutputDirectory ./output/${{matrix.build_configuration}} + + - name: Upload NuGet Package as Artifact + uses: actions/upload-artifact@v4.3.1 + with: + name: ${{matrix.build_configuration}}-nuget-package + path: ./output/${{matrix.build_configuration}}/*.nupkg # TODO Run tests #- name: Test @@ -59,7 +115,13 @@ jobs: run: sudo apt-get install --assume-yes automake g++ python2-dev python2 libicu-dev mono5-sil icu-dev-fw libteckit-dev - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4.1.1 + + - name: List Files in Repository + run: ls -R + + - name: Restore NuGet Packages + run: nuget restore "${{env.SOLUTION_FILE_PATH}}" - name: Autogen run: . environ && ./autogen.sh diff --git a/EncConverters 2015.sln b/EncConverters 2015.sln deleted file mode 100644 index 483f143c..00000000 --- a/EncConverters 2015.sln +++ /dev/null @@ -1,1477 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.1000 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECInterfaces 2010", "src\ECInterfaces\ECInterfaces 2010.csproj", "{2935E02F-43ED-4670-9A00-A91B0AD3D66C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EncCnvtrs 2010", "src\EncCnvtrs\EncCnvtrs 2010.csproj", "{3E4B908A-4F96-43C5-981B-1AA4B73CCC26}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECFileConverter 2010", "src\ECFileConverter\ECFileConverter 2010.csproj", "{1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AIGuesserEC 2010", "src\AIGuesserEC\AIGuesserEC 2010.csproj", "{B718B5F3-A49A-454C-84FD-6D6F59EC7410}" - ProjectSection(ProjectDependencies) = postProject - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DriveAiEncConverter 2010", "src\DriveAiEncConverter\DriveAiEncConverter 2010.csproj", "{088E2974-9588-4EDA-AF7F-869A10DF402A}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {B718B5F3-A49A-454C-84FD-6D6F59EC7410} = {B718B5F3-A49A-454C-84FD-6D6F59EC7410} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SilIndicEncConverters 2010", "src\SilIndicEncConverters\SilIndicEncConverters 2010.csproj", "{DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ECDriver", "src\ECDriver\windows\ECDriver 2010.vcxproj", "{1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuConvEC", "src\IcuEC\IcuConvEC 2010.vcxproj", "{B6F84043-658E-4732-AFCA-BBE07FF465CB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuRegexEC", "src\IcuEC\IcuRegexEC 2010.vcxproj", "{F77C7224-DF82-4ADF-A761-773D21B58EF4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuTranslitEC", "src\IcuEC\IcuTranslitEC 2010.vcxproj", "{1D0DA000-6192-4B57-A377-7A0A5AB1A121}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IcuEC 2010", "src\IcuEC\IcuEC 2010.csproj", "{D1BAE593-A552-4F1A-8B08-5A1C27875C2F}" - ProjectSection(ProjectDependencies) = postProject - {1D0DA000-6192-4B57-A377-7A0A5AB1A121} = {1D0DA000-6192-4B57-A377-7A0A5AB1A121} - {F77C7224-DF82-4ADF-A761-773D21B58EF4} = {F77C7224-DF82-4ADF-A761-773D21B58EF4} - {B6F84043-658E-4732-AFCA-BBE07FF465CB} = {B6F84043-658E-4732-AFCA-BBE07FF465CB} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PyScriptEncConverter", "src\PyScriptEC\PyScriptEncConverter 2010.vcxproj", "{C5808AC0-A52F-4D77-9903-AE6709712B62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PyScriptEC 2010", "src\PyScriptEC\PyScriptEC 2010.csproj", "{0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}" - ProjectSection(ProjectDependencies) = postProject - {C5808AC0-A52F-4D77-9903-AE6709712B62} = {C5808AC0-A52F-4D77-9903-AE6709712B62} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerlExpressionEC 2010", "src\PerlExpressionEC\PerlExpressionEC 2010.csproj", "{4704F67B-246D-483C-B840-231F42D7A12B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CcEC 2010", "src\CcEC\CcEC 2010.csproj", "{2E70A627-605F-4625-8637-A7109DB8B35C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestEncCnvtrs 2010", "src\TestEncCnvtrs\TestEncCnvtrs 2010.csproj", "{E13305E0-0AC9-4181-A9AD-3B9B0A479087}" - ProjectSection(ProjectDependencies) = postProject - {1D0DA000-6192-4B57-A377-7A0A5AB1A121} = {1D0DA000-6192-4B57-A377-7A0A5AB1A121} - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9} = {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9} - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} = {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} - {F77C7224-DF82-4ADF-A761-773D21B58EF4} = {F77C7224-DF82-4ADF-A761-773D21B58EF4} - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {B6F84043-658E-4732-AFCA-BBE07FF465CB} = {B6F84043-658E-4732-AFCA-BBE07FF465CB} - {088E2974-9588-4EDA-AF7F-869A10DF402A} = {088E2974-9588-4EDA-AF7F-869A10DF402A} - {4704F67B-246D-483C-B840-231F42D7A12B} = {4704F67B-246D-483C-B840-231F42D7A12B} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} = {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} - {C5808AC0-A52F-4D77-9903-AE6709712B62} = {C5808AC0-A52F-4D77-9903-AE6709712B62} - {B718B5F3-A49A-454C-84FD-6D6F59EC7410} = {B718B5F3-A49A-454C-84FD-6D6F59EC7410} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppDataMover", "src\AppDataMover\AppDataMover.csproj", "{AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}" - ProjectSection(ProjectDependencies) = postProject - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GuesserEC", "src\AIGuesserEC\GuesserEC\GuesserEC.vcxproj", "{7F906C15-8DCD-466E-9AF3-2EF50E7FC046}" -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "EC_40_MM", "installer\EC_40_MM\EC_40_MM.wixproj", "{DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9} = {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9} - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC} = {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "CcDLLsMM", "installer\CcDLLsMM\CcDLLsMM.wixproj", "{69904B85-6945-4369-A2E3-79DD7319FB53}" - ProjectSection(ProjectDependencies) = postProject - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AIGuesserMM", "installer\AIGuesserMM\AIGuesserMM.wixproj", "{406EA033-1918-4CE2-AE3D-1AC9B14CF111}" - ProjectSection(ProjectDependencies) = postProject - {B718B5F3-A49A-454C-84FD-6D6F59EC7410} = {B718B5F3-A49A-454C-84FD-6D6F59EC7410} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "TECkitDLLsMM", "installer\TECkitDLLsMM\TECkitDLLsMM.wixproj", "{6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installer", "Installer", "{D3355CC9-A400-49B7-ADCE-F623A816D1B5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Testing", "Testing", "{652EFEB5-5F0A-4578-A518-D77FEDB0A53C}" -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PerlEcMM", "installer\PerlEcMM\PerlEcMM.wixproj", "{D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}" - ProjectSection(ProjectDependencies) = postProject - {4704F67B-246D-483C-B840-231F42D7A12B} = {4704F67B-246D-483C-B840-231F42D7A12B} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PythonEcMM", "installer\PythonEcMM\PythonEcMM.wixproj", "{34D26D24-57AF-4031-B5B6-5A8C9279AFCC}" - ProjectSection(ProjectDependencies) = postProject - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} = {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "TECkit64bitDllsMM", "installer\TECkit64bitDllsMM\TECkit64bitDllsMM.wixproj", "{AE5F8D43-08DE-4E3B-AE84-E89A01122B40}" -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PythonEc64bitMM", "installer\PythonEc64bitMM\PythonEc64bitMM.wixproj", "{CCBB5714-9635-4C54-AE1C-4D06441B9F3A}" - ProjectSection(ProjectDependencies) = postProject - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} = {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} - {C5808AC0-A52F-4D77-9903-AE6709712B62} = {C5808AC0-A52F-4D77-9903-AE6709712B62} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PerlEc64bitMM", "installer\PerlEc64bitMM\PerlEc64bitMM.wixproj", "{25E133DF-507B-422A-91FD-4E36155ABF7A}" - ProjectSection(ProjectDependencies) = postProject - {4704F67B-246D-483C-B840-231F42D7A12B} = {4704F67B-246D-483C-B840-231F42D7A12B} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "EC_40_64bit_MM", "installer\EC_40_64bit_MM\EC_40_64bit_MM.wixproj", "{4BF6846B-4DB1-4C91-9435-43E1077BEEE4}" - ProjectSection(ProjectDependencies) = postProject - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9} = {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9} - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC} = {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC} - EndProjectSection -EndProject -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "CcDLLs64bitMM", "installer\CcDLLs64bitMM\CcDLLs64bitMM.wixproj", "{8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}" - ProjectSection(ProjectDependencies) = postProject - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - LegacyDebug|Any CPU = LegacyDebug|Any CPU - LegacyDebug|Mixed Platforms = LegacyDebug|Mixed Platforms - LegacyDebug|Win32 = LegacyDebug|Win32 - LegacyDebug|x64 = LegacyDebug|x64 - LegacyDebug|x86 = LegacyDebug|x86 - LegacyRelease|Any CPU = LegacyRelease|Any CPU - LegacyRelease|Mixed Platforms = LegacyRelease|Mixed Platforms - LegacyRelease|Win32 = LegacyRelease|Win32 - LegacyRelease|x64 = LegacyRelease|x64 - LegacyRelease|x86 = LegacyRelease|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - Template|Any CPU = Template|Any CPU - Template|Mixed Platforms = Template|Mixed Platforms - Template|Win32 = Template|Win32 - Template|x64 = Template|x64 - Template|x86 = Template|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Win32.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Win32.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x64.ActiveCfg = Debug|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x64.Build.0 = Debug|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x86.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x86.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x64.Build.0 = Debug|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x64.ActiveCfg = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x64.Build.0 = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x86.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Any CPU.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Win32.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Win32.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x64.ActiveCfg = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x64.Build.0 = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x86.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x86.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Any CPU.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Any CPU.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Win32.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Win32.Build.0 = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x64.ActiveCfg = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x64.Build.0 = Release|x64 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x86.ActiveCfg = Release|Any CPU - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x86.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Win32.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Win32.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x64.ActiveCfg = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x64.Build.0 = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x86.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x64.Build.0 = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x64.ActiveCfg = Release|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x64.Build.0 = Release|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x86.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Any CPU.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Win32.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Win32.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x64.ActiveCfg = Release|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x64.Build.0 = Release|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x86.ActiveCfg = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x86.Build.0 = Release|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Any CPU.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Any CPU.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Mixed Platforms.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Win32.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Win32.Build.0 = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x64.ActiveCfg = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x64.Build.0 = Debug|x64 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x86.ActiveCfg = Debug|Any CPU - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x86.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Win32.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Win32.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x64.ActiveCfg = Debug|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x64.Build.0 = Debug|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x86.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x64.Build.0 = Debug|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x64.ActiveCfg = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x64.Build.0 = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x86.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Any CPU.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Win32.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Win32.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x64.ActiveCfg = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x64.Build.0 = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x86.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x86.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Any CPU.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Any CPU.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Win32.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Win32.Build.0 = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x64.ActiveCfg = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x64.Build.0 = Release|x64 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x86.ActiveCfg = Release|Any CPU - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x86.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Win32.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Win32.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x64.ActiveCfg = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x64.Build.0 = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x86.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x86.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x64.Build.0 = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x64.ActiveCfg = Release|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x64.Build.0 = Release|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x86.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Any CPU.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Win32.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Win32.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x64.ActiveCfg = Release|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x64.Build.0 = Release|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x86.ActiveCfg = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x86.Build.0 = Release|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Any CPU.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Any CPU.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Mixed Platforms.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Win32.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Win32.Build.0 = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x64.ActiveCfg = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x64.Build.0 = Debug|x64 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x86.ActiveCfg = Debug|Any CPU - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x86.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Win32.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Win32.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x64.ActiveCfg = Debug|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x64.Build.0 = Debug|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x86.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x86.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x64.Build.0 = Debug|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x64.ActiveCfg = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x64.Build.0 = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x86.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Win32.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Win32.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x64.ActiveCfg = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x64.Build.0 = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x86.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x86.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Win32.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Win32.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|x64.ActiveCfg = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|x64.Build.0 = Release|x64 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|x86.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|x86.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Win32.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Win32.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x64.ActiveCfg = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x64.Build.0 = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x86.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x86.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x64.Build.0 = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x64.ActiveCfg = Release|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x64.Build.0 = Release|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x86.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Any CPU.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Win32.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Win32.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x64.ActiveCfg = Release|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x64.Build.0 = Release|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x86.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x86.Build.0 = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Any CPU.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Any CPU.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Mixed Platforms.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Win32.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Win32.Build.0 = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x64.ActiveCfg = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x64.Build.0 = Debug|x64 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x86.ActiveCfg = Debug|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x86.Build.0 = Debug|Any CPU - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Win32.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x64.ActiveCfg = Debug|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x64.Build.0 = Debug|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x86.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x86.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|x64.Build.0 = Debug|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|x64.ActiveCfg = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|x64.Build.0 = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x64.ActiveCfg = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x64.Build.0 = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x86.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x86.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|x64.ActiveCfg = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|x64.Build.0 = Release|x64 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Win32.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Win32.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x64.ActiveCfg = Debug|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x64.Build.0 = Debug|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x86.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x86.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|x64.Build.0 = Debug|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|x64.ActiveCfg = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|x64.Build.0 = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x64.ActiveCfg = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x64.Build.0 = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x86.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|x64.ActiveCfg = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|x64.Build.0 = Release|x64 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Win32.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Win32.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x64.ActiveCfg = Debug|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x64.Build.0 = Debug|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x86.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x86.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|x64.Build.0 = Debug|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|x64.ActiveCfg = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|x64.Build.0 = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x64.ActiveCfg = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x64.Build.0 = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x86.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|x64.ActiveCfg = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|x64.Build.0 = Release|x64 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Win32.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Win32.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x64.ActiveCfg = Debug|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x64.Build.0 = Debug|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x86.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x86.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|x64.Build.0 = Debug|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|x64.ActiveCfg = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|x64.Build.0 = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x64.ActiveCfg = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x64.Build.0 = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x86.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|x64.ActiveCfg = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|x64.Build.0 = Release|x64 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|x86.ActiveCfg = Release|Win32 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Win32.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Win32.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x64.ActiveCfg = Debug|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x64.Build.0 = Debug|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x86.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x86.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x64.Build.0 = Debug|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x64.ActiveCfg = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x64.Build.0 = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x86.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Any CPU.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Win32.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Win32.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x64.ActiveCfg = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x64.Build.0 = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x86.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x86.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Any CPU.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Any CPU.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Win32.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Win32.Build.0 = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x64.ActiveCfg = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x64.Build.0 = Release|x64 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x86.ActiveCfg = Release|Any CPU - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x86.Build.0 = Release|Any CPU - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Win32.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Win32.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x64.ActiveCfg = Debug|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x64.Build.0 = Debug|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x86.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x86.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|x64.Build.0 = Debug|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|x64.ActiveCfg = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|x64.Build.0 = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x64.ActiveCfg = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x64.Build.0 = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x86.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x86.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|x64.ActiveCfg = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|x64.Build.0 = Release|x64 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|x86.ActiveCfg = Release|Win32 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Win32.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Win32.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x64.ActiveCfg = Debug|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x64.Build.0 = Debug|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x86.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x86.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x64.Build.0 = Debug|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x64.ActiveCfg = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x64.Build.0 = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x86.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Any CPU.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Win32.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Win32.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x64.ActiveCfg = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x64.Build.0 = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x86.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x86.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Any CPU.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Any CPU.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Win32.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Win32.Build.0 = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x64.ActiveCfg = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x64.Build.0 = Release|x64 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x86.ActiveCfg = Release|Any CPU - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x86.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Win32.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Win32.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x64.ActiveCfg = Debug|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x64.Build.0 = Debug|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x86.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x86.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x64.Build.0 = Debug|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x64.ActiveCfg = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x64.Build.0 = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x86.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Any CPU.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Win32.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Win32.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x64.ActiveCfg = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x64.Build.0 = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x86.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x86.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Any CPU.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Any CPU.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Win32.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Win32.Build.0 = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x64.ActiveCfg = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x64.Build.0 = Release|x64 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x86.ActiveCfg = Release|Any CPU - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x86.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Win32.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Win32.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x64.ActiveCfg = Debug|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x64.Build.0 = Debug|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x86.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x86.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x64.Build.0 = Debug|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x64.ActiveCfg = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x64.Build.0 = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x86.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Any CPU.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Win32.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Win32.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x64.ActiveCfg = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x64.Build.0 = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x86.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x86.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Any CPU.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Any CPU.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Win32.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Win32.Build.0 = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x64.ActiveCfg = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x64.Build.0 = Release|x64 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x86.ActiveCfg = Release|Any CPU - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x86.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Win32.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Win32.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x64.ActiveCfg = Debug|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x64.Build.0 = Debug|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x86.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x86.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x64.Build.0 = Debug|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x64.ActiveCfg = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x64.Build.0 = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x86.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Any CPU.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Win32.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Win32.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x64.ActiveCfg = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x64.Build.0 = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x86.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x86.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Any CPU.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Any CPU.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Win32.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Win32.Build.0 = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x64.ActiveCfg = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x64.Build.0 = Release|x64 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x86.ActiveCfg = Release|Any CPU - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x86.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Win32.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Win32.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x64.ActiveCfg = Debug|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x64.Build.0 = Debug|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x86.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x86.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Win32.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x64.Build.0 = Debug|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x86.ActiveCfg = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x86.Build.0 = Debug|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Win32.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x64.ActiveCfg = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x64.Build.0 = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x86.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x86.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Any CPU.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Win32.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Win32.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x64.ActiveCfg = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x64.Build.0 = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x86.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x86.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Any CPU.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Any CPU.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Win32.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Win32.Build.0 = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x64.ActiveCfg = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x64.Build.0 = Release|x64 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x86.ActiveCfg = Release|Any CPU - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x86.Build.0 = Release|Any CPU - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Win32.Build.0 = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|x64.ActiveCfg = Debug|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|x86.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|x86.Build.0 = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Any CPU.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Mixed Platforms.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Mixed Platforms.Build.0 = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Win32.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Win32.Build.0 = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|x64.ActiveCfg = LegacyDebug|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|x86.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Any CPU.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Mixed Platforms.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Mixed Platforms.Build.0 = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Win32.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Win32.Build.0 = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|x64.ActiveCfg = LegacyRelease|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|x86.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Any CPU.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Mixed Platforms.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Win32.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Win32.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|x64.ActiveCfg = Release|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|x86.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|x86.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Any CPU.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Mixed Platforms.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Win32.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Win32.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|x64.ActiveCfg = Release|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|x64.Build.0 = Release|x64 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|x86.ActiveCfg = Release|Win32 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Debug|Any CPU.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Debug|Win32.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Debug|x64.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Debug|x86.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|x64.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|x64.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyDebug|x86.Build.0 = Debug|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|x64.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|x64.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|x86.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.LegacyRelease|x86.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|Any CPU.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|Mixed Platforms.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|Win32.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|Win32.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|x64.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|x86.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Release|x86.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|Any CPU.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|Mixed Platforms.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|Win32.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|x64.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|x64.Build.0 = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|x86.ActiveCfg = Release|x86 - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014}.Template|x86.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Debug|Any CPU.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Debug|Win32.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Debug|x64.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Debug|x86.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|x64.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|x64.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyDebug|x86.Build.0 = Debug|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|x64.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|x64.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|x86.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.LegacyRelease|x86.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|Any CPU.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|Mixed Platforms.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|Win32.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|Win32.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|x64.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|x86.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Release|x86.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|Any CPU.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|Mixed Platforms.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|Win32.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|x64.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|x64.Build.0 = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|x86.ActiveCfg = Release|x86 - {69904B85-6945-4369-A2E3-79DD7319FB53}.Template|x86.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Debug|Any CPU.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Debug|Win32.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Debug|x64.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Debug|x86.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|x64.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|x64.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyDebug|x86.Build.0 = Debug|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|x64.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|x64.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|x86.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.LegacyRelease|x86.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|Any CPU.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|Mixed Platforms.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|Win32.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|Win32.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|x64.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|x86.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Release|x86.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|Any CPU.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|Mixed Platforms.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|Win32.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|x64.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|x64.Build.0 = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|x86.ActiveCfg = Release|x86 - {406EA033-1918-4CE2-AE3D-1AC9B14CF111}.Template|x86.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Debug|Any CPU.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Debug|Win32.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Debug|x64.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Debug|x86.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|x64.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|x64.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyDebug|x86.Build.0 = Debug|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|x64.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|x64.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|x86.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.LegacyRelease|x86.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|Any CPU.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|Mixed Platforms.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|Win32.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|Win32.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|x64.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|x86.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Release|x86.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|Any CPU.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|Mixed Platforms.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|Win32.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|x64.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|x64.Build.0 = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|x86.ActiveCfg = Release|x86 - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF}.Template|x86.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Debug|Win32.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Debug|x64.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Debug|x86.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|x64.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|x64.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyDebug|x86.Build.0 = Debug|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|x64.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|x64.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|x86.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.LegacyRelease|x86.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|Any CPU.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|Mixed Platforms.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|Win32.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|Win32.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|x64.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|x86.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Release|x86.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|Any CPU.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|Mixed Platforms.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|Win32.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|x64.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|x64.Build.0 = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|x86.ActiveCfg = Release|x86 - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E}.Template|x86.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Debug|Any CPU.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Debug|Win32.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Debug|x64.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Debug|x86.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|x64.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|x64.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyDebug|x86.Build.0 = Debug|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|x64.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|x64.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|x86.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.LegacyRelease|x86.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|Any CPU.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|Mixed Platforms.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|Win32.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|Win32.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|x64.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|x86.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Release|x86.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|Any CPU.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|Mixed Platforms.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|Win32.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|x64.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|x64.Build.0 = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|x86.ActiveCfg = Release|x86 - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC}.Template|x86.Build.0 = Release|x86 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Debug|Win32.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Debug|x64.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Debug|x86.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Any CPU.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Any CPU.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Win32.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|Win32.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|x64.Build.0 = Debug|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|x86.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyDebug|x86.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Any CPU.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Any CPU.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Mixed Platforms.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Win32.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|Win32.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|x64.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|x64.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|x86.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.LegacyRelease|x86.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|Any CPU.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|Win32.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|x64.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|x64.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Release|x86.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Any CPU.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Any CPU.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Mixed Platforms.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Mixed Platforms.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Win32.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|Win32.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|x64.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|x64.Build.0 = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|x86.ActiveCfg = Release|x64 - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40}.Template|x86.Build.0 = Release|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Debug|Win32.ActiveCfg = Debug|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Debug|x64.ActiveCfg = Debug|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Debug|x86.ActiveCfg = Debug|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Any CPU.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Any CPU.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|Win32.Build.0 = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|x64.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|x64.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyDebug|x86.Build.0 = Debug|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Any CPU.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|Win32.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|x64.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|x64.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|x86.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.LegacyRelease|x86.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|Any CPU.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|Win32.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|x64.ActiveCfg = Release|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|x64.Build.0 = Release|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Release|x86.ActiveCfg = Release|x64 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Any CPU.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Any CPU.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Mixed Platforms.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Win32.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|Win32.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|x64.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|x64.Build.0 = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|x86.ActiveCfg = Release|x86 - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A}.Template|x86.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Debug|Win32.ActiveCfg = Debug|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Debug|x64.ActiveCfg = Debug|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Debug|x86.ActiveCfg = Debug|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Any CPU.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Any CPU.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|Win32.Build.0 = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|x64.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|x64.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyDebug|x86.Build.0 = Debug|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Any CPU.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|Win32.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|x64.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|x64.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|x86.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.LegacyRelease|x86.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|Any CPU.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|Win32.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|x64.ActiveCfg = Release|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|x64.Build.0 = Release|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Release|x86.ActiveCfg = Release|x64 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Any CPU.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Any CPU.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Mixed Platforms.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Win32.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|Win32.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|x64.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|x64.Build.0 = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|x86.ActiveCfg = Release|x86 - {25E133DF-507B-422A-91FD-4E36155ABF7A}.Template|x86.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Debug|Any CPU.ActiveCfg = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Debug|Win32.ActiveCfg = Debug|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Debug|x64.ActiveCfg = Debug|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Debug|x86.ActiveCfg = Debug|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Any CPU.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Any CPU.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|Win32.Build.0 = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|x64.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|x64.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyDebug|x86.Build.0 = Debug|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Any CPU.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|Win32.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|x64.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|x64.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|x86.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.LegacyRelease|x86.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|Any CPU.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|Win32.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|x64.ActiveCfg = Release|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|x64.Build.0 = Release|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|x86.ActiveCfg = Release|x64 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Any CPU.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Any CPU.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Mixed Platforms.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Win32.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Win32.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x86.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x86.Build.0 = Release|x86 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|Win32.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|x64.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|x86.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Any CPU.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Any CPU.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Win32.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|Win32.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|x64.ActiveCfg = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|x64.Build.0 = Debug|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|x86.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyDebug|x86.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Any CPU.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Any CPU.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Mixed Platforms.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Win32.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|Win32.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|x64.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|x64.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|x86.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.LegacyRelease|x86.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|Any CPU.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|Win32.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|x64.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|x64.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|x86.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Any CPU.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Any CPU.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Mixed Platforms.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Mixed Platforms.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Win32.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|Win32.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|x64.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|x64.Build.0 = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|x86.ActiveCfg = Release|x64 - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Template|x86.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {088E2974-9588-4EDA-AF7F-869A10DF402A} = {652EFEB5-5F0A-4578-A518-D77FEDB0A53C} - {DBF25A0C-5F5B-4060-AC5C-CDC50C4AA014} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {69904B85-6945-4369-A2E3-79DD7319FB53} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {406EA033-1918-4CE2-AE3D-1AC9B14CF111} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {6EAFDB48-2E2C-4874-9924-2D8B115FA1EF} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {D6A6243C-A7F4-4174-80C5-5EFD39C29D5E} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {34D26D24-57AF-4031-B5B6-5A8C9279AFCC} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {AE5F8D43-08DE-4E3B-AE84-E89A01122B40} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {CCBB5714-9635-4C54-AE1C-4D06441B9F3A} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {25E133DF-507B-422A-91FD-4E36155ABF7A} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA} = {D3355CC9-A400-49B7-ADCE-F623A816D1B5} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6FE31029-BBCA-40A0-81A4-79C05FE08285} - EndGlobalSection -EndGlobal diff --git a/EncConverters 2019.sln b/EncConverters 2019.sln index 79400fbc..3c3962dd 100644 --- a/EncConverters 2019.sln +++ b/EncConverters 2019.sln @@ -18,6 +18,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECFileConverter 2010", "src ProjectSection(ProjectDependencies) = postProject {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} + {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} = {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AIGuesserEC 2010", "src\AIGuesserEC\AIGuesserEC 2010.csproj", "{B718B5F3-A49A-454C-84FD-6D6F59EC7410}" @@ -42,6 +43,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SilIndicEncConverters 2010" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ECDriver", "src\ECDriver\windows\ECDriver 2010.vcxproj", "{1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}" ProjectSection(ProjectDependencies) = postProject + {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6} = {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6} {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} EndProjectSection @@ -153,7 +155,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .github\workflows\build.yml = .github\workflows\build.yml build\Encoding-Converters-Core.props = build\Encoding-Converters-Core.props - Package.nuspec = Package.nuspec + Package.Debug.nuspec = Package.Debug.nuspec + Package.Release.nuspec = Package.Release.nuspec EndProjectSection EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "EcFolderACLsMM", "installer\EcFolderACLsMM\EcFolderACLsMM.wixproj", "{F7483CF4-5AB5-4E62-B87E-A6A88EC228DC}" @@ -190,16 +193,22 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EcTranslators", "src\EcTran EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "EcTranslatorsMM", "installer\EcTranslatorsMM\EcTranslatorsMM.wixproj", "{9FAB4338-F089-4279-A5DF-AF5FC0368783}" ProjectSection(ProjectDependencies) = postProject + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE} = {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE} {C4D0AA5B-F319-4E06-A982-A52E79EB57DC} = {C4D0AA5B-F319-4E06-A982-A52E79EB57DC} EndProjectSection EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "EcTranslators64bitMM", "installer\EcTranslators64bitMM\EcTranslators64bitMM.wixproj", "{9628E44E-C407-4EA3-95AF-C7E4310EB9D3}" ProjectSection(ProjectDependencies) = postProject + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE} = {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE} {C4D0AA5B-F319-4E06-A982-A52E79EB57DC} = {C4D0AA5B-F319-4E06-A982-A52E79EB57DC} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BackTranslationHelper", "src\BackTranslationHelper\BackTranslationHelper.csproj", "{3E74CE98-6558-4AF0-BB0C-C7E436208B1B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureOpenAiExe", "src\EcTranslators\AzureOpenAi\AzureOpenAiExe\AzureOpenAiExe.csproj", "{4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VertexAiExe", "src\EcTranslators\VertexAi\VertexAiExe\VertexAiExe.csproj", "{5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -493,8 +502,8 @@ Global {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Release|x64.Build.0 = Release|x64 {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Win32.ActiveCfg = Release|x86 {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|Win32.Build.0 = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.ActiveCfg = Release|x86 - {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.Build.0 = Release|x86 + {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.ActiveCfg = Release|x64 + {4BF6846B-4DB1-4C91-9435-43E1077BEEE4}.Template|x64.Build.0 = Release|x64 {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|Win32.ActiveCfg = Debug|x64 {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Debug|x64.ActiveCfg = Debug|x64 {8C8AF4F6-2E50-4195-BDBE-499CE90E52CA}.Release|Win32.ActiveCfg = Release|x64 @@ -618,6 +627,30 @@ Global {3E74CE98-6558-4AF0-BB0C-C7E436208B1B}.Template|Win32.Build.0 = Debug|x86 {3E74CE98-6558-4AF0-BB0C-C7E436208B1B}.Template|x64.ActiveCfg = Debug|x64 {3E74CE98-6558-4AF0-BB0C-C7E436208B1B}.Template|x64.Build.0 = Debug|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Debug|Win32.ActiveCfg = Debug|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Debug|Win32.Build.0 = Debug|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Debug|x64.ActiveCfg = Debug|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Debug|x64.Build.0 = Debug|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Release|Win32.ActiveCfg = Release|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Release|Win32.Build.0 = Release|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Release|x64.ActiveCfg = Release|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Release|x64.Build.0 = Release|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Template|Win32.ActiveCfg = Debug|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Template|Win32.Build.0 = Debug|x86 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Template|x64.ActiveCfg = Debug|x64 + {4F6FF8AD-6BEB-4104-B123-7FA9C2DC0BBE}.Template|x64.Build.0 = Debug|x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Debug|Win32.ActiveCfg = Debug|x86 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Debug|Win32.Build.0 = Debug|x86 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Debug|x64.ActiveCfg = Debug|x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Debug|x64.Build.0 = Debug|x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Release|Win32.ActiveCfg = Release|x86 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Release|Win32.Build.0 = Release|x86 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Release|x64.ActiveCfg = Release|x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Release|x64.Build.0 = Release|x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Template|Win32.ActiveCfg = Debug|Any CPU + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Template|Win32.Build.0 = Debug|Any CPU + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Template|x64.ActiveCfg = Debug|Any CPU + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982}.Template|x64.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/EncConverters-mono.sln b/EncConverters-mono.sln deleted file mode 100644 index a4bb161c..00000000 --- a/EncConverters-mono.sln +++ /dev/null @@ -1,666 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Changed paths to use Mono csproj files. -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECInterfaces-mono", "src\ECInterfaces\ECInterfaces-mono.csproj", "{2935E02F-43ED-4670-9A00-A91B0AD3D66C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EncCnvtrs-mono", "src\EncCnvtrs\EncCnvtrs-mono.csproj", "{3E4B908A-4F96-43C5-981B-1AA4B73CCC26}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ECFileConverter-mono", "src\ECFileConverter\ECFileConverter-mono.csproj", "{1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AIGuesserEC-mono", "src\AIGuesserEC\AIGuesserEC-mono.csproj", "{B718B5F3-A49A-454C-84FD-6D6F59EC7410}" - ProjectSection(ProjectDependencies) = postProject - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DriveAiEncConverter-mono", "src\DriveAiEncConverter\DriveAiEncConverter-mono.csproj", "{088E2974-9588-4EDA-AF7F-869A10DF402A}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {B718B5F3-A49A-454C-84FD-6D6F59EC7410} = {B718B5F3-A49A-454C-84FD-6D6F59EC7410} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SilIndicEncConverters-mono", "src\SilIndicEncConverters\SilIndicEncConverters-mono.csproj", "{DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}" - ProjectSection(ProjectDependencies) = postProject - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ECDriver", "src\ECDriver\windows\ECDriver-mono.vcxproj", "{1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuConvEC", "src\IcuEC\IcuConvEC-mono.vcxproj", "{B6F84043-658E-4732-AFCA-BBE07FF465CB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuRegexEC", "src\IcuEC\IcuRegexEC-mono.vcxproj", "{F77C7224-DF82-4ADF-A761-773D21B58EF4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IcuTranslitEC", "src\IcuEC\IcuTranslitEC-mono.vcxproj", "{1D0DA000-6192-4B57-A377-7A0A5AB1A121}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IcuEC-mono", "src\IcuEC\IcuEC-mono.csproj", "{D1BAE593-A552-4F1A-8B08-5A1C27875C2F}" - ProjectSection(ProjectDependencies) = postProject - {1D0DA000-6192-4B57-A377-7A0A5AB1A121} = {1D0DA000-6192-4B57-A377-7A0A5AB1A121} - {F77C7224-DF82-4ADF-A761-773D21B58EF4} = {F77C7224-DF82-4ADF-A761-773D21B58EF4} - {B6F84043-658E-4732-AFCA-BBE07FF465CB} = {B6F84043-658E-4732-AFCA-BBE07FF465CB} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PyScriptEncConverter", "src\PyScriptEC\PyScriptEncConverter-mono.vcxproj", "{C5808AC0-A52F-4D77-9903-AE6709712B62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PyScriptEC-mono", "src\PyScriptEC\PyScriptEC-mono.csproj", "{0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerlExpressionEC-mono", "src\PerlExpressionEC\PerlExpressionEC-mono.csproj", "{4704F67B-246D-483C-B840-231F42D7A12B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CcEC-mono", "src\CcEC\CcEC-mono.csproj", "{2E70A627-605F-4625-8637-A7109DB8B35C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestEncCnvtrs-mono", "src\TestEncCnvtrs\TestEncCnvtrs-mono.csproj", "{E13305E0-0AC9-4181-A9AD-3B9B0A479087}" - ProjectSection(ProjectDependencies) = postProject - {1D0DA000-6192-4B57-A377-7A0A5AB1A121} = {1D0DA000-6192-4B57-A377-7A0A5AB1A121} - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9} = {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9} - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} = {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7} - {F77C7224-DF82-4ADF-A761-773D21B58EF4} = {F77C7224-DF82-4ADF-A761-773D21B58EF4} - {2E70A627-605F-4625-8637-A7109DB8B35C} = {2E70A627-605F-4625-8637-A7109DB8B35C} - {2935E02F-43ED-4670-9A00-A91B0AD3D66C} = {2935E02F-43ED-4670-9A00-A91B0AD3D66C} - {B6F84043-658E-4732-AFCA-BBE07FF465CB} = {B6F84043-658E-4732-AFCA-BBE07FF465CB} - {088E2974-9588-4EDA-AF7F-869A10DF402A} = {088E2974-9588-4EDA-AF7F-869A10DF402A} - {4704F67B-246D-483C-B840-231F42D7A12B} = {4704F67B-246D-483C-B840-231F42D7A12B} - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} = {D1BAE593-A552-4F1A-8B08-5A1C27875C2F} - {C5808AC0-A52F-4D77-9903-AE6709712B62} = {C5808AC0-A52F-4D77-9903-AE6709712B62} - {B718B5F3-A49A-454C-84FD-6D6F59EC7410} = {B718B5F3-A49A-454C-84FD-6D6F59EC7410} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppDataMover", "src\AppDataMover\AppDataMover.csproj", "{AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}" - ProjectSection(ProjectDependencies) = postProject - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} = {3E4B908A-4F96-43C5-981B-1AA4B73CCC26} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GuesserEC", "src\AIGuesserEC\GuesserEC\GuesserEC.vcxproj", "{7F906C15-8DCD-466E-9AF3-2EF50E7FC046}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|Win32 = Debug|Win32 - Debug|x86 = Debug|x86 - LegacyDebug|Any CPU = LegacyDebug|Any CPU - LegacyDebug|Mixed Platforms = LegacyDebug|Mixed Platforms - LegacyDebug|Win32 = LegacyDebug|Win32 - LegacyDebug|x86 = LegacyDebug|x86 - LegacyRelease|Any CPU = LegacyRelease|Any CPU - LegacyRelease|Mixed Platforms = LegacyRelease|Mixed Platforms - LegacyRelease|Win32 = LegacyRelease|Win32 - LegacyRelease|x86 = LegacyRelease|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|Win32 = Release|Win32 - Release|x86 = Release|x86 - Template|Any CPU = Template|Any CPU - Template|Mixed Platforms = Template|Mixed Platforms - Template|Win32 = Template|Win32 - Template|x86 = Template|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Any CPU.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|Win32.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x86.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Debug|x86.Build.0 = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyDebug|x86.Build.0 = Debug|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x86.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.LegacyRelease|x86.Build.0 = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Any CPU.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Mixed Platforms.Build.0 = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|Win32.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x86.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Release|x86.Build.0 = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Any CPU.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Mixed Platforms.Build.0 = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|Win32.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x86.ActiveCfg = Release|x86 - {2935E02F-43ED-4670-9A00-A91B0AD3D66C}.Template|x86.Build.0 = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Any CPU.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|Win32.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x86.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Debug|x86.Build.0 = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyDebug|x86.Build.0 = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x86.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.LegacyRelease|x86.Build.0 = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Any CPU.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Mixed Platforms.Build.0 = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|Win32.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x86.ActiveCfg = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Release|x86.Build.0 = Release|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Any CPU.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Mixed Platforms.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Mixed Platforms.Build.0 = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|Win32.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x86.ActiveCfg = Debug|x86 - {3E4B908A-4F96-43C5-981B-1AA4B73CCC26}.Template|x86.Build.0 = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|Win32.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x86.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Debug|x86.Build.0 = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyDebug|x86.Build.0 = Debug|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x86.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.LegacyRelease|x86.Build.0 = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Any CPU.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Mixed Platforms.Build.0 = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|Win32.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x86.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Release|x86.Build.0 = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Any CPU.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Mixed Platforms.Build.0 = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|Win32.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x86.ActiveCfg = Release|x86 - {1E45DBF2-3629-4413-AC1F-61E6AA33B9B6}.Template|x86.Build.0 = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Any CPU.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|Win32.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x86.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Debug|x86.Build.0 = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyDebug|x86.Build.0 = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x86.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.LegacyRelease|x86.Build.0 = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Any CPU.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Mixed Platforms.Build.0 = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|Win32.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x86.ActiveCfg = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Release|x86.Build.0 = Release|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Any CPU.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Mixed Platforms.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Mixed Platforms.Build.0 = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|Win32.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x86.ActiveCfg = Debug|x86 - {B718B5F3-A49A-454C-84FD-6D6F59EC7410}.Template|x86.Build.0 = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|Win32.ActiveCfg = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x86.ActiveCfg = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Debug|x86.Build.0 = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Any CPU.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Any CPU.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|Win32.ActiveCfg = Debug|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyDebug|x86.Build.0 = Debug|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Mixed Platforms.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|Win32.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x86.ActiveCfg = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.LegacyRelease|x86.Build.0 = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Mixed Platforms.Build.0 = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|Win32.ActiveCfg = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x86.ActiveCfg = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Release|x86.Build.0 = Release|x86 - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Any CPU.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Any CPU.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Mixed Platforms.Build.0 = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|Win32.ActiveCfg = Release|Any CPU - {088E2974-9588-4EDA-AF7F-869A10DF402A}.Template|x86.ActiveCfg = Release|Any CPU - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Any CPU.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|Win32.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x86.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Debug|x86.Build.0 = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyDebug|x86.Build.0 = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x86.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.LegacyRelease|x86.Build.0 = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Any CPU.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Mixed Platforms.Build.0 = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|Win32.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x86.ActiveCfg = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Release|x86.Build.0 = Release|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Any CPU.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Mixed Platforms.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Mixed Platforms.Build.0 = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|Win32.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x86.ActiveCfg = Debug|x86 - {DC0A7A02-87B7-4619-B45F-D5A3ECB599A9}.Template|x86.Build.0 = Debug|x86 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|Win32.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x86.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Debug|x86.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x86.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Release|x86.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Any CPU.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Mixed Platforms.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Win32.ActiveCfg = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|Win32.Build.0 = Release|Win32 - {1AE110F1-E97B-4D14-9F3A-8AF01344E3B9}.Template|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Win32.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|Win32.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x86.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Debug|x86.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x86.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Release|x86.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Any CPU.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Mixed Platforms.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Win32.ActiveCfg = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|Win32.Build.0 = Release|Win32 - {B6F84043-658E-4732-AFCA-BBE07FF465CB}.Template|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Win32.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|Win32.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x86.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Debug|x86.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x86.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Release|x86.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Any CPU.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Mixed Platforms.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Win32.ActiveCfg = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|Win32.Build.0 = Release|Win32 - {F77C7224-DF82-4ADF-A761-773D21B58EF4}.Template|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Win32.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|Win32.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x86.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Debug|x86.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x86.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Release|x86.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Any CPU.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Mixed Platforms.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Win32.ActiveCfg = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|Win32.Build.0 = Release|Win32 - {1D0DA000-6192-4B57-A377-7A0A5AB1A121}.Template|x86.ActiveCfg = Release|Win32 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|Win32.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x86.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Debug|x86.Build.0 = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyDebug|x86.Build.0 = Debug|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x86.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.LegacyRelease|x86.Build.0 = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Any CPU.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Mixed Platforms.Build.0 = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|Win32.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x86.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Release|x86.Build.0 = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Any CPU.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Mixed Platforms.Build.0 = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|Win32.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x86.ActiveCfg = Release|x86 - {D1BAE593-A552-4F1A-8B08-5A1C27875C2F}.Template|x86.Build.0 = Release|x86 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Win32.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|Win32.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x86.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Debug|x86.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Any CPU.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Mixed Platforms.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Win32.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|Win32.Build.0 = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyDebug|x86.ActiveCfg = Debug|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.LegacyRelease|x86.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x86.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Release|x86.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Any CPU.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Mixed Platforms.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Win32.ActiveCfg = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|Win32.Build.0 = Release|Win32 - {C5808AC0-A52F-4D77-9903-AE6709712B62}.Template|x86.ActiveCfg = Release|Win32 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Any CPU.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|Win32.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x86.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Debug|x86.Build.0 = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyDebug|x86.Build.0 = Debug|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x86.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.LegacyRelease|x86.Build.0 = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Any CPU.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Mixed Platforms.Build.0 = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|Win32.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x86.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Release|x86.Build.0 = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Any CPU.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Mixed Platforms.Build.0 = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|Win32.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x86.ActiveCfg = Release|x86 - {0DFDDA0B-9EBF-4238-8A2B-D4C2B4F745D7}.Template|x86.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Any CPU.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|Win32.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x86.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Debug|x86.Build.0 = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyDebug|x86.Build.0 = Debug|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x86.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.LegacyRelease|x86.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Any CPU.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Mixed Platforms.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|Win32.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x86.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Release|x86.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Any CPU.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Mixed Platforms.Build.0 = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|Win32.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x86.ActiveCfg = Release|x86 - {4704F67B-246D-483C-B840-231F42D7A12B}.Template|x86.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Any CPU.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|Win32.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x86.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Debug|x86.Build.0 = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyDebug|x86.Build.0 = Debug|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x86.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.LegacyRelease|x86.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Any CPU.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Mixed Platforms.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|Win32.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x86.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Release|x86.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Any CPU.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Mixed Platforms.Build.0 = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|Win32.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x86.ActiveCfg = Release|x86 - {2E70A627-605F-4625-8637-A7109DB8B35C}.Template|x86.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Any CPU.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|Win32.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x86.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Debug|x86.Build.0 = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyDebug|x86.Build.0 = Debug|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x86.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.LegacyRelease|x86.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Any CPU.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Mixed Platforms.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|Win32.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x86.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Release|x86.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Any CPU.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Mixed Platforms.Build.0 = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|Win32.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x86.ActiveCfg = Release|x86 - {E13305E0-0AC9-4181-A9AD-3B9B0A479087}.Template|x86.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Any CPU.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|Win32.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x86.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Debug|x86.Build.0 = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Any CPU.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Mixed Platforms.Build.0 = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|Win32.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x86.ActiveCfg = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyDebug|x86.Build.0 = Debug|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Any CPU.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Mixed Platforms.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Mixed Platforms.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|Win32.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x86.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.LegacyRelease|x86.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Any CPU.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Mixed Platforms.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|Win32.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x86.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Release|x86.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Any CPU.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Mixed Platforms.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Mixed Platforms.Build.0 = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|Win32.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x86.ActiveCfg = Release|x86 - {AC397DFB-5A78-43FF-AB14-83FCAE39ECEC}.Template|x86.Build.0 = Release|x86 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|Win32.Build.0 = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Debug|x86.ActiveCfg = Debug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Any CPU.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Mixed Platforms.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Mixed Platforms.Build.0 = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Win32.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|Win32.Build.0 = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyDebug|x86.ActiveCfg = LegacyDebug|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Any CPU.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Mixed Platforms.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Mixed Platforms.Build.0 = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Win32.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|Win32.Build.0 = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.LegacyRelease|x86.ActiveCfg = LegacyRelease|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Any CPU.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Mixed Platforms.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Win32.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|Win32.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Release|x86.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Any CPU.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Mixed Platforms.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Mixed Platforms.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Win32.ActiveCfg = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|Win32.Build.0 = Release|Win32 - {7F906C15-8DCD-466E-9AF3-2EF50E7FC046}.Template|x86.ActiveCfg = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Package.nuspec b/Package.Debug.nuspec similarity index 72% rename from Package.nuspec rename to Package.Debug.nuspec index 43635eb6..d60e3b37 100644 --- a/Package.nuspec +++ b/Package.Debug.nuspec @@ -2,7 +2,7 @@ Encoding-Converters-Core - 0.7.0 + 0.8.0 Bob Eaton, Jim Kornelson, SIL International jnaylor, sillsdev MIT @@ -18,18 +18,18 @@ ReadMe.md - + - - + + - - + + - + - - - - - - - - + + + + + + + + - - - + + + \ No newline at end of file diff --git a/Package.Release.nuspec b/Package.Release.nuspec new file mode 100644 index 00000000..29f6ee95 --- /dev/null +++ b/Package.Release.nuspec @@ -0,0 +1,65 @@ + + + + Encoding-Converters-Core + 0.8.2 + Bob Eaton, Jim Kornelson, SIL International + jnaylor, sillsdev + MIT + https://github.com/silnrsi/encoding-converters-core + false + Libraries and merge modules for core encoding converter functionality. + Includes managed DLL (for including in projects as nuget artifacts) in the .\lib\net48\... folder, and other managed and non-managed (read: non-nuget) resources that optionally may be manually added to projects or at least in installers in the .\runtimes\... folder -- including plugin definitions, tlb, and exe files for both Win32/x86 and x64. Some of the resources are also included in various merge modules in the .\installer\MergeModules... folder + Copyright 2017-2024 + + + + + ReadMe.md + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installer/AIGuesser64bitMM/AIGuesser64bitMM.wixproj b/installer/AIGuesser64bitMM/AIGuesser64bitMM.wixproj index 208ad324..31019982 100644 --- a/installer/AIGuesser64bitMM/AIGuesser64bitMM.wixproj +++ b/installer/AIGuesser64bitMM/AIGuesser64bitMM.wixproj @@ -1,5 +1,6 @@ + Release x64 @@ -9,25 +10,36 @@ AIGuesser64bitMM Module AIGuesser64bitMM + + - bin\$(Configuration)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ Debug - ..\MergeModules\$(Platform)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + + diff --git a/installer/CcDLLs64bitMM/packages.config b/installer/CcDLLs64bitMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/CcDLLs64bitMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/CcDLLsMM/CcDLLsMM.wixproj b/installer/CcDLLsMM/CcDLLsMM.wixproj index f9785083..714ebd6e 100644 --- a/installer/CcDLLsMM/CcDLLsMM.wixproj +++ b/installer/CcDLLsMM/CcDLLsMM.wixproj @@ -1,32 +1,44 @@ + - Debug + Release x86 3.11 {69904b85-6945-4369-a2e3-79dd7319fb53} 2.0 CcDLLsMM Module + + - bin\$(Configuration)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ Debug - ..\MergeModules\$(Platform)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ - - - - - - + + + + + + + + + + + + + + + + + + + @@ -753,6 +801,7 @@ WSO.run "%comspec% /c """ + EncConvertersAppDataMoverPath + """", WindowStyleSte + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" = 501]]> diff --git a/installer/EC_40_64bit_MM/packages.config b/installer/EC_40_64bit_MM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/EC_40_64bit_MM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/EC_40_MM/EC_40_MM.wixproj b/installer/EC_40_MM/EC_40_MM.wixproj index b09c203d..23368f3c 100644 --- a/installer/EC_40_MM/EC_40_MM.wixproj +++ b/installer/EC_40_MM/EC_40_MM.wixproj @@ -1,38 +1,50 @@ - - Debug - x86 - 3.11 - {dbf25a0c-5f5b-4060-ac5c-cdc50c4aa014} - 2.0 - EC_40_MM - Module - - - bin\$(Configuration)\ - obj\$(Configuration)\ - Debug - - - ..\MergeModules\$(Platform)\ - obj\$(Configuration)\ - - - - - - - $(WixExtDir)\WixUtilExtension.dll - WixUtilExtension - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -753,6 +801,7 @@ WSO.run "%comspec% /c """ + EncConvertersAppDataMoverPath + """", WindowStyleSte + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" = 501]]> diff --git a/installer/EC_40_MM/packages.config b/installer/EC_40_MM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/EC_40_MM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/EcFolderACLsMM/EcFolderACLsMM.wixproj b/installer/EcFolderACLsMM/EcFolderACLsMM.wixproj index 27b21371..43e4c53c 100644 --- a/installer/EcFolderACLsMM/EcFolderACLsMM.wixproj +++ b/installer/EcFolderACLsMM/EcFolderACLsMM.wixproj @@ -1,38 +1,48 @@ - - Debug - x86 - 3.11 - f7483cf4-5ab5-4e62-b87e-a6a88ec228dc - 2.0 - EcFolderACLsMM - Module - - - bin\$(Configuration)\ - obj\$(Configuration)\ - Debug - - - ..\MergeModules\ - obj\$(Configuration)\ - - - - - - - $(WixExtDir)\WixUtilExtension.dll - WixUtilExtension - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -317,68 +512,144 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -392,5 +663,9 @@ + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + diff --git a/installer/EcTranslators64bitMM/packages.config b/installer/EcTranslators64bitMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/EcTranslators64bitMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/EcTranslatorsMM/EcTranslatorsMM.wixproj b/installer/EcTranslatorsMM/EcTranslatorsMM.wixproj index b5aaf451..10ab802d 100644 --- a/installer/EcTranslatorsMM/EcTranslatorsMM.wixproj +++ b/installer/EcTranslatorsMM/EcTranslatorsMM.wixproj @@ -1,31 +1,43 @@ + - Debug + Release x86 3.11 {9FAB4338-F089-4279-A5DF-AF5FC0368783} 2.0 EcTranslatorsMM Module + + - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ + obj\$(Configuration)\ Debug - ..\MergeModules\$(Platform)\ - obj\$(Platform)\$(Configuration)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ + obj\$(Configuration)\ - - - - - + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -316,68 +512,144 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -391,5 +663,9 @@ + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + diff --git a/installer/EcTranslatorsMM/packages.config b/installer/EcTranslatorsMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/EcTranslatorsMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/FireFox/FireFox.wixproj b/installer/FireFox/FireFox.wixproj index aa97b734..b3718f64 100644 --- a/installer/FireFox/FireFox.wixproj +++ b/installer/FireFox/FireFox.wixproj @@ -1,31 +1,43 @@ + - Debug + Release x86 3.11 e4de895c-b714-4fa7-b9de-20eb2e4d78fd 2.0 EcFireFox Module + + - bin\$(Configuration)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ Debug - ..\MergeModules\$(Platform)\ + ..\..\output\MergeModules\$(Platform)\$(Configuration)\ obj\$(Configuration)\ + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + + diff --git a/installer/PerlEc64bitMM/packages.config b/installer/PerlEc64bitMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/PerlEc64bitMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/PerlEcMM/PerlEcMM.wixproj b/installer/PerlEcMM/PerlEcMM.wixproj index 95a3133a..128ec0ac 100644 --- a/installer/PerlEcMM/PerlEcMM.wixproj +++ b/installer/PerlEcMM/PerlEcMM.wixproj @@ -1,32 +1,44 @@ - - Debug - x86 - 3.11 - {d6a6243c-a7f4-4174-80c5-5efd39c29d5e} - 2.0 - PerlEcMM - Module - - - bin\$(Configuration)\ - obj\$(Configuration)\ - Debug - - - ..\MergeModules\$(Platform)\ - obj\$(Configuration)\ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - - + + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + + diff --git a/installer/PerlEcMM/packages.config b/installer/PerlEcMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/PerlEcMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/PythonEc64bitMM/PythonEc64bitMM.wixproj b/installer/PythonEc64bitMM/PythonEc64bitMM.wixproj index 32d43207..95c3de76 100644 --- a/installer/PythonEc64bitMM/PythonEc64bitMM.wixproj +++ b/installer/PythonEc64bitMM/PythonEc64bitMM.wixproj @@ -1,32 +1,44 @@ - - Release - x64 - 3.11 - {ccbb5714-9635-4c54-ae1c-4d06441b9f3a} - 2.0 - PythonEc64bitMM - Module - - - Debug - bin\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - - - ..\MergeModules\$(Platform)\ - obj\$(Platform)\$(Configuration)\ - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -80,5 +103,9 @@ + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + diff --git a/installer/PythonEc64bitMM/packages.config b/installer/PythonEc64bitMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/PythonEc64bitMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/PythonEcMM/PythonEcMM.wixproj b/installer/PythonEcMM/PythonEcMM.wixproj index 5bf9d013..ed3d18a7 100644 --- a/installer/PythonEcMM/PythonEcMM.wixproj +++ b/installer/PythonEcMM/PythonEcMM.wixproj @@ -1,32 +1,44 @@ - - Debug - x86 - 3.11 - {34d26d24-57af-4031-b5b6-5a8c9279afcc} - 2.0 - PythonEcMM - Module - - - bin\$(Configuration)\ - obj\$(Configuration)\ - Debug - - - ..\MergeModules\$(Platform)\ - obj\$(Configuration)\ - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -86,5 +110,9 @@ + + + Installed AND NOT UPGRADINGPRODUCTCODE AND REMOVE="ALL" + diff --git a/installer/PythonEcMM/packages.config b/installer/PythonEcMM/packages.config new file mode 100644 index 00000000..48182e9f --- /dev/null +++ b/installer/PythonEcMM/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/installer/TECkit64bitDllsMM/TECkit64bitDllsMM.wixproj b/installer/TECkit64bitDllsMM/TECkit64bitDllsMM.wixproj index a7d08f1b..96b9e87b 100644 --- a/installer/TECkit64bitDllsMM/TECkit64bitDllsMM.wixproj +++ b/installer/TECkit64bitDllsMM/TECkit64bitDllsMM.wixproj @@ -1,32 +1,44 @@ - - Release - x64 - 3.11 - ae5f8d43-08de-4e3b-ae84-e89a01122b40 - 2.0 - TECkit64bitDllsMM - Module - - - ..\MergeModules\$(Platform)\ - obj\$(Platform)\$(Configuration)\ - - - bin\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - Debug - - - - - - - - - - + + diff --git a/redist/EC/Plugins/Translators 4.0.0.0 Plugin Details.xml b/redist/EC/Plugins/Translators 4.0.0.0 Plugin Details.xml index 6ba38560..35aedd03 100644 --- a/redist/EC/Plugins/Translators 4.0.0.0 Plugin Details.xml +++ b/redist/EC/Plugins/Translators 4.0.0.0 Plugin Details.xml @@ -18,4 +18,22 @@ DisplayName="Google Translate" ConfiguratorProgId="SilEncConverters40.EcTranslators.GoogleTranslator.GoogleTranslatorEncConverterConfig" AssemblyReference="EcTranslators, Version=4.0.0.0, Culture=neutral, PublicKeyToken=f1447bae1e63f485" /> + + + diff --git a/redist/Help/AdaptIt_Plug-in_About_box.htm b/redist/Help/AdaptIt_Plug-in_About_box.htm index 50198786..047ac4eb 100644 --- a/redist/Help/AdaptIt_Plug-in_About_box.htm +++ b/redist/Help/AdaptIt_Plug-in_About_box.htm @@ -1935,7 +1935,7 @@

Note that these menu items will be grayed out (as here) unless you have EncConverters v 2.2 installed on your system. This utility is available as part of FieldWorks 3.1 or it can be downloaded from this website: http://scripts.sil.org/EncCnvtrs

+class=MsoHyperlink>http://scripts.sil.org/EncCnvtrs

diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box.htm b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box.htm new file mode 100644 index 00000000..ccaa1288 --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box.htm @@ -0,0 +1,2094 @@ + + + + + + + + + + + +Azure Open AI Translate + + + + + + + + + + + +
+ +

Azure Open AI Transducer

+ +

This +converter allows you to use Azure Open AI Service to do text processing within EncConverter-enabled +applications. Azure Open AI is a cloud-based Artificial Intelligence +service based on (currently) Chat GPT 3.5 and 4 and several other model as +well. It can be used to perform language translation and other language-related +operations between a growing number of languages (see this website for specific languages supported). Note that +it requires a live internet connection to function.

+ +

The +Azure Open AI Transducer uses an Azure Open AI Resource to do the +translation, which is available from Microsoft’s Azure portal, and unlike other Translators +supported by the EncConverters core (i.e. Google, Bing & DeepL), the Azure +Open AI Resource requires you to get your own Azure resource in order to use +it.

+ +

See +this website for more information on getting your own Azure +Open AI Resource.

+ +

Setup Tab

+ +

Here is the configuration setup tab for the Azure Open +AI EncConverter:

+ +

+ +

Figure 1: +Azure Open AI Translate Setup 1, 2, 3, 4, 5, 6, +7

+ +

 

+ +

1)      +This text box is for entering the Source +language of the input text for the translation operation.

+ +

2)      This +text box is for entering the Target language the input text should be +translated into.

+ +

3)      This combo box/text box is for choosing one +of the pre-existing additions or entering your own addition to be added to the System +Prompt to customize what is sent to the Azure Open AI service.

+ +

In the example shown +above, the addition tells the AI language model to translate from Hindi to +English and request the result be “in a ‘free translation’ +style aimed at high school students.”

+ +

The underlying language +model is quite good at understanding English and can adjust its translation for +most requests (e.g. even sending the results back in rhyme or in ‘Yoda +speak’ (OSV))

+ +

Click on the drop-down +arrow to the right of the box to see any pre-loaded or previously used +additions.

+ +

By default, the System +Prompt used is:

+ +

You will be given 1 or more +lines of text in <SourceLanguage> which you are to translate into +<TargetLanguage> <additions> and return only the translated lines.

+ +

This prompt was picked +to allow the converter to work well with the Paratext Back Translation plug-in, +which often has multiple lines (i.e. verses) of text to be processed and as the +language model often returns additional information about the input line to be +translated, by default, it is instructed to return only the translated text.

+ +

You can override this +formatted System Prompt to get any arbitrary results you want by using the +prefix: “UseSystemPrompt: ”

+ +

For example, to see if +it meets the needs of your application, you could start with the simple System +Prompt:

+ +

UseSystemPrompt: Translate +Hindi into English.

+ +

Then, the System Prompt +sent to the language model would simply be:

+ +

Translate Hindi into English.

+ +

Note that if you begin +this field with the string, “UseSystemPrompt: ”, then the Source +and Target language boxes will be ignored.

+ +

Finally, you should +note that the Azure Open AI Resource has Content Filtering +and it may refuse to translate some text if it runs afoul of any of these four +areas: Hate, Sexual, Self-harm, Violence.

+ +

4)      +This box shows the System Prompt that will be sent to +the Azure Open AI service.

+ +

5)      +This button brings up a dialog box into which you can +enter the information needed about your personal Azure Open AI resource (see +below for information).

+ +

Note that unlike the +other Translators supported by EncConverters, the Azure Open AI (currently) +does not have a free pricing tier, and so you’ll need to sign up for your +own resource to use it, although for most human-guided translation work, the volume +involved is small enough that it’s not very costly.

+ +

See this +webpage for how to get your own Azure Open AI resource to use for this +transducer.

+ +

6)      If you want the +converter to be permanently added to the System Repository, then you must click +the Save in System Repository button +(see below).

+ +

7)      +You can click on the Test Area tab to test the +converter with some sample data.

+ +
+ +

You may not see script errors until you use the converter to +convert some data. So, for this converter type, it is important to test it +before trying it with real data.

+ +

You can also test various System Prompts in the Azure Open AI +Studio mentioned below to find the specific one you want to use.

+ +
+ +

Entering your own Azure Open AI Resource Information

+ +

Once you acquire your own Azure Open AI resource on the +Azure portal, you can enter the +information to use it in the dialog that appears by clicking the button on the +Setup dialog (5)  above:

+ +

 

+ +

+ +

Figure 2: +Entering Azure Open AI Configuration Data

+ +

 

+ +

The information you need for this dialog (by the number in +red) is available from this page/blade of the Azure portal:

+ +

The value to use in the Enter +Azure Open AI Key’ box (1) above comes from the KEY1 field in Figure 3 below and the value to +use for the Enter Language API Endpoint +box (3) above comes from the Language API +(endpoint) field in Figure 3 below.

+ +

+ +

Figure 3: +Azure Portal Settings for the Azure Open AI Resource

+ +

 

+ +

The value to use in the Deployment +Name field (2) in Figure 2 above comes from the deployment you create on +the Deployments blade of the Azure Open AI Studio tool as shown here:

+ +

+ +

Figure 4: +Azure Portal Settings in the Azure OpenAI Studio

+ +

 

+ +

The Azure Open AI Studio +tool can be opened from Model deployments +blade just below the Keys and Endpoint +blade in Figure 3 above.

+ +

Using Environment +Variables to Store Azure Open AI Credentials

+ +

When the translator is used in different client +applications (e.g. Paratext, Word, or the Clipboard +EncConverter), the settings (including the key mentioned above) are +stored (encrypted) in the application settings file of the specific application +using it. So you may be asked to enter the key, +deployment name, and endpoint in each application that you want to +use it in. Alternately, you can set these values as three environment variables +(EncConverters_AzureOpenAiKey, EncConverters_AzureOpenAiDeploymentName, EncConverters_AzureOpenAiEndpoint), and they +will be available to all applications:

+ +

+ +

Figure 5: +Environment Variables for Azure OpenAI Settings

+ +

 

+ +

 

+ +

Saving the +converter in the System Repository:

+ +

By default, if you click the Apply or OK +buttons, the configured converter will be returned to the client application as +a temporary converter for temporary use. Once the client application (e.g. FieldWorks or Word) is +closed or releases the converter, it will no longer be available. If you want +the converter to be permanently available to client applications, then you must +explicitly add it to the System Repository using +the Save in System Repository button.

+ +

When you click this button, the following dialog box will +be displayed to query for a friendly name by +which the converter will be known in client applications:

+ +

 

+ +

+ +

 

+ +

The Advanced Tab can be used to enter further, +optional information about this converter, which is also put into the System Repository and can be used by various client +applications. Click on this tab to display the following dialog box:

+ +

+ +

 

+ +

Though these values are not necessary for the operation of +the converter, they can be helpful to various client applications. For example, +the Clipboard EncConverter can be configured to +filter the list of displayed converters based on the Encoding Name +and/or the Transduction Type configured here.

+ +
+ + + + diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/colorschememapping.xml b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/colorschememapping.xml new file mode 100644 index 00000000..6a0069cd --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/colorschememapping.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/filelist.xml b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/filelist.xml new file mode 100644 index 00000000..5fec2b7b --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/filelist.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/header.htm b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/header.htm new file mode 100644 index 00000000..865573c5 --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/header.htm @@ -0,0 +1,61 @@ + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ + + + diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image002.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image002.jpg new file mode 100644 index 00000000..1cffc87c Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image002.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image004.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image004.jpg new file mode 100644 index 00000000..043fdca1 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image004.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image006.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image006.jpg new file mode 100644 index 00000000..8bd6a87d Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image006.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image007.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image007.jpg new file mode 100644 index 00000000..35044a68 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image007.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image008.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image008.jpg new file mode 100644 index 00000000..b518a1d4 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image008.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image012.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image012.jpg new file mode 100644 index 00000000..2bc4a3f0 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image012.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image017.jpg b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image017.jpg new file mode 100644 index 00000000..9ec2d0e1 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/image017.jpg differ diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/item0015.xml b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/item0015.xml new file mode 100644 index 00000000..df14848b --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/item0015.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/props016.xml b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/props016.xml new file mode 100644 index 00000000..9621d74e --- /dev/null +++ b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/props016.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/themedata.thmx b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/themedata.thmx new file mode 100644 index 00000000..3d2a4372 Binary files /dev/null and b/redist/Help/Azure_OpenAI_Translate_Plug-in_About_box_files/themedata.thmx differ diff --git a/redist/Help/Bing_Translator_Plug-in_About_box.htm b/redist/Help/Bing_Translator_Plug-in_About_box.htm index d6d98166..4a0e2e3d 100644 --- a/redist/Help/Bing_Translator_Plug-in_About_box.htm +++ b/redist/Help/Bing_Translator_Plug-in_About_box.htm @@ -1747,7 +1747,7 @@

Setup Tab of characters of the selected Source language to the corresponding characters or letters of the selected Target language script. Note: not all Source languages support Transliteration. See this table to know whether a certain combination is supported. The Source script ( + NLLB Translator + + + + + + + + + + + + + + +
+ +

No Language Left +Behind (NLLB) Translator

+ +

This +converter allows you to use the Meta +No Language Left Behind (NLLB) Translator to perform text processing within +EncConverter-enabled applications. The NLLB Translator is currently a +local translation service, but is expected to be online as well with the larger +data models by the end of 2024. It can be used to perform language translation +between a growing number of languages (see here for specific supported languages).

+ +

The +NLLB Translator, which is available to EncConverter-enabled applications, +currently requires a number of complex additional steps to use beyond simply +installing the EncConverter. You may need to update Powershell on your computer, and then download and install Docker (e.g. Docker Desktop for Windows), and run some commands in Powershell to build the Docker container, which +downloads the NLLB model and other prerequisites (~2.5 GB) and creates an +interface to the model. Finally, you need to run the Docker container to allow +the NLLB Translator EncConverter to access the model. Instructions for these +prerequisites are discussed below. It is suggested that you restart your +computer before doing these steps in order to free up as much memory as +possible.

+ +

Click to Open this page in a Browser window

+ +

Virtualization +Check

+ +

To download and use Docker, your computer must support +virtualization. To check if your computer supports virtualization, press the Ctrl ++ Shift + Esc keys to open the Task +Manager dialog. On the Performance +tab, look for Virtualization line in the +CPU section to see if it’s Enabled:

+ +

+ +

Figure 1: Virtualization Check

+ +

If it’s not enabled, you may be able to enable it in +your BIOS settings (if your computer supports it). But if it doesn’t +support virtualization, then you won’t be able to use this +Translator/EncConverter.

+ +

Update Powershell

+ +

Most Windows computers already have Powershell installed on +them, and by default, you can open Powershell and run this command to update it +to the latest version:

+ +

winget install --id Microsoft.Powershell --source winget

+ +

If this doesn’t work, then you can install the +latest version of Powershell by following the instructions on this page.

+ +

Install Docker

+ +

Download a Windows (or other OS) installer for Docker from +here +and install it.

+ +

You can keep whatever default settings the installer shows +you (esp. one recommending using ‘WSL 2 instead of Hyper-V’, if you +have the latter installed), as shown here:

+ +

+ +

Figure 2: Docker Installer

+ +

After the installation is complete, restart your computer. +Then open Docker for Desktop and accept +the agreement to complete the installation using the recommended settings +(requires administrator password).

+ +

Once this is complete, it will ask you to either sign up +or sign in or you can just Continue without signing in.

+ +

Once this is complete, you can bring up the NLLB +Translator Setup dialog to complete the configuration.

+ +

Setup +Tab

+ +

To bring up the Setup dialog for the NLLB Translator, you can run, for example, the Clipboard EncConverter installed as part of SILConverters. Then right-click on its small icon in the system tray +and choose the Edit or Delete Converters +menu item:

+ +

+ +

Figure 3: Clipboard EncConverter

+ +

In the resulting dialog, click the Add New button and then choose the NLLB Translator from the list and click the Add button:

+ +

+ +

Figure 4: Select and Add New Converter type

+ +

 

+ +

This will bring up the Setup dialog for the NLLB +Translator EncConverter:

+ +

+ +

Figure 5: +NLLB Translator Setup Dialog

+ +

 

+ +

The numbers in the above +image correspond to these settings:

+ +

1)      This +edit box shows the path to the folder where the files needed to create the +Docker container to host the NLLB model will be installed. Click the browse +button to the right of the edit box to choose an empty folder to put the files. +Here’s an example of the Folder Browse dialog, setting C:\Program Data\SIL\NLLB as the folder to put +the files in:

+ +

+ +

Figure +6: Folder Browse Dialog

+ +

 

+ +

2)      Click on this button to bring up the NLLB Model Configuration +dialog where you will make several choices to configure which NLLB model, etc., +you want to use (see below).

+ +

3)      +This combo box is for selecting the Source language of +the input text for the translation operation. Until you have the +NLLB Model running, these list boxes will be empty.

+ +

4)      This +combo box is for selecting the Target language to translate into.

+ +

5)      +If you want the converter to +be permanently added to the System Repository, then click the Save in System Repository button (see +below).

+ +

6)      +Once +the NLLB Model is running, you can click on the Test Area tab to test the +converter with some sample data.

+ +

Model +Configuration Dialog

+ +

Click the Configure NLLB +Model button (by number (3) +above in the Setup dialog) to bring up the NLLB Model Configuration dialog:

+ +

+ +

Figure 7: +Model Configuration Dialog

+ +

 

+ +

The numbers in the above image correspond to these settings:

+ +

1)      This listbox shows the (currently) 3 models that you can +choose from. If your computer has only 16 GB of Ram, you will want to use the +smallest model (facebook/nllb-200-distilled-600M). If you have 32 GB of Ram, the 1.3GB model should also +work. The larger the model, the more time it will take to do translation, but +also the more likely it is to produce a better translation.

+ +

2)      This edit box is to enter an API Key which would then be +required to access the NLLB Model for translation. If you only plan to use your +model from your personal computer or from another computer on your local +network, you can just keep the default value or remove the key altogether. But +if you plan to host and access the model from the internet, then this allows +you to specify a custom API key to restrict access.

+ +

3)      This edit box is to enter the endpoint through which the +model can be accessed from your computer. If you only plan to use your model +from your own computer, you can just keep the default value (http://localhost:8000). If you want to share a +model with multiple computers on your local network, see the ‘Sharing +a model with other computers on a local network’ section below.

+ +

It’s also possible to use a +different port to access the model (i.e. in place of the value 8000 above). If +you plan to host multiple NLLB models at the same time, you will have to use a +different port for each one to access them simultaneously. The port number can +be whatever you want, but again, you might need to adjust the firewall to allow +inbound traffic for whatever port you choose.

+ +

4)      Finally, +once you’ve chosen the parameters you want, click the Create Docker Project button to continue. The +Setup dialog will then install the necessary files, configured with the +settings you choose, into the folder you entered on the Setup Dialog (see (1) +in the Setup Tab +section above).

+ +

After the files are created, you will see this msg indicating the +next step is to build the Docker container (you can leave this box up while you +do the next steps):

+ +

+ +

Build +Docker Container

+ +

The remaining steps will be run in a Powershell window. +Suppose the Model Configuration files were installed to the D:\repos\NNLB folder. In your +Powershell window, change to that folder with the command:

+ +

cd D:\repos\NLLB

+ +

The exact commands you will execute depends on which model +you choose in the previous step. To see the exact commands you want to execute, +type out the README.md file using this command:

+ +

type README.md

+ +

and then make sure that Docker +for Desktop is running and execute the first command listed in the +README.md file (note the space and period (.) at the end). For example, if you +choose the facebook/nllb-200-distilled-600M +model, your command will look like this (your command may differ depending on +which model you choose):

+ +

docker build -t +nllb-600m .

+ +

This step can take a long time, because it must download +the NLLB model and several other prerequisites (>2.5 GB for the smallest +600M model).

+ +

Note: there is a Powershell script named buildDocker.ps1 +that is also created in the Docker Project Folder that you could run in +Powershell to accomplish this and the next step. But if your computer is +initialized to block unknown Powershell scripts, the script won’t execute +and you’ll have to enter them manually as shown above.

+ +

Run +Docker Container

+ +

The final step to prepare the NLLB model is to execute the +following command in Powershell after the docker build step completes (your +command may differ depending on which model and port you choose):

+ +

docker run -p 8000:8000 +nllb-600m

+ +

Once this command is finished, your powershell should look +something like this:

+ +

+ +

Figure 8: Powershell after NLLB Model is built and running

+ +

If the process didn’t have enough memory to +complete, there will be an error showing a problem with the +‘import_model.py’ script execution. You can restart your computer +and try it again and/or use a smaller model.

+ +

To see if everything is working properly, you can open the +url, localhost:8000, (or whatever +endpoint you choose when configuring the Model) in a web browser, and you +should see the following web page:

+ +

+ +

Figure 9: NLLB webpage (at localhost:8000)

+ +

NOTE: If you created an API Key in the Model Configuration Dialog above, then you would +need to add that key (along with the prefix, “SIL-NLLB-Auth-Key, note the following space) to the Authorization header in your browser to see +this web page. For example, most browsers support the extension, ModHeader, which allows you to enter key value +pairs in the Request Header like this:

+ +

+ +

Figure 10: ModHeader Chrome extension to +add API key to Authorization header

+ +

 

+ +

The exact value to add to the header can be found in the +settings.py file located in the Docker Project Folder, but will be something +like:

+ +

SIL-NLLB-Auth-Key +your-api-key-here

+ +

After you are done testing this page, you may want to +reopen the ModHeader extensions (click on +the Extensions icon  to the right of the address bar in the +browser) and uncheck the box next where it says Authorization in Figure 10 +above, so it isn’t used for all your internet traffic.

+ +

Once this is complete, then you are ready to connect the +NLLB Translator EncConverter to this service. Return to step (4) +of the Model Configuration +Dialog +section above and click OK to connect to the model endpoint and query for +languages in the Setup dialog.

+ +

Sharing +a model with other computers on a local network

+ +

If you have multiple computers that want to share a model, +you can host it from one computer and share the endpoint with other computers +on your local network by configuring the latter to use the IP address of the +hosting machine as the endpoint rather than http://localhost:8000. +

+ +

On the computer that is hosting the model, during the Model Configuration +Dialog +step above, you would use http://localhost:8000, +for example, as the endpoint and build the model using the instructions in the Build Docker Container +and Run Docker Container +sections above.

+ +

And from the other computers on your local network, during +the Model Configuration +Dialog +step above, you would use the IP address of the machine with the model as the +endpoint (e.g. http://192.168.62.154:8000). +And then there’s no need to build the model on that computer (i.e. for +the non-hosting machines, ignore the instructions in the Build Docker Container +and Run Docker Container +sections above).

+ +

Also note that if you share a model with other computers, +you may need to make a change to the firewall on the computer that is hosting +the model to allow access to port 8000 (or whichever port you choose) from the +network. See this +page for hints on how to do this.

+ +

Saving the +converter in the System Repository:

+ +

By default, if you click the Apply or OK +buttons, the configured converter will be returned to the client application as +a temporary converter for temporary use. Once the client application (e.g. FieldWorks or Word) is +closed or releases the converter, it will no longer be available. If you want +the converter to be permanently available to client applications, then you must +explicitly add it to the System Repository using +the Save in System Repository button.

+ +

When you click this button, the following dialog box will +be displayed to query for a friendly name by +which the converter will be known in client applications:

+ +

+ +

 

+ +

The Advanced Tab can be used to enter further, +optional information about this converter, which is also put into the System Repository and can be used by various client +applications. Click on this tab to display the following dialog box:

+ +

+ +

 

+ +

Though these values are not necessary for the operation of +the converter, they can be helpful to various client applications. For example, +the Clipboard EncConverter can be configured to +filter the list of displayed converters based on the Encoding Name +and/or the Transduction Type configured here.

+ +
+ + + + diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/colorschememapping.xml b/redist/Help/NLLB_Translate_Plug-in_About_box_files/colorschememapping.xml new file mode 100644 index 00000000..6a0069cd --- /dev/null +++ b/redist/Help/NLLB_Translate_Plug-in_About_box_files/colorschememapping.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/filelist.xml b/redist/Help/NLLB_Translate_Plug-in_About_box_files/filelist.xml new file mode 100644 index 00000000..71ff85ce --- /dev/null +++ b/redist/Help/NLLB_Translate_Plug-in_About_box_files/filelist.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/header.htm b/redist/Help/NLLB_Translate_Plug-in_About_box_files/header.htm new file mode 100644 index 00000000..b223218e --- /dev/null +++ b/redist/Help/NLLB_Translate_Plug-in_About_box_files/header.htm @@ -0,0 +1,60 @@ + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ + + + diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image001.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image001.jpg new file mode 100644 index 00000000..fcff0d7b Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image001.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image003.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image003.jpg new file mode 100644 index 00000000..04f9eb4c Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image003.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image004.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image004.jpg new file mode 100644 index 00000000..5df2dff4 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image004.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image005.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image005.jpg new file mode 100644 index 00000000..1169cc8b Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image005.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image006.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image006.jpg new file mode 100644 index 00000000..3c5d2a73 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image006.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image007.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image007.jpg new file mode 100644 index 00000000..cc0de70b Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image007.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image008.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image008.jpg new file mode 100644 index 00000000..11fb3347 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image008.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image009.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image009.jpg new file mode 100644 index 00000000..f66702ae Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image009.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image010.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image010.jpg new file mode 100644 index 00000000..5f6fe8c0 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image010.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image012.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image012.jpg new file mode 100644 index 00000000..11783c43 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image012.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image016.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image016.jpg new file mode 100644 index 00000000..8ce3b3c1 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image016.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image021.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image021.jpg new file mode 100644 index 00000000..cdad918c Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image021.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image023.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image023.jpg new file mode 100644 index 00000000..e96963a4 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image023.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/image027.jpg b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image027.jpg new file mode 100644 index 00000000..04dabef9 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/image027.jpg differ diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/item0027.xml b/redist/Help/NLLB_Translate_Plug-in_About_box_files/item0027.xml new file mode 100644 index 00000000..df14848b --- /dev/null +++ b/redist/Help/NLLB_Translate_Plug-in_About_box_files/item0027.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/props028.xml b/redist/Help/NLLB_Translate_Plug-in_About_box_files/props028.xml new file mode 100644 index 00000000..9621d74e --- /dev/null +++ b/redist/Help/NLLB_Translate_Plug-in_About_box_files/props028.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/NLLB_Translate_Plug-in_About_box_files/themedata.thmx b/redist/Help/NLLB_Translate_Plug-in_About_box_files/themedata.thmx new file mode 100644 index 00000000..3d2a4372 Binary files /dev/null and b/redist/Help/NLLB_Translate_Plug-in_About_box_files/themedata.thmx differ diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box.htm b/redist/Help/Net_Regular_Expression_Plug-in_About_box.htm new file mode 100644 index 00000000..87f29ff6 --- /dev/null +++ b/redist/Help/Net_Regular_Expression_Plug-in_About_box.htm @@ -0,0 +1,1870 @@ + + + + + + + + + + +.Net Regular Expression Help + + + + + + + + + + + +
+ +

Regular Expression +Processor (.Net)

+ +

The .Net Regular Expression converter provides +applications with the ability to apply regular expression searching and text manipulation +for Unicode string data. The regular expression patterns and behavior are based +on the .Net regular expression syntax. See https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference +for more information on the syntax of .Net Regular Expressions or this website +if you want to test the syntax to prepare your regular expression http://regexstorm.net/tester. +

+ +

Setup Tab

+ +

Here is the setup tab for the .Net Regular Expression +EncConverter:

+ +

+ +

Figure 1: +.Net Regular Expression Setup Dialog [1], +[2], +[3], +[4], +[5], +[6], +[7], +[8], +[9]

+ +

 

+ +

1.      +In the Search for +box, enter the regular expression you want to use as the search rule for text +processing. These pages shows what Character Escapes, +Character Classes, +Anchors, +Grouping Constructs, +Lookaround Expressions, +Quantifiers, +Backreference +Constructs, and Alternation Constructs +are supported by the .Net regular expression engine.

+ +

2.      +Click this button to see a pop-up list of +commonly used meta-characters and operators which will be inserted into +the Search for box if selected:

+ +

+ +

Figure 2: +Commonly Used Regular Expression Tokens

+ +

 

+ + + +

3.      +In the Replace with +box, enter the string or operator (see here +for Substitution syntax) that represents the text or grouping tokens to replace +the Search for string.

+ +

4.      +This +area shows the various RegexOptions you can choose. If you hover your cursor of +one of the check boxes, a tooltip will pop up to show you the meaning of each +option. Also, see here for more information.

+ +

5.      +The Previous Searches combo box includes a few example +regular expressions and remembers any new ones you add. Note that in this +combobox, the Search for and Replace with strings will be enclosed in +“{}” in order to maintain them in the dialog’s Settings, but +you don’t use the “{}” when adding them in the Search for and Replace +with text boxes (i.e. 1 and 2 +above). The Delete button can be used to remove the selected +search item if you need to purge the list to keep it manageable (e.g. to +remove expressions you have updated to fix its behavior).

+ +

6.      This link on the Setup tab will launch your +system defined web browser and open the learn.microsoft web page that has the quick reference guide +for the .Net regular expression syntax.

+ +

7.      +If you +want the converter to be permanently added to the System Repository, then you +must click the Save in System Repository button (see below).

+ +

8.      +You can +click on the Test Area tab in order to test the converter with +some sample data.

+ +

9.      +You can +add Advanced information (encoding names, process types, etc) using the Advanced +tab.

+ +

Saving the converter in the System Repository:

+ +

By default, if you click the Apply +or OK buttons, the configured converter will +be returned to the client application as a temporary converter for temporary +use. Once the client application (e.g. FieldWorks +or Word) is closed or releases the converter, it +will no longer be available. If you want the converter to be permanently +available to client applications, then you must explicitly add it to the System Repository using the Save +in System Repository button.

+ +

When you click this button, the following dialog box will +be displayed to query for a friendly name by +which the converter will be known in client applications:

+ +

+ +

 

+ +

For the .Net Regular Expression converter, the default +name will be the Search for and Replace with elements separated by the arrow. However, +you can change it to something more descriptive if desired (e.g. Replace +English vowels with 'V').

+ +

The Advanced Tab can be +used to enter further, optional information about this converter, which is also +put into the System Repository and can be used +by various client applications. Click on this tab to display the following:

+ +

+ +

 

+ +

Though these values are not necessary for the operation of +the converter, they can be helpful to various client applications. For example, +the Clipboard EncConverter can be configured to +filter the list of displayed converters based on the Encoding +Name and/or the Transduction Type +configured here.

+ +
+ + + + diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/colorschememapping.xml b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/colorschememapping.xml new file mode 100644 index 00000000..6a0069cd --- /dev/null +++ b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/colorschememapping.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/filelist.xml b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/filelist.xml new file mode 100644 index 00000000..b325c87a --- /dev/null +++ b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/filelist.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image001.jpg b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image001.jpg new file mode 100644 index 00000000..02a5f946 Binary files /dev/null and b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image001.jpg differ diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image002.jpg b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image002.jpg new file mode 100644 index 00000000..c91edd2a Binary files /dev/null and b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image002.jpg differ diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image003.jpg b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image003.jpg new file mode 100644 index 00000000..75938a37 Binary files /dev/null and b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image003.jpg differ diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image005.jpg b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image005.jpg new file mode 100644 index 00000000..5286439c Binary files /dev/null and b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/image005.jpg differ diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/item0010.xml b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/item0010.xml new file mode 100644 index 00000000..c8543fbf --- /dev/null +++ b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/item0010.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/props011.xml b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/props011.xml new file mode 100644 index 00000000..38cf3e4b --- /dev/null +++ b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/props011.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/themedata.thmx b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/themedata.thmx new file mode 100644 index 00000000..c2dd8c12 Binary files /dev/null and b/redist/Help/Net_Regular_Expression_Plug-in_About_box_files/themedata.thmx differ diff --git a/redist/Help/Perl_Expression_Plug-in_About_box.htm b/redist/Help/Perl_Expression_Plug-in_About_box.htm index ff7bbfad..a2481c51 100644 --- a/redist/Help/Perl_Expression_Plug-in_About_box.htm +++ b/redist/Help/Perl_Expression_Plug-in_About_box.htm @@ -742,9 +742,9 @@

Perl Expression Converter

separately downloaded Perl distribution (currently, version 5.10.1) to be installed on your system to operate correctly. You can download a free Perl distribution, such as ActiveState’s Perl v5.10.1 from this website: Active State +class=MsoHyperlink>Active State (or perhaps in their previous downloads area).

+href="http://downloads.activestate.com/ActivePerl/Windows/5.10/" target="_blank">area).

diff --git a/redist/Help/Python_3_Script_Plug-in_About_box.htm b/redist/Help/Python_3_Script_Plug-in_About_box.htm new file mode 100644 index 00000000..e932c0ff --- /dev/null +++ b/redist/Help/Python_3_Script_Plug-in_About_box.htm @@ -0,0 +1,1553 @@ + + + + + + + + + + +Python 3 Script + + + + + + + + + +
+ +

Python 3 Script

+ +

This converter type allows you to use Python functions for +Unicode text processing. For example, you could have the following Python function +to return the Unicode code point names for all the characters in the input +string (e.g. the input string, ő , would return "LATIN SMALL LETTER O; COMBINING DOUBLE ACUTE ACCENT; "):

+ +

 

+ +

# return the UnicodeName of input string

+ +

import unicodedata

+ +

def Convert(u):

+ +

if not +isinstance(u, unicode):

+ +

raise +UnicodeError(u'Input Data is not a Unicode string! (%s)' % u)

+ +

else:

+ +

r = u''

+ +

for ch in +u:

+ +

r += +'%s; ' % unicodedata.name(ch)

+ +

return r

+ +

 

+ +

The directory of the Python script gets added to sys.path by EncConverters. This makes it easy to import another python +script in the same directory. For +example, a script could say:

+ +

 

+ +

import +script2
+
def +Convert(u):
+    return script2.enToGarhwali(u)

+ +

 

+ +

If there was a script2.py +in the same folder defined, for example, as:

+ +

 

+ +

def +enToGarhwali(u):

+ +

if u.lower() in (u"what's this?", +u"what is this?"):

+ +

return u"yu kyaa chh?"

+ +

else:

+ +

return u"(could not +translate)"

+ +

 

+ +
+ +

To use this transducer, you must have a Python distribution +(v. 3.*) installed on your machine. You can download a free Python +distributions, such as Python 3.12, from https://www.python.org/downloads.

+ +
+ +

Setup Tab

+ +

Here is the setup tab for the Python 3 Script +EncConverter:

+ +

+ +

Figure 1: Python Script Setup

+ +

 

+ +

1.      +Browse +(using the upper Browse... button) for the Python script file that +implements a function named Convert as shown in +the above examples.

+ +

2.      +Browse (using the lower Browse... button) for the python3 DLL file (e.g. python312.dll) +located in the folder you installed your python distribution in.

+ +

After +configuring the path to the script and Python DLL files, you can click the Apply button to accept the configuration.

+ +

Also shown are the following options:

+ +

3.      If you want the Python function to be +permanently added to the System Repository, then click the Save in System +Repository button.

+ +

4.      +You can +click on the Test Area tab in order to test the converter with +some sample data.

+ +

Saving the converter in the System Repository:

+ +

By default, if you click the Apply +or OK buttons, the configured converter will +be returned to the client application as a temporary converter for temporary +use. Once the client application (e.g. FieldWorks +or Word) is closed or releases the converter, it +will no longer be available. If you want the converter to be permanently +available to client applications, then you must explicitly add it to the System Repository using the Save +in System Repository button.

+ +

When you click this button, the following dialog box will +be displayed to query for a friendly name by +which the converter will be known in client applications:

+ +

+ +

 

+ +

For the Python Script converter, the default name will be the +file name of the Python script containing Convert function. However, you can +change it to something more descriptive if desired.

+ +

The Advanced tab can be +used to enter further, optional information about this converter which is also +put into the System Repository and can be used +by various client applications. Clicking this tab will bring up the following +dialog box:

+ +

+ +

 

+ +

Though these values are not necessary for the operation of +the converter, they can be helpful to various client applications. For example, +the Clipboard EncConverter can be configured to +filter the list of displayed converters based on the Encoding +Name and/or the Transduction Type +configured here.

+ +
+ + + + diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/colorschememapping.xml b/redist/Help/Python_3_Script_Plug-in_About_box_files/colorschememapping.xml new file mode 100644 index 00000000..6a0069cd --- /dev/null +++ b/redist/Help/Python_3_Script_Plug-in_About_box_files/colorschememapping.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/filelist.xml b/redist/Help/Python_3_Script_Plug-in_About_box_files/filelist.xml new file mode 100644 index 00000000..cb808d2a --- /dev/null +++ b/redist/Help/Python_3_Script_Plug-in_About_box_files/filelist.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/header.htm b/redist/Help/Python_3_Script_Plug-in_About_box_files/header.htm new file mode 100644 index 00000000..b24777d7 --- /dev/null +++ b/redist/Help/Python_3_Script_Plug-in_About_box_files/header.htm @@ -0,0 +1,59 @@ + + + + + + + + + + + + +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ + + + diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/image004.jpg b/redist/Help/Python_3_Script_Plug-in_About_box_files/image004.jpg new file mode 100644 index 00000000..8fc62575 Binary files /dev/null and b/redist/Help/Python_3_Script_Plug-in_About_box_files/image004.jpg differ diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/image006.jpg b/redist/Help/Python_3_Script_Plug-in_About_box_files/image006.jpg new file mode 100644 index 00000000..0374b8b4 Binary files /dev/null and b/redist/Help/Python_3_Script_Plug-in_About_box_files/image006.jpg differ diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/image010.jpg b/redist/Help/Python_3_Script_Plug-in_About_box_files/image010.jpg new file mode 100644 index 00000000..44e806c3 Binary files /dev/null and b/redist/Help/Python_3_Script_Plug-in_About_box_files/image010.jpg differ diff --git a/redist/Help/Python_3_Script_Plug-in_About_box_files/themedata.thmx b/redist/Help/Python_3_Script_Plug-in_About_box_files/themedata.thmx new file mode 100644 index 00000000..c2dd8c12 Binary files /dev/null and b/redist/Help/Python_3_Script_Plug-in_About_box_files/themedata.thmx differ diff --git a/redist/Help/Python_Script_Plug-in_About_box.htm b/redist/Help/Python_Script_Plug-in_About_box.htm index 79c783cd..b4c87e33 100644 --- a/redist/Help/Python_Script_Plug-in_About_box.htm +++ b/redist/Help/Python_Script_Plug-in_About_box.htm @@ -1213,7 +1213,7 @@

Python ScriptTo use this transduction processor, you must have a Python distribution (v. 2.7) installed on your machine. You can download free Python distributions, such as ActivePython 2.7 from ActivePython.

+href="http://www.activestate.com/activepython/downloads" target="_blank">ActivePython.

diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box.htm b/redist/Help/Vertex_AI_Translate_Plug-in_About_box.htm new file mode 100644 index 00000000..93122bb9 --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box.htm @@ -0,0 +1,2124 @@ + + + + + + + + + + + +Vertex AI Translate + + + + + + + + + + + +
+ +

Vertex AI Transducer

+ +

This +converter allows you to use Vertex AI +to do text processing within EncConverter-enabled applications. Vertex AI +is a cloud-based Artificial Intelligence service offered in Google Cloud with a +number of Translation-related generative AI models, such as PaLM API, Llama 2, and the Gemini Pro models in their Model Garden.

+ +

In +the EncConverters domain, this transducer can be used to do translation between +languages supported by the model (see this website for specific languages supported). Note that +it requires a live internet connection to function.

+ +

The +Vertex AI Transducer uses an Vertex AI Resource to do the translation, +which is available from Google’s portal, and unlike other +Translators supported by the EncConverters core (i.e. Google, Bing & +DeepL), the Vertex AI Resource requires you to get your own Vertex AI resource +in order to use it.

+ +

See +this website for more information on getting your own +Vertex AI Resource.

+ +

Setup Tab

+ +

Here is the configuration setup tab for the Vertex AI +EncConverter:

+ +

+ +

Figure 1: +Vertex AI Translate Setup 1, 2, +3, 4, 5, +6, 7, 8, 9, 10, +11

+ +

 

+ +

1)      +This text box is for entering the Google +Cloud Project ID in which you have a Vertex AI resource. See Google Cloud help +for help.

+ +

2)      This text box is for entering the Location Id +of your Vertex AI resource. See Google Cloud help +for instructions on creating a Vertex AI resource.

+ +

3)      This +text box is for entering the Publisher of your Vertex AI resource. (e.g. for a chat-bison AI resource, the publisher is google.

+ +

4)      This +text box is for entering the Model Id of your Vertex AI resource. (e.g. chat-bison, chat-bison-32k, +or gemini-pro).

+ +

5)      +This text box is for entering +the Source language of the input text for the translation operation.

+ +

6)      +This text box is for entering +the Target language the input text should be translated into.

+ +

7)      This combo box/text box is for choosing one +of the pre-existing additions or entering your own addition to be added to the System +Prompt to customize what is sent to the Vertex AI service.

+ +

In the example shown +above, the addition tells the AI language model to translate from Hindi to +English and request the result be “in a ‘free translation’ +style.”

+ +

The underlying language +model is quite good at understanding English and can adjust its translation for +most requests (e.g. even sending the results back in rhyme or in ‘Yoda +speak’ (OSV))

+ +

Click on the drop-down +arrow to the right of the box to see any pre-loaded or previously used +additions.

+ +

By default, the System +Prompt used is:

+ +

You are a Language Translator +that Translates between different languages. Your job is to translate the text +in the user prompt into the requested language according to the following +instructions: You will be given 1 or more lines of text in <SourceLanguage> +which you are to translate into <TargetLanguage> <additions> and +return only the translated lines.

+ +

This prompt was picked +to allow the converter to work well with the Paratext Back Translation plug-in, +which often has multiple lines (i.e. verses) of text to be processed and as the +language model often returns additional information about the input line to be +translated, by default, it is instructed to return only the translated text.

+ +

You can override this +formatted System Prompt to get any arbitrary results you want by using the +prefix: “UseSystemPrompt: ”

+ +

For example, to see if +it meets the needs of your application, you could start with the simple System +Prompt:

+ +

UseSystemPrompt: Translate +Hindi into English.

+ +

Then, the System Prompt +sent to the language model would simply be:

+ +

Translate Hindi into English.

+ +

Note that if you begin +this field with the string, “UseSystemPrompt: ”, then the Source +and Target language boxes will be ignored.

+ +

Finally, you should +note that the Vertex AI Resource has Content Filtering +and it may refuse to translate some text if it runs afoul of any of these four +areas: Violent, Harmful, Sexually explicit, Hate speech, Harassment, +Dangerous or Toxic.

+ +

8)      +This box shows the System Prompt that will be sent to +the Vertex AI service.

+ +

9)      +This +button brings up a dialog box into which you can enter the information needed +about your personal Google Cloud Account Credentials (see below for +information).

+ +

Note that unlike the +other Translators supported by EncConverters, the Vertex AI (currently) does +not have a free pricing tier, and so you must get your own resource to use it.

+ +

See this +webpage for how to get your own Vertex AI resource to use for this transducer.

+ +

10)  If you want the +converter to be permanently added to the System Repository, then you must click +the Save in System Repository button +(see below).

+ +

11)  You +can click on the Test Area tab to test the converter with some sample data.

+ +
+ +

You may not see script errors until you use the converter to +convert some data. So, for this converter type, it is important to test it +before trying it with real data.

+ +

You can also test various System Prompts in the Vertex AI +Studio mentioned below to find the specific one you want to use.

+ +
+ +

Entering your own Google Cloud Credentials

+ +

Once you acquire your own Vertex AI resource on the Google +Cloud portal, +you can enter the credentials (as json) to use it in the dialog that appears by +clicking the button on the Setup dialog (9)  above:

+ +

 

+ +

+ +

Figure 2: +Entering Vertex AI Credentials

+ +

 

+ +

The information you need for this dialog is available, +after you have created your Vertex AI Service Account, by click the APIs & +Services blade in the Google Cloud Console:

+ +

+ +

Figure 3: +Google Cloud Console to Create Credentials for Vertex AI Resource

+ +

 

+ +

From this credentials page, you can create a new +credentials (json) key that you will want to save in a safe place.

+ +

+ +

Figure 4: +Google Cloud Console Service Account Credentials Page

+ +

 

+ +

Using Environment +Variables to Store Google Cloud Credentials

+ +

Note that when the translator is used in different client +applications (e.g. Paratext, Word, or the Clipboard +EncConverter), the settings (including the credentials json message +mentioned above) are stored (encrypted) in the application settings file of the +specific application using it. So you may be asked to enter it in each +application that you want to use it in. Alternately, you can add the path to +the downloaded json file to the following environment variable (GOOGLE_APPLICATION_CREDENTIALS), and it will be +available to all applications:

+ +

+ +

Figure 5: +Environment Variable for Google Cloud Credentials

+ +

 

+ +

Saving the +converter in the System Repository:

+ +

By default, if you click the Apply or OK +buttons, the configured converter will be returned to the client application as +a temporary converter for temporary use. Once the client application (e.g. Paratext or Word) is +closed or releases the converter, it will no longer be available. If you want +the converter to be permanently available to client applications, then you must +explicitly add it to the System Repository using +the Save in System Repository button.

+ +

When you click this button, the following dialog box will +be displayed to query for a friendly name by +which the converter will be known in client applications:

+ +

 

+ +

+ +

 

+ +

The Advanced Tab can be used to enter further, optional +information about this converter, which is also put into the System Repository and can be used by various client +applications. Click on this tab to display the following dialog box:

+ +

+ +

 

+ +

Though these values are not necessary for the operation of +the converter, they can be helpful to various client applications. For example, +the Clipboard EncConverter can be configured to +filter the list of displayed converters based on the Encoding Name +and/or the Transduction Type configured here.

+ +
+ + + + diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/colorschememapping.xml b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/colorschememapping.xml new file mode 100644 index 00000000..6a0069cd --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/colorschememapping.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/filelist.xml b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/filelist.xml new file mode 100644 index 00000000..83b6661c --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/filelist.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/header.htm b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/header.htm new file mode 100644 index 00000000..eb2550fe --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/header.htm @@ -0,0 +1,61 @@ + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ + + + diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image001.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image001.jpg new file mode 100644 index 00000000..8a85e291 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image001.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image002.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image002.jpg new file mode 100644 index 00000000..a8c2ada1 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image002.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image003.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image003.jpg new file mode 100644 index 00000000..27282e74 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image003.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image005.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image005.jpg new file mode 100644 index 00000000..92e28971 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image005.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image006.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image006.jpg new file mode 100644 index 00000000..9c69afd1 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image006.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image007.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image007.jpg new file mode 100644 index 00000000..37743359 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image007.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image012.jpg b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image012.jpg new file mode 100644 index 00000000..18367c15 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/image012.jpg differ diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/item0015.xml b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/item0015.xml new file mode 100644 index 00000000..df14848b --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/item0015.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/props016.xml b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/props016.xml new file mode 100644 index 00000000..9621d74e --- /dev/null +++ b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/props016.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/themedata.thmx b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/themedata.thmx new file mode 100644 index 00000000..3d2a4372 Binary files /dev/null and b/redist/Help/Vertex_AI_Translate_Plug-in_About_box_files/themedata.thmx differ diff --git a/redist/MapsTables/PythonExamples/ReverseString.py b/redist/MapsTables/PythonExamples/ReverseString.py index 5f7b3f37..e69c6d01 100644 --- a/redist/MapsTables/PythonExamples/ReverseString.py +++ b/redist/MapsTables/PythonExamples/ReverseString.py @@ -14,18 +14,18 @@ def Convert(s): ## Warning: The following testing code will not work on Python 3. result = Convert(b'mop') expected = b'pom' - print b"result: %s" % repr(result) + print(b"result: %s" % repr(result)) if result != expected: - print b"unexpected result; expected %s" % repr(expected) + print(b"unexpected result; expected %s" % repr(expected)) exit() ui = u"மோப" # Tamil Ma + Oo + Pa - print u"sending: %s " % repr(ui) + print(u"sending: %s " % repr(ui)) result = Convert(ui) - print u"result: %s" % repr(result) + print(u"result: %s" % repr(result)) expected = u"போம" # Tamil Pa + Oo + Ma if result == expected: - print "ok" + print("ok") else: - print u"unexpected result; expected %s" % repr(expected) + print(u"unexpected result; expected %s" % repr(expected)) diff --git a/redist/MapsTables/PythonExamples/ToLowerCase.py b/redist/MapsTables/PythonExamples/ToLowerCase.py index f8339458..129c0ea3 100644 --- a/redist/MapsTables/PythonExamples/ToLowerCase.py +++ b/redist/MapsTables/PythonExamples/ToLowerCase.py @@ -8,9 +8,9 @@ def Convert(bytesInput): ## Warning: The following testing code will not work on Python 3. result = Convert(b'ASdG') expected = b'asdg' - print b"result: %s" % repr(result) + print(b"result: %s" % repr(result)) if result == expected: - print "ok" + print("ok") else: - print b"unexpected result; expected %s" % repr(expected) + print(b"unexpected result; expected %s" % repr(expected)) diff --git a/redist/MapsTables/PythonExamples/ToNfc.py b/redist/MapsTables/PythonExamples/ToNfc.py index e1bbc6a6..f54a4990 100644 --- a/redist/MapsTables/PythonExamples/ToNfc.py +++ b/redist/MapsTables/PythonExamples/ToNfc.py @@ -12,12 +12,12 @@ def Convert(u): if __name__ == '__main__': ## Warning: The following testing code will not work on Python 3. uInput = u"Ę" # NFD string - print u"sending: %s" % repr(uInput) + print(u"sending: %s" % repr(uInput)) result = Convert(uInput) - print u"result: %s" % repr(result) + print(u"result: %s" % repr(result)) expected = u"Ę" # NFC string if result == expected: - print "ok" + print("ok") else: - print u"unexpected result; expected %s" % repr(expected) + print(u"unexpected result; expected %s" % repr(expected)) diff --git a/redist/MapsTables/PythonExamples/ToNfd.py b/redist/MapsTables/PythonExamples/ToNfd.py index b567bc80..0a945d78 100644 --- a/redist/MapsTables/PythonExamples/ToNfd.py +++ b/redist/MapsTables/PythonExamples/ToNfd.py @@ -12,12 +12,12 @@ def Convert(u): if __name__ == '__main__': ## Warning: The following testing code will not work on Python 3. uInput = u"क़" # NFC string - print u"sending: %s" % repr(uInput) + print(u"sending: %s" % repr(uInput)) result = Convert(uInput) - print u"result: %s" % repr(result) + print(u"result: %s" % repr(result)) expected = u"क़" # NFD string if result == expected: - print "ok" + print("ok") else: - print u"unexpected result; expected %s" % repr(expected) + print(u"unexpected result; expected %s" % repr(expected)) diff --git a/redist/MapsTables/PythonExamples/ToUnicodeNames.py b/redist/MapsTables/PythonExamples/ToUnicodeNames.py index 78885b73..189b49e0 100644 --- a/redist/MapsTables/PythonExamples/ToUnicodeNames.py +++ b/redist/MapsTables/PythonExamples/ToUnicodeNames.py @@ -18,11 +18,11 @@ def Convert(u): if __name__ == '__main__': ## Warning: The following testing code will not work on Python 3. uInput = u"क़" - print u"sending: %s" % repr(uInput) + print(u"sending: %s" % repr(uInput)) result = Convert(uInput) - print "result: %s" % repr(result) + print("result: %s" % repr(result)) expected = "DEVANAGARI LETTER KA; DEVANAGARI SIGN NUKTA; " if result == expected: - print "ok" + print("ok") else: - print "unexpected result; expected %s" % repr(expected) + print("unexpected result; expected %s" % repr(expected)) diff --git a/redist/MapsTables/PythonExamples/ToUpperCase.py b/redist/MapsTables/PythonExamples/ToUpperCase.py index b3dbf16e..b21911d3 100644 --- a/redist/MapsTables/PythonExamples/ToUpperCase.py +++ b/redist/MapsTables/PythonExamples/ToUpperCase.py @@ -8,8 +8,8 @@ def Convert(bytesInput): ## Warning: The following testing code will not work on Python 3. result = Convert(b'asdg') expected = b'ASDG' - print b"result: %s" % repr(result) + print(b"result: %s" % repr(result)) if result == expected: - print "ok" + print("ok") else: - print b"unexpected result; expected %s" % repr(expected) + print(b"unexpected result; expected %s" % repr(expected)) diff --git a/src/BackTranslationHelper/BackTranslationHelper.csproj b/src/BackTranslationHelper/BackTranslationHelper.csproj index c4f2f0d6..420731b0 100644 --- a/src/BackTranslationHelper/BackTranslationHelper.csproj +++ b/src/BackTranslationHelper/BackTranslationHelper.csproj @@ -103,17 +103,32 @@ BackTranslationHelperCtrl.cs - - - + Form - + + ExampleEditorDialog.cs + + + True True Resources.resx + + Form + + + TranslatorListForm.cs + + + ExampleEditorDialog.cs + + + TranslatorListForm.cs + + True True @@ -125,13 +140,10 @@ BackTranslationHelperCtrl.cs Designer - - TranslatorListForm.cs - ResXFileCodeGenerator - Resources.Designer.cs Designer + Resources.Designer.cs @@ -154,6 +166,9 @@ + + + diff --git a/src/BackTranslationHelper/BackTranslationHelperCtrl.cs b/src/BackTranslationHelper/BackTranslationHelperCtrl.cs index b967ae1c..cc587344 100644 --- a/src/BackTranslationHelper/BackTranslationHelperCtrl.cs +++ b/src/BackTranslationHelper/BackTranslationHelperCtrl.cs @@ -1,6 +1,7 @@ using ECInterfaces; using SilEncConverters40; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; @@ -8,13 +9,26 @@ using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; namespace BackTranslationHelper { public partial class BackTranslationHelperCtrl : UserControl { - public int MaxPossibleTargetTranslations = 3; // to add more, you have to add new lines like the one starting at row 2 + public const int MaxPossibleTargetTranslations = 4; // to add more, you have to add new lines like the one starting at row 2 + + // I could make the EcTranslator project a dependency to this project and use NllbEncConverter.CstrDisplayName instead, but... + private const string NllbEncConverterDisplayName = "NLLB Translator"; + + private readonly List PromptTranslatorConfiguratorDisplayNames = new List + { + "Azure OpenAI Translator", "Vertex AI Translator" + }; + + private const string NllbEncConverterSplitSentencesPrefix = @"\SplitSentences "; + #region Member variables // the form in which this UserControl is embedded will initialize these @@ -24,6 +38,7 @@ public partial class BackTranslationHelperCtrl : UserControl public DirectableEncConverter TheFindReplaceConverter; public BackTranslationHelperModel _model; public bool IsModified = false; + public bool IsPaused = false; // if the client form wants to stop the translations (e.g. Paratext when checking in different verses and the user doesn't want each one translated) /// /// keep track of some recently translated portions, so we can avoid calling to Bing again for the same input data @@ -41,8 +56,8 @@ public BackTranslationHelperCtrl() this.MouseWheel += new MouseEventHandler(this.UserControl_MouseWheel); this.textBoxTargetBackTranslation.MouseWheel += new MouseEventHandler(this.TargetBackTranslation_MouseWheel); hideCurrentTargetTextToolStripMenuItem.Checked = Properties.Settings.Default.HideCurrentTargetText; - hideSourceTextToolStripMenuItem.Checked = Properties.Settings.Default.HideSourceText; - } + hideSourceTextToolStripMenuItem.Checked = Properties.Settings.Default.HideSourceText; + } protected override void OnParentChanged(EventArgs e) { @@ -56,18 +71,20 @@ protected override void OnParentChanged(EventArgs e) if (parent is Form parentForm) { - buttonPinToTop.Image = global::BackTranslationHelper.Properties.Resources.pindown; - parentForm.TopMost = true; - } - } + buttonPinToTop.Image = global::BackTranslationHelper.Properties.Resources.pindown; + parentForm.TopMost = true; + } + } } - private void SettingsToolStripMenuItem_DropDownOpening(object sender, EventArgs e) - { - this.hideCurrentTargetTextToolStripMenuItem.Visible = (_model == null) || (_model.DisplayExistingTargetTranslation); - } + private void SettingsToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + this.hideCurrentTargetTextToolStripMenuItem.Visible = (_model == null) || (_model.DisplayExistingTargetTranslation); + this.SentenceSplittingMenuItem.Enabled = TheTranslators.Any(t => t.Configurator?.ConfiguratorDisplayName == NllbEncConverterDisplayName); + this.AddExampleMenuItem.Enabled = this.PurgeExamplesMenuItem.Enabled = PromptTranslators.Any(); + } - private void TargetBackTranslation_MouseWheel(object sender, MouseEventArgs e) + private void TargetBackTranslation_MouseWheel(object sender, MouseEventArgs e) { UserControl_MouseWheel(sender, e); } @@ -100,129 +117,146 @@ private void TextBoxTargetBackTranslation_TextChanged(object sender, System.Even } } - public void AddToSettingsMenu(System.Windows.Forms.ToolStripMenuItem menuItem) - { - settingsToolStripMenuItem.DropDownItems.Add(menuItem); - } - #endregion - - public void Initialize(BackTranslationHelperModel model) - { - var displayExistingTargetTranslation = model.DisplayExistingTargetTranslation; - var targetIsEditable = model.IsTargetTranslationEditable; - - CheckInitializeFindReplaceHelper(); - BackTranslationHelperDataSource.SetDataUpdateProc(UpdateData); - - // get the last used converter names from settings - InitializeTheTranslators(); - - tableLayoutPanel.SuspendLayout(); - SuspendLayout(); - - hideColumn1LabelsToolStripMenuItem.Checked = Properties.Settings.Default.HideLabels; - InitializeLabelHiding(); - - var projectName = BackTranslationHelperDataSource.ProjectName; - toolStripTextBoxStatus.Size = CalculateStatusLineSize(toolStripTextBoxStatus, settingsToolStripMenuItem); - - var nRowStyleOffset = 0; // start w/ the Source Language text box - - ExpandOrCollapse(!Properties.Settings.Default.HideSourceText, nRowStyleOffset++, - textBoxSourceData, GetSourceLanguageFontForProject(projectName), GetSourceLanguageRightToLeftForProject(projectName)); - - var targetLanguageFont = GetTargetLanguageFontForProject(projectName); - var targetLanguageRightToLeft = GetTargetLanguageRightToLeftForProject(projectName); - - var hideCurrentTargetText = Properties.Settings.Default.HideCurrentTargetText; - ExpandOrCollapse(displayExistingTargetTranslation && !hideCurrentTargetText, nRowStyleOffset++, - textBoxTargetTextExisting, targetLanguageFont, targetLanguageRightToLeft); - - textBoxTargetBackTranslation.Font = targetLanguageFont; - textBoxTargetBackTranslation.RightToLeft = targetLanguageRightToLeft; - textBoxTargetBackTranslation.ReadOnly = !targetIsEditable; - - // we're either showing the target translated suggestion in a textbox (if there's only 1 converter) - // or in readonly textboxes (so they can have scroll bars) above it to choose from (if there are more than one converter) - var textBoxesPossibleTargetTranslations = tableLayoutPanel.Controls.OfType().Where(l => l.Name.Contains("textBoxPossibleTargetTranslation")).ToList(); - var buttonsFillTargetOption = tableLayoutPanel.Controls.OfType + +
+

Target

+ + +
+
+ +

API instructions

+
    +
  • GET /api/v1/translate/languages/
  • +
  • POST /api/v1/translate/ with sourceLanguage, targetLanguage, text
  • +
+ + + diff --git a/src/EcTranslators/NllbTranslator/NllbHumanReadableLgNames.json b/src/EcTranslators/NllbTranslator/NllbHumanReadableLgNames.json new file mode 100644 index 00000000..6135652f --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbHumanReadableLgNames.json @@ -0,0 +1,806 @@ +[ + { + "Code": "zul_Latn", + "Name": "Zulu (Latin script)" + }, + { + "Code": "zsm_Latn", + "Name": "Standard Malay (Latin script)" + }, + { + "Code": "zho_Hant", + "Name": "Chinese (Traditional Han script)" + }, + { + "Code": "zho_Hans", + "Name": "Chinese (Simplified Han script)" + }, + { + "Code": "yue_Hant", + "Name": "Cantonese (Traditional Han script)" + }, + { + "Code": "yor_Latn", + "Name": "Yoruba (Latin script)" + }, + { + "Code": "ydd_Hebr", + "Name": "Yiddish (Hebrew script)" + }, + { + "Code": "xho_Latn", + "Name": "Xhosa (Latin script)" + }, + { + "Code": "wol_Latn", + "Name": "Wolof (Latin script)" + }, + { + "Code": "war_Latn", + "Name": "Waray (Latin script)" + }, + { + "Code": "vie_Latn", + "Name": "Vietnamese (Latin script)" + }, + { + "Code": "vec_Latn", + "Name": "Venetian (Latin script)" + }, + { + "Code": "uzn_Latn", + "Name": "Uzbek (Latin script)" + }, + { + "Code": "urd_Arab", + "Name": "Urdu (Arabic script)" + }, + { + "Code": "umb_Latn", + "Name": "Umbundu (Latin script)" + }, + { + "Code": "ukr_Cyrl", + "Name": "Ukrainian (Cyrillic script)" + }, + { + "Code": "uig_Arab", + "Name": "Uyghur (Arabic script)" + }, + { + "Code": "tzm_Tfng", + "Name": "Central Atlas Tamazight (Tifinagh script)" + }, + { + "Code": "twi_Latn", + "Name": "Twi (Latin script)" + }, + { + "Code": "tur_Latn", + "Name": "Turkish (Latin script)" + }, + { + "Code": "tum_Latn", + "Name": "Tumbuka (Latin script)" + }, + { + "Code": "tuk_Latn", + "Name": "Turkmen (Latin script)" + }, + { + "Code": "tso_Latn", + "Name": "Tsonga (Latin script)" + }, + { + "Code": "tsn_Latn", + "Name": "Tswana (Latin script)" + }, + { + "Code": "tpi_Latn", + "Name": "Tok Pisin (Latin script)" + }, + { + "Code": "tir_Ethi", + "Name": "Tigrinya (Ethiopic script)" + }, + { + "Code": "tha_Thai", + "Name": "Thai (Thai script)" + }, + { + "Code": "tgl_Latn", + "Name": "Tagalog (Latin script)" + }, + { + "Code": "tgk_Cyrl", + "Name": "Tajik (Cyrillic script)" + }, + { + "Code": "tel_Telu", + "Name": "Telugu (Telugu script)" + }, + { + "Code": "tat_Cyrl", + "Name": "Tatar (Cyrillic script)" + }, + { + "Code": "taq_Tfng", + "Name": "Tamasheq (Tifinagh script)" + }, + { + "Code": "taq_Latn", + "Name": "Tamasheq (Latin script)" + }, + { + "Code": "tam_Taml", + "Name": "Tamil (Tamil script)" + }, + { + "Code": "szl_Latn", + "Name": "Silesian (Latin script)" + }, + { + "Code": "swh_Latn", + "Name": "Swahili (Latin script)" + }, + { + "Code": "swe_Latn", + "Name": "Swedish (Latin script)" + }, + { + "Code": "sun_Latn", + "Name": "Sundanese (Latin script)" + }, + { + "Code": "ssw_Latn", + "Name": "Swazi (Latin script)" + }, + { + "Code": "srp_Cyrl", + "Name": "Serbian (Cyrillic script)" + }, + { + "Code": "srd_Latn", + "Name": "Sardinian (Latin script)" + }, + { + "Code": "spa_Latn", + "Name": "Spanish (Latin script)" + }, + { + "Code": "sot_Latn", + "Name": "Sotho (Latin script)" + }, + { + "Code": "som_Latn", + "Name": "Somali (Latin script)" + }, + { + "Code": "snd_Arab", + "Name": "Sindhi (Arabic script)" + }, + { + "Code": "sna_Latn", + "Name": "Shona (Latin script)" + }, + { + "Code": "smo_Latn", + "Name": "Samoan (Latin script)" + }, + { + "Code": "slv_Latn", + "Name": "Slovenian (Latin script)" + }, + { + "Code": "slk_Latn", + "Name": "Slovak (Latin script)" + }, + { + "Code": "sin_Sinh", + "Name": "Sinhala (Sinhala script)" + }, + { + "Code": "shn_Mymr", + "Name": "Shan (Myanmar script)" + }, + { + "Code": "scn_Latn", + "Name": "Sicilian (Latin script)" + }, + { + "Code": "sat_Beng", + "Name": "Santali (Bengali script)" + }, + { + "Code": "san_Deva", + "Name": "Sanskrit (Devanagari script)" + }, + { + "Code": "sag_Latn", + "Name": "Sango (Latin script)" + }, + { + "Code": "rus_Cyrl", + "Name": "Russian (Cyrillic script)" + }, + { + "Code": "run_Latn", + "Name": "Rundi (Latin script)" + }, + { + "Code": "ron_Latn", + "Name": "Romanian (Latin script)" + }, + { + "Code": "quy_Latn", + "Name": "Ayacucho Quechua (Latin script)" + }, + { + "Code": "prs_Arab", + "Name": "Dari (Arabic script)" + }, + { + "Code": "por_Latn", + "Name": "Portuguese (Latin script)" + }, + { + "Code": "pol_Latn", + "Name": "Polish (Latin script)" + }, + { + "Code": "plt_Latn", + "Name": "Malagasy (Latin script)" + }, + { + "Code": "pes_Arab", + "Name": "Western Farsi (Arabic script)" + }, + { + "Code": "pbt_Arab", + "Name": "Northern Pashto (Arabic script)" + }, + { + "Code": "pap_Latn", + "Name": "Papiamento (Latin script)" + }, + { + "Code": "pan_Guru", + "Name": "Punjabi (Gurmukhi script)" + }, + { + "Code": "pag_Latn", + "Name": "Pangasinan (Latin script)" + }, + { + "Code": "ory_Orya", + "Name": "Odia (Oriya script)" + }, + { + "Code": "oci_Latn", + "Name": "Occitan (Latin script)" + }, + { + "Code": "nya_Latn", + "Name": "Chichewa (Latin script)" + }, + { + "Code": "nus_Latn", + "Name": "Nuer (Latin script)" + }, + { + "Code": "npi_Deva", + "Name": "Nepali (Devanagari script)" + }, + { + "Code": "nob_Latn", + "Name": "Norwegian (Bokmål, Latin script)" + }, + { + "Code": "nno_Latn", + "Name": "Norwegian (Nynorsk, Latin script)" + }, + { + "Code": "nld_Latn", + "Name": "Dutch (Latin script)" + }, + { + "Code": "mya_Mymr", + "Name": "Burmese (Myanmar script)" + }, + { + "Code": "mri_Latn", + "Name": "Maori (Latin script)" + }, + { + "Code": "mos_Latn", + "Name": "Mossi (Latin script)" + }, + { + "Code": "mni_Beng", + "Name": "Manipuri (Bengali script)" + }, + { + "Code": "mlt_Latn", + "Name": "Maltese (Latin script)" + }, + { + "Code": "mkd_Cyrl", + "Name": "Macedonian (Cyrillic script)" + }, + { + "Code": "min_Latn", + "Name": "Minangkabau (Latin script)" + }, + { + "Code": "mar_Deva", + "Name": "Marathi (Devanagari script)" + }, + { + "Code": "mal_Mlym", + "Name": "Malayalam (Malayalam script)" + }, + { + "Code": "mai_Deva", + "Name": "Maithili (Devanagari script)" + }, + { + "Code": "mag_Deva", + "Name": "Magahi (Devanagari script)" + }, + { + "Code": "lvs_Latn", + "Name": "Latvian (Latin script)" + }, + { + "Code": "lus_Latn", + "Name": "Mizo (Latin script)" + }, + { + "Code": "luo_Latn", + "Name": "Luo (Latin script)" + }, + { + "Code": "lug_Latn", + "Name": "Luganda (Latin script)" + }, + { + "Code": "lua_Latn", + "Name": "Luba-Kasai (Latin script)" + }, + { + "Code": "ltz_Latn", + "Name": "Luxembourgish (Latin script)" + }, + { + "Code": "ltg_Latn", + "Name": "Latgalian (Latin script)" + }, + { + "Code": "lmo_Latn", + "Name": "Lombard (Latin script)" + }, + { + "Code": "lit_Latn", + "Name": "Lithuanian (Latin script)" + }, + { + "Code": "lin_Latn", + "Name": "Lingala (Latin script)" + }, + { + "Code": "lim_Latn", + "Name": "Limburgish (Latin script)" + }, + { + "Code": "lij_Latn", + "Name": "Ligurian (Latin script)" + }, + { + "Code": "lao_Laoo", + "Name": "Lao (Lao script)" + }, + { + "Code": "kor_Hang", + "Name": "Korean (Hangul script)" + }, + { + "Code": "kon_Latn", + "Name": "Kongo (Latin script)" + }, + { + "Code": "knc_Latn", + "Name": "Central Kanuri (Latin script)" + }, + { + "Code": "knc_Arab", + "Name": "Central Kanuri (Arabic script)" + }, + { + "Code": "kmr_Latn", + "Name": "Northern Kurdish (Latin script)" + }, + { + "Code": "kmb_Latn", + "Name": "Kimbundu (Latin script)" + }, + { + "Code": "kir_Cyrl", + "Name": "Kyrgyz (Cyrillic script)" + }, + { + "Code": "kin_Latn", + "Name": "Kinyarwanda (Latin script)" + }, + { + "Code": "kik_Latn", + "Name": "Kikuyu (Latin script)" + }, + { + "Code": "khm_Khmr", + "Name": "Khmer (Khmer script)" + }, + { + "Code": "khk_Cyrl", + "Name": "Khakass (Cyrillic script)" + }, + { + "Code": "kea_Latn", + "Name": "Kabuverdianu (Latin script)" + }, + { + "Code": "kbp_Latn", + "Name": "Kabiye (Latin script)" + }, + { + "Code": "kaz_Cyrl", + "Name": "Kazakh (Cyrillic script)" + }, + { + "Code": "kat_Geor", + "Name": "Georgian (Georgian script)" + }, + { + "Code": "kas_Deva", + "Name": "Kashmiri (Devanagari script)" + }, + { + "Code": "kas_Arab", + "Name": "Kashmiri (Arabic script)" + }, + { + "Code": "kan_Knda", + "Name": "Kannada (Kannada script)" + }, + { + "Code": "kam_Latn", + "Name": "Kamba (Latin script)" + }, + { + "Code": "kac_Latn", + "Name": "Kachin (Latin script)" + }, + { + "Code": "kab_Latn", + "Name": "Kabyle (Latin script)" + }, + { + "Code": "jpn_Jpan", + "Name": "Japanese (Japanese script)" + }, + { + "Code": "jav_Latn", + "Name": "Javanese (Latin script)" + }, + { + "Code": "ita_Latn", + "Name": "Italian (Latin script)" + }, + { + "Code": "isl_Latn", + "Name": "Icelandic (Latin script)" + }, + { + "Code": "ind_Latn", + "Name": "Indonesian (Latin script)" + }, + { + "Code": "ilo_Latn", + "Name": "Iloko (Latin script)" + }, + { + "Code": "ibo_Latn", + "Name": "Igbo (Latin script)" + }, + { + "Code": "hye_Armn", + "Name": "Armenian (Armenian script)" + }, + { + "Code": "hun_Latn", + "Name": "Hungarian (Latin script)" + }, + { + "Code": "hrv_Latn", + "Name": "Croatian (Latin script)" + }, + { + "Code": "hne_Deva", + "Name": "Chhattisgarhi (Devanagari script)" + }, + { + "Code": "hin_Deva", + "Name": "Hindi (Devanagari script)" + }, + { + "Code": "heb_Hebr", + "Name": "Hebrew (Hebrew script)" + }, + { + "Code": "hau_Latn", + "Name": "Hausa (Latin script)" + }, + { + "Code": "hat_Latn", + "Name": "Haitian Creole (Latin script)" + }, + { + "Code": "guj_Gujr", + "Name": "Gujarati (Gujarati script)" + }, + { + "Code": "grn_Latn", + "Name": "Guarani (Latin script)" + }, + { + "Code": "glg_Latn", + "Name": "Galician (Latin script)" + }, + { + "Code": "gle_Latn", + "Name": "Irish (Latin script)" + }, + { + "Code": "gla_Latn", + "Name": "Scottish Gaelic (Latin script)" + }, + { + "Code": "gaz_Latn", + "Name": "West Central Oromo (Latin script)" + }, + { + "Code": "fuv_Latn", + "Name": "Nigerian Fulfulde (Latin script)" + }, + { + "Code": "fur_Latn", + "Name": "Friulian (Latin script)" + }, + { + "Code": "fra_Latn", + "Name": "French (Latin script)" + }, + { + "Code": "fon_Latn", + "Name": "Fon (Latin script)" + }, + { + "Code": "fin_Latn", + "Name": "Finnish (Latin script)" + }, + { + "Code": "fij_Latn", + "Name": "Fijian (Latin script)" + }, + { + "Code": "fao_Latn", + "Name": "Faroese (Latin script)" + }, + { + "Code": "ewe_Latn", + "Name": "Ewe (Latin script)" + }, + { + "Code": "eus_Latn", + "Name": "Basque (Latin script)" + }, + { + "Code": "est_Latn", + "Name": "Estonian (Latin script)" + }, + { + "Code": "epo_Latn", + "Name": "Esperanto (Latin script)" + }, + { + "Code": "eng_Latn", + "Name": "English (Latin script)" + }, + { + "Code": "ell_Grek", + "Name": "Greek (Greek script)" + }, + { + "Code": "dzo_Tibt", + "Name": "Dzongkha (Tibetan script)" + }, + { + "Code": "dyu_Latn", + "Name": "Dyula (Latin script)" + }, + { + "Code": "dik_Latn", + "Name": "Dinka (Latin script)" + }, + { + "Code": "deu_Latn", + "Name": "German (Latin script)" + }, + { + "Code": "dan_Latn", + "Name": "Danish (Latin script)" + }, + { + "Code": "cym_Latn", + "Name": "Welsh (Latin script)" + }, + { + "Code": "crh_Latn", + "Name": "Crimean Tatar (Latin script)" + }, + { + "Code": "ckb_Arab", + "Name": "Central Kurdish (Arabic script)" + }, + { + "Code": "cjk_Latn", + "Name": "Korean (Latin script)" + }, + { + "Code": "ces_Latn", + "Name": "Czech (Latin script)" + }, + { + "Code": "ceb_Latn", + "Name": "Cebuano (Latin script)" + }, + { + "Code": "cat_Latn", + "Name": "Catalan (Latin script)" + }, + { + "Code": "bul_Cyrl", + "Name": "Bulgarian (Cyrillic script)" + }, + { + "Code": "bug_Latn", + "Name": "Buginese (Latin script)" + }, + { + "Code": "bos_Latn", + "Name": "Bosnian (Latin script)" + }, + { + "Code": "bod_Tibt", + "Name": "Tibetan (Tibetan script)" + }, + { + "Code": "bjn_Latn", + "Name": "Banjar (Latin script)" + }, + { + "Code": "bjn_Arab", + "Name": "Banjar (Arabic script)" + }, + { + "Code": "bho_Deva", + "Name": "Bhojpuri (Devanagari script)" + }, + { + "Code": "ben_Beng", + "Name": "Bengali (Bengali script)" + }, + { + "Code": "bem_Latn", + "Name": "Bemba (Latin script)" + }, + { + "Code": "bel_Cyrl", + "Name": "Belarusian (Cyrillic script)" + }, + { + "Code": "ban_Latn", + "Name": "Balinese (Latin script)" + }, + { + "Code": "bam_Latn", + "Name": "Bambara (Latin script)" + }, + { + "Code": "bak_Cyrl", + "Name": "Bashkir (Cyrillic script)" + }, + { + "Code": "azj_Latn", + "Name": "North Azerbaijani (Latin script)" + }, + { + "Code": "azb_Arab", + "Name": "South Azerbaijani (Arabic script)" + }, + { + "Code": "ayr_Latn", + "Name": "Central Aymara (Latin script)" + }, + { + "Code": "awa_Deva", + "Name": "Awadhi (Devanagari script)" + }, + { + "Code": "ast_Latn", + "Name": "Asturian (Latin script)" + }, + { + "Code": "asm_Beng", + "Name": "Assamese (Bengali script)" + }, + { + "Code": "arz_Arab", + "Name": "Egyptian Arabic (Arabic script)" + }, + { + "Code": "ary_Arab", + "Name": "Moroccan Arabic (Arabic script)" + }, + { + "Code": "ars_Arab", + "Name": "Najdi Arabic (Arabic script)" + }, + { + "Code": "arb_Arab", + "Name": "Standard Arabic (Arabic script)" + }, + { + "Code": "apc_Arab", + "Name": "Palestinian Arabic (Arabic script)" + }, + { + "Code": "amh_Ethi", + "Name": "Amharic (Ethiopian script)" + }, + { + "Code": "als_Latn", + "Name": "Tosk Albanian (Latin script)" + }, + { + "Code": "aka_Latn", + "Name": "Akan (Latin script)" + }, + { + "Code": "ajp_Arab", + "Name": "South Levantine Arabic (Arabic script)" + }, + { + "Code": "afr_Latn", + "Name": "Afrikaans (Latin script)" + }, + { + "Code": "aeb_Arab", + "Name": "Tunisian Arabic (Arabic script)" + }, + { + "Code": "acq_Arab", + "Name": "Ta'izzi-Adeni Arabic (Arabic script)" + }, + { + "Code": "acm_Arab", + "Name": "Iraqi Arabic (Arabic script)" + }, + { + "Code": "ace_Latn", + "Name": "Acehnese (Latin script)" + }, + { + "Code": "ace_Arab", + "Name": "Acehnese (Arabic script)" + } +] \ No newline at end of file diff --git a/src/EcTranslators/NllbTranslator/NllbLanguage.cs b/src/EcTranslators/NllbTranslator/NllbLanguage.cs new file mode 100644 index 00000000..67672e89 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbLanguage.cs @@ -0,0 +1,129 @@ +// Copyright 2022 DeepL SE (https://www.deepl.com) +// Use of this source code is governed by an MIT +// license that can be found in the LICENSE file. + +using System; +using System.Globalization; +using System.Text.Json.Serialization; + +namespace Nllb.Model +{ + /// + /// A language supported by DeepL translation. The class provides functions to retrieve + /// the available source and target languages. objects are considered equal if their + /// language codes match. + /// + /// + /// + public class Language : IEquatable + { + /// Initializes a new Language object. + /// The language code. + /// The name of the language in English. + //protected Language(string code, string name) + //{ + // Code = DeepL.LanguageCode.Standardize(code); + // Name = name; + //} + + /// Initializes a new Language object. + /// The language code. + /// The name of the language in English. + protected Language(string name) + { + Name = name; + } + + /// The name of the language in English, for example "Italian" or "Romanian". + public string Name { get; } + + /// + /// The language code, for example "it", "ro" or "en-US". Language codes follow ISO 639-1 with an optional + /// regional code from ISO 3166-1. + /// + [JsonPropertyName("language")] + public string Code { get; } + + /// Creates a object corresponding to this language. + public CultureInfo CultureInfo => new CultureInfo(Code); + + /// + /// Returns true if the other object has the same language code, otherwise + /// false. + /// + /// to compare with. + /// true if languages have the same language code, otherwise false. + public bool Equals(Language? other) + { + if (ReferenceEquals(null, other)) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + return Code == other.Code; + } + + /// Converts the language to a string containing the name and language code. + /// A string containing the name and language code of the language. + /// + /// This function is for diagnostic purposes only; the content of the returned string is exempt from backwards + /// compatibility. + /// + public override string ToString() => $"{Name} ({Code})"; + + /// Implicitly cast to string using the language code. + /// object to cast into string. + /// String containing the language code. + public static implicit operator string(Language language) => language.Code; + + /// + /// Determines whether this instance and a specified object, which must also be a object, + /// have the same value. objects are considered equal if their language codes match. + /// + /// The Language to compare to this instance. + /// + /// true if is a and its value is the same as this + /// instance; otherwise, false. If is null, the method + /// returns false. + /// + public override bool Equals(object? obj) => ReferenceEquals(this, obj) || (obj is Language other && Equals(other)); + + /// + /// Returns the hash code for this object, that is simply the hash code of the language + /// code. + /// + /// A 32-bit signed integer hash code. + public override int GetHashCode() => Code.GetHashCode(); + + /// Determines whether two specified Languages have the same value. + /// The first Language to compare, or null. + /// The second Language to compare, or null. + /// + /// true if the value of is the same as the value of ; + /// otherwise, false. + /// + public static bool operator ==(Language? a, Language? b) + { + if ((object?)a == null || (object?)b == null) + { + return Equals(a, b); + } + + return a.Equals(b); + } + + /// Determines whether two specified Languages have different values. + /// The first Language to compare, or null. + /// The second Language to compare, or null. + /// + /// true if the value of is different from the value of , + /// otherwise false. + /// + public static bool operator !=(Language? a, Language? b) => !(a == b); + } +} diff --git a/src/EcTranslators/NllbTranslator/NllbTextResult.cs b/src/EcTranslators/NllbTranslator/NllbTextResult.cs new file mode 100644 index 00000000..cdf65951 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTextResult.cs @@ -0,0 +1,39 @@ +// Copyright 2022 DeepL SE (https://www.deepl.com) +// Use of this source code is governed by an MIT +// license that can be found in the LICENSE file. + +using System.Text.Json.Serialization; + +namespace DeepL.Model +{ + /// The result of a text translation. + public sealed class NllbTextResult + { + /// Initializes a new instance of . + /// Translated text. + /// The detected language code of the input text. + /// + /// The constructor for this class (and all other Model classes) should not be used by library users. Ideally it + /// would be marked , but needs to be for JSON deserialization. + /// In future this function may have backwards-incompatible changes. + /// + [JsonConstructor] + public NllbTextResult(string originalText, string translatedText) + { + OriginalText = originalText; + TranslatedText = translatedText; + } + + /// The translated text. + [JsonPropertyName("translatedText")] + public string TranslatedText { get; } + + /// The language code of the source text detected by DeepL. + [JsonPropertyName("originalText")] + public string OriginalText { get; } + + /// Returns the translated text. + /// The translated text. + public override string ToString() => TranslatedText; + } +} diff --git a/src/EcTranslators/NllbTranslator/NllbTranslator.cs b/src/EcTranslators/NllbTranslator/NllbTranslator.cs new file mode 100644 index 00000000..f8ce102e --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslator.cs @@ -0,0 +1,299 @@ +// Copyright 2022 DeepL SE (https://www.deepl.com) +// Use of this source code is governed by an MIT +// license that can be found in the LICENSE file. + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text.Json.Serialization; +using System.Threading; +using System.Threading.Tasks; +using DeepL.Internal; +using DeepL.Model; + +namespace Nllb +{ + + public interface ITranslator : IDisposable + { + /// Translate specified text from source language into target language. + /// Text to translate; must not be empty. + /// Language code of the input language, or null to use auto-detection. + /// Language code of the desired output language. + /// influencing translation. + /// The cancellation token to cancel operation. + /// Text translated into specified target language. + /// If any argument is invalid. + /// + /// If any error occurs while communicating with the DeepL API, a + /// or a derived class will be thrown. + /// + Task TranslateTextAsync( + string text, + string? sourceLanguageCode, + string targetLanguageCode, + DeepL.TextTranslateOptions? options = null, + CancellationToken cancellationToken = default); + + /// + /// Client for the DeepL API. To use the DeepL API, initialize an instance of this class using your DeepL + /// Authentication Key. All functions are thread-safe, aside from . + /// + public sealed class Translator : ITranslator + { + /// Base URL for the Nllb accounts. + private const string NllbLServerUrl = "http://localhost:8000"; + + /// Internal class implementing HTTP requests. + private readonly DeepLClient _client; + + /// Initializes a new object using your authentication key. + /// + /// Authentication Key as found in your + /// DeepL API account. + /// + /// Additional options controlling Translator behaviour. + /// If authKey argument is null. + /// If authKey argument is empty. + /// + /// This function does not establish a connection to the DeepL API. To check connectivity, use + /// . + /// + public Translator(string authKey, DeepL.TranslatorOptions? options = null) + { + options ??= new DeepL.TranslatorOptions(); + + authKey = authKey?.Trim(); + + var serverUrl = new Uri(options.ServerUrl ?? NllbLServerUrl); + + var headers = new Dictionary(options.Headers, StringComparer.OrdinalIgnoreCase); + + if (!String.IsNullOrEmpty(authKey) && !headers.ContainsKey("Authorization")) + { + headers.Add("Authorization", authKey); + } + + var clientFactory = options.ClientFactory ?? (() => + DeepLClient.CreateDefaultHttpClient( + options.PerRetryConnectionTimeout, + options.OverallConnectionTimeout, + options.MaximumNetworkRetries)); + + _client = new DeepLClient( + serverUrl, + clientFactory, + headers); + } + + /// Releases the unmanaged resources and disposes of the managed resources used by the . + public void Dispose() => _client.Dispose(); + + /// Retrieves the version string, with format MAJOR.MINOR.BUGFIX. + /// String containing the library version. + public static string Version() + { + var version = Assembly.GetExecutingAssembly().GetCustomAttribute() + ?.InformationalVersion ?? "1.3.0"; + return version; + } + + /// + /// Determines if the given DeepL Authentication Key belongs to an API Free account or an API Pro account. + /// + /// + /// DeepL Authentication Key as found in your + /// DeepL API account. + /// + /// + /// true if the Authentication Key belongs to an API Free account, false if it belongs to an API Pro + /// account. + /// + public static bool AuthKeyIsFreeAccount(string authKey) => true; + + /// + public async Task GetUsageAsync(CancellationToken cancellationToken = default) + { + using var responseMessage = await _client.ApiGetAsync("/api/v1/usage", cancellationToken).ConfigureAwait(false); + await DeepLClient.CheckStatusCodeAsync(responseMessage).ConfigureAwait(false); + var usageFields = await JsonUtils.DeserializeAsync(responseMessage) + .ConfigureAwait(false); + return new Usage(usageFields); + } + + public class TranslateMsg + { + [Newtonsoft.Json.JsonProperty("sourceLanguage")] + public string SourceLanguage { get; set; } + [Newtonsoft.Json.JsonProperty("targetLanguage")] + public string TargetLanguage { get; set; } + [Newtonsoft.Json.JsonProperty("text")] + public string Text { get; set; } + } + + /// + public async Task TranslateTextAsync( + string text, + string? sourceLanguageCode, + string targetLanguageCode, + DeepL.TextTranslateOptions? options = null, + CancellationToken cancellationToken = default) + { + // call it once for each paragraph of text + var strings = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + var result = String.Empty; + foreach (var str in strings) + { + var bodyParams = new TranslateMsg { SourceLanguage = sourceLanguageCode, TargetLanguage = targetLanguageCode, Text = str }; + + using var responseMessage = await _client + .ApiPostJsonAsync("/api/v1/translate/", cancellationToken, bodyParams).ConfigureAwait(false); + + // Read response as a string. + if (!String.IsNullOrEmpty(result)) + result += ","; + result += await responseMessage.Content.ReadAsStringAsync(); + if (!responseMessage.IsSuccessStatusCode) + throw new ApplicationException(result); + } + return $"[{result}]"; + } + + /// Internal function to retrieve available languages. + /// true to retrieve target languages, false to retrieve source languages. + /// The cancellation token to cancel operation. + /// Array of objects containing information about the available languages. + /// + /// If any error occurs while communicating with the DeepL API, a + /// or a derived class will be thrown. + /// + private async Task GetLanguagesAsync( + CancellationToken cancellationToken = default) + { + using var responseMessage = + await _client.ApiGetAsync("/api/v1/translate/languages/", cancellationToken) + .ConfigureAwait(false); + + await DeepLClient.CheckStatusCodeAsync(responseMessage).ConfigureAwait(false); + return await JsonUtils.DeserializeAsync(responseMessage).ConfigureAwait(false); + } + + /// + public async Task GetSupportedLanguagesAsync(CancellationToken cancellationToken = default) => + await GetLanguagesAsync (cancellationToken).ConfigureAwait(false); + + /// + /// Checks the specified languages and options are valid, and returns an enumerable of tuples containing the parameters + /// to include in HTTP request. + /// + /// + /// Language code of translation source language, or null if auto-detection should be + /// used. + /// + /// Language code of translation target language. + /// Extra influencing translation. + /// Enumerable of tuples containing the parameters to include in HTTP request. + /// If the specified languages or options are invalid. + private IEnumerable<(string Key, string Value)> CreateHttpParams( + string? sourceLanguageCode, + string targetLanguageCode, + string text, + DeepL.TextTranslateOptions? options) + { + targetLanguageCode = DeepL.LanguageCode.Standardize(targetLanguageCode); + sourceLanguageCode = sourceLanguageCode == null ? null : DeepL.LanguageCode.Standardize(sourceLanguageCode); + + CheckValidLanguages(sourceLanguageCode, targetLanguageCode); + + var bodyParams = new List<(string Key, string Value)> { ("sourceLanguage", sourceLanguageCode), ("targetLanguage", targetLanguageCode), ("text", text) }; + + return bodyParams; + } + + /// + /// Checks the specified languages and options are valid, and returns an enumerable of tuples containing the parameters + /// to include in HTTP request. + /// + /// + /// Language code of translation source language, or null if auto-detection should be + /// used. + /// + /// Language code of translation target language. + /// Extra influencing translation. + /// Enumerable of tuples containing the parameters to include in HTTP request. + /// If the specified languages or options are invalid. + private IEnumerable<(string Key, string Value)> CreateHttpParams( + string? sourceLanguageCode, + string targetLanguageCode, + DeepL.DocumentTranslateOptions? options) + { + targetLanguageCode = DeepL.LanguageCode.Standardize(targetLanguageCode); + sourceLanguageCode = sourceLanguageCode == null ? null : DeepL.LanguageCode.Standardize(sourceLanguageCode); + + CheckValidLanguages(sourceLanguageCode, targetLanguageCode); + + var bodyParams = new List<(string Key, string Value)> { ("target_lang", targetLanguageCode) }; + if (sourceLanguageCode != null) + { + bodyParams.Add(("source_lang", sourceLanguageCode)); + } + + return bodyParams; + } + + /// Checks the specified source and target language are valid, and throws an exception if not. + /// Language code of translation source language, or null if auto-detection is used. + /// Language code of translation target language. + /// If source or target language code are not valid. + private static void CheckValidLanguages(string? sourceLanguageCode, string targetLanguageCode) + { + if (sourceLanguageCode is { Length: 0 }) + { + throw new ArgumentException($"{nameof(sourceLanguageCode)} must not be empty"); + } + + if (targetLanguageCode.Length == 0) + { + throw new ArgumentException($"{nameof(targetLanguageCode)} must not be empty"); + } + + switch (targetLanguageCode) + { + case "en": + throw new ArgumentException( + $"{nameof(targetLanguageCode)}=\"en\" is deprecated, please use \"en-GB\" or \"en-US\" instead"); + case "pt": + throw new ArgumentException( + $"{nameof(targetLanguageCode)}=\"pt\" is deprecated, please use \"pt-PT\" or \"pt-BR\" instead"); + } + } + + /// + /// Determines recommended time to wait before checking document translation again, using an optional hint of + /// seconds remaining. + /// + /// Optional hint of the number of seconds remaining. + /// to wait. + private static TimeSpan CalculateDocumentWaitTime(int? hintSecondsRemaining) + { + var secs = ((hintSecondsRemaining ?? 0) / 2.0) + 1.0; + secs = Math.Max(1.0, Math.Min(secs, 60.0)); + return TimeSpan.FromSeconds(secs); + } + + /// Class used for JSON-deserialization of text translate results. + private readonly struct TextTranslateResult + { + /// Initializes a new instance of , used for JSON deserialization. + [JsonConstructor] + public TextTranslateResult(NllbTextResult translation) + { + Translation = translation; + } + + /// Array of objects holding text translation results. + public NllbTextResult Translation { get; } + } + } + } +} \ No newline at end of file diff --git a/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.cs b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.cs new file mode 100644 index 00000000..4329e968 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.cs @@ -0,0 +1,323 @@ +#define DisableBilling + +using System; +using System.Windows.Forms; +using ECInterfaces; // for IEncConverter +using static SilEncConverters40.EcTranslators.NllbTranslator.NllbTranslatorEncConverter; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using SilEncConverters40.EcTranslators.NllbTranslator; +using System.Net; +using Newtonsoft.Json; +using System.IO; +using System.Text; +using static System.Environment; + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + public partial class NllbTranslatorAutoConfigDialog : AutoConfigDialog + { + private readonly ComboBoxItem SourceLanguageNameMustBeConfigured = new ComboBoxItem { Display = "Select Source Language" }; + private readonly ComboBoxItem TargetLanguageNameMustBeConfigured = new ComboBoxItem { Display = "Select Target Language" }; + private string ModelNameSuffix = String.Empty; // so we can add it to the friendly name -- but only works if the user edits (which they should do, but...) + + public NllbTranslatorAutoConfigDialog + ( + IEncConverters aECs, + string strDisplayName, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strLhsEncodingId, + string strRhsEncodingId, + int lProcessTypeFlags, + bool bIsInRepository + ) + { + Util.DebugWriteLine(this, "(1) BEGIN"); + InitializeComponent(); + Util.DebugWriteLine(this, "initialized component"); + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + base.Initialize + ( + aECs, + strHtmlFilename, + strDisplayName, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strLhsEncodingId, + strRhsEncodingId, + lProcessTypeFlags, + bIsInRepository + ); + Util.DebugWriteLine(this, "called base.Initalize"); + + // if we're editing converter, then set the Converter Spec and say it's unmodified + if (m_bEditMode) + { + System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(ConverterIdentifier)); + + ParseConverterIdentifier(ConverterIdentifier, out string pathToDockerProject, out string fromLanguage, out string toLanguage, + out string apiKey, out string endpoint); + + var languagesSupported = GetLanguagesSupportedAndInitializeComboBoxes(true, apiKey, endpoint); + if (languagesSupported == null) + return; + + DockerProjectFolderPath = pathToDockerProject; + var selectedItem = comboBoxSourceLanguages.Items.Cast().FirstOrDefault(l => l.Code == fromLanguage); + comboBoxSourceLanguages.SelectedItem = selectedItem; + comboBoxTargetLanguages.SelectedItem = languagesSupported.FirstOrDefault(l => l.Code == toLanguage); + IsModified = false; + } + else + { + // if we've done one before... see if it still works + DockerProjectFolderPath = Properties.Settings.Default.NllbTranslatorPathToDockerProject; + + var apiKey = NllbTranslatorApiKey; + var endpoint = NllbTranslatorEndpoint; + if (!String.IsNullOrEmpty(apiKey) && !String.IsNullOrEmpty(endpoint)) + GetLanguagesSupportedAndInitializeComboBoxes(false, apiKey, endpoint); + else + buttonConfigureNllbModel.Enabled = !String.IsNullOrEmpty(DockerProjectFolderPath); // until the path is chosen + + comboBoxSourceLanguages.SelectedItem = SourceLanguageNameMustBeConfigured; + comboBoxTargetLanguages.SelectedItem = TargetLanguageNameMustBeConfigured; + } + + m_bInitialized = true; + + helpProvider.SetHelpString(comboBoxSourceLanguages, Properties.Resources.HelpForNllbTranslatorSourceLanguagesComboBox); + helpProvider.SetHelpString(comboBoxTargetLanguages, Properties.Resources.HelpForNllbTranslatorTargetLanguagesComboBox); + helpProvider.SetHelpString(buttonConfigureNllbModel, Properties.Resources.HelpForNllbTranslatorAddYourOwnApiKey); + + Util.DebugWriteLine(this, "END"); + } + + private List GetLanguagesSupportedAndInitializeComboBoxes(bool showError, string apiKey, string endpoint) + { + // for our purposes here, we only need the Model configuration (so we can hit the endpoint for languages supported); + // not the specific languages we want to convert To/From. So we don't want to use 'OnApply' here, bkz it will fails + // so just create a temporary one and set the key/endpoint and use it to get the languages supported. + var theNllbEncConverter = new NllbTranslatorEncConverter + { + ApiKey = apiKey, + Endpoint = endpoint + }; + var langMap = theNllbEncConverter.GetCapabilities(showError).GetAwaiter().GetResult(); + if (langMap == null) + return null; + + var languagesSupported = langMap.Select(kvp => new ComboBoxItem { Code = kvp.Key, Display = kvp.Value }) + .OrderBy(c => c.Display) + .ToList(); + InitializeSourceAndTargetLanguages(languagesSupported); + return languagesSupported; + } + + public NllbTranslatorAutoConfigDialog + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + Util.DebugWriteLine(this, "(2) BEGIN"); + InitializeComponent(); + + base.Initialize + ( + aECs, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strTestData + ); + Util.DebugWriteLine(this, "END"); + } + + // this method is called either when the user clicks the "Apply" or "OK" buttons *OR* if she + // tries to switch to the Test or Advanced tab. This is the dialog's one opportunity + // to make sure that the user has correctly configured a legitimate converter. + protected override bool OnApply() + { + var dockerProjectFolder = DockerProjectFolderPath; + if (String.IsNullOrEmpty(dockerProjectFolder)) + { + MessageBox.Show(this, "The Path to the Docker Project Folder must be entered!", EncConverters.cstrCaption); + return false; + } + + var selectedToLanguage = (ComboBoxItem)comboBoxTargetLanguages.SelectedItem; + if ((selectedToLanguage == null) || (TargetLanguageNameMustBeConfigured == selectedToLanguage)) + { + MessageBox.Show(this, "The Target Language must be selected!", EncConverters.cstrCaption); + return false; + } + + var selectedFromLanguage = (ComboBoxItem)comboBoxSourceLanguages.SelectedItem; + if ((selectedFromLanguage == null) || (SourceLanguageNameMustBeConfigured == selectedFromLanguage)) + { + MessageBox.Show(this, "The Source Language must be selected!", EncConverters.cstrCaption); + return false; + } + + // for this converter, use the source and target language codes (e.g. hin_Deva) as the converter identifier + // UPDATE: also include the path to the project and the API key (encrypted) and the Endpoint, since it's + // possible to have multiple models running. The latter two can be blank, though to just revert to the + // defaults (i.e. your-api-key-here and http://localhost:8000, respectively) + // P.S. no need to validate them, bkz if they don't exist, then we wouldn't have the selectedLgs either + ConverterIdentifier = String.Format("{0};{1};{2};{3};{4}", + dockerProjectFolder, + selectedFromLanguage.Code, + selectedToLanguage.Code, + NllbTranslatorEndpoint, + EncryptionClass.Encrypt(NllbTranslatorApiKey)); + + return base.OnApply(); + } + + protected override string ProgID + { + get + { + return typeof(NllbTranslatorEncConverter).FullName; + } + } + + protected override string ImplType + { + get + { + return EncConverters.strTypeSILNllbTranslator; + } + } + + protected override string DefaultFriendlyName + { + // as the default, make it the same as the table name (w/o extension) + get + { + var selectedSourceLanguage = (ComboBoxItem)comboBoxSourceLanguages.SelectedItem; + var selectedTargetLanguage = (ComboBoxItem)comboBoxTargetLanguages.SelectedItem; + return $"NLLB{ModelNameSuffix} Translate {selectedSourceLanguage} to {selectedTargetLanguage}"; + } + + } + + /// + /// Initialize the source and possibly target language combo boxes with the translation languages possible. + /// For TranslateWithTransliteration, we only need the source language, so the 'initializeTargetLanguageAlso' parameter should be false + /// + /// true to initialize the target language combo box also + private void InitializeSourceAndTargetLanguages(List languagesSupported) + { + var items = languagesSupported.ToArray(); + comboBoxSourceLanguages.Items.Clear(); + comboBoxSourceLanguages.Items.Add(SourceLanguageNameMustBeConfigured); + comboBoxSourceLanguages.Items.AddRange(items); + + comboBoxTargetLanguages.Items.Clear(); + comboBoxTargetLanguages.Items.Add(TargetLanguageNameMustBeConfigured); + comboBoxTargetLanguages.Items.AddRange(items); + } + + public class ComboBoxItem + { + public string Display { get; set; } + public string Code { get; set; } + public override string ToString() + { + return Display; + } + + public override bool Equals(object obj) + { + if (obj == null) + return false; + var objAsComboBoxItem = obj as ComboBoxItem; + return (objAsComboBoxItem?.Display == Display) || (objAsComboBoxItem?.Code == Code); + } + + public override int GetHashCode() + { + int hashCode = 1075847657; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Code); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Display); + return hashCode; + } + } + + private void ButtonSetNllbTranslateApiKey_Click(object sender, EventArgs e) + { + var dockerProjectFolderPath = DockerProjectFolderPath; + if (string.IsNullOrEmpty(dockerProjectFolderPath)) + { + MessageBox.Show($"You must browse for/enter the path to where the Docker Project is located or should be created.", EncConverters.cstrCaption); + return; + } + + var apiKey = NllbTranslatorApiKey; + var endpoint = NllbTranslatorEndpoint; + if (m_aEC != null) + { + var theTranslator = (NllbTranslatorEncConverter)m_aEC; + apiKey = theTranslator.ApiKey; + endpoint = theTranslator.Endpoint; + } + + + using var dlg = new QueryForEndpointAndApiKey(dockerProjectFolderPath, apiKey, endpoint); + if (dlg.ShowDialog() == DialogResult.OK) + { + // if the user configures a model, then save the API Key and Endpoint for any new converters they create + // the path was set earlier, but save it here (since this means the user at least intended to do something, + // whether they build the model (successfully) or not) + Properties.Settings.Default.NllbTranslatorPathToDockerProject = dockerProjectFolderPath; + NllbTranslatorApiKey = dlg.TranslatorApiKey; + endpoint = dlg.Endpoint; + NllbTranslatorEndpoint = (endpoint == Properties.Settings.Default.NllbTranslatorEndpoint) ? null : endpoint; + Properties.Settings.Default.Save(); + + m_aEC = null; // reset the associated EncConverter instance so it'll get rebuilt w/ the new parameters + ModelNameSuffix = dlg.ModelNameSuffix; // so we can add it to the DefaultFriendlyName + + // in case something changed, reinitialize the combo boxes + GetLanguagesSupportedAndInitializeComboBoxes(m_bInitialized, dlg.TranslatorApiKey, dlg.Endpoint); + } + } + + private string DockerProjectFolderPath + { + get { return textBoxDockerProjectFolder.Text?.Trim(); } + set { textBoxDockerProjectFolder.Text = value; } + } + + private void buttonBrowse_Click(object sender, System.EventArgs e) + { + folderBrowserDialog.SelectedPath = Path.Combine(Path.Combine(Environment.GetFolderPath(SpecialFolder.CommonApplicationData), "SIL"), "NLLB Docker Folder" + Path.PathSeparator); + if (folderBrowserDialog.ShowDialog() == DialogResult.OK) + { + DockerProjectFolderPath = folderBrowserDialog.SelectedPath; + buttonConfigureNllbModel.Enabled = true; + } + } + + private void ComboBoxSourceLanguages_SelectedIndexChanged_1(object sender, EventArgs e) + { + IsModified = true; + } + + private void ComboBoxTargetLanguages_SelectedIndexChanged_1(object sender, EventArgs e) + { + IsModified = true; + } + } +} + diff --git a/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.designer.cs b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.designer.cs new file mode 100644 index 00000000..4a8bf9f2 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.designer.cs @@ -0,0 +1,225 @@ +using System; +using ECInterfaces; // for Util + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + partial class NllbTranslatorAutoConfigDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.labelFolderPath = new System.Windows.Forms.Label(); + this.textBoxDockerProjectFolder = new System.Windows.Forms.TextBox(); + this.buttonBrowse = new System.Windows.Forms.Button(); + this.buttonConfigureNllbModel = new System.Windows.Forms.Button(); + this.labelSourceLanguage = new System.Windows.Forms.Label(); + this.comboBoxSourceLanguages = new System.Windows.Forms.ComboBox(); + this.labelTargetLanguage = new System.Windows.Forms.Label(); + this.comboBoxTargetLanguages = new System.Windows.Forms.ComboBox(); + this.labelModelConfiguration = new System.Windows.Forms.Label(); + this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); + this.tabControl.SuspendLayout(); + this.tabPageSetup.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tabPageSetup + // + this.tabPageSetup.Controls.Add(this.tableLayoutPanel1); + // + // buttonApply + // + this.helpProvider.SetHelpString(this.buttonApply, "Click this button to apply the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonApply, true); + // + // buttonCancel + // + this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel this dialog"); + this.helpProvider.SetShowHelp(this.buttonCancel, true); + // + // buttonOK + // + this.helpProvider.SetHelpString(this.buttonOK, "Click this button to accept the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonOK, true); + // + // buttonSaveInRepository + // + this.helpProvider.SetHelpString(this.buttonSaveInRepository, "\r\nClick to add this converter to the system repository permanently.\r\n "); + this.helpProvider.SetShowHelp(this.buttonSaveInRepository, true); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.labelFolderPath, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.textBoxDockerProjectFolder, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.buttonBrowse, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.buttonConfigureNllbModel, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.labelSourceLanguage, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.comboBoxSourceLanguages, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.labelTargetLanguage, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.comboBoxTargetLanguages, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.labelModelConfiguration, 1, 4); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 5; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(596, 394); + this.tableLayoutPanel1.TabIndex = 2; + // + // labelFolderPath + // + this.labelFolderPath.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelFolderPath.AutoSize = true; + this.labelFolderPath.Location = new System.Drawing.Point(3, 18); + this.labelFolderPath.Name = "labelFolderPath"; + this.labelFolderPath.Size = new System.Drawing.Size(113, 13); + this.labelFolderPath.TabIndex = 1; + this.labelFolderPath.Text = "Docker Project Folder:"; + // + // textBoxDockerProjectFolder + // + this.textBoxDockerProjectFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxDockerProjectFolder.Location = new System.Drawing.Point(122, 15); + this.textBoxDockerProjectFolder.Name = "textBoxDockerProjectFolder"; + this.textBoxDockerProjectFolder.Size = new System.Drawing.Size(439, 20); + this.textBoxDockerProjectFolder.TabIndex = 2; + // + // buttonBrowse + // + this.buttonBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.buttonBrowse.Location = new System.Drawing.Point(567, 13); + this.buttonBrowse.Name = "buttonBrowse"; + this.buttonBrowse.Size = new System.Drawing.Size(26, 23); + this.buttonBrowse.TabIndex = 3; + this.buttonBrowse.Text = "..."; + this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click); + // + // buttonConfigureNllbModel + // + this.buttonConfigureNllbModel.Location = new System.Drawing.Point(122, 53); + this.buttonConfigureNllbModel.Name = "buttonConfigureNllbModel"; + this.buttonConfigureNllbModel.Size = new System.Drawing.Size(224, 23); + this.buttonConfigureNllbModel.TabIndex = 3; + this.buttonConfigureNllbModel.Text = "Configure NLLB Model"; + this.buttonConfigureNllbModel.UseVisualStyleBackColor = true; + this.buttonConfigureNllbModel.Click += new System.EventHandler(this.ButtonSetNllbTranslateApiKey_Click); + // + // labelSourceLanguage + // + this.labelSourceLanguage.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelSourceLanguage.AutoSize = true; + this.labelSourceLanguage.Location = new System.Drawing.Point(25, 118); + this.labelSourceLanguage.Name = "labelSourceLanguage"; + this.labelSourceLanguage.Size = new System.Drawing.Size(91, 13); + this.labelSourceLanguage.TabIndex = 4; + this.labelSourceLanguage.Text = "Source language:"; + // + // comboBoxSourceLanguages + // + this.comboBoxSourceLanguages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxSourceLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSourceLanguages.FormattingEnabled = true; + this.comboBoxSourceLanguages.Location = new System.Drawing.Point(122, 114); + this.comboBoxSourceLanguages.Name = "comboBoxSourceLanguages"; + this.comboBoxSourceLanguages.Size = new System.Drawing.Size(439, 21); + this.comboBoxSourceLanguages.TabIndex = 5; + this.comboBoxSourceLanguages.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSourceLanguages_SelectedIndexChanged_1); + // + // labelTargetLanguage + // + this.labelTargetLanguage.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelTargetLanguage.AutoSize = true; + this.labelTargetLanguage.Location = new System.Drawing.Point(28, 168); + this.labelTargetLanguage.Name = "labelTargetLanguage"; + this.labelTargetLanguage.Size = new System.Drawing.Size(88, 13); + this.labelTargetLanguage.TabIndex = 6; + this.labelTargetLanguage.Text = "Target language:"; + // + // comboBoxTargetLanguages + // + this.comboBoxTargetLanguages.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxTargetLanguages.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxTargetLanguages.FormattingEnabled = true; + this.comboBoxTargetLanguages.Location = new System.Drawing.Point(122, 164); + this.comboBoxTargetLanguages.Name = "comboBoxTargetLanguages"; + this.comboBoxTargetLanguages.Size = new System.Drawing.Size(439, 21); + this.comboBoxTargetLanguages.TabIndex = 7; + this.comboBoxTargetLanguages.SelectedIndexChanged += new System.EventHandler(this.ComboBoxTargetLanguages_SelectedIndexChanged_1); + // + // labelModelConfiguration + // + this.labelModelConfiguration.AutoSize = true; + this.labelModelConfiguration.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelModelConfiguration.Location = new System.Drawing.Point(122, 200); + this.labelModelConfiguration.Name = "labelModelConfiguration"; + this.labelModelConfiguration.Size = new System.Drawing.Size(439, 194); + this.labelModelConfiguration.TabIndex = 8; + // + // folderBrowserDialog + // + this.folderBrowserDialog.Description = "Browse and create a folder into which we will write the Docker Project files"; + this.folderBrowserDialog.RootFolder = System.Environment.SpecialFolder.MyComputer; + // + // NllbTranslatorAutoConfigDialog + // + this.ClientSize = new System.Drawing.Size(634, 479); + this.Name = "NllbTranslatorAutoConfigDialog"; + this.Controls.SetChildIndex(this.tabControl, 0); + this.Controls.SetChildIndex(this.buttonApply, 0); + this.Controls.SetChildIndex(this.buttonCancel, 0); + this.Controls.SetChildIndex(this.buttonOK, 0); + this.Controls.SetChildIndex(this.buttonSaveInRepository, 0); + this.tabControl.ResumeLayout(false); + this.tabPageSetup.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label labelSourceLanguage; + private System.Windows.Forms.Label labelTargetLanguage; + private System.Windows.Forms.ComboBox comboBoxSourceLanguages; + private System.Windows.Forms.ComboBox comboBoxTargetLanguages; + private System.Windows.Forms.Button buttonConfigureNllbModel; + private System.Windows.Forms.Label labelModelConfiguration; + private System.Windows.Forms.Label labelFolderPath; + private System.Windows.Forms.TextBox textBoxDockerProjectFolder; + private System.Windows.Forms.Button buttonBrowse; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog; + } +} diff --git a/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.resx b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.resx new file mode 100644 index 00000000..74caa030 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslatorAutoConfigDialog.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 341, 17 + + + 450, 17 + + \ No newline at end of file diff --git a/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverter.cs b/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverter.cs new file mode 100644 index 00000000..faa5a8ea --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverter.cs @@ -0,0 +1,448 @@ +// #define encryptingNewCredentials + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Runtime.InteropServices; // for the class attributes +using System.Text; // for ASCIIEncoding +using System.Threading.Tasks; +using ECInterfaces; // for ConvType +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using static Nllb.ITranslator; +using System.Windows.Forms; +using SilEncConverters40.EcTranslators.Properties; +using System.Collections; +using System.Text.RegularExpressions; + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + /// + /// Managed Nllb Translate EncConverter. + /// +#if X64 + [GuidAttribute("DAFFF949-BA9C-4A28-B7A3-13D205D0B838")] +#else + [GuidAttribute("0CE67479-9D4D-4DC5-B89F-A5384B72DFBD")] +#endif + // normally these subclasses are treated as the base class (i.e. the + // client can use them orthogonally as IEncConverter interface pointers + // so normally these individual subclasses would be invisible), but if + // we add 'ComVisible = false', then it doesn't get the registry + // 'HKEY_CLASSES_ROOT\SilEncConverters40.EcTranslators.NllbTranslatorEncConverter' which is the basis of + // how it is started (see EncConverters.AddEx). + // [ComVisible(false)] + public class NllbTranslatorEncConverter : TranslatorConverter + { + #region Const Definitions + + public const string CstrDisplayName = "NLLB Translator"; + internal const string strHtmlFilename = "NLLB_Translate_Plug-in_About_box.htm"; + + public const string NllbAuthenticationPrefix = "SIL-NLLB-Auth-Key "; + + public const string EnvVarNameEndPoint = "EncConverters_NllbEndpoint"; + public const string EnvVarNameKey = "EncConverters_NllbApiKey"; + + public const string SplitSentencesPrefix = @"\SplitSentences "; // send for conversion: \SplitSentences ON and \SplitSentences OFF + + #endregion Const Definitions + + #region Member Variable Definitions + + public string FromLanguage; + public string ToLanguage; + public string PathToDockerProject; + public string ApiKey; // always clear text + public string Endpoint; + + public Regex SentenceSplitter = new Regex(Properties.Settings.Default.NllbSentenceFinalPunctuationRegex); + public bool IsSplitSentences = Properties.Settings.Default.NllbProcessSentenceBySentence; + + public int RepeatsOfLastInputString { get; set; } = 0; + public string LastInputString { get; set; } + public int MaxTokensPerSentence { get; set; } + + private static bool HasValidEnvironmentVariable(string envVarName, out string parameter) + { + return !string.IsNullOrEmpty((parameter = Environment.GetEnvironmentVariable(envVarName))); + } + + // borrowing from deepL's approach + internal Translator _nllbTranslator; + public Translator NllbTranslator + { + get + { + if (_nllbTranslator == null) + { + var handler = new DeepLTranslator.Http2CustomHandler(); + var serverUrl = Endpoint ?? NllbTranslatorEndpoint; + + var options = new DeepL.TranslatorOptions + { + ServerUrl = serverUrl, + MaximumNetworkRetries = 2, + PerRetryConnectionTimeout = TimeSpan.FromSeconds(5), + OverallConnectionTimeout = TimeSpan.FromSeconds(10), + ClientFactory = () => new DeepL.HttpClientAndDisposeFlag + { + HttpClient = new HttpClient(handler), + DisposeClient = true, + }, + }; + var apiKey = ApiKey ?? NllbTranslatorApiKey; + if (!String.IsNullOrEmpty(apiKey)) + apiKey = NllbAuthenticationPrefix + apiKey; + _nllbTranslator = new Translator(apiKey, options); + } + return _nllbTranslator; + } + } + + public static string NllbTranslatorApiKey + { + get + { + // since the user won't be able to encrypt the key, it'll be in clear text as an environment variable + if (HasValidEnvironmentVariable(EnvVarNameKey, out string overrideKey)) + return overrideKey; + + var key = Properties.Settings.Default.NllbTranslatorKeyOverride; + +#if encryptingNewCredentials + var translatorKey = EncryptionClass.Encrypt(key); +#endif + return String.IsNullOrEmpty(key) ? String.Empty : EncryptionClass.Decrypt(key); + } + set + { + var trimmedValue = value?.Trim(); + var translatorKey = !String.IsNullOrEmpty(trimmedValue) + ? EncryptionClass.Encrypt(trimmedValue) + : null; + Properties.Settings.Default.NllbTranslatorKeyOverride = translatorKey; + } + } + + public static string NllbTranslatorEndpoint + { + get + { + var endpoint = HasValidEnvironmentVariable(EnvVarNameEndPoint, out string overrideEndpoint) + ? overrideEndpoint + : !String.IsNullOrEmpty((overrideEndpoint = Properties.Settings.Default.NllbTranslatorEndpointOverride)) + ? overrideEndpoint + : Properties.Settings.Default.NllbTranslatorEndpoint; + return endpoint; + } + set + { + Properties.Settings.Default.NllbTranslatorEndpointOverride = String.IsNullOrEmpty(value) ? null : value; + } + } + +#endregion Member Variable Definitions + + #region Initialization + public NllbTranslatorEncConverter() : base(typeof(NllbTranslatorEncConverter).FullName,EncConverters.strTypeSILNllbTranslator) + { + // this is needed to be able to use the NLLB Translator (https call) from Word. If you don't have it, you just get this error: + // Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + } + + public override void Initialize(string converterName, string converterSpec, + ref string lhsEncodingID, ref string rhsEncodingID, ref ConvType conversionType, + ref Int32 processTypeFlags, Int32 codePageInput, Int32 codePageOutput, bool bAdding) + { + Util.DebugWriteLine(this, $"BEGIN: {converterName}, {converterSpec}"); + + // let the base class have first stab at it + base.Initialize(converterName, converterSpec, ref lhsEncodingID, ref rhsEncodingID, + ref conversionType, ref processTypeFlags, codePageInput, codePageOutput, bAdding ); + + if (!ParseConverterIdentifier(converterSpec, out string pathToDockerProject, out FromLanguage, out ToLanguage, + out ApiKey, out Endpoint)) + { + throw new ApplicationException($"{CstrDisplayName} not properly configured! converterName: {converterName}"); + } + + if (conversionType == ConvType.Unknown) + conversionType = ConvType.Unicode_to_Unicode; + + // I'm assuming that we'd have to/want to set up a different one to go the other direction + m_eConversionType = conversionType = MakeUniDirectional(conversionType); + + if (String.IsNullOrEmpty(lhsEncodingID)) + lhsEncodingID = m_strLhsEncodingID = EncConverters.strDefUnicodeEncoding; + if (String.IsNullOrEmpty(rhsEncodingID)) + rhsEncodingID = m_strRhsEncodingID = EncConverters.strDefUnicodeEncoding; + + // this is a Translation process type by definition. This is used by various programs to prevent + // over usage -- e.g. Paratext should be blocking these EncConverter types as the 'Transliteration' + // type project EncConverter (bkz it'll try to "transliterate" the entire corpus -- probably not + // what's wanted). Also ClipboardEncConverter also doesn't process these for a preview (so the + // system tray popup doesn't take forever to display. + processTypeFlags |= (int)ProcessTypeFlags.Translation; + + Util.DebugWriteLine(this, "END"); + } + + internal static bool ParseConverterIdentifier(string converterSpec, out string pathToDockerProject, + out string fromLanguage, out string toLanguage, out string apiKey, out string endpoint) + { + toLanguage = null; + + string[] astrs = converterSpec.Split(new[] { ';' }); + + if (astrs.Length < 3) + throw new ApplicationException($"{CstrDisplayName} not properly configured! converterSpec: {converterSpec} must have the path to the Docker project and the source and target languages (eg. D:\\Docker\\NLLB;hin_Deva;eng_Latn)"); + + pathToDockerProject = astrs[0]; + fromLanguage = astrs[1]; + toLanguage = astrs[2]; + + endpoint = (astrs.Length >= 4) ? astrs[3] : NllbTranslatorEndpoint; + apiKey = (astrs.Length >= 5) ? EncryptionClass.Decrypt(astrs[4]) : NllbTranslatorApiKey; + + return true; + } + +#pragma warning disable CS3002 // Return type is not CLS-compliant + public async Task> GetCapabilities(bool showError) +#pragma warning restore CS3002 // Return type is not CLS-compliant + { + try + { + var resultLanguagesSupported = await Task.Run(async delegate + { + return (await NllbTranslator.GetSupportedLanguagesAsync()).ToList(); + }).ConfigureAwait(false); + + var json = LoadEmbeddedResourceFileAsStringExecutingAssembly("NllbHumanReadableLgNames.json"); + var languageCodeMap = JsonConvert.DeserializeObject(json).ToDictionary(l => l.Code, l => l.Name); + + resultLanguagesSupported.Except(languageCodeMap.Select(l => l.Key)) + .ToList() + .ForEach(s => languageCodeMap.Add(s, s)); + return languageCodeMap; + } + catch (Exception ex) + { + var error = GetErrorMsg(ex); + if (showError) + MessageBox.Show(error, EncConverters.cstrCaption); + else + System.Diagnostics.Debug.WriteLine(error); + } + return null; + } + + public class LanguageInfo + { + [JsonProperty("Code")] + public string Code { get; set; } + + [JsonProperty("Name")] + public string Name { get; set; } + } + #endregion Initialization + + #region Abstract Base Class Overrides + + [CLSCompliant(false)] + protected override unsafe void DoConvert + ( + byte* lpInBuffer, + int nInLen, + byte* lpOutBuffer, + ref int rnOutLen + ) + { + // we need to put it *back* into a string for the lookup + // [aside: I should probably override base.InternalConvertEx so I can avoid having the base + // class version turn the input string into a byte* for this call just so we can turn around + // and put it *back* into a string for our processing... but I like working with a known + // quantity and no other EncConverter does it that way. Besides, I'm afraid I'll break smtg ;-] + byte[] baIn = new byte[nInLen]; + ECNormalizeData.ByteStarToByteArr(lpInBuffer, nInLen, baIn); + + char[] caIn = Encoding.Unicode.GetChars(baIn); + + // here's our input string + var strInput = new string(caIn); + + var strOutput = DoConvert(strInput); + + StringToProperByteStar(strOutput, lpOutBuffer, ref rnOutLen); + return; + } + + protected string DoConvert(string strInput) + { + // if we're not already splitting sentences, see if we're getting the same string over and over again + if ((LastInputString == strInput) && (RepeatsOfLastInputString++ > 0)) + { + // ... on the 3rd time of getting the same string, start the splitting of sentences and processing them separately + // to see if that helps. Here's an example of one that the facebook-1.3G model seems to lose its way with: + // (केवल ये शहीद और न्याय करने वाले लोग हजार वर्षों वाले उस युग के आरंभ में पुनर्जीवित हो जाएँगे। इस बार जीवित होने को “पहला जीवित होना” कहते हैं। बाकि जो मरे हुए हैं, परमेश्वर उन सबको तब तक पुनर्जीवित नहीं करेगा, जब तक उस हजार वर्षों वाले युग का अंत नहीं होगा।) + // litBt: (Only these martyrs and judge-doing ones will become alive again in the beginning of that thousand year era. This time of becoming alive is called the “first resurrection.” The remaining (ones) who have died, God will not make them alive again until the end of that thousand years era happens.) + // 1.3G model (before splitting sentences): + // (The first resurrection is the first.) The rest of the dead will not be raised until the thousand years are ended. + // 1.3G model (after splitting sentences): + // (Only these martyrs and judges will be resurrected at the beginning of the millennial age. This resurrection is called the first resurrection.) (The rest of the dead will not be raised until the thousand years are over.) + IsSplitSentences = true; + + // start w/ 1 less than the current, so we'll likely do a split right away + MaxTokensPerSentence = WordCount(strInput) - RepeatsOfLastInputString; + + // if the user keeps doing this until it goes negative, then just start over + if (MaxTokensPerSentence < 0) + { + SetSplitSentences(false); // start over + } + System.Diagnostics.Debug.WriteLine($"NllbEncConverter: RepeatsOfLastInputString: {RepeatsOfLastInputString}, convert the string, \"{SplitSentencesPrefix} ON\" (or OFF), to turn on (or off) splitting sentences"); + } + else + { + LastInputString = strInput; + if (strInput.StartsWith(SplitSentencesPrefix)) + { + SetSplitSentences(strInput.Substring(Math.Min(strInput.Length, SplitSentencesPrefix.Length))?.StartsWith("ON") ?? false); + return strInput; + } + } + + var toAdd = default((int, string)); + var sentences = new List<(int WordCount, string Sentence)>(); + if (IsSplitSentences) + { + SentenceSplitter.Replace(strInput, LimitSentenceLength); + if (sentences.Sum(s => s.Sentence.Length) < strInput.Length) + { + var accumulatedSentences = String.Join(String.Empty, sentences.Select(s => s.Sentence)); + System.Diagnostics.Debug.Assert(strInput.Contains(accumulatedSentences)); + var leftOver = strInput.Substring(accumulatedSentences.Length); // add the remaining bit that didn't end in a sentence final puntuation + var lastSentence = sentences.LastOrDefault(); + if (lastSentence != default) + { + var addlInput = lastSentence.Sentence + leftOver; + if (WordCount(addlInput) <= MaxTokensPerSentence) + { + sentences.Remove(lastSentence); // remove it here, so it can be added back combined later + leftOver = addlInput; + } + } + toAdd = (WordCount(leftOver), leftOver); + } + } + else + toAdd = (WordCount(strInput), strInput); + + if (toAdd != default) + sentences.Add(toAdd); + + var strOutput = String.Empty; + foreach (var sentence in sentences.Select(s => s.Sentence)) + { + var output = String.IsNullOrEmpty(sentence.Trim()) + ? sentence + : CallNllbTranslator(sentence).Result; + + // make sure the space isn't lost between the sentences + if ((strOutput.LastOrDefault() != default) && (output?.First() != ' ')) + strOutput += ' '; + + strOutput += output; + } + + return strOutput; + + + string LimitSentenceLength(Match match) + { + var sentence = match.ToString(); + var wordCount = WordCount(sentence); + var lastSentence = sentences.LastOrDefault(); + + // if there is no last sentence or if it would go beyond the limit to add this one to its Sentence... + int combinedWordCount = wordCount; + if ((lastSentence == default((int, string))) || ((combinedWordCount = (wordCount + lastSentence.WordCount)) > MaxTokensPerSentence)) + { + sentences.Add((wordCount, sentence)); // ... make this new one the new last sentence + } + else + { + // otherwise, remove the current last sentence, and add this combined one back in + sentences.Remove(lastSentence); + var combinedSentence = lastSentence.Sentence + sentence; + sentences.Add((combinedWordCount, combinedSentence)); + } + return sentence; // always return the matched item, so we can see if we got the whole thing + } + + void SetSplitSentences(bool isSplitSentences) // expecting this to be either 'ON' or 'OFF' + { + IsSplitSentences = isSplitSentences; + RepeatsOfLastInputString = isSplitSentences ? 1 : 0; + System.Diagnostics.Debug.WriteLine($"NllbEncConverter: Sentence Splitting is {isSplitSentences}. Convert the same string again and it'll start up again w/ 1 less than the number of tokens in the next string sent for conversion."); + } + } + + private static int WordCount(string sentence) + { + return sentence.Split(new[] { ' ' }).Length; + } + + private async Task CallNllbTranslator(string strInput) + { + try + { + var translatedText = await Task.Run(async delegate + { + return await NllbTranslator.TranslateTextAsync(strInput, FromLanguage, ToLanguage); + }).ConfigureAwait(false); + + var result = HarvestResult(translatedText); + return result; + } + catch (Exception ex) + { + var error = GetErrorMsg(ex); + return error; + } + } + + private static string GetErrorMsg(Exception ex) + { + var error = LogExceptionMessage(CstrDisplayName, ex); + if (error.Contains("Unauthorized")) + error = String.Format("You need to edit this converter instance and in the Setup tab, enter the api key you set up in your NLLB Docker instance. {0}(if you didn't change the default key, then just delete the current key to revert back to the default key).{0}You may need to do this for each client app, since they store their Settings separately.{0}You can also use environment variables to set these values:{0}{1}{0}{2}{0}{0}{3}", + Environment.NewLine, EnvVarNameKey, EnvVarNameEndPoint, error); + if (error.Contains("Unable to connect to the remote server") || error.Contains("A connection with the server could not be established")) + error = String.Format("Unable to reach the {1} service. Have you turned on the NLLB Docker container?{0}{0}{2}", Environment.NewLine, CstrDisplayName, error); + return error; + } + + private string HarvestResult(string jsonResult) + { + var jsonArray = JArray.Parse(jsonResult); + var output = jsonArray.Select(obj => (string)obj["translatedText"])?.ToList(); + return String.Join(Environment.NewLine, output); + } + + #endregion Abstract Base Class Overrides + + #region Misc helpers + + protected override string GetConfigTypeName + { + get { return typeof(NllbTranslatorEncConverterConfig).AssemblyQualifiedName; } + } + + #endregion Misc helpers + } +} diff --git a/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverterConfig.cs b/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverterConfig.cs new file mode 100644 index 00000000..c14e74c7 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/NllbTranslatorEncConverterConfig.cs @@ -0,0 +1,64 @@ +using System; +using ECInterfaces; // for IEncConverter + +//uncomment the following line for verbose debugging output using Console.WriteLine +//#define VERBOSE_DEBUGGING + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + public class NllbTranslatorEncConverterConfig : EncConverterConfig + { + public NllbTranslatorEncConverterConfig() + : base + ( + typeof(NllbTranslatorEncConverter).FullName, + NllbTranslatorEncConverter.CstrDisplayName, + NllbTranslatorEncConverter.strHtmlFilename, + ProcessTypeFlags.DontKnow + ) + { + } + + [STAThread] + public override bool Configure + ( + IEncConverters aECs, + string strFriendlyName, + ConvType eConversionType, + string strLhsEncodingID, + string strRhsEncodingID + ) + { +#if VERBOSE_DEBUGGING + Console.WriteLine("NllbTranslatorEncConverterConfig(3).Configure BEGIN"); +#endif + NllbTranslatorAutoConfigDialog form = new NllbTranslatorAutoConfigDialog(aECs, m_strDisplayName, m_strFriendlyName, + m_strConverterID, m_eConversionType, m_strLhsEncodingID, m_strRhsEncodingID, + m_lProcessType, m_bIsInRepository); + +#if VERBOSE_DEBUGGING + Console.WriteLine("NllbTranslatorEncConverterConfig.Configure END"); +#endif + return base.Configure(form); + } + + public override void DisplayTestPage + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + Console.Error.WriteLine("NllbTranslatorEncConverterConfig.DisplayTestPage() BEGIN"); + InitializeFromThis(ref strFriendlyName, ref strConverterIdentifier, + ref eConversionType, ref strTestData); + + NllbTranslatorAutoConfigDialog form = new NllbTranslatorAutoConfigDialog(aECs, strFriendlyName, + strConverterIdentifier, eConversionType, strTestData); + + base.DisplayTestPage(form); + } + } +} diff --git a/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.Designer.cs b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.Designer.cs new file mode 100644 index 00000000..b1f891fc --- /dev/null +++ b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.Designer.cs @@ -0,0 +1,213 @@ + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + partial class QueryForEndpointAndApiKey + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QueryForEndpointAndApiKey)); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.labelNllbModel = new System.Windows.Forms.Label(); + this.comboBoxNllbModel = new System.Windows.Forms.ComboBox(); + this.labelNllbApiKey = new System.Windows.Forms.Label(); + this.textBoxNllbApiKey = new System.Windows.Forms.TextBox(); + this.labelNllbEndpoint = new System.Windows.Forms.Label(); + this.textBoxNllbEndpoint = new System.Windows.Forms.TextBox(); + this.labelNllbInstructions = new System.Windows.Forms.Label(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.tableLayoutPanel.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel.ColumnCount = 3; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60F)); + this.tableLayoutPanel.Controls.Add(this.labelNllbModel, 0, 0); + this.tableLayoutPanel.Controls.Add(this.comboBoxNllbModel, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelNllbApiKey, 0, 1); + this.tableLayoutPanel.Controls.Add(this.textBoxNllbApiKey, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelNllbEndpoint, 0, 2); + this.tableLayoutPanel.Controls.Add(this.textBoxNllbEndpoint, 1, 2); + this.tableLayoutPanel.Controls.Add(this.labelNllbInstructions, 0, 3); + this.tableLayoutPanel.Controls.Add(this.buttonOK, 1, 4); + this.tableLayoutPanel.Controls.Add(this.buttonCancel, 2, 4); + this.tableLayoutPanel.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 5; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel.Size = new System.Drawing.Size(611, 304); + this.tableLayoutPanel.TabIndex = 0; + // + // labelNllbModel + // + this.labelNllbModel.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelNllbModel.AutoSize = true; + this.labelNllbModel.Location = new System.Drawing.Point(4, 18); + this.labelNllbModel.Name = "labelNllbModel"; + this.labelNllbModel.Size = new System.Drawing.Size(69, 13); + this.labelNllbModel.TabIndex = 1; + this.labelNllbModel.Text = "NLLB Model:"; + // + // comboBoxNllbModel + // + this.comboBoxNllbModel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel.SetColumnSpan(this.comboBoxNllbModel, 2); + this.comboBoxNllbModel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxNllbModel.FormattingEnabled = true; + this.comboBoxNllbModel.Items.AddRange(new object[] { + "facebook/nllb-200-distilled-600M", + "facebook/nllb-200-distilled-1.3B", + "facebook/nllb-200-3.3B"}); + this.comboBoxNllbModel.Location = new System.Drawing.Point(79, 14); + this.comboBoxNllbModel.Name = "comboBoxNllbModel"; + this.comboBoxNllbModel.Size = new System.Drawing.Size(529, 21); + this.comboBoxNllbModel.TabIndex = 2; + this.toolTip.SetToolTip(this.comboBoxNllbModel, resources.GetString("comboBoxNllbModel.ToolTip")); + // + // labelNllbApiKey + // + this.labelNllbApiKey.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelNllbApiKey.AutoSize = true; + this.labelNllbApiKey.Location = new System.Drawing.Point(27, 68); + this.labelNllbApiKey.Name = "labelNllbApiKey"; + this.labelNllbApiKey.Size = new System.Drawing.Size(46, 13); + this.labelNllbApiKey.TabIndex = 3; + this.labelNllbApiKey.Text = "Api Key:"; + // + // textBoxNllbApiKey + // + this.textBoxNllbApiKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel.SetColumnSpan(this.textBoxNllbApiKey, 2); + this.textBoxNllbApiKey.Location = new System.Drawing.Point(79, 65); + this.textBoxNllbApiKey.Name = "textBoxNllbApiKey"; + this.textBoxNllbApiKey.Size = new System.Drawing.Size(529, 20); + this.textBoxNllbApiKey.TabIndex = 4; + this.toolTip.SetToolTip(this.textBoxNllbApiKey, "Enter the API key to use with your model (Stored in the settings.py file, default" + + ": your_api_key_here)"); + // + // labelNllbEndpoint + // + this.labelNllbEndpoint.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelNllbEndpoint.AutoSize = true; + this.labelNllbEndpoint.Location = new System.Drawing.Point(3, 118); + this.labelNllbEndpoint.Name = "labelNllbEndpoint"; + this.labelNllbEndpoint.Size = new System.Drawing.Size(70, 13); + this.labelNllbEndpoint.TabIndex = 5; + this.labelNllbEndpoint.Text = "Api Endpoint:"; + // + // textBoxNllbEndpoint + // + this.textBoxNllbEndpoint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel.SetColumnSpan(this.textBoxNllbEndpoint, 2); + this.textBoxNllbEndpoint.Location = new System.Drawing.Point(79, 115); + this.textBoxNllbEndpoint.Name = "textBoxNllbEndpoint"; + this.textBoxNllbEndpoint.Size = new System.Drawing.Size(529, 20); + this.textBoxNllbEndpoint.TabIndex = 6; + this.toolTip.SetToolTip(this.textBoxNllbEndpoint, "Enter the Host portion of the Endpoint (default is: http://localhost:8000). You c" + + "an leave this blank to revert to http://localhost:8000. (Stored in the settings." + + "py file)\r\n"); + // + // labelNllbInstructions + // + this.labelNllbInstructions.AutoSize = true; + this.tableLayoutPanel.SetColumnSpan(this.labelNllbInstructions, 3); + this.labelNllbInstructions.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelNllbInstructions.Location = new System.Drawing.Point(3, 150); + this.labelNllbInstructions.Name = "labelNllbInstructions"; + this.labelNllbInstructions.Size = new System.Drawing.Size(605, 125); + this.labelNllbInstructions.TabIndex = 9; + this.labelNllbInstructions.Text = "See the instructions on the About tab for how to build your NLLB Docker Container" + + " to support an API Key, modify the port number and serve it to the local area ne" + + "twork you are on.\r\n"; + this.labelNllbInstructions.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // buttonOK + // + this.buttonOK.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.buttonOK.Location = new System.Drawing.Point(132, 278); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(155, 23); + this.buttonOK.TabIndex = 10; + this.buttonOK.Text = "&Create Docker Project"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(293, 278); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 11; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // QueryForEndpointAndApiKey + // + this.AcceptButton = this.buttonOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(635, 328); + this.Controls.Add(this.tableLayoutPanel); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "QueryForEndpointAndApiKey"; + this.Text = "NLLB Model Configuration"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label labelNllbApiKey; + private System.Windows.Forms.Label labelNllbEndpoint; + private System.Windows.Forms.Label labelNllbInstructions; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.Label labelNllbModel; + private System.Windows.Forms.TextBox textBoxNllbApiKey; + private System.Windows.Forms.TextBox textBoxNllbEndpoint; + private System.Windows.Forms.ComboBox comboBoxNllbModel; + } +} \ No newline at end of file diff --git a/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.cs b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.cs new file mode 100644 index 00000000..3487ed2b --- /dev/null +++ b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using static System.Environment; + +namespace SilEncConverters40.EcTranslators.NllbTranslator +{ + public partial class QueryForEndpointAndApiKey : Form + { + private const string ButtonLabelOverwriteProject = "&Overwrite Existing Project"; + + public const string DefaultPort = "8000"; + public const string DefaultModelName = "facebook/nllb-200-distilled-600M"; + + // these are the files that we write out to build the Docker container from + private const string FileNameIndexHtml = "index.html"; + private const string FileNameDockerfile = "Dockerfile"; + private const string FileNamePyImportModel = "import_model.py"; + private const string FileNameReadme = "README.md"; + private const string FileNamePs1BuildDocker = "buildDocker.ps1"; + private const string FileNamePyServer = "server.py"; + private const string FileNamePySettings = "settings.py"; + + private readonly List FileNames = new List + { + FileNameIndexHtml, FileNameDockerfile, FileNamePyImportModel, FileNameReadme, FileNamePs1BuildDocker, FileNamePyServer, FileNamePySettings + }; + + // these are the regular expressions to harvest the existing values of these from the settings.py file + private readonly Regex _regexApiKey = new Regex("API_KEY = 'SIL-NLLB-Auth-Key (.*?)'"); + private readonly Regex _regexPort = new Regex(@"PORT = (\d+)"); + private readonly Regex _regexModelName = new Regex(@"MODEL_NAME = '(.*?)'"); + private readonly Regex _regexFindPortInEndpoint = new Regex(@":(\d+)"); + + private string _pathToDockerProjectFolder; + + public QueryForEndpointAndApiKey(string pathToDockerProjectFolder, string apiKey, string endpoint) + { + InitializeComponent(); + + _pathToDockerProjectFolder = pathToDockerProjectFolder; + + var modelName = DefaultModelName; + if (!Directory.Exists(_pathToDockerProjectFolder)) + Directory.CreateDirectory(_pathToDockerProjectFolder); + + var action = "create"; + var filesInFolder = Directory.GetFiles(_pathToDockerProjectFolder)?.ToList(); + var filesExist = filesInFolder.Any(fi => FileNames.Any(fn => fi.Contains(fn))); + if (filesExist) + { + buttonOK.Text = ButtonLabelOverwriteProject; + action = "overwrite"; + + var pathToSettingsPy = filesInFolder.FirstOrDefault(fn => fn.Contains(FileNamePySettings)); + if (pathToSettingsPy != null) + { + var settingsFileContents = File.ReadAllText(pathToSettingsPy); + + // grab the settings currently in the settings file and display them. e.g.: + // API_KEY = 'SIL-NLLB-Auth-Key your-api-key-here' + // PORT = 8000 + // MODEL_NAME = 'facebook/nllb-200-distilled-600M' + SearchForSetting(_regexApiKey, settingsFileContents, ref apiKey); + var port = DefaultPort; + SearchForSetting(_regexFindPortInEndpoint, endpoint, ref port); + + // port now contains the value that came in from the caller. Keep it so we can replace it after the next step + var endpointPort = port; + SearchForSetting(_regexPort, settingsFileContents, ref port); + if (endpointPort != port) + endpoint = endpoint.Replace(endpointPort, port); + SearchForSetting(_regexModelName, settingsFileContents, ref modelName); + } + } + + toolTip.SetToolTip(buttonOK, $"Click this button to {action} the Docker Project Files in the '{_pathToDockerProjectFolder}' folder with the above settings."); + + comboBoxNllbModel.SelectedItem = modelName; + TranslatorApiKey = apiKey; + Endpoint = endpoint; + } + + private void SearchForSetting(Regex regex, string settingsFileContents, ref string apiKey) + { + var match = regex.Match(settingsFileContents); + if (match.Success) + { + apiKey = match.Groups[1].Value; + } + } + + + public string TranslatorApiKey + { + get + { + return textBoxNllbApiKey.Text; + } + set + { + textBoxNllbApiKey.Text = value; + } + } + + public string Endpoint + { + get + { + return textBoxNllbEndpoint.Text; + } + set + { + textBoxNllbEndpoint.Text = value; + } + } + + private string _modelName; + public string ModelName + { + get => _modelName; + set => _modelName = value; + } + + public string ModelNameSuffix + { + get + { + var index = ModelName.LastIndexOf("-"); + if (index == -1) + return null; + + return ModelName.Substring(index).ToLower(); + } + } + + private string _port = DefaultPort; + public string Port + { + get => _port; + set => _port = value; + } + + private void buttonOK_Click(object sender, System.EventArgs e) + { + if (buttonOK.Text == ButtonLabelOverwriteProject) + { + if (DialogResult.No == MessageBox.Show($"Are you sure you want to overwrite the files in the {_pathToDockerProjectFolder} folder?", + EncConverters.cstrCaption, MessageBoxButtons.YesNo)) + { + return; + } + } + + // create the files using the entered information. All the model configuration settings will + // be stored in the settings.py file and used from there for the other scripts/files. + var port = DefaultPort; + SearchForSetting(_regexFindPortInEndpoint, textBoxNllbEndpoint.Text, ref port); + Port = port; + + ModelName = comboBoxNllbModel.SelectedItem.ToString(); + + // first the index.html template + var htmlFilePath = Path.Combine(_pathToDockerProjectFolder, "templates"); + if (!Directory.Exists(htmlFilePath)) + Directory.CreateDirectory(htmlFilePath); + File.WriteAllText(Path.Combine(htmlFilePath, FileNameIndexHtml), Properties.Resources.index); + + // the Dockerfile + File.WriteAllText(Path.Combine(_pathToDockerProjectFolder, FileNameDockerfile), Properties.Resources.Dockerfile); + + // the import_model.py file + File.WriteAllText(Path.Combine(_pathToDockerProjectFolder, FileNamePyImportModel), Properties.Resources.import_model); + + // the README.md file + var readmeFileContents = String.Format(Properties.Resources.README, ModelNameSuffix, Port); + var pathToReadme = Path.Combine(_pathToDockerProjectFolder, FileNameReadme); + File.WriteAllText(pathToReadme, readmeFileContents); + + // the build powershell script file + // NB: this turned out to be a mostly non-starter, since script we would create here can't be run normally + // so the instructions now say, look in the README.md file to see what the commands to run manually are. + // but for those users who know how to enable this... create it anyway + var pathToPsScript = Path.Combine(_pathToDockerProjectFolder, FileNamePs1BuildDocker); + var buildPsScriptContents = String.Format(Properties.Resources.buildDocker, ModelNameSuffix, Port); + File.WriteAllText(pathToPsScript, buildPsScriptContents); + + // the server.py file + File.WriteAllText(Path.Combine(_pathToDockerProjectFolder, FileNamePyServer), Properties.Resources.server); + + // the settings.py file + var translatorApiKey = TranslatorApiKey?.Trim(); + if (!String.IsNullOrEmpty(translatorApiKey)) + translatorApiKey = NllbTranslatorEncConverter.NllbAuthenticationPrefix + translatorApiKey; + + var settingsFileContents = string.Format(Properties.Resources.settings, + $"'{translatorApiKey}'", Port, $"'{ModelName}'"); + File.WriteAllText(Path.Combine(_pathToDockerProjectFolder, FileNamePySettings), settingsFileContents); + + MessageBox.Show($"If you have Docker installed and a recent version of Powershell (see instructions on the About tab), open a Powershell Window and run the two 'docker' commands listed in the '{pathToReadme}' file to build the NLLB Docker project (or run them in the '{pathToPsScript}' script if you know how to enable running scripts from the internet). When finished, return to this message and click 'OK' to connect to the launched endpoint and continue.", + EncConverters.cstrCaption); + + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.resx b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.resx new file mode 100644 index 00000000..986d7267 --- /dev/null +++ b/src/EcTranslators/NllbTranslator/QueryForEndpointAndApiKey.resx @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + Select the NLLB model you want to use. The larger the model, the more accurate the translation, but the longer it will take to download, initialize, and translate text. (Stored in the settings.py file) + + + + + AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/ + AAAA//8A/wAAAP8A/wD//wAA////AHd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3 + d3f3d3d3d3d3d3d3d3d3d3d//3d3d3d3d3d3d3d3d3d3d//3d3d3d3d3d3d3d3d3d3d//3d3d3d3d3d3 + d3d3d//////3d3d3d3d3d3d3d3f//////3d3d3d3d3d3d3d3//////d3d3d3d3d3d3d3d3d3f/93d3d3 + d3d3d3d3d3d3d//3d3d3d3d3d3d3d3d3d3//d3d3d3d3d3d3d3d3d3d393d3d3d3d3d3d3d3d3d3d3d3 + d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7u7d3e7u7u3d3u7u7t3e7u7u3d3u7u7t3d7u7u7d3u7d3d3d3d3 + d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3f3d3d3d3d3d3d3d3d3d3d//3d3d3d3d3d3d3 + d3d3d3//d3d3d3d3d3d3d3d3d3f/93d3d3d3d3d3d3d3d3d//////3d3d3d3d3d3d3d3//////93d3d3 + d3d3d3d3d3//////d3d3d3d3d3d3d3d3//d3d3d3d3d3d3d3d3d3d3//d3d3d3d3d3d3d3d3d3d3//d3 + d3d3d3d3d3d3d3d3d393d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA + AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AHd3d3d3d3d3d3d3d/d3 + d3d3d3d3f3d3d3d3d///93d3d3d3d393d3d3d3d393d3d3d3d3d3d3d3u7t3u7t3u7u7u3e7u3e7u3d3 + d3d3d3d3d3d3f3d3d3d3d3f3d3d3d3d3f///d3d3d3d393d3d3d3d3d/d3d3d3d3d3d3d3d3AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/src/EcTranslators/PromptExeTranslatorCommandLineArgs.cs b/src/EcTranslators/PromptExeTranslatorCommandLineArgs.cs new file mode 100644 index 00000000..77ce6017 --- /dev/null +++ b/src/EcTranslators/PromptExeTranslatorCommandLineArgs.cs @@ -0,0 +1,43 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace SilEncConverters40.EcTranslators +{ + public class PromptExeTranslatorCommandLineArgs + { + public List ExamplesInputString { get; set; } + public List ExamplesOutputString { get; set; } + public string SystemPrompt { get; set; } + public string Credentials { get; set; } + + public override string ToString() + { + var json = JsonConvert.SerializeObject(this); + var base64 = StringToBase64(json); + return base64; + /* e.g for VertexAi + H=>E: eyJQcm9qZWN0SWQiOiJicmlnaHQtY295b3RlLTM4MTgxMiIsIkxvY2F0aW9uSWQiOiJ1cy1jZW50cmFsMSIsIlB1Ymxpc2hlciI6Imdvb2dsZSIsIk1vZGVsSWQiOiJjaGF0LWJpc29uLTMyayIsIkV4YW1wbGVJbnB1dFN0cmluZyI6IuCkuOClg+Ckt+CljeCkn+CkvyDgpJXgpYcg4KSG4KSw4KSC4KStIOCkuOClhyDgpLLgpYfgpJXgpLAg4KSq4KSw4KSu4KWH4KS24KWN4KS14KSwIOCksuCli+Ckl+Cli+CkgiDgpKrgpLAg4KSF4KSq4KSo4KWAIOCkh+CkmuCljeKAjeCkm+CkvuCkj+CkgSwg4KSs4KS54KWB4KSkIOCkrOCkvuCksCDgpK3gpL/gpKjgpY3igI3gpKgt4KSt4KS/4KSo4KWN4oCN4KSoIOCkquCljeCksOCkleCkvuCksCDgpLjgpYcg4KSq4KWN4KSw4KSV4KSfIOCkleCksOCkpOCkviDgpIbgpK/gpL4g4KS54KWI4KWkIOCkueCkruCkvuCksOClhyDgpKrgpYLgpLDgpY3gpLXgpJzgpYvgpIIg4KSV4KWHIOCkr+ClgeCklyDgpK7gpYfgpIIg4KSt4KWAIOCkquCksOCkruClh+CktuCljeCkteCksCDgpLjgpILgpKQt4KSu4KS54KS+4KSk4KWN4oCN4KSu4KS+4KST4KSCIOCkleClhyDgpKbgpY3gpLXgpL7gpLDgpL4g4KSF4KSq4KSo4KS+IOCkuOCkguCkpuClh+CktiDgpK3gpYfgpJzgpKTgpL4g4KSl4KS+4KWkIiwiRXhhbXBsZU91dHB1dFN0cmluZyI6IlNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgY3JlYXRpb24sIEdvZCBoYXMgcmV2ZWFsZWQgSGlzIHdpbGwgdG8gbWFua2luZCBtYW55IHRpbWVzIGluIGRpZmZlcmVudCB3YXlzLiBFdmVuIGluIHRoZSBlcmEgb2Ygb3VyIGFuY2VzdG9ycywgR29kIHVzZWQgdG8gc2VuZCBIaXMgbWVzc2FnZSB0aHJvdWdoIHNhaW50cyBhbmQgcHJvcGhldHMuIiwiU3lzdGVtUHJvbXB0IjoiWW91IHdpbGwgYmUgZ2l2ZW4gMSBvciBtb3JlIGxpbmVzIG9mIHRleHQgaW4gSGluZGkgd2hpY2ggeW91IGFyZSB0byB0cmFuc2xhdGUgaW50byBFbmdsaXNoIFRyYW5zbGF0ZSBmcm9tIEhpbmRpIGludG8gRW5nbGlzaC4gYW5kIHJldHVybiBvbmx5IHRoZSB0cmFuc2xhdGVkIGxpbmVzLiIsIkNyZWRlbnRpYWxzIjoieyAgJ3R5cGUnOiAnc2VydmljZV9hY2NvdW50JywgICdwcm9qZWN0X2lkJzogJ2JyaWdodC1jb3lvdGUtMzgxODEyJywgICdwcml2YXRlX2tleV9pZCc6ICdiYzU4NGNlYzAwN2ZhOTcxMTcyMzE5ZDk0MWIwMzVhOWJlNjUzM2RlJywgICdwcml2YXRlX2tleSc6ICctLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRRGNrUFdBaUEzaVRiQURcbm4wSmQxK29vbGZtNHVNSW5JZ2VVVE5tVHJFeEhET05xZTJZamI3VWVkUjdPMGlGaVJkOW1NaEk2RVpFWStoaWhcbmhFcndEOEVSZjdLRkxrdmRyTjgyOUIvejU5bFFLYWZiTjlHUGNmdUpDTGdheGVqUXAwL3dMMFBkcFF6ZmZMQ3hcbk9pdjlKZGwyOWk0S053N2IvaE05Tys3OWluclRKLzRzRnJtZXpoMjBHY205NVNFNWo4MTkyakRmUWdTV05KV3VcbjZVb1ZyTlJPWVIxV1o3cUp0OTVsQ1lScitydTJBVGxPaTJvbTFldEVwUE1Wd0hTeHZIcElYYVFKdisxaHdDYldcbmZuYjE2bTNWR2t3bnk3YXBnNGtIWEZxSnpqeGJqVm9pYTE4OCtON2FOekQyTEdMMW1nR2l3dUxzSzNHNnVLZnlcblkyeXRKUWpoQWdNQkFBRUNnZ0VBQlVNWTlORTJJOVhzdFA3cVIrUHZPV3IzMEYrcHkrSkZyQlRMNkhCSytQTllcbmUvdHovclNmSllvSHQwbGppQkUwdnQ3aklQOFhHeUY1RjhZZ3ZhN0NDV0pla0d0bi9tSzkxKzFCdzRWZW1abEhcblVMRkprTlNRU3JyK1RhNzIzcDY5dnpRbytFMVVKL010RWRyYWRwOTk4MWJrNXZ2c21ReDBFZjBEZHZsOE0vdzJcbkJydC94MjN3YUt1WS90NE1TYUdTbklad281Wm94YTJxN2dvMFYvWk4zMC9LaGlLQVhLS1ZPRkJkZUVkQ0VneDhcbktPZThhOEI2VjZBcG13UFVoTWwvdnlFNWlxY00vVXhtN1FEbFdidUxoS3o3ZFVEaFIwOXUzbTlQc1Q0bXBIMFBcbnd5NWM3bVA4TkwrT1drQ1ZkYmNXOUZPL2E2dzZKclBreHVQNVZrNk5RUUtCZ1FEeVRBNkRmZUFNVEF1RUllVUJcbmJ6OUZ5T0xxK0poVEkwTFZwUFBXaDkyZmtjUXJ5ZFFpTmZ4REJPYXAyUXN1RWo4bWc2dnFCUHpSamV0UmM1UjRcblM0TWJDOGZab3hEeEtZY0tSOUo2dTgzSXFpOHh2amFHcjlNekIzRnF0WkVsUHFKdFFhTC9yRWJvamFhS1J0WEdcbnBVSE9TMGxuc3pKRGJBMldOSXoyT0lCZ29RS0JnUURwQ2trOTZaZ0IzVjVkcndiMXowenh6MFJsQlZ3Y3dDM3JcblZSMkhUQnUweHRIT0FYOVpYc25tb3pJdXk3RmxUUmdJeXNjTkVsTlBtR2M1NC9Zdkt1OVZobElDSEVzT0I1b3NcblNUSmh4VnVBdE01Z2hJTXlmZ1Z0UHVPaWt4Vm93RjJRSnBRWC9rbFU4YWZ3MmQ0dE5yVVBXWUl3c1FWZDUwT2hcblB6dGNicnlBUVFLQmdCZjhuNU0wNnZGTXRmY213OTBZZmxNU1NDU3E1Nm1UWEJKNmVnbEsrZzNLQ0htdFNXcjVcbm5UZWxUSkNVQkI5VGZ4ejQvQlAyMm5DRWREOWtDZGErNHdQU2JyNkUvakJoeEJTb2Q1WGU4Y2hqMExoRDlISHhcbkJoK1BKUk5EVmxNeG1ETG94Skk3SStueDNBTGtjRlZ5RnNtdGVsN2h4cUFXR21JOFlaZ2VqOWNCQW9HQkFOR2FcbmdOb0Erc25pay9mcmIzVTBLVjd0TC9VMDV1NnRKQ0FoQkZnbTZseWszeHhOV0gvSHRBMlFCNWp6ZVBGR2NER29cblFYVE9ZTVNjcld2eVVBR0l1by9RS243ZmQ5cDhsL3p4TVRHalUzUG1MQ0cvemtsaDgvdVlyeUlRN1JhMHZ2TGlcbjRCemNpSlN3Ym45QlZvYVFTRFl3S2RzbHZWQUNyRitpQWdCWFVaQ0JBb0dBS2xXU1Z4aUFjUXZsZVdHT1hHWTZcbjdUVWdoOXAwdmx1Y2gwWXVFV1A3MEJRVDdmYjIzeUdUMWU0aWtLbWtueUhHQWtEZlZ1bzE2WCs3S0c3cnVpNWFcbldwRWdVc3FKcWlVcC9RVVlmcDZlVWhJMzdGQlVyeEg0eXFNeXZvY3BuUUhSQ2Z6NFBnaXJzSmdOdmJYa25aVE1cbk9HZjRqdGovWk1OV3gwd3c4RE5nTzNRPVxuLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLVxuJywgICdjbGllbnRfZW1haWwnOiAndmVydGV4YWllbmNjb252ZXJ0ZXJAYnJpZ2h0LWNveW90ZS0zODE4MTIuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20nLCAgJ2NsaWVudF9pZCc6ICcxMTYxMTM1NDE1NjY4OTI5MjM2OTInLCAgJ2F1dGhfdXJpJzogJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi9hdXRoJywgICd0b2tlbl91cmknOiAnaHR0cHM6Ly9vYXV0aDIuZ29vZ2xlYXBpcy5jb20vdG9rZW4nLCAgJ2F1dGhfcHJvdmlkZXJfeDUwOV9jZXJ0X3VybCc6ICdodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9vYXV0aDIvdjEvY2VydHMnLCAgJ2NsaWVudF94NTA5X2NlcnRfdXJsJzogJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3JvYm90L3YxL21ldGFkYXRhL3g1MDkvdmVydGV4YWllbmNjb252ZXJ0ZXIlNDBicmlnaHQtY295b3RlLTM4MTgxMi5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbScsICAndW5pdmVyc2VfZG9tYWluJzogJ2dvb2dsZWFwaXMuY29tJ30ifQ== + E=>H: eyJQcm9qZWN0SWQiOiJicmlnaHQtY295b3RlLTM4MTgxMiIsIkxvY2F0aW9uSWQiOiJ1cy1jZW50cmFsMSIsIlB1Ymxpc2hlciI6Imdvb2dsZSIsIk1vZGVsSWQiOiJjaGF0LWJpc29uLTMyayIsIlRlbXBlcmF0dXJlIjowLjMsIk1heERlY29kZVN0ZXBzIjoyMDAsIlRvcFAiOjAuOCwiVG9wSyI6NDAsIkV4YW1wbGVJbnB1dFN0cmluZyI6bnVsbCwiRXhhbXBsZU91dHB1dFN0cmluZyI6bnVsbCwiU3lzdGVtUHJvbXB0IjoiWW91IHdpbGwgYmUgZ2l2ZW4gMSBvciBtb3JlIGxpbmVzIG9mIHRleHQgaW4gRW5nbGlzaCB3aGljaCB5b3UgYXJlIHRvIHRyYW5zbGF0ZSBpbnRvIEhpbmRpIHdpdGggYSBcImZyZWUgdHJhbnNsYXRpb25cIiBzdHlsZSBhaW1lZCBhdCBoaWdoIHNjaG9vbCBzdHVkZW50cyBhbmQgcmV0dXJuIG9ubHkgdGhlIHRyYW5zbGF0ZWQgbGluZXMuIiwiQ3JlZGVudGlhbHMiOiJ7ICAndHlwZSc6ICdzZXJ2aWNlX2FjY291bnQnLCAgJ3Byb2plY3RfaWQnOiAnYnJpZ2h0LWNveW90ZS0zODE4MTInLCAgJ3ByaXZhdGVfa2V5X2lkJzogJ2JjNTg0Y2VjMDA3ZmE5NzExNzIzMTlkOTQxYjAzNWE5YmU2NTMzZGUnLCAgJ3ByaXZhdGVfa2V5JzogJy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLVxuTUlJRXZRSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS2N3Z2dTakFnRUFBb0lCQVFEY2tQV0FpQTNpVGJBRFxubjBKZDErb29sZm00dU1JbklnZVVUTm1UckV4SERPTnFlMllqYjdVZWRSN08waUZpUmQ5bU1oSTZFWkVZK2hpaFxuaEVyd0Q4RVJmN0tGTGt2ZHJOODI5Qi96NTlsUUthZmJOOUdQY2Z1SkNMZ2F4ZWpRcDAvd0wwUGRwUXpmZkxDeFxuT2l2OUpkbDI5aTRLTnc3Yi9oTTlPKzc5aW5yVEovNHNGcm1lemgyMEdjbTk1U0U1ajgxOTJqRGZRZ1NXTkpXdVxuNlVvVnJOUk9ZUjFXWjdxSnQ5NWxDWVJyK3J1MkFUbE9pMm9tMWV0RXBQTVZ3SFN4dkhwSVhhUUp2KzFod0NiV1xuZm5iMTZtM1ZHa3dueTdhcGc0a0hYRnFKemp4YmpWb2lhMTg4K043YU56RDJMR0wxbWdHaXd1THNLM0c2dUtmeVxuWTJ5dEpRamhBZ01CQUFFQ2dnRUFCVU1ZOU5FMkk5WHN0UDdxUitQdk9XcjMwRitweStKRnJCVEw2SEJLK1BOWVxuZS90ei9yU2ZKWW9IdDBsamlCRTB2dDdqSVA4WEd5RjVGOFlndmE3Q0NXSmVrR3RuL21LOTErMUJ3NFZlbVpsSFxuVUxGSmtOU1FTcnIrVGE3MjNwNjl2elFvK0UxVUovTXRFZHJhZHA5OTgxYms1dnZzbVF4MEVmMERkdmw4TS93MlxuQnJ0L3gyM3dhS3VZL3Q0TVNhR1NuSVp3bzVab3hhMnE3Z28wVi9aTjMwL0toaUtBWEtLVk9GQmRlRWRDRWd4OFxuS09lOGE4QjZWNkFwbXdQVWhNbC92eUU1aXFjTS9VeG03UURsV2J1TGhLejdkVURoUjA5dTNtOVBzVDRtcEgwUFxud3k1YzdtUDhOTCtPV2tDVmRiY1c5Rk8vYTZ3NkpyUGt4dVA1Vms2TlFRS0JnUUR5VEE2RGZlQU1UQXVFSWVVQlxuYno5RnlPTHErSmhUSTBMVnBQUFdoOTJma2NRcnlkUWlOZnhEQk9hcDJRc3VFajhtZzZ2cUJQelJqZXRSYzVSNFxuUzRNYkM4ZlpveER4S1ljS1I5SjZ1ODNJcWk4eHZqYUdyOU16QjNGcXRaRWxQcUp0UWFML3JFYm9qYWFLUnRYR1xucFVIT1MwbG5zekpEYkEyV05JejJPSUJnb1FLQmdRRHBDa2s5NlpnQjNWNWRyd2IxejB6eHowUmxCVndjd0MzclxuVlIySFRCdTB4dEhPQVg5Wlhzbm1vekl1eTdGbFRSZ0l5c2NORWxOUG1HYzU0L1l2S3U5VmhsSUNIRXNPQjVvc1xuU1RKaHhWdUF0TTVnaElNeWZnVnRQdU9pa3hWb3dGMlFKcFFYL2tsVThhZncyZDR0TnJVUFdZSXdzUVZkNTBPaFxuUHp0Y2JyeUFRUUtCZ0JmOG41TTA2dkZNdGZjbXc5MFlmbE1TU0NTcTU2bVRYQko2ZWdsSytnM0tDSG10U1dyNVxublRlbFRKQ1VCQjlUZnh6NC9CUDIybkNFZEQ5a0NkYSs0d1BTYnI2RS9qQmh4QlNvZDVYZThjaGowTGhEOUhIeFxuQmgrUEpSTkRWbE14bURMb3hKSTdJK254M0FMa2NGVnlGc210ZWw3aHhxQVdHbUk4WVpnZWo5Y0JBb0dCQU5HYVxuZ05vQStzbmlrL2ZyYjNVMEtWN3RML1UwNXU2dEpDQWhCRmdtNmx5azN4eE5XSC9IdEEyUUI1anplUEZHY0RHb1xuUVhUT1lNU2NyV3Z5VUFHSXVvL1FLbjdmZDlwOGwvenhNVEdqVTNQbUxDRy96a2xoOC91WXJ5SVE3UmEwdnZMaVxuNEJ6Y2lKU3dibjlCVm9hUVNEWXdLZHNsdlZBQ3JGK2lBZ0JYVVpDQkFvR0FLbFdTVnhpQWNRdmxlV0dPWEdZNlxuN1RVZ2g5cDB2bHVjaDBZdUVXUDcwQlFUN2ZiMjN5R1QxZTRpa0tta255SEdBa0RmVnVvMTZYKzdLRzdydWk1YVxuV3BFZ1VzcUpxaVVwL1FVWWZwNmVVaEkzN0ZCVXJ4SDR5cU15dm9jcG5RSFJDZno0UGdpcnNKZ052YlhrblpUTVxuT0dmNGp0ai9aTU5XeDB3dzhETmdPM1E9XG4tLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tXG4nLCAgJ2NsaWVudF9lbWFpbCc6ICd2ZXJ0ZXhhaWVuY2NvbnZlcnRlckBicmlnaHQtY295b3RlLTM4MTgxMi5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbScsICAnY2xpZW50X2lkJzogJzExNjExMzU0MTU2Njg5MjkyMzY5MicsICAnYXV0aF91cmknOiAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL2F1dGgnLCAgJ3Rva2VuX3VyaSc6ICdodHRwczovL29hdXRoMi5nb29nbGVhcGlzLmNvbS90b2tlbicsICAnYXV0aF9wcm92aWRlcl94NTA5X2NlcnRfdXJsJzogJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92MS9jZXJ0cycsICAnY2xpZW50X3g1MDlfY2VydF91cmwnOiAnaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vcm9ib3QvdjEvbWV0YWRhdGEveDUwOS92ZXJ0ZXhhaWVuY2NvbnZlcnRlciU0MGJyaWdodC1jb3lvdGUtMzgxODEyLmlhbS5nc2VydmljZWFjY291bnQuY29tJywgICd1bml2ZXJzZV9kb21haW4nOiAnZ29vZ2xlYXBpcy5jb20nfSJ9 + */ + + static string StringToBase64(string plainText) + { + byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + } + + public string SaveToTempFile() + { + var tempFilespec = Path.GetTempFileName(); + var json = JsonConvert.SerializeObject(this); + var encrypted = EncryptionClass.Encrypt(json); + File.WriteAllText(tempFilespec, encrypted); + System.Diagnostics.Debug.WriteLine($"file: {tempFilespec} contains: {json}"); + return tempFilespec; + } + } +} diff --git a/src/EcTranslators/PromptTranslator.cs b/src/EcTranslators/PromptTranslator.cs new file mode 100644 index 00000000..21c1884c --- /dev/null +++ b/src/EcTranslators/PromptTranslator.cs @@ -0,0 +1,41 @@ +using ECInterfaces; +using SilEncConverters40.EcTranslators.AzureOpenAI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SilEncConverters40.EcTranslators +{ + public abstract class PromptExeTranslator : ExeEncConverter + { + public List ExamplesInputString { get; set; } = new List(); + public List ExamplesOutputString { get; set; } = new List(); + + + public PromptExeTranslator + ( + string strProgramID, // usually "typeof().FullName", e.g. typeof(AzureOpenAiEncConverter).FullName + string strImplType, // e.g. (cf. SIL.AzureOpenAi) + Int32 lProcessType = (int)ProcessTypeFlags.Translation, // e.g. ProcessTypeFlags.Translation + string strWorkingDirSuffix = "" // e.g. @"\SIL\Indic\ITrans" (if installed there) + ) + : base(strProgramID, strImplType, ConvType.Unicode_to_Unicode, "UNICODE", "UNICODE", lProcessType, strWorkingDirSuffix) + { + } + + public virtual void AddExample(string inputString, string outputString) + { + ExamplesInputString.Add(inputString); + ExamplesOutputString.Add(outputString); + m_psi = null; // to force it to re-pull the Arguments, including these examples + } + + public virtual void PurgeExamples() + { + ExamplesInputString.Clear(); + ExamplesOutputString.Clear(); + m_psi = null; // to force it to re-pull the Arguments, including these examples + } + } +} diff --git a/src/EcTranslators/Properties/Resources.Designer.cs b/src/EcTranslators/Properties/Resources.Designer.cs index 36fede68..c4517ec2 100644 --- a/src/EcTranslators/Properties/Resources.Designer.cs +++ b/src/EcTranslators/Properties/Resources.Designer.cs @@ -60,6 +60,17 @@ internal Resources() { } } + /// + /// Looks up a localized string similar to docker build -t nllb{0} . + ///docker run -p {1}:{1} nllb{0} + ///# Start-Process http://localhost:{1}/. + /// + internal static string buildDocker { + get { + return ResourceManager.GetString("buildDocker", resourceCulture); + } + } + /// /// Looks up a localized string similar to https://www.deepl.com/pro?cta=header-pro/. /// @@ -69,6 +80,31 @@ internal static string DeepLTranslatorKeyDialogInstructionUrl { } } + /// + /// Looks up a localized string similar to FROM python:3.9 + /// + ///# Install steps mostly taken from https://medium.com/mlearning-ai/text-translation-using-nllb-and-huggingface-tutorial-7e789e0f7816 + /// + ///# Install main dependencies + ///RUN pip install transformers sentencepiece fasttext + ///# Install PyTorch. This command varies depending on your OS and other factors; see https://pytorch.org/get-started/locally/ for instructions for your system + ///RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # if you have a gpu: r [rest of string was truncated]";. + /// + internal static string Dockerfile { + get { + return ResourceManager.GetString("Dockerfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to https://cloud.google.com/vertex-ai/docs/start/cloud-environment. + /// + internal static string GoogleCloudVertexCredentialsDialogInstructionUrl { + get { + return ResourceManager.GetString("GoogleCloudVertexCredentialsDialogInstructionUrl", resourceCulture); + } + } + /// /// Looks up a localized string similar to https://cloud.google.com/translate/docs/setup#creating_service_accounts_and_keys. /// @@ -78,6 +114,51 @@ internal static string GoogleTranslatorKeyDialogInstructionUrl { } } + /// + /// Looks up a localized string similar to Click this button to enter your own Resource key and other information needed to use the Microsoft Azure Open AI Service. See https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource, for more information on how to get your own Azure Open AI Resource. Note: there is no default Resource for this converter; you must get your own to use it.. + /// + internal static string HelpForAzureOpenAiAddYourOwnApiKey { + get { + return ResourceManager.GetString("HelpForAzureOpenAiAddYourOwnApiKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the name of the language you want the Azure Open AI Resource to tranlate from (e.g. Hindi). + /// + internal static string HelpForAzureOpenAiSourceLanguageTextBox { + get { + return ResourceManager.GetString("HelpForAzureOpenAiSourceLanguageTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can add one of the existing additions to the base system prompt using the values in this drop down box (or type in your own). + /// + internal static string HelpForAzureOpenAiSystemPromptAdditionsComboBox { + get { + return ResourceManager.GetString("HelpForAzureOpenAiSystemPromptAdditionsComboBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This box shows the System Prompt that will be sent to the Azure Open AI Resource. + /// + internal static string HelpForAzureOpenAiSystemPromptTextBox { + get { + return ResourceManager.GetString("HelpForAzureOpenAiSystemPromptTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the name of the language you want the Azure Open AI Resource to tranlate into (e.g. English). + /// + internal static string HelpForAzureOpenAiTargetLanguageTextBox { + get { + return ResourceManager.GetString("HelpForAzureOpenAiTargetLanguageTextBox", resourceCulture); + } + } + /// /// Looks up a localized string similar to Click this button to enter your own API key from Microsoft Azure. See the "Prerequisites" section on the page, https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-translator, for how to get your own key (e.g. if the default API key has run out of translation support -- note: the default API key is using the free pricing tier and is limited to 2 million characters/month). /// @@ -209,7 +290,7 @@ internal static string HelpForGoogleTranslatorAddYourOwnApiKey { } /// - /// Looks up a localized string similar to Choose the language you want to translate or transliterate from. Choose 'Auto-Detect' if you want Google Translate to attempt to determine the input language.. + /// Looks up a localized string similar to Choose the language you want to translate from. Choose 'Auto-Detect' if you want Google Translate to attempt to determine the input language.. /// internal static string HelpForGoogleTranslatorSourceLanguagesComboBox { get { @@ -225,5 +306,221 @@ internal static string HelpForGoogleTranslatorTargetLanguagesComboBox { return ResourceManager.GetString("HelpForGoogleTranslatorTargetLanguagesComboBox", resourceCulture); } } + + /// + /// Looks up a localized string similar to Click this button to configure the NLLB Parameters (e.g. which model to use, an API key, and the endpoint).. + /// + internal static string HelpForNllbTranslatorAddYourOwnApiKey { + get { + return ResourceManager.GetString("HelpForNllbTranslatorAddYourOwnApiKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose the language you want to translate from.. + /// + internal static string HelpForNllbTranslatorSourceLanguagesComboBox { + get { + return ResourceManager.GetString("HelpForNllbTranslatorSourceLanguagesComboBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose the language you want the input text to be translated into.. + /// + internal static string HelpForNllbTranslatorTargetLanguagesComboBox { + get { + return ResourceManager.GetString("HelpForNllbTranslatorTargetLanguagesComboBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Click this button to enter your own Google Cloud credential key. Follow the instructions on the page, https://cloud.google.com/vertex-ai/docs/start/cloud-environment, to get create your own Google Cloud Translate service and get your own credentials (e.g. if the default credentials have run out of translation support. + /// + internal static string HelpForVertexAiAddYourOwnApiKey { + get { + return ResourceManager.GetString("HelpForVertexAiAddYourOwnApiKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the location id of the Google Cloud Vertex AI resource (e.g. us-central1). + /// + internal static string HelpForVertexAiLocationIdTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiLocationIdTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the model id of the Google Cloud Vertex AI resource (e.g. chat-bison, chat-bison-32k, or gemini-pro). + /// + internal static string HelpForVertexAiModelIdTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiModelIdTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the id of the Google Cloud Project that contains the Vertex AI resource. + /// + internal static string HelpForVertexAiProjectIdTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiProjectIdTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the publisher of the Google Cloud Vertex AI resource (e.g. google). + /// + internal static string HelpForVertexAiPublisherTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiPublisherTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the name of the language you want the Vertex AI Model to tranlate from (e.g. Hindi). + /// + internal static string HelpForVertexAiSourceLanguageTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiSourceLanguageTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can add one of the existing additions to the base system prompt using the values in this drop down box (or type in your own). + /// + internal static string HelpForVertexAiSystemPromptAdditionsComboBox { + get { + return ResourceManager.GetString("HelpForVertexAiSystemPromptAdditionsComboBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This box shows the System Prompt that will be sent to the Vertext AI Model. + /// + internal static string HelpForVertexAiSystemPromptTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiSystemPromptTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the name of the language you want the Vertex AI Model to tranlate into (e.g. English). + /// + internal static string HelpForVertexAiTargetLanguageTextBox { + get { + return ResourceManager.GetString("HelpForVertexAiTargetLanguageTextBox", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to # This file exists because: + ///# 1. Documentation for using transformers often shows how to download them in Python + ///# 2. We want the download of the model to happen as part of the building of the image, not when it runs + /// + ///from settings import MODEL_NAME + /// + ///checkpoint = MODEL_NAME + ///from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline + ///model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint) + ///tokenizer = AutoTokenizer.from_pretrained(checkpoint) + ///. + /// + internal static string import_model { + get { + return ResourceManager.GetString("import_model", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <!DOCTYPE html> + ///<html> + /// <head> + /// <title>{{ MODEL_NAME }}</title> + /// <style> + /// html { + /// box-sizing: border-box; + /// } + /// *, + /// *:before, + /// *:after { + /// box-sizing: inherit; + /// } + /// #wrapper { + /// display: grid; + /// grid-template-columns: 1fr 1fr; + /// grid-column-gap: 2em; + /// } + /// #input, + /// #output { + /// width: 100%; + /// height: 10em; + /// border: 1px solid grey; + /// font-size: 1rem; + /// padding: 0.5rem; + /// [rest of string was truncated]";. + /// + internal static string index { + get { + return ResourceManager.GetString("index", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to # Usage: execute these commands in Powershell + /// + ///PS> docker build -t nllb{0} . # note: include the space and '.' at the end when copying to Powershell + ///PS> docker run -p {1}:{1} nllb{0} + /// + ///Then in a web browser, navigate to http://localhost:{1}/ + ///. + /// + internal static string README { + get { + return ResourceManager.GetString("README", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to from flask import Flask, render_template, request, jsonify + ///from settings import MODEL_NAME, PORT, API_KEY + ///from gevent.pywsgi import WSGIServer + /// + ///app = Flask(__name__) + /// + ///checkpoint = MODEL_NAME + ///from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline + ///model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint) + ///tokenizer = AutoTokenizer.from_pretrained(checkpoint) + /// + ///def IsNullOrEmpty(s): + /// return s is None or s == '' + /// + ///@app.route('/') + ///def send_report(): + /// # Check if the API key is [rest of string was truncated]";. + /// + internal static string server { + get { + return ResourceManager.GetString("server", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to # Define your API key: it can only be alphanumeric characters + '-'; nothing else (i.e. [a-zA-Z-]) + ///# the prefix, 'SIL-NLLB-Auth-Key ' will be added, so if you're using this in the 'Nllb Translator' + ///# Setup tab of SILConverters, just enter the part after that (i.e. your-api-key-here) + ///API_KEY = {0} # e.g. 'SIL-NLLB-Auth-Key your-api-key-here' + /// + ///# You can either access the model locally via http://localhost:8000/ or from another machine on the network by using + ///# the IP address of the machine hosting [rest of string was truncated]";. + /// + internal static string settings { + get { + return ResourceManager.GetString("settings", resourceCulture); + } + } } } diff --git a/src/EcTranslators/Properties/Resources.resx b/src/EcTranslators/Properties/Resources.resx index fb873263..07490fd6 100644 --- a/src/EcTranslators/Properties/Resources.resx +++ b/src/EcTranslators/Properties/Resources.resx @@ -117,12 +117,37 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\nllbtranslator\docker\builddocker.ps1;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + https://www.deepl.com/pro?cta=header-pro/ + + ..\nllbtranslator\docker\dockerfile;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + https://cloud.google.com/vertex-ai/docs/start/cloud-environment + https://cloud.google.com/translate/docs/setup#creating_service_accounts_and_keys + + Click this button to enter your own Resource key and other information needed to use the Microsoft Azure Open AI Service. See https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource, for more information on how to get your own Azure Open AI Resource. Note: there is no default Resource for this converter; you must get your own to use it. + + + Enter the name of the language you want the Azure Open AI Resource to tranlate from (e.g. Hindi) + + + You can add one of the existing additions to the base system prompt using the values in this drop down box (or type in your own) + + + This box shows the System Prompt that will be sent to the Azure Open AI Resource + + + Enter the name of the language you want the Azure Open AI Resource to tranlate into (e.g. English) + Click this button to enter your own API key from Microsoft Azure. See the "Prerequisites" section on the page, https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-translator, for how to get your own key (e.g. if the default API key has run out of translation support -- note: the default API key is using the free pricing tier and is limited to 2 million characters/month) @@ -170,9 +195,60 @@ See https://docs.microsoft.com/en-us/azure/cognitive-services/translator/languag Click this button to enter your own Google Cloud credential key. Follow the instructions on the page, https://cloud.google.com/translation-hub/docs/admin-setup, to get create your own Google Cloud Translate service and get your own credentials (e.g. if the default credentials have run out of translation support -- note: the default credentials are using the free pricing tier and is limited to 500K characters/month for all users) - Choose the language you want to translate or transliterate from. Choose 'Auto-Detect' if you want Google Translate to attempt to determine the input language. + Choose the language you want to translate from. Choose 'Auto-Detect' if you want Google Translate to attempt to determine the input language. Choose the language you want the input text to be translated into. + + Click this button to configure the NLLB Parameters (e.g. which model to use, an API key, and the endpoint). + + + Choose the language you want to translate from. + + + Choose the language you want the input text to be translated into. + + + Click this button to enter your own Google Cloud credential key. Follow the instructions on the page, https://cloud.google.com/vertex-ai/docs/start/cloud-environment, to get create your own Google Cloud Translate service and get your own credentials (e.g. if the default credentials have run out of translation support + + + Enter the location id of the Google Cloud Vertex AI resource (e.g. us-central1) + + + Enter the model id of the Google Cloud Vertex AI resource (e.g. chat-bison, chat-bison-32k, or gemini-pro) + + + Enter the id of the Google Cloud Project that contains the Vertex AI resource + + + Enter the publisher of the Google Cloud Vertex AI resource (e.g. google) + + + Enter the name of the language you want the Vertex AI Model to tranlate from (e.g. Hindi) + + + You can add one of the existing additions to the base system prompt using the values in this drop down box (or type in your own) + + + This box shows the System Prompt that will be sent to the Vertext AI Model + + + Enter the name of the language you want the Vertex AI Model to tranlate into (e.g. English) + + + ..\nllbtranslator\docker\import_model.py;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\nllbtranslator\docker\templates\index.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\nllbtranslator\docker\readme.md;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\nllbtranslator\docker\server.py;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\nllbtranslator\docker\settings.py;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/src/EcTranslators/Properties/Settings.Designer.cs b/src/EcTranslators/Properties/Settings.Designer.cs index 80b1ac78..33449dfa 100644 --- a/src/EcTranslators/Properties/Settings.Designer.cs +++ b/src/EcTranslators/Properties/Settings.Designer.cs @@ -181,5 +181,199 @@ public string GoogleCloudBillingProjectName { this["GoogleCloudBillingProjectName"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string AzureOpenAiEndpoint { + get { + return ((string)(this["AzureOpenAiEndpoint"])); + } + set { + this["AzureOpenAiEndpoint"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string AzureOpenAiDeploymentName { + get { + return ((string)(this["AzureOpenAiDeploymentName"])); + } + set { + this["AzureOpenAiDeploymentName"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string AzureOpenAiKeyOverride { + get { + return ((string)(this["AzureOpenAiKeyOverride"])); + } + set { + this["AzureOpenAiKeyOverride"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource" + + "")] + public string AzureOpenAiKeyLocationDialogInstructionUrl { + get { + return ((string)(this["AzureOpenAiKeyLocationDialogInstructionUrl"])); + } + set { + this["AzureOpenAiKeyLocationDialogInstructionUrl"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute(@" + + with a 'free translation' style + with a 'literal translation' style + with a 'free translation' style aimed at high school students + in the Devanagari script + using 'Yoda speak' + UseSystemPrompt: Translate from Hindi into English. + UseSystemPrompt: You will be given one or more sentences in Khmer script. Your job is to transliterate them into the Latin script and return only the transliterated Latin result. + UseSystemPrompt: You will be given one or more sentences in Tibetan script. Your job is to transliterate them into the International Phonetic Alphabet (IPA) and return only the transliterated IPA result. +")] + public global::System.Collections.Specialized.StringCollection AzureOpenAiSystemPromptAdditions { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["AzureOpenAiSystemPromptAdditions"])); + } + set { + this["AzureOpenAiSystemPromptAdditions"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("N3RK/o+wYtvEFMVGtYsmROIyLr/+RWh1")] + public string NllbTranslatorKeyOverride { + get { + return ((string)(this["NllbTranslatorKeyOverride"])); + } + set { + this["NllbTranslatorKeyOverride"] = value; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("http://localhost:8000")] + public string NllbTranslatorEndpoint { + get { + return ((string)(this["NllbTranslatorEndpoint"])); + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string NllbTranslatorEndpointOverride { + get { + return ((string)(this["NllbTranslatorEndpointOverride"])); + } + set { + this["NllbTranslatorEndpointOverride"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string NllbTranslatorPathToDockerProject { + get { + return ((string)(this["NllbTranslatorPathToDockerProject"])); + } + set { + this["NllbTranslatorPathToDockerProject"] = value; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("(.*?)([\\p{Po}-[,]])")] + public string NllbSentenceFinalPunctuationRegex { + get { + return ((string)(this["NllbSentenceFinalPunctuationRegex"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool NllbProcessSentenceBySentence { + get { + return ((bool)(this["NllbProcessSentenceBySentence"])); + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string GoogleCloudVertexAiCredentialsOverride { + get { + return ((string)(this["GoogleCloudVertexAiCredentialsOverride"])); + } + set { + this["GoogleCloudVertexAiCredentialsOverride"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string GoogleCloudVertexAiProjectId { + get { + return ((string)(this["GoogleCloudVertexAiProjectId"])); + } + set { + this["GoogleCloudVertexAiProjectId"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("us-central1")] + public string GoogleCloudVertexAiLocationId { + get { + return ((string)(this["GoogleCloudVertexAiLocationId"])); + } + set { + this["GoogleCloudVertexAiLocationId"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("google")] + public string GoogleCloudVertexAiPublisher { + get { + return ((string)(this["GoogleCloudVertexAiPublisher"])); + } + set { + this["GoogleCloudVertexAiPublisher"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("chat-bison")] + public string GoogleCloudVertexAiModelId { + get { + return ((string)(this["GoogleCloudVertexAiModelId"])); + } + set { + this["GoogleCloudVertexAiModelId"] = value; + } + } } } diff --git a/src/EcTranslators/Properties/Settings.settings b/src/EcTranslators/Properties/Settings.settings index 6e89a01e..f2c44277 100644 --- a/src/EcTranslators/Properties/Settings.settings +++ b/src/EcTranslators/Properties/Settings.settings @@ -32,5 +32,63 @@ projects/bright-coyote-381812 + + + + + + + + + + + https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource + + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string>with a 'free translation' style</string> + <string>with a 'literal translation' style</string> + <string>with a 'free translation' style aimed at high school students</string> + <string>in the Devanagari script</string> + <string>using 'Yoda speak'</string> + <string>UseSystemPrompt: Translate from Hindi into English.</string> + <string>UseSystemPrompt: You will be given one or more sentences in Khmer script. Your job is to transliterate them into the Latin script and return only the transliterated Latin result.</string> + <string>UseSystemPrompt: You will be given one or more sentences in Tibetan script. Your job is to transliterate them into the International Phonetic Alphabet (IPA) and return only the transliterated IPA result.</string> +</ArrayOfString> + + + N3RK/o+wYtvEFMVGtYsmROIyLr/+RWh1 + + + http://localhost:8000 + + + + + + + + + (.*?)([\p{Po}-[,]]) + + + False + + + + + + + + + us-central1 + + + google + + + chat-bison + \ No newline at end of file diff --git a/src/EcTranslators/TranslatorConverter.cs b/src/EcTranslators/TranslatorConverter.cs index e23e9932..6f349096 100644 --- a/src/EcTranslators/TranslatorConverter.cs +++ b/src/EcTranslators/TranslatorConverter.cs @@ -1,10 +1,8 @@ using ECInterfaces; using System; -using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; +using System.Reflection; namespace SilEncConverters40.EcTranslators { @@ -37,17 +35,34 @@ internal static unsafe void StringToProperByteStar(string strOutput, byte* lpOut ECNormalizeData.StringToByteStar(strOutput, lpOutBuffer, rnOutLen, false); } - internal static string LogExceptionMessage(string className, Exception ex) + public static string LogExceptionMessage(string className, Exception ex) { - string msg = "Error occurred: " + ex.Message; + var message = ex.Message; + var msg = "Error occurred: " + message; while (ex.InnerException != null) { ex = ex.InnerException; - msg += $"{Environment.NewLine}because: (InnerException): {ex.Message}"; + if (message.Contains(ex.Message)) + continue; // skip identical msgs + message = ex.Message; + msg += $"{Environment.NewLine}because: (InnerException): {message}"; } Util.DebugWriteLine(className, msg); return msg; } + + public static string LoadEmbeddedResourceFileAsStringExecutingAssembly(string strResourceName) + { + var assembly = Assembly.GetExecutingAssembly(); + strResourceName = assembly.GetManifestResourceNames().FirstOrDefault(n => n.Contains(strResourceName)); + if (string.IsNullOrEmpty(strResourceName)) + return null; + + var resourceAsStream = assembly.GetManifestResourceStream(strResourceName); + StreamReader reader = new StreamReader(resourceAsStream); + string text = reader.ReadToEnd(); + return text; + } } } diff --git a/src/EcTranslators/VertexAi/QueryForGoogleCredentials.Designer.cs b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.Designer.cs new file mode 100644 index 00000000..8c13745a --- /dev/null +++ b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.Designer.cs @@ -0,0 +1,149 @@ + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + partial class QueryForGoogleCredentials + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.buttonOK = new System.Windows.Forms.Button(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.labelTranslatorKey = new System.Windows.Forms.Label(); + this.textBoxTranslatorKey = new System.Windows.Forms.TextBox(); + this.linkLabelInstructions = new System.Windows.Forms.LinkLabel(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 65F)); + this.tableLayoutPanel1.Controls.Add(this.buttonOK, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.buttonCancel, 2, 2); + this.tableLayoutPanel1.Controls.Add(this.labelTranslatorKey, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.textBoxTranslatorKey, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.linkLabelInstructions, 0, 1); + this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(658, 368); + this.tableLayoutPanel1.TabIndex = 0; + // + // buttonOK + // + this.buttonOK.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.buttonOK.Location = new System.Drawing.Point(299, 342); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 6; + this.buttonOK.Text = "&OK"; + this.buttonOK.UseVisualStyleBackColor = true; + this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); + // + // buttonCancel + // + this.buttonCancel.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point(380, 342); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 7; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // labelTranslatorKey + // + this.labelTranslatorKey.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelTranslatorKey.AutoSize = true; + this.labelTranslatorKey.Location = new System.Drawing.Point(3, 138); + this.labelTranslatorKey.Name = "labelTranslatorKey"; + this.labelTranslatorKey.Size = new System.Drawing.Size(220, 13); + this.labelTranslatorKey.TabIndex = 1; + this.labelTranslatorKey.Text = "Enter Google Cloud/Vertex Credentials (json):"; + // + // textBoxTranslatorKey + // + this.tableLayoutPanel1.SetColumnSpan(this.textBoxTranslatorKey, 2); + this.textBoxTranslatorKey.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxTranslatorKey.Location = new System.Drawing.Point(229, 3); + this.textBoxTranslatorKey.Multiline = true; + this.textBoxTranslatorKey.Name = "textBoxTranslatorKey"; + this.textBoxTranslatorKey.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBoxTranslatorKey.Size = new System.Drawing.Size(426, 283); + this.textBoxTranslatorKey.TabIndex = 2; + // + // linkLabelInstructions + // + this.linkLabelInstructions.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.linkLabelInstructions.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(this.linkLabelInstructions, 3); + this.linkLabelInstructions.Location = new System.Drawing.Point(3, 307); + this.linkLabelInstructions.Name = "linkLabelInstructions"; + this.linkLabelInstructions.Size = new System.Drawing.Size(365, 13); + this.linkLabelInstructions.TabIndex = 5; + this.linkLabelInstructions.TabStop = true; + this.linkLabelInstructions.Text = "see {0} for instructions on creating your own Google Cloud/Vertex Resource"; + this.linkLabelInstructions.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelInstructions_LinkClicked); + // + // QueryForGoogleCredentials + // + this.AcceptButton = this.buttonOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(686, 392); + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "QueryForGoogleCredentials"; + this.Text = "Enter Google Cloud/Vertex API Credentials"; + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label labelTranslatorKey; + private System.Windows.Forms.TextBox textBoxTranslatorKey; + private System.Windows.Forms.LinkLabel linkLabelInstructions; + } +} \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/QueryForGoogleCredentials.cs b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.cs new file mode 100644 index 00000000..1ce31f96 --- /dev/null +++ b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.cs @@ -0,0 +1,41 @@ +using System.Diagnostics; +using System.Windows.Forms; + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + public partial class QueryForGoogleCredentials : Form + { + private const string InstructionsFormat = "see {0} for instructions on creating your own Google Cloud/Vertex Resource"; + + public QueryForGoogleCredentials(string googleTranslatorCredentials) + { + InitializeComponent(); + + textBoxTranslatorKey.Text = googleTranslatorCredentials; + var translatorKeyLocationDialogInstructionUrl = Properties.Resources.GoogleCloudVertexCredentialsDialogInstructionUrl; + var translatorKeyLocationDialogInstruction = string.Format(InstructionsFormat, translatorKeyLocationDialogInstructionUrl); + linkLabelInstructions.Text = translatorKeyLocationDialogInstruction; + linkLabelInstructions.Links.Add(4, translatorKeyLocationDialogInstructionUrl.Length, + translatorKeyLocationDialogInstructionUrl); + } + + public string TranslatorKey + { + get + { + return textBoxTranslatorKey.Text; + } + } + + private void linkLabelInstructions_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(Properties.Resources.GoogleCloudVertexCredentialsDialogInstructionUrl); + } + + private void buttonOK_Click(object sender, System.EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/src/EcTranslators/VertexAi/QueryForGoogleCredentials.resx b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/src/EcTranslators/VertexAi/QueryForGoogleCredentials.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.cs b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.cs new file mode 100644 index 00000000..346a4927 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.cs @@ -0,0 +1,316 @@ +// #define encryptingNewCredentials + +using System; +using System.Windows.Forms; +using ECInterfaces; // for IEncConverter +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using static SilEncConverters40.EcTranslators.VertexAi.VertexAiEncConverter; +using System.Net; +using SilEncConverters40.EcTranslators.Properties; +using SilEncConverters40.EcTranslators.GoogleTranslator; + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + public partial class VertexAiAutoConfigDialog : AutoConfigDialog + { + private const string SourceLanguageNameMustBeConfigured = ""; + private const string TargetLanguageNameMustBeConfigured = ""; + private readonly string ResourceNeededWarning = $"The {VertexAiEncConverter.strDisplayName} requires an Google Cloud Vertex AI resource."; + + public VertexAiAutoConfigDialog + ( + IEncConverters aECs, + string strDisplayName, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strLhsEncodingId, + string strRhsEncodingId, + int lProcessTypeFlags, + bool bIsInRepository + ) + { + Util.DebugWriteLine(this, "(1) BEGIN"); + InitializeComponent(); + Util.DebugWriteLine(this, "initialized component"); + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + base.Initialize + ( + aECs, + strHtmlFilename, + strDisplayName, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strLhsEncodingId, + strRhsEncodingId, + lProcessTypeFlags, + bIsInRepository + ); + Util.DebugWriteLine(this, "called base.Initalize"); + + string fromLanguage = SourceLanguageNameMustBeConfigured, toLanguage = TargetLanguageNameMustBeConfigured; + + // if we're editing converter, then set the Converter Spec and say it's unmodified + if (m_bEditMode) + { + System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(ConverterIdentifier)); + + ParseConverterIdentifier(ConverterIdentifier, out fromLanguage, out toLanguage, + out string projectId, out string locationId, out string publisher, out string modelId, + out string addlInstructions, out string systemPrompt); + + textBoxProjectId.Text = projectId; + textBoxLocationId.Text = locationId; + textBoxPublisher.Text = publisher; + textBoxModelId.Text = modelId; + textBoxCompleteSystemPrompt.Text = systemPrompt; + if (!String.IsNullOrEmpty(addlInstructions)) + comboBoxSystemPromptAdditions.Text = addlInstructions; + IsModified = false; + } + else + { + textBoxCompleteSystemPrompt.Text = ResourceNeededWarning; + textBoxProjectId.Text = Settings.Default.GoogleCloudVertexAiProjectId; + textBoxLocationId.Text = Settings.Default.GoogleCloudVertexAiLocationId; + textBoxPublisher.Text = Settings.Default.GoogleCloudVertexAiPublisher; + textBoxModelId.Text = Settings.Default.GoogleCloudVertexAiModelId; + } + + textBoxSourceLanguage.Text = fromLanguage; + textBoxTargetLanguage.Text = toLanguage; + LoadComboBoxFromSettings(comboBoxSystemPromptAdditions, Settings.Default.AzureOpenAiSystemPromptAdditions); + + m_bInitialized = true; + + helpProvider.SetHelpString(textBoxProjectId, Resources.HelpForVertexAiProjectIdTextBox); + helpProvider.SetHelpString(textBoxLocationId, Resources.HelpForVertexAiLocationIdTextBox); + helpProvider.SetHelpString(textBoxPublisher, Resources.HelpForVertexAiPublisherTextBox); + helpProvider.SetHelpString(textBoxModelId, Resources.HelpForVertexAiModelIdTextBox); + helpProvider.SetHelpString(textBoxSourceLanguage, Properties.Resources.HelpForVertexAiSourceLanguageTextBox); + helpProvider.SetHelpString(textBoxTargetLanguage, Properties.Resources.HelpForVertexAiTargetLanguageTextBox); + helpProvider.SetHelpString(textBoxCompleteSystemPrompt, Properties.Resources.HelpForVertexAiSystemPromptTextBox); + helpProvider.SetHelpString(comboBoxSystemPromptAdditions, Properties.Resources.HelpForVertexAiSystemPromptAdditionsComboBox); + helpProvider.SetHelpString(buttonSetVertexAiApiKey, Properties.Resources.HelpForVertexAiAddYourOwnApiKey); + + Util.DebugWriteLine(this, "END"); + } + + private void InitializeComboBoxFromCode(ComboBox comboBox, string code) + { + if (String.IsNullOrEmpty(code)) + return; + + string value = $"({code})"; + var item = comboBox.Items.Cast().FirstOrDefault(i => i.Contains(value)); + + if ((item == null) && (comboBox.Items.Count > 0)) + { + item = (string)comboBox.Items[0]; + } + + if (item != null) + comboBox.SelectedItem = item; + } + + public VertexAiAutoConfigDialog + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + Util.DebugWriteLine(this, "(2) BEGIN"); + InitializeComponent(); + + base.Initialize + ( + aECs, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strTestData + ); + Util.DebugWriteLine(this, "END"); + } + + // this method is called either when the user clicks the "Apply" or "OK" buttons *OR* if she + // tries to switch to the Test or Advanced tab. This is the dialog's one opportunity + // to make sure that the user has correctly configured a legitimate converter. + protected override bool OnApply() + { + if (!IsModified) + return true; + + var additionToSystemPrompt = comboBoxSystemPromptAdditions.Text?.Trim().Replace(";", null); + if (!String.IsNullOrEmpty(additionToSystemPrompt) && !Settings.Default.AzureOpenAiSystemPromptAdditions.Contains(additionToSystemPrompt)) + { + Settings.Default.AzureOpenAiSystemPromptAdditions.Insert(0, additionToSystemPrompt); + Settings.Default.Save(); + LoadComboBoxFromSettings(comboBoxSystemPromptAdditions, Settings.Default.AzureOpenAiSystemPromptAdditions); + } + + var projectId = textBoxProjectId.Text; + var locationId = textBoxLocationId.Text; + var publisher = textBoxPublisher.Text; + var modelId = textBoxModelId.Text; + + if (!IsValidUserInput(null, ref projectId)) + { + MessageBox.Show(this, $"The Vertex AI resource Project Id must be entered and cannot contain a ';' character! See {Resources.GoogleCloudVertexCredentialsDialogInstructionUrl} for help on creating one.", EncConverters.cstrCaption); + return false; + } + Settings.Default.GoogleCloudVertexAiProjectId = projectId; + + if (!IsValidUserInput(null, ref locationId)) + { + MessageBox.Show(this, $"The Vertex AI resource Location Id (e.g. us-central1) must be entered and cannot contain a ';' character! See {Resources.GoogleCloudVertexCredentialsDialogInstructionUrl} for help on creating one.", EncConverters.cstrCaption); + return false; + } + Settings.Default.GoogleCloudVertexAiLocationId = locationId; + + if (!IsValidUserInput(null, ref publisher)) + { + MessageBox.Show(this, $"The Vertex AI resource Publisher (e.g. google) must be entered and cannot contain a ';' character! See {Resources.GoogleCloudVertexCredentialsDialogInstructionUrl} for help on creating one.", EncConverters.cstrCaption); + return false; + } + Settings.Default.GoogleCloudVertexAiPublisher = publisher; + + if (!IsValidUserInput(null, ref modelId)) + { + MessageBox.Show(this, $"The Vertex AI resource Model Id (e.g. chat-bison, chat-bison-32k, or gemini-pro) must be entered and cannot contain a ';' character! See {Resources.GoogleCloudVertexCredentialsDialogInstructionUrl} for help on creating one.", EncConverters.cstrCaption); + return false; + } + Settings.Default.GoogleCloudVertexAiModelId = modelId; + Settings.Default.Save(); + + var selectedFromLanguage = textBoxSourceLanguage.Text; + var selectedToLanguage = textBoxTargetLanguage.Text; + if (!additionToSystemPrompt.StartsWith(ReplacementSystemPrompt)) + { + if (!IsValidUserInput(SourceLanguageNameMustBeConfigured, ref selectedFromLanguage)) + { + MessageBox.Show(this, "A Source language name (e.g. Hindi) must be entered and cannot contain a ';' character!", EncConverters.cstrCaption); + return false; + } + + if (!IsValidUserInput(TargetLanguageNameMustBeConfigured, ref selectedToLanguage)) + { + MessageBox.Show(this, "A Target Language (e.g. English) must be entered and cannot contain a ';' character!", EncConverters.cstrCaption); + return false; + } + } + else + { + selectedFromLanguage = null; + selectedToLanguage = null; + } + + // for Azure Open AI, get the converter identifier from the Setup tab controls. + // e.g. "Hindi;English;with a 'free translation' style aimed at high school students" + ConverterIdentifier = String.Format("{0};{1};{2};{3};{4};{5};{6}", + selectedFromLanguage, + selectedToLanguage, + projectId, + locationId, + publisher, + modelId, + additionToSystemPrompt); + + return base.OnApply(); + + static bool IsValidUserInput(string defaultValue, ref string userInput) + { + userInput = userInput?.Trim(); + return (defaultValue != userInput) && !String.IsNullOrEmpty(userInput) && !userInput.Contains(";"); + } + } + + protected override string ProgID + { + get + { + return typeof(VertexAiEncConverter).FullName; + } + } + + protected override string ImplType + { + get + { + return EncConverters.strTypeSILVertexAiTranslator; + } + } + + protected override string DefaultFriendlyName + { + // as the default, make it the same as the table name (w/o extension) + get + { + var additionToSystemPrompt = comboBoxSystemPromptAdditions.Text?.Trim().Replace(";", null); + if (additionToSystemPrompt.StartsWith(ReplacementSystemPrompt)) + return $"Vertex AI {SubstituteSystemPrompt(additionToSystemPrompt)}"; + + var selectedFromLanguage = textBoxSourceLanguage.Text.Trim(); + if (selectedFromLanguage == SourceLanguageNameMustBeConfigured) + selectedFromLanguage = null; + var selectedToLanguage = textBoxTargetLanguage.Text.Trim(); + if (selectedToLanguage == TargetLanguageNameMustBeConfigured) + selectedToLanguage = null; + return $"Vertex AI Translate {selectedFromLanguage} to {selectedToLanguage}"; + } + } + + private void textBox_TextChanged(object sender, EventArgs e) + { + if (m_bInitialized) // but only do this after we've already initialized (we might have set it during m_bEditMode) + IsModified = true; + UpdateSystemPrompt(); + } + + private void comboBoxSystemPromptAdditions_TextChanged(object sender, EventArgs e) + { + if (m_bInitialized) + IsModified = true; + UpdateSystemPrompt(); + } + + private void UpdateSystemPrompt() + { + var systemPrompt = VertexAiEncConverter.GetSystemPrompt(textBoxSourceLanguage.Text?.Trim(), textBoxTargetLanguage.Text?.Trim(), + comboBoxSystemPromptAdditions.Text?.Trim()); + textBoxCompleteSystemPrompt.Text = systemPrompt; + } + + private void ButtonSetVertexAiKey_Click(object sender, EventArgs e) + { +#if encryptingNewCredentials + var googleTranslatorKeyHide = Properties.Settings.Default.GoogleTranslatorCredentials; + var credentials = EncryptionClass.Encrypt(googleTranslatorKeyHide); +#endif + // only send the key if it's already the override key (so we don't expose ours) + var vertexAiCredentialsOverride = Properties.Settings.Default.GoogleCloudVertexAiCredentialsOverride; + if (!String.IsNullOrEmpty(vertexAiCredentialsOverride)) + vertexAiCredentialsOverride = EncryptionClass.Decrypt(vertexAiCredentialsOverride); + + using var dlg = new QueryForGoogleCredentials(vertexAiCredentialsOverride); + if (dlg.ShowDialog() == DialogResult.OK) + { + GoogleCloudVertexAiSubscriptionKey = dlg.TranslatorKey; + Properties.Settings.Default.Save(); + } + } + + private void TextBoxVertexResourceParameters_TextChanged(object sender, EventArgs e) + { + IsModified = true; + } + } +} + diff --git a/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.designer.cs b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.designer.cs new file mode 100644 index 00000000..1f7aa6f5 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.designer.cs @@ -0,0 +1,322 @@ +using System; +using ECInterfaces; // for Util + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + partial class VertexAiAutoConfigDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.labelSourceLanguage = new System.Windows.Forms.Label(); + this.labelTargetLanguage = new System.Windows.Forms.Label(); + this.labelSystemPromptAddition = new System.Windows.Forms.Label(); + this.comboBoxSystemPromptAdditions = new System.Windows.Forms.ComboBox(); + this.buttonSetVertexAiApiKey = new System.Windows.Forms.Button(); + this.textBoxSourceLanguage = new System.Windows.Forms.TextBox(); + this.textBoxTargetLanguage = new System.Windows.Forms.TextBox(); + this.labelSystemPrompt = new System.Windows.Forms.Label(); + this.textBoxCompleteSystemPrompt = new System.Windows.Forms.TextBox(); + this.labelProjectId = new System.Windows.Forms.Label(); + this.textBoxProjectId = new System.Windows.Forms.TextBox(); + this.labelLocationId = new System.Windows.Forms.Label(); + this.textBoxLocationId = new System.Windows.Forms.TextBox(); + this.labelPublisher = new System.Windows.Forms.Label(); + this.textBoxPublisher = new System.Windows.Forms.TextBox(); + this.labelModelId = new System.Windows.Forms.Label(); + this.textBoxModelId = new System.Windows.Forms.TextBox(); + this.tabControl.SuspendLayout(); + this.tabPageSetup.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tabPageSetup + // + this.tabPageSetup.Controls.Add(this.tableLayoutPanel1); + // + // buttonApply + // + this.helpProvider.SetHelpString(this.buttonApply, "Click this button to apply the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonApply, true); + // + // buttonCancel + // + this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel this dialog"); + this.helpProvider.SetShowHelp(this.buttonCancel, true); + // + // buttonOK + // + this.helpProvider.SetHelpString(this.buttonOK, "Click this button to accept the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonOK, true); + // + // buttonSaveInRepository + // + this.helpProvider.SetHelpString(this.buttonSaveInRepository, "\r\nClick to add this converter to the system repository permanently.\r\n "); + this.helpProvider.SetShowHelp(this.buttonSaveInRepository, true); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.labelProjectId, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.textBoxProjectId, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.labelLocationId, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.textBoxLocationId, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.labelPublisher, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.textBoxPublisher, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.labelModelId, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.textBoxModelId, 1, 3); + this.tableLayoutPanel1.Controls.Add(this.labelSourceLanguage, 0, 4); + this.tableLayoutPanel1.Controls.Add(this.textBoxSourceLanguage, 1, 4); + this.tableLayoutPanel1.Controls.Add(this.labelTargetLanguage, 0, 5); + this.tableLayoutPanel1.Controls.Add(this.textBoxTargetLanguage, 1, 5); + this.tableLayoutPanel1.Controls.Add(this.labelSystemPromptAddition, 0, 6); + this.tableLayoutPanel1.Controls.Add(this.comboBoxSystemPromptAdditions, 1, 6); + this.tableLayoutPanel1.Controls.Add(this.labelSystemPrompt, 0, 7); + this.tableLayoutPanel1.Controls.Add(this.textBoxCompleteSystemPrompt, 1, 7); + this.tableLayoutPanel1.Controls.Add(this.buttonSetVertexAiApiKey, 1, 8); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 9; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 40F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(596, 394); + this.tableLayoutPanel1.TabIndex = 1; + // + // labelSourceLanguage + // + this.labelSourceLanguage.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelSourceLanguage.AutoSize = true; + this.labelSourceLanguage.Location = new System.Drawing.Point(47, 173); + this.labelSourceLanguage.Name = "labelSourceLanguage"; + this.labelSourceLanguage.Size = new System.Drawing.Size(91, 13); + this.labelSourceLanguage.TabIndex = 6; + this.labelSourceLanguage.Text = "Source language:"; + // + // labelTargetLanguage + // + this.labelTargetLanguage.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelTargetLanguage.AutoSize = true; + this.labelTargetLanguage.Location = new System.Drawing.Point(50, 213); + this.labelTargetLanguage.Name = "labelTargetLanguage"; + this.labelTargetLanguage.Size = new System.Drawing.Size(88, 13); + this.labelTargetLanguage.TabIndex = 8; + this.labelTargetLanguage.Text = "Target language:"; + // + // labelSystemPromptAddition + // + this.labelSystemPromptAddition.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelSystemPromptAddition.AutoSize = true; + this.labelSystemPromptAddition.Location = new System.Drawing.Point(3, 253); + this.labelSystemPromptAddition.Name = "labelSystemPromptAddition"; + this.labelSystemPromptAddition.Size = new System.Drawing.Size(135, 13); + this.labelSystemPromptAddition.TabIndex = 12; + this.labelSystemPromptAddition.Text = "Additions to system prompt:"; + // + // comboBoxSystemPromptAdditions + // + this.comboBoxSystemPromptAdditions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxSystemPromptAdditions.FormattingEnabled = true; + this.comboBoxSystemPromptAdditions.Location = new System.Drawing.Point(144, 249); + this.comboBoxSystemPromptAdditions.Name = "comboBoxSystemPromptAdditions"; + this.comboBoxSystemPromptAdditions.Size = new System.Drawing.Size(449, 21); + this.comboBoxSystemPromptAdditions.TabIndex = 3; + this.comboBoxSystemPromptAdditions.TextChanged += new System.EventHandler(this.comboBoxSystemPromptAdditions_TextChanged); + // + // buttonSetVertexAiApiKey + // + this.buttonSetVertexAiApiKey.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonSetVertexAiApiKey.Location = new System.Drawing.Point(144, 368); + this.buttonSetVertexAiApiKey.Name = "buttonSetVertexAiApiKey"; + this.buttonSetVertexAiApiKey.Size = new System.Drawing.Size(326, 23); + this.buttonSetVertexAiApiKey.TabIndex = 5; + this.buttonSetVertexAiApiKey.Text = "Enter your GoogleCloud Vertex AI Credentials (json)"; + this.buttonSetVertexAiApiKey.UseVisualStyleBackColor = true; + this.buttonSetVertexAiApiKey.Click += new System.EventHandler(this.ButtonSetVertexAiKey_Click); + // + // textBoxSourceLanguage + // + this.textBoxSourceLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxSourceLanguage.Location = new System.Drawing.Point(144, 170); + this.textBoxSourceLanguage.Name = "textBoxSourceLanguage"; + this.textBoxSourceLanguage.Size = new System.Drawing.Size(449, 20); + this.textBoxSourceLanguage.TabIndex = 1; + this.textBoxSourceLanguage.TextChanged += new System.EventHandler(this.textBox_TextChanged); + // + // textBoxTargetLanguage + // + this.textBoxTargetLanguage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxTargetLanguage.Location = new System.Drawing.Point(144, 210); + this.textBoxTargetLanguage.Name = "textBoxTargetLanguage"; + this.textBoxTargetLanguage.Size = new System.Drawing.Size(449, 20); + this.textBoxTargetLanguage.TabIndex = 2; + this.textBoxTargetLanguage.TextChanged += new System.EventHandler(this.textBox_TextChanged); + // + // labelSystemPrompt + // + this.labelSystemPrompt.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelSystemPrompt.AutoSize = true; + this.labelSystemPrompt.Location = new System.Drawing.Point(59, 316); + this.labelSystemPrompt.Name = "labelSystemPrompt"; + this.labelSystemPrompt.Size = new System.Drawing.Size(79, 13); + this.labelSystemPrompt.TabIndex = 12; + this.labelSystemPrompt.Text = "System prompt:"; + // + // textBoxCompleteSystemPrompt + // + this.textBoxCompleteSystemPrompt.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxCompleteSystemPrompt.Location = new System.Drawing.Point(144, 283); + this.textBoxCompleteSystemPrompt.Multiline = true; + this.textBoxCompleteSystemPrompt.Name = "textBoxCompleteSystemPrompt"; + this.textBoxCompleteSystemPrompt.ReadOnly = true; + this.textBoxCompleteSystemPrompt.Size = new System.Drawing.Size(449, 79); + this.textBoxCompleteSystemPrompt.TabIndex = 3; + // + // labelProjectId + // + this.labelProjectId.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelProjectId.AutoSize = true; + this.labelProjectId.Location = new System.Drawing.Point(83, 13); + this.labelProjectId.Name = "labelProjectId"; + this.labelProjectId.Size = new System.Drawing.Size(55, 13); + this.labelProjectId.TabIndex = 6; + this.labelProjectId.Text = "Project Id:"; + // + // textBoxProjectId + // + this.textBoxProjectId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxProjectId.Location = new System.Drawing.Point(144, 10); + this.textBoxProjectId.Name = "textBoxProjectId"; + this.textBoxProjectId.Size = new System.Drawing.Size(449, 20); + this.textBoxProjectId.TabIndex = 1; + this.textBoxProjectId.TextChanged += new System.EventHandler(this.TextBoxVertexResourceParameters_TextChanged); + // + // labelLocationId + // + this.labelLocationId.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelLocationId.AutoSize = true; + this.labelLocationId.Location = new System.Drawing.Point(75, 53); + this.labelLocationId.Name = "labelLocationId"; + this.labelLocationId.Size = new System.Drawing.Size(63, 13); + this.labelLocationId.TabIndex = 6; + this.labelLocationId.Text = "Location Id:"; + // + // textBoxLocationId + // + this.textBoxLocationId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxLocationId.Location = new System.Drawing.Point(144, 50); + this.textBoxLocationId.Name = "textBoxLocationId"; + this.textBoxLocationId.Size = new System.Drawing.Size(449, 20); + this.textBoxLocationId.TabIndex = 1; + this.textBoxLocationId.TextChanged += new System.EventHandler(this.TextBoxVertexResourceParameters_TextChanged); + // + // labelPublisher + // + this.labelPublisher.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelPublisher.AutoSize = true; + this.labelPublisher.Location = new System.Drawing.Point(85, 93); + this.labelPublisher.Name = "labelPublisher"; + this.labelPublisher.Size = new System.Drawing.Size(53, 13); + this.labelPublisher.TabIndex = 6; + this.labelPublisher.Text = "Publisher:"; + // + // textBoxPublisher + // + this.textBoxPublisher.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxPublisher.Location = new System.Drawing.Point(144, 90); + this.textBoxPublisher.Name = "textBoxPublisher"; + this.textBoxPublisher.Size = new System.Drawing.Size(449, 20); + this.textBoxPublisher.TabIndex = 1; + this.textBoxPublisher.TextChanged += new System.EventHandler(this.TextBoxVertexResourceParameters_TextChanged); + // + // labelModelId + // + this.labelModelId.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelModelId.AutoSize = true; + this.labelModelId.Location = new System.Drawing.Point(87, 133); + this.labelModelId.Name = "labelModelId"; + this.labelModelId.Size = new System.Drawing.Size(51, 13); + this.labelModelId.TabIndex = 6; + this.labelModelId.Text = "Model Id:"; + // + // textBoxModelId + // + this.textBoxModelId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxModelId.Location = new System.Drawing.Point(144, 130); + this.textBoxModelId.Name = "textBoxModelId"; + this.textBoxModelId.Size = new System.Drawing.Size(449, 20); + this.textBoxModelId.TabIndex = 1; + this.textBoxModelId.TextChanged += new System.EventHandler(this.TextBoxVertexResourceParameters_TextChanged); + // + // VertexAiAutoConfigDialog + // + this.ClientSize = new System.Drawing.Size(634, 479); + this.Name = "VertexAiAutoConfigDialog"; + this.Controls.SetChildIndex(this.tabControl, 0); + this.Controls.SetChildIndex(this.buttonApply, 0); + this.Controls.SetChildIndex(this.buttonCancel, 0); + this.Controls.SetChildIndex(this.buttonOK, 0); + this.Controls.SetChildIndex(this.buttonSaveInRepository, 0); + this.tabControl.ResumeLayout(false); + this.tabPageSetup.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Label labelSourceLanguage; + private System.Windows.Forms.Label labelTargetLanguage; + private System.Windows.Forms.Label labelSystemPromptAddition; + private System.Windows.Forms.ComboBox comboBoxSystemPromptAdditions; + private System.Windows.Forms.Button buttonSetVertexAiApiKey; + private System.Windows.Forms.TextBox textBoxSourceLanguage; + private System.Windows.Forms.TextBox textBoxTargetLanguage; + private System.Windows.Forms.Label labelSystemPrompt; + private System.Windows.Forms.TextBox textBoxCompleteSystemPrompt; + private System.Windows.Forms.Label labelProjectId; + private System.Windows.Forms.TextBox textBoxProjectId; + private System.Windows.Forms.Label labelLocationId; + private System.Windows.Forms.TextBox textBoxLocationId; + private System.Windows.Forms.Label labelPublisher; + private System.Windows.Forms.TextBox textBoxPublisher; + private System.Windows.Forms.Label labelModelId; + private System.Windows.Forms.TextBox textBoxModelId; + } +} diff --git a/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.resx b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.resx new file mode 100644 index 00000000..4c464bdd --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiAutoConfigDialog.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 17, 17 + + + 338, 17 + + \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiEncConverter.cs b/src/EcTranslators/VertexAi/VertexAiEncConverter.cs new file mode 100644 index 00000000..ef9ad397 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiEncConverter.cs @@ -0,0 +1,256 @@ +// #define encryptingNewCredentials + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using Microsoft.Win32; // for RegistryKey +using ECInterfaces; // for IEncConverter +using SilEncConverters40.EcTranslators.BingTranslator; +using System.Windows.Forms; +using System.Reflection; +using Google.Apis.Discovery; + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + /// + /// Access to chat-bison or eventually gemini-pro via Google Cloud's Vertext AI + /// +#if X64 + [GuidAttribute("06907915-F41E-48BA-BF47-49F1E3CE584D")] +#else + [GuidAttribute("8B8FC565-9E65-44F7-B2C4-A2C11E54AD86")] +#endif + public class VertexAiEncConverter : PromptExeTranslator + { + #region Member Variable Definitions + protected string VertexAiSystemPrompt; + + public const string strDisplayName = "Vertex AI Translator"; + const string SystemPromptFormat = "You will be given 1 or more lines of text in {0} which you are to translate into {1}{2} and return only the translated lines."; + public static readonly string strHtmlFilename = "Vertex_AI_Translate_Plug-in_About_box.htm"; + public const string strExeDefPath = "VertexAiExe"; + public const string ImplTypeSilVertexAi = "SIL.VertexAi"; + public const string ReplacementSystemPrompt = "UseSystemPrompt: "; // to allow the user to specify the entire system prompt (rather than just the additional bit beyond 'SystemPromptFormat' above + + public const string EnvVarNameProjectId = "EncConverters_VertexAiProjectId"; // e.g. bright-coyote-381812 + public const string EnvVarNameLocationId = "EncConverters_VertexAiLocationId"; // e.g. us-central1 + public const string EnvVarNamePublisher = "EncConverters_VertexAiPublisher"; // e.g. google + public const string EnvVarNameModelId = "EncConverters_VertexAiModelId"; // e.g. chat-bison-32k, chat-bison, gemini-pro, etc. + public const string EnvVarNameCredentials = "GOOGLE_APPLICATION_CREDENTIALS"; // e.g. @"H:\bright-coyote-381812-bc584cec007f.json"; // downloaded from the APIs & Services => Credentials page in console.cloud.google.com + + #endregion Member Variable Definitions + + #region Initialization + // by putting the google cloud vertex AI credentials in a settings file, users can get their own credentials to use, + // and enter it thru the UI if our key runs out of free stuff + // see https://console.cloud.google.com/apis/credentials + public static string GoogleCloudVertexAiSubscriptionKey + { + get + { + var overrideKey = Properties.Settings.Default.GoogleCloudVertexAiCredentialsOverride; + +#if encryptingNewCredentials + var translatorKey = EncryptionClass.Encrypt(overrideKey); +#endif + + // decrypt it if we're storing it + overrideKey = String.IsNullOrEmpty(overrideKey) ? overrideKey : EncryptionClass.Decrypt(overrideKey); + + return !String.IsNullOrEmpty(overrideKey) + ? overrideKey + : Environment.GetEnvironmentVariable(EnvVarNameCredentials); + } + set + { + // the value is already encrypted by the time it gets here + var credentials = String.IsNullOrEmpty(value) ? value : EncryptionClass.Encrypt(value); + Properties.Settings.Default.GoogleCloudVertexAiCredentialsOverride = credentials; + } + } + + /// + /// The class constructor. + public VertexAiEncConverter() + : base + ( + typeof(VertexAiEncConverter).FullName, + ImplTypeSilVertexAi + ) + { + } + + public override void Initialize( + string converterName, + string converterSpec, + ref string lhsEncodingID, + ref string rhsEncodingID, + ref ConvType conversionType, + ref Int32 processTypeFlags, + Int32 codePageInput, + Int32 codePageOutput, + bool bAdding) + { + // let the base class have first stab at it + base.Initialize(converterName, converterSpec, ref lhsEncodingID, ref rhsEncodingID, + ref conversionType, ref processTypeFlags, codePageInput, codePageOutput, bAdding); + + ParseConverterIdentifier(converterSpec, out string fromLanguage, out string toLanguage, + out string projectId, out string locationId, out string publisher, out string modelId, + out string addlInstructions, out string systemPrompt); + + VertexAiSystemPrompt = systemPrompt; + + // this is the only one we support from now on (if the user really wants to do legacy to unicode, they have to deal with the legacy as coming in utf-8 format + conversionType = ConvType.Unicode_to_Unicode; + + // I'm assuming that we'd have to/want to set up a different one to go the other direction + m_eConversionType = conversionType = MakeUniDirectional(conversionType); + + if (String.IsNullOrEmpty(lhsEncodingID)) + lhsEncodingID = m_strLhsEncodingID = EncConverters.strDefUnicodeEncoding; + if (String.IsNullOrEmpty(rhsEncodingID)) + rhsEncodingID = m_strRhsEncodingID = EncConverters.strDefUnicodeEncoding; + + // this is a Translation process type by definition. This is used by various programs to prevent + // over usage -- e.g. Paratext should be blocking these EncConverter types as the 'Transliteration' + // type project EncConverter (bkz it'll try to "transliterate" the entire corpus -- probably not + // what's wanted). Also ClipboardEncConverter also doesn't process these for a preview (so the + // system tray popup doesn't take forever to display. + processTypeFlags |= (int)ProcessTypeFlags.Translation; + } + + internal static bool ParseConverterIdentifier(string converterSpec, + out string fromLanguage, out string toLanguage, + out string projectId, out string locationId, out string publisher, out string modelId, + out string addlInstructions, out string systemPrompt) + { + var strs = converterSpec.Split(new[] { ';' }); + if (strs.Length < 6) + throw new ApplicationException($"{strDisplayName} not properly configured! converterSpec: {converterSpec} must have at least a source and target language, followed by GoogleCloud Vertex AI settings: 'projectId', 'locationId' (e.g. us-central1), 'publisher' (e.g. google), and modelId (eg. chat-bison, chat-bison-32k, gemini-pro)"); + + fromLanguage = strs[0]; + toLanguage = strs[1]; + projectId = strs[2]; + locationId = strs[3]; + publisher = strs[4]; + modelId = strs[5]; + + addlInstructions = (strs.Length == 7) + ? strs[6] + : String.Empty; + + systemPrompt = GetSystemPrompt(fromLanguage, toLanguage, addlInstructions); + + return true; + } + + public static string GetSystemPrompt(string fromLanguage, string toLanguage, string addlInstructions) + { + return (addlInstructions.StartsWith(ReplacementSystemPrompt)) + ? SubstituteSystemPrompt(addlInstructions) + : FormatSystemPrompt(fromLanguage, toLanguage, addlInstructions); + } + + public static string SubstituteSystemPrompt(string addlInstructions) + { + return addlInstructions.Substring(ReplacementSystemPrompt.Length).Replace(";", null); + } + + public static string FormatSystemPrompt(string fromLanguage, string toLanguage, string addlInstructions) + { + // can't have double quotes in it, bkz we pass it as a command line parameter surrounded by double quotes + return String.Format(SystemPromptFormat, fromLanguage, toLanguage, $" {addlInstructions.Replace(";", null)}"); + } + + #endregion Initialization + + public override string ExeName + { + get + { + // the requirement is that this DLL (i.e. EcTranslators.dll) is in the same folder as the VertexAiExe.exe + // console app (bkz this EncConverter could be being launched by Paratext, which could even be using a different + // version of the core SilEncConverters40.dll--in its install folder), and which wouldn't have this + // EcTranslators DLL, OR by Word, which knows nothing about either and launches them via COM). + // So to get the path where the VertexAiExe is located, it should be the same location as this DLL + // (e.g. the SILConverters install dir) + var pathToDll = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + return Path.Combine(pathToDll, $"{strExeDefPath}.exe"); + } + } + + public override string Arguments + { + get + { + ParseConverterIdentifier(ConverterIdentifier, out string fromLanguage, out string toLanguage, + out string projectId, out string locationId, out string publisher, out string modelId, + out string addlInstructions, out string systemPrompt); + + var args = new VertexAiPromptExeTranslatorCommandLineArgs + { + ProjectId = projectId, + LocationId = locationId, + Publisher = publisher, + ModelId = modelId, + SystemPrompt = VertexAiSystemPrompt, + Credentials = GoogleCloudVertexAiSubscriptionKey, + ExamplesInputString = ExamplesInputString, + ExamplesOutputString = ExamplesOutputString, + }; + + // The system prompt can't have double quotes in it, bkz those are used for separating the 4 command line parameters, + // So convert them to single quotes, which should also work + // return $"\"{projectId}\" \"{locationId}\" \"{publisher}\" \"{modelId}\" \"{VertexAiSystemPrompt.Replace("\"", "'")}\" \"{GoogleCloudVertexAiSubscriptionKey}\""; + var tempFilespec = args.SaveToTempFile(); + var arguments = $"\"{tempFilespec}\""; + return arguments; + } + } + + private static bool IsValidParameter(string envVarName, ref string parameter) + { + return !string.IsNullOrEmpty(parameter) || + !string.IsNullOrEmpty((parameter = Environment.GetEnvironmentVariable(envVarName))); + } + + #region Misc helpers + + protected override EncodingForm DefaultUnicodeEncForm(bool bForward, bool bLHS) + { + // if it's unspecified, then we want UTF-16 + return EncodingForm.UTF16; + } + + #endregion Misc helpers + + #region Abstract Base Class Overrides + protected override string GetConfigTypeName + { + get { return typeof(VertexAiEncConverterConfig).AssemblyQualifiedName; } + } + + protected override Encoding StandardOutputEncoding + { + get + { + return Encoding.Unicode; + } + } + + protected override Encoding StandardInputEncoding + { + get + { + return Encoding.Unicode; + } + } + + #endregion Abstract Base Class Overrides + } +} + diff --git a/src/EcTranslators/VertexAi/VertexAiEncConverterConfig.cs b/src/EcTranslators/VertexAi/VertexAiEncConverterConfig.cs new file mode 100644 index 00000000..ed08b1ae --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiEncConverterConfig.cs @@ -0,0 +1,65 @@ +using System; +using System.Windows.Forms; +using ECInterfaces; // for IEncConverter + +//uncomment the following line for verbose debugging output using Console.WriteLine +//#define VERBOSE_DEBUGGING + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + public class VertexAiEncConverterConfig : EncConverterConfig + { + public VertexAiEncConverterConfig() + : base + ( + typeof(VertexAiEncConverter).FullName, + VertexAiEncConverter.strDisplayName, + VertexAiEncConverter.strHtmlFilename, + ProcessTypeFlags.Translation + ) + { + } + + [STAThread] + public override bool Configure + ( + IEncConverters aECs, + string strFriendlyName, + ConvType eConversionType, + string strLhsEncodingID, + string strRhsEncodingID + ) + { +#if VERBOSE_DEBUGGING + Console.WriteLine("VertexAiEncConverterConfig(3).Configure BEGIN"); +#endif + VertexAiAutoConfigDialog form = new VertexAiAutoConfigDialog(aECs, m_strDisplayName, m_strFriendlyName, + m_strConverterID, m_eConversionType, m_strLhsEncodingID, m_strRhsEncodingID, + m_lProcessType, m_bIsInRepository); + +#if VERBOSE_DEBUGGING + Console.WriteLine("VertexAiEncConverterConfig.Configure END"); +#endif + return base.Configure(form); + } + + public override void DisplayTestPage + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + Console.Error.WriteLine("VertexAiEncConverterConfig.DisplayTestPage() BEGIN"); + InitializeFromThis(ref strFriendlyName, ref strConverterIdentifier, + ref eConversionType, ref strTestData); + + VertexAiAutoConfigDialog form = new VertexAiAutoConfigDialog(aECs, strFriendlyName, + strConverterIdentifier, eConversionType, strTestData); + + base.DisplayTestPage(form); + } + } +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/App.config b/src/EcTranslators/VertexAi/VertexAiExe/App.config new file mode 100644 index 00000000..fdfd45f5 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/App.config @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiExe/MessageClasses.cs b/src/EcTranslators/VertexAi/VertexAiExe/MessageClasses.cs new file mode 100644 index 00000000..53023ee0 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/MessageClasses.cs @@ -0,0 +1,43 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SilEncConverters40.EcTranslators.VertexAi.VertexAiExe +{ + public class ChatConversation + { + public string context { get; set; } + public List examples { get; set; } + public List messages { get; set; } + + public override string ToString() + { + return JsonConvert.SerializeObject(this, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }); + } + } + + public class Example + { + public Input input { get; set; } + public Output output { get; set; } + } + + public class Input + { + public string content { get; set; } + } + + public class Output + { + public string content { get; set; } + } + + public class ChatMessage + { + public string author { get; set; } + public string content { get; set; } + } +} \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiExe/Program.cs b/src/EcTranslators/VertexAi/VertexAiExe/Program.cs new file mode 100644 index 00000000..5170ec85 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/Program.cs @@ -0,0 +1,332 @@ +// #define UseLocalExamples + +#if DEBUG +#define LogResults +// #define DEBUG_LIVE +#endif + +using Google.Apis.Auth.OAuth2; +using Google.Cloud.AIPlatform.V1; +using Google.Protobuf.Collections; +using Google.Protobuf.Reflection; +using Google.Type; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using static Google.Rpc.Context.AttributeContext.Types; +using Value = Google.Protobuf.WellKnownTypes.Value; + +namespace SilEncConverters40.EcTranslators.VertexAi.VertexAiExe +{ + internal class Program + { +#if LogResults + private const string LogFilePath = @"C:\btmp\VertexAiExeLog.txt"; +#endif + private const string EnvVarNameProjectId = "EncConverters_VertexAiProjectId"; // e.g. bright-coyote-381812 + private const string EnvVarNameLocationId = "EncConverters_VertexAiLocationId"; // e.g. us-central1 + private const string EnvVarNamePublisher = "EncConverters_VertexAiPublisher"; // e.g. google + private const string EnvVarNameModelId = "EncConverters_VertexAiModelId"; // e.g. chat-bison-32k, chat-bison, gemini-pro, etc. + + private const string EnvVarNameGoogleApplicationCredentials = "GOOGLE_APPLICATION_CREDENTIALS"; // e.g. @"C:\Users\pete_\Downloads\bright-coyote-381812-bc584cec007f.json" + + private static readonly char[] TrimmableChars = new char[] { '\r', '\n', ' ' }; + + static async Task Main(string[] args) + { + // set the stdin/out to Unicode + Console.InputEncoding = Encoding.Unicode; + Console.OutputEncoding = Encoding.Unicode; + + string pathToEncryptedCommandLineParameterFile = null; + if ((args.Length == 0) || !File.Exists((pathToEncryptedCommandLineParameterFile = args[0]))) + { + Console.WriteLine(String.Format("Usage:{0}{0}{1} \"\"", Environment.NewLine, typeof(Program).Namespace)); + return; + } + +#if DEBUG_LIVE + System.Diagnostics.Debug.Fail("Click Retry to debug AzureOpenAiExe"); +#endif + + try + { + var contents = File.ReadAllText(pathToEncryptedCommandLineParameterFile); + var json = EncryptionClass.Decrypt(contents); + var arguments = JsonConvert.DeserializeObject(json); + + if (!IsValidParameters(arguments, out PredictionServiceClient client, out EndpointName endpointName, + out string systemPrompt)) + return; + + await ProcessRequest(arguments, client, endpointName, systemPrompt); + } + catch (Exception ex) + { + Console.WriteLine(GetExceptionMessage(ex)); + } + + static string GetExceptionMessage(Exception ex) + { + var message = ex.Message; + var msg = "Error occurred: " + message; + while (ex.InnerException != null) + { + ex = ex.InnerException; + if (message.Contains(ex.Message)) + continue; // skip identical msgs + message = ex.Message; + msg += $"{Environment.NewLine}because: (InnerException): {message}"; + } + return msg; + } + } + + private static async Task ProcessRequest(VertexAiPromptExeTranslatorCommandLineArgs arguments, PredictionServiceClient client, + EndpointName endpointName, string systemPrompt) + { + var chatConversation = new ChatConversation + { + context = $"You are a Language Translator that Translates between different languages. Your job is to translate the text in the user prompt into the requested language according to the following instructions: {systemPrompt}", + examples = new List(), + messages = new List() + }; + + var numberOfExamples = arguments.ExamplesInputString.Count; + for (int i = 0; i < numberOfExamples; i++) + { + chatConversation.examples.Add(new Example + { + input = new Input { content = arguments.ExamplesInputString[i] }, + output = new Output { content = arguments.ExamplesOutputString[i] } + }); + } + + // You can construct Protobuf from JSON. + var parametersJson = JsonConvert.SerializeObject(new + { + temperature = (arguments.Temperature == null) ? 0.3 : (double)arguments.Temperature, + maxDecodeSteps = (arguments.MaxDecodeSteps == null) ? 200 : (int)arguments.MaxDecodeSteps, + topP = (arguments.TopP == null) ? 0.8 : arguments.TopP, + topK = (arguments.TopK == null) ? 40 : arguments.TopK, + }); + var parameters = Value.Parser.ParseJson(parametersJson); + + // in case there are multiple lines (e.g. what Paratext will do if the verse has multiple paragraphs), + // process in a while loop + var index = 0; +#if UseLocalExamples + List input = new List { "उसने सब लोग जान से मारा।", "वहाँ वह विश्राम के दिन प्रार्थना घर में जाकर लोगों को परमेश्वर का वचन सुनाने लगा। सब लोग सुनकर चकित हो गये।", "", "परंतु कई तो यह भी कहने लगे, “यह ज्ञान इसको कहाँ से आया!? और ऐसे सामर्थ्‍य के काम यह कैसे करता है, जिसकी चर्चा सब लोग कर रहे हैं!?" }; +#else + List input = null; // new List { "वहाँ वह विश्राम के दिन प्रार्थना घर में जाकर लोगों को परमेश्वर का वचन सुनाने लगा। सब लोग सुनकर चकित हो गये।", "", "परंतु कई तो यह भी कहने लगे, “यह ज्ञान इसको कहाँ से आया!? और ऐसे सामर्थ्‍य के काम यह कैसे करता है, जिसकी चर्चा सब लोग कर रहे हैं!?" }; +#endif + while ((input != null && input.Count > index) || (input == null && Console.In.Peek() != -1)) + { + var strInput = (input != null) + ? input[index++] + : Console.ReadLine(); + if (String.IsNullOrEmpty(strInput?.Trim(TrimmableChars))) // don't actually trim them, but just for the sake of finding nothing to translate... + continue; + + // add the string to be translated to as the 'user' message + chatConversation.messages.Add(new ChatMessage { author = "user", content = strInput }); + + // call the service to process the user msg based on the given system prompt + // Make the request. + var json = chatConversation.ToString(); +#if LogResults + File.AppendAllText(LogFilePath, json + Environment.NewLine); +#endif + var response = client.Predict(endpointName, new List { Value.Parser.ParseJson(json) }, parameters); + + var fields = response.Predictions.First().StructValue.Fields; + // clean up and return the "assistent's response" + var strOutput = HarvestResult(strInput, fields); + + // put that back in the chat, in case we are processing multiple lines + // (this'll make them 'related' for better translation) + chatConversation.messages.Add(new ChatMessage { author = "1", content = strOutput }); + } + + for (var i = 0; i < chatConversation.messages.Count;) + { + var strInput = chatConversation.messages[i++].content; + var strOutput = chatConversation.messages[i++].content; + +#if LogResults + File.AppendAllText(LogFilePath, string.Format("{1}=>{2}:{3}=>{4}{0}", Environment.NewLine, systemPrompt, i / 2, strInput, strOutput)); +#endif + // write the responses to the standard out to return it + Console.WriteLine(strOutput); + } + + return true; + } + + private static string HarvestResult(string strInput, MapField fields) + { + var responseContent = fields["candidates"].ListValue.Values[0].StructValue.Fields["content"].StringValue; + + if (strInput?[0] != ' ' && responseContent?[0] == ' ') + responseContent = responseContent.Substring(1); + + // these come from: https://cloud.google.com/vertex-ai/docs/generative-ai/configure-safety-attributes-palm + if (responseContent.Contains("I'm not able to help with that, as I'm only a language model. If you believe this is an error, please send us your feedback.")) + { + var blocked = fields["safetyAttributes"].ListValue.Values[0].StructValue.Fields["blocked"].BoolValue; + if (blocked) + { + var errors = fields["safetyAttributes"].ListValue.Values[0].StructValue.Fields["errors"].ListValue.Values[0].NumberValue.ToString(); + if ((errors.Length == 3) && (errors[0] == '2')) + { + string contentFilteringReason = "violence, sexual content, etc."; + switch (errors.Substring(1)) + { + case "20": + contentFilteringReason = "The supplied or returned language is unsupported.For a list of supported languages, see Language support."; + break; + + case "30": + contentFilteringReason = "The prompt or response was blocked because it was found to be potentially harmful. A term is included from the terminology blocklist. Rephrase your prompt."; + break; + + case "31": + contentFilteringReason = "The content might include Sensitive Personally Identifiable Information(SPII). Rephrase your prompt."; + break; + + case "40": + contentFilteringReason = "The prompt or response was blocked because it was found to be potentially harmful. The content violates SafeSearch settings.Rephrase your prompt."; + break; + + case "50": + contentFilteringReason = "The prompt or response was blocked because it might contain sexually explicit content.Rephrase your prompt."; + break; + + case "51": + contentFilteringReason = "The prompt or response was blocked because it might contain hate speech content.Rephrase your prompt."; + break; + + case "52": + contentFilteringReason = "The prompt or response was blocked because it might contain harassment content. Rephrase your prompt."; + break; + + case "53": + contentFilteringReason = "The prompt or response was blocked because it might contain dangerous content. Rephrase your prompt."; + break; + + case "54": + contentFilteringReason = "The prompt or response was blocked because it might contain toxic content. Rephrase your prompt."; + break; + + default: + case "00": + contentFilteringReason = "Reason unknown. Rephrase your prompt."; + break; + } + + responseContent = $""; + } + } + } + + return CleanString(strInput, responseContent); + } + + private static string CleanString(string input, string output) + { + if (!String.IsNullOrEmpty(input) && input.Length > 1) + { + if (input.First() != '"') + output = output.TrimStart('"'); + if (input.Length > 2 && input.Last() != '"') + output = output.TrimEnd('"'); + } + + return output; + } + + private static bool IsValidParameters(VertexAiPromptExeTranslatorCommandLineArgs arguments, out PredictionServiceClient client, + out EndpointName endpoint, out string systemPrompt) + { + client = null; + endpoint = null; + + var projectId = arguments.ProjectId; + var locationId = arguments.LocationId; + var publisher = arguments.Publisher; + var modelId = arguments.ModelId; + + systemPrompt = arguments.SystemPrompt; + + if (String.IsNullOrEmpty(projectId) || String.IsNullOrEmpty(locationId) || String.IsNullOrEmpty(publisher) || String.IsNullOrEmpty(modelId) || String.IsNullOrEmpty(systemPrompt)) + { + Console.WriteLine(String.Format("Usage:{0}{0}{1} \"\"", Environment.NewLine, typeof(Program).Namespace)); + return false; + } + + if (!IsValidParameter(EnvVarNameProjectId, ref projectId)) + { + Console.WriteLine($"The calling program failed to send the GoogleCloud ProjectId (first) command line parameter. You can also pass it by setting the '{EnvVarNameProjectId}' environment variable."); + return false; + } + + if (!IsValidParameter(EnvVarNameLocationId, ref locationId)) + { + Console.WriteLine($"The calling program failed to send the GoogleCloud LocationId (second) command line parameter (where the VertexAI resource is located, e.g. 'us-central1'). You can also pass it by setting the '{EnvVarNameLocationId}' environment variable."); + return false; + } + + if (!IsValidParameter(EnvVarNamePublisher, ref publisher)) + { + Console.WriteLine($"The calling program failed to send the Vertex AI Publisher (third) command line parameter (e.g. 'google'). You can also pass it by setting the '{EnvVarNamePublisher}' environment variable."); + return false; + } + + if (!IsValidParameter(EnvVarNameModelId, ref modelId)) + { + Console.WriteLine($"The calling program failed to send the Vertext AI ModelId (third) command line parameter (e.g. chat-bison-32k, chat-bison, gemini-pro, etc). You can also pass it by setting the '{EnvVarNameModelId}' environment variable."); + return false; + } + + if (String.IsNullOrEmpty(systemPrompt)) + { + Console.WriteLine("The calling program failed to send the System Prompt (forth) command line parameter"); + return false; + } + + var credentialsAsJson = arguments.Credentials; + var credentials = !String.IsNullOrEmpty(credentialsAsJson) && !File.Exists(credentialsAsJson) + ? GoogleCredential.FromJson(credentialsAsJson) + : GoogleCredential.GetApplicationDefault(); + + client = new PredictionServiceClientBuilder + { + Endpoint = $"{locationId}-aiplatform.googleapis.com", + GoogleCredential = credentials, + }.Build(); + + // Configure the parent resource. + endpoint = EndpointName.FromProjectLocationPublisherModel(projectId, locationId, publisher, modelId); + + return true; + } + + private static bool IsValidParameter(string envVarName, ref string parameter) + { + return !string.IsNullOrEmpty(parameter) || + !string.IsNullOrEmpty((parameter = Environment.GetEnvironmentVariable(envVarName))); + } + + static string Base64ToString(string base64String) + { + byte[] base64Bytes = Convert.FromBase64String(base64String); + return Encoding.UTF8.GetString(base64Bytes); + } + } +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/Properties/AssemblyInfo.cs b/src/EcTranslators/VertexAi/VertexAiExe/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0c93e171 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VertexAiExe")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("VertexAiExe")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5e1021b4-61ae-4e96-8d5a-7cdf6d5f7982")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/EcTranslators/VertexAi/VertexAiExe/VertexAiExe.csproj b/src/EcTranslators/VertexAi/VertexAiExe/VertexAiExe.csproj new file mode 100644 index 00000000..341601f6 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/VertexAiExe.csproj @@ -0,0 +1,238 @@ + + + + + Debug + x64 + {5E1021B4-61AE-4E96-8D5A-7CDF6D5F7982} + Exe + SilEncConverters40.EcTranslators.VertexAi.VertexAiExe + VertexAiExe + v4.8 + 512 + true + true + latest + + + + + true + ..\..\..\..\output\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + true + + + ..\..\..\..\output\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + true + + + true + ..\..\..\..\output\Win32\Debug\ + DEBUG;TRACE + full + x86 + prompt + true + + + ..\..\..\..\output\Win32\Release\ + TRACE + true + pdbonly + x86 + prompt + true + + + + ..\..\..\..\packages\Google.Api.CommonProtos.2.14.0\lib\net461\Google.Api.CommonProtos.dll + + + ..\..\..\..\packages\Google.Api.Gax.4.6.0\lib\net462\Google.Api.Gax.dll + + + ..\..\..\..\packages\Google.Api.Gax.Grpc.4.6.0\lib\net462\Google.Api.Gax.Grpc.dll + + + ..\..\..\..\packages\Google.Apis.1.67.0\lib\net462\Google.Apis.dll + + + ..\..\..\..\packages\Google.Apis.Auth.1.67.0\lib\net462\Google.Apis.Auth.dll + + + ..\..\..\..\packages\Google.Apis.Core.1.67.0\lib\net462\Google.Apis.Core.dll + + + ..\..\..\..\packages\Google.Cloud.AIPlatform.V1.2.24.0\lib\net462\Google.Cloud.AIPlatform.V1.dll + + + ..\..\..\..\packages\Google.Cloud.Iam.V1.3.1.0\lib\net462\Google.Cloud.Iam.V1.dll + + + ..\..\..\..\packages\Google.Cloud.Location.2.1.0\lib\net462\Google.Cloud.Location.dll + + + ..\..\..\..\packages\Google.LongRunning.3.1.0\lib\net462\Google.LongRunning.dll + + + ..\..\..\..\packages\Google.Protobuf.3.25.3\lib\net45\Google.Protobuf.dll + + + ..\..\..\..\packages\Grpc.Auth.2.61.0\lib\net462\Grpc.Auth.dll + + + ..\..\..\..\packages\Grpc.Core.2.46.6\lib\net45\Grpc.Core.dll + + + ..\..\..\..\packages\Grpc.Core.Api.2.61.0\lib\net462\Grpc.Core.Api.dll + + + ..\..\..\..\packages\Grpc.Net.Client.2.61.0\lib\net462\Grpc.Net.Client.dll + + + ..\..\..\..\packages\Grpc.Net.Common.2.61.0\lib\netstandard2.0\Grpc.Net.Common.dll + + + ..\..\..\..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\..\..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.0\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\..\..\..\packages\Microsoft.Extensions.Logging.Abstractions.8.0.0\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\..\..\..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + ..\..\..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\..\..\..\packages\System.CodeDom.8.0.0\lib\net462\System.CodeDom.dll + + + + ..\..\..\..\packages\System.Diagnostics.DiagnosticSource.8.0.0\lib\net462\System.Diagnostics.DiagnosticSource.dll + + + + ..\..\..\..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + ..\..\..\..\packages\System.Net.Http.WinHttpHandler.8.0.0\lib\net462\System.Net.Http.WinHttpHandler.dll + + + + ..\..\..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\..\..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\..\..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + ..\..\..\..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + PromptExeTranslatorCommandLineArgs.cs + + + RsaEncryptionClass.cs + + + VertexAiPromptExeTranslatorCommandLineArgs.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiExe/packages.config b/src/EcTranslators/VertexAi/VertexAiExe/packages.config new file mode 100644 index 00000000..1e8b914b --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/packages.config @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/annotations.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/annotations.proto new file mode 100644 index 00000000..efdab3db --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/annotations.proto @@ -0,0 +1,31 @@ +// Copyright 2015 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/http.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See `HttpRule`. + HttpRule http = 72295728; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/auth.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/auth.proto new file mode 100644 index 00000000..ca91bb1b --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/auth.proto @@ -0,0 +1,237 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "AuthProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Authentication` defines the authentication configuration for API methods +// provided by an API service. +// +// Example: +// +// name: calendar.googleapis.com +// authentication: +// providers: +// - id: google_calendar_auth +// jwks_uri: https://www.googleapis.com/oauth2/v1/certs +// issuer: https://securetoken.google.com +// rules: +// - selector: "*" +// requirements: +// provider_id: google_calendar_auth +// - selector: google.calendar.Delegate +// oauth: +// canonical_scopes: https://www.googleapis.com/auth/calendar.read +message Authentication { + // A list of authentication rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated AuthenticationRule rules = 3; + + // Defines a set of authentication providers that a service supports. + repeated AuthProvider providers = 4; +} + +// Authentication rules for the service. +// +// By default, if a method has any authentication requirements, every request +// must include a valid credential matching one of the requirements. +// It's an error to include more than one kind of credential in a single +// request. +// +// If a method doesn't have any auth requirements, request credentials will be +// ignored. +message AuthenticationRule { + // Selects the methods to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // The requirements for OAuth credentials. + OAuthRequirements oauth = 2; + + // If true, the service accepts API keys without any other credential. + // This flag only applies to HTTP and gRPC requests. + bool allow_without_credential = 5; + + // Requirements for additional authentication providers. + repeated AuthRequirement requirements = 7; +} + +// Specifies a location to extract JWT from an API request. +message JwtLocation { + oneof in { + // Specifies HTTP header name to extract JWT token. + string header = 1; + + // Specifies URL query parameter name to extract JWT token. + string query = 2; + + // Specifies cookie name to extract JWT token. + string cookie = 4; + } + + // The value prefix. The value format is "value_prefix{token}" + // Only applies to "in" header type. Must be empty for "in" query type. + // If not empty, the header value has to match (case sensitive) this prefix. + // If not matched, JWT will not be extracted. If matched, JWT will be + // extracted after the prefix is removed. + // + // For example, for "Authorization: Bearer {JWT}", + // value_prefix="Bearer " with a space at the end. + string value_prefix = 3; +} + +// Configuration for an authentication provider, including support for +// [JSON Web Token +// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). +message AuthProvider { + // The unique identifier of the auth provider. It will be referred to by + // `AuthRequirement.provider_id`. + // + // Example: "bookstore_auth". + string id = 1; + + // Identifies the principal that issued the JWT. See + // https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1 + // Usually a URL or an email address. + // + // Example: https://securetoken.google.com + // Example: 1234567-compute@developer.gserviceaccount.com + string issuer = 2; + + // URL of the provider's public key set to validate signature of the JWT. See + // [OpenID + // Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + // Optional if the key set document: + // - can be retrieved from + // [OpenID + // Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + // of the issuer. + // - can be inferred from the email domain of the issuer (e.g. a Google + // service account). + // + // Example: https://www.googleapis.com/oauth2/v1/certs + string jwks_uri = 3; + + // The list of JWT + // [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + // that are allowed to access. A JWT containing any of these audiences will + // be accepted. When this setting is absent, JWTs with audiences: + // - "https://[service.name]/[google.protobuf.Api.name]" + // - "https://[service.name]/" + // will be accepted. + // For example, if no audiences are in the setting, LibraryService API will + // accept JWTs with the following audiences: + // - + // https://library-example.googleapis.com/google.example.library.v1.LibraryService + // - https://library-example.googleapis.com/ + // + // Example: + // + // audiences: bookstore_android.apps.googleusercontent.com, + // bookstore_web.apps.googleusercontent.com + string audiences = 4; + + // Redirect URL if JWT token is required but not present or is expired. + // Implement authorizationUrl of securityDefinitions in OpenAPI spec. + string authorization_url = 5; + + // Defines the locations to extract the JWT. For now it is only used by the + // Cloud Endpoints to store the OpenAPI extension [x-google-jwt-locations] + // (https://cloud.google.com/endpoints/docs/openapi/openapi-extensions#x-google-jwt-locations) + // + // JWT locations can be one of HTTP headers, URL query parameters or + // cookies. The rule is that the first match wins. + // + // If not specified, default to use following 3 locations: + // 1) Authorization: Bearer + // 2) x-goog-iap-jwt-assertion + // 3) access_token query parameter + // + // Default locations can be specified as followings: + // jwt_locations: + // - header: Authorization + // value_prefix: "Bearer " + // - header: x-goog-iap-jwt-assertion + // - query: access_token + repeated JwtLocation jwt_locations = 6; +} + +// OAuth scopes are a way to define data and permissions on data. For example, +// there are scopes defined for "Read-only access to Google Calendar" and +// "Access to Cloud Platform". Users can consent to a scope for an application, +// giving it permission to access that data on their behalf. +// +// OAuth scope specifications should be fairly coarse grained; a user will need +// to see and understand the text description of what your scope means. +// +// In most cases: use one or at most two OAuth scopes for an entire family of +// products. If your product has multiple APIs, you should probably be sharing +// the OAuth scope across all of those APIs. +// +// When you need finer grained OAuth consent screens: talk with your product +// management about how developers will use them in practice. +// +// Please note that even though each of the canonical scopes is enough for a +// request to be accepted and passed to the backend, a request can still fail +// due to the backend requiring additional scopes or permissions. +message OAuthRequirements { + // The list of publicly documented OAuth scopes that are allowed access. An + // OAuth token containing any of these scopes will be accepted. + // + // Example: + // + // canonical_scopes: https://www.googleapis.com/auth/calendar, + // https://www.googleapis.com/auth/calendar.read + string canonical_scopes = 1; +} + +// User-defined authentication requirements, including support for +// [JSON Web Token +// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). +message AuthRequirement { + // [id][google.api.AuthProvider.id] from authentication provider. + // + // Example: + // + // provider_id: bookstore_auth + string provider_id = 1; + + // NOTE: This will be deprecated soon, once AuthProvider.audiences is + // implemented and accepted in all the runtime components. + // + // The list of JWT + // [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + // that are allowed to access. A JWT containing any of these audiences will + // be accepted. When this setting is absent, only JWTs with audience + // "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" + // will be accepted. For example, if no audiences are in the setting, + // LibraryService API will only accept JWTs with the following audience + // "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + // + // Example: + // + // audiences: bookstore_android.apps.googleusercontent.com, + // bookstore_web.apps.googleusercontent.com + string audiences = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/backend.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/backend.proto new file mode 100644 index 00000000..6ff68878 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/backend.proto @@ -0,0 +1,185 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "BackendProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Backend` defines the backend configuration for a service. +message Backend { + // A list of API backend rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated BackendRule rules = 1; +} + +// A backend rule provides configuration for an individual API element. +message BackendRule { + // Path Translation specifies how to combine the backend address with the + // request path in order to produce the appropriate forwarding URL for the + // request. + // + // Path Translation is applicable only to HTTP-based backends. Backends which + // do not accept requests over HTTP/HTTPS should leave `path_translation` + // unspecified. + enum PathTranslation { + PATH_TRANSLATION_UNSPECIFIED = 0; + + // Use the backend address as-is, with no modification to the path. If the + // URL pattern contains variables, the variable names and values will be + // appended to the query string. If a query string parameter and a URL + // pattern variable have the same name, this may result in duplicate keys in + // the query string. + // + // # Examples + // + // Given the following operation config: + // + // Method path: /api/company/{cid}/user/{uid} + // Backend address: https://example.cloudfunctions.net/getUser + // + // Requests to the following request paths will call the backend at the + // translated path: + // + // Request path: /api/company/widgetworks/user/johndoe + // Translated: + // https://example.cloudfunctions.net/getUser?cid=widgetworks&uid=johndoe + // + // Request path: /api/company/widgetworks/user/johndoe?timezone=EST + // Translated: + // https://example.cloudfunctions.net/getUser?timezone=EST&cid=widgetworks&uid=johndoe + CONSTANT_ADDRESS = 1; + + // The request path will be appended to the backend address. + // + // # Examples + // + // Given the following operation config: + // + // Method path: /api/company/{cid}/user/{uid} + // Backend address: https://example.appspot.com + // + // Requests to the following request paths will call the backend at the + // translated path: + // + // Request path: /api/company/widgetworks/user/johndoe + // Translated: + // https://example.appspot.com/api/company/widgetworks/user/johndoe + // + // Request path: /api/company/widgetworks/user/johndoe?timezone=EST + // Translated: + // https://example.appspot.com/api/company/widgetworks/user/johndoe?timezone=EST + APPEND_PATH_TO_ADDRESS = 2; + } + + // Selects the methods to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // The address of the API backend. + // + // The scheme is used to determine the backend protocol and security. + // The following schemes are accepted: + // + // SCHEME PROTOCOL SECURITY + // http:// HTTP None + // https:// HTTP TLS + // grpc:// gRPC None + // grpcs:// gRPC TLS + // + // It is recommended to explicitly include a scheme. Leaving out the scheme + // may cause constrasting behaviors across platforms. + // + // If the port is unspecified, the default is: + // - 80 for schemes without TLS + // - 443 for schemes with TLS + // + // For HTTP backends, use [protocol][google.api.BackendRule.protocol] + // to specify the protocol version. + string address = 2; + + // The number of seconds to wait for a response from a request. The default + // varies based on the request protocol and deployment environment. + double deadline = 3; + + // Deprecated, do not use. + double min_deadline = 4 [deprecated = true]; + + // The number of seconds to wait for the completion of a long running + // operation. The default is no deadline. + double operation_deadline = 5; + + PathTranslation path_translation = 6; + + // Authentication settings used by the backend. + // + // These are typically used to provide service management functionality to + // a backend served on a publicly-routable URL. The `authentication` + // details should match the authentication behavior used by the backend. + // + // For example, specifying `jwt_audience` implies that the backend expects + // authentication via a JWT. + // + // When authentication is unspecified, the resulting behavior is the same + // as `disable_auth` set to `true`. + // + // Refer to https://developers.google.com/identity/protocols/OpenIDConnect for + // JWT ID token. + oneof authentication { + // The JWT audience is used when generating a JWT ID token for the backend. + // This ID token will be added in the HTTP "authorization" header, and sent + // to the backend. + string jwt_audience = 7; + + // When disable_auth is true, a JWT ID token won't be generated and the + // original "Authorization" HTTP header will be preserved. If the header is + // used to carry the original token and is expected by the backend, this + // field must be set to true to preserve the header. + bool disable_auth = 8; + } + + // The protocol used for sending a request to the backend. + // The supported values are "http/1.1" and "h2". + // + // The default value is inferred from the scheme in the + // [address][google.api.BackendRule.address] field: + // + // SCHEME PROTOCOL + // http:// http/1.1 + // https:// http/1.1 + // grpc:// h2 + // grpcs:// h2 + // + // For secure HTTP backends (https://) that support HTTP/2, set this field + // to "h2" for improved performance. + // + // Configuring this field to non-default values is only supported for secure + // HTTP backends. This field will be ignored for all other backends. + // + // See + // https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + // for more details on the supported values. + string protocol = 9; + + // The map between request protocol and the backend address. + map overrides_by_request_protocol = 10; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/billing.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/billing.proto new file mode 100644 index 00000000..8b75452f --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/billing.proto @@ -0,0 +1,77 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "BillingProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Billing related configuration of the service. +// +// The following example shows how to configure monitored resources and metrics +// for billing, `consumer_destinations` is the only supported destination and +// the monitored resources need at least one label key +// `cloud.googleapis.com/location` to indicate the location of the billing +// usage, using different monitored resources between monitoring and billing is +// recommended so they can be evolved independently: +// +// +// monitored_resources: +// - type: library.googleapis.com/billing_branch +// labels: +// - key: cloud.googleapis.com/location +// description: | +// Predefined label to support billing location restriction. +// - key: city +// description: | +// Custom label to define the city where the library branch is located +// in. +// - key: name +// description: Custom label to define the name of the library branch. +// metrics: +// - name: library.googleapis.com/book/borrowed_count +// metric_kind: DELTA +// value_type: INT64 +// unit: "1" +// billing: +// consumer_destinations: +// - monitored_resource: library.googleapis.com/billing_branch +// metrics: +// - library.googleapis.com/book/borrowed_count +message Billing { + // Configuration of a specific billing destination (Currently only support + // bill against consumer project). + message BillingDestination { + // The monitored resource type. The type must be defined in + // [Service.monitored_resources][google.api.Service.monitored_resources] + // section. + string monitored_resource = 1; + + // Names of the metrics to report to this billing destination. + // Each name must be defined in + // [Service.metrics][google.api.Service.metrics] section. + repeated string metrics = 2; + } + + // Billing configurations for sending metrics to the consumer project. + // There can be multiple consumer destinations per service, each one must have + // a different monitored resource type. A metric can be used in at most + // one consumer destination. + repeated BillingDestination consumer_destinations = 8; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/client.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/client.proto new file mode 100644 index 00000000..39bdde82 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/client.proto @@ -0,0 +1,407 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/launch_stage.proto"; +import "google/protobuf/descriptor.proto"; +import "google/protobuf/duration.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "ClientProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // A definition of a client library method signature. + // + // In client libraries, each proto RPC corresponds to one or more methods + // which the end user is able to call, and calls the underlying RPC. + // Normally, this method receives a single argument (a struct or instance + // corresponding to the RPC request object). Defining this field will + // add one or more overloads providing flattened or simpler method signatures + // in some languages. + // + // The fields on the method signature are provided as a comma-separated + // string. + // + // For example, the proto RPC and annotation: + // + // rpc CreateSubscription(CreateSubscriptionRequest) + // returns (Subscription) { + // option (google.api.method_signature) = "name,topic"; + // } + // + // Would add the following Java overload (in addition to the method accepting + // the request object): + // + // public final Subscription createSubscription(String name, String topic) + // + // The following backwards-compatibility guidelines apply: + // + // * Adding this annotation to an unannotated method is backwards + // compatible. + // * Adding this annotation to a method which already has existing + // method signature annotations is backwards compatible if and only if + // the new method signature annotation is last in the sequence. + // * Modifying or removing an existing method signature annotation is + // a breaking change. + // * Re-ordering existing method signature annotations is a breaking + // change. + repeated string method_signature = 1051; +} + +extend google.protobuf.ServiceOptions { + // The hostname for this service. + // This should be specified with no prefix or protocol. + // + // Example: + // + // service Foo { + // option (google.api.default_host) = "foo.googleapi.com"; + // ... + // } + string default_host = 1049; + + // OAuth scopes needed for the client. + // + // Example: + // + // service Foo { + // option (google.api.oauth_scopes) = \ + // "https://www.googleapis.com/auth/cloud-platform"; + // ... + // } + // + // If there is more than one scope, use a comma-separated string: + // + // Example: + // + // service Foo { + // option (google.api.oauth_scopes) = \ + // "https://www.googleapis.com/auth/cloud-platform," + // "https://www.googleapis.com/auth/monitoring"; + // ... + // } + string oauth_scopes = 1050; +} + +// Required information for every language. +message CommonLanguageSettings { + // Link to automatically generated reference documentation. Example: + // https://cloud.google.com/nodejs/docs/reference/asset/latest + string reference_docs_uri = 1 [deprecated = true]; + + // The destination where API teams want this client library to be published. + repeated ClientLibraryDestination destinations = 2; +} + +// Details about how and where to publish client libraries. +message ClientLibrarySettings { + // Version of the API to apply these settings to. This is the full protobuf + // package for the API, ending in the version element. + // Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + string version = 1; + + // Launch stage of this version of the API. + LaunchStage launch_stage = 2; + + // When using transport=rest, the client request will encode enums as + // numbers rather than strings. + bool rest_numeric_enums = 3; + + // Settings for legacy Java features, supported in the Service YAML. + JavaSettings java_settings = 21; + + // Settings for C++ client libraries. + CppSettings cpp_settings = 22; + + // Settings for PHP client libraries. + PhpSettings php_settings = 23; + + // Settings for Python client libraries. + PythonSettings python_settings = 24; + + // Settings for Node client libraries. + NodeSettings node_settings = 25; + + // Settings for .NET client libraries. + DotnetSettings dotnet_settings = 26; + + // Settings for Ruby client libraries. + RubySettings ruby_settings = 27; + + // Settings for Go client libraries. + GoSettings go_settings = 28; +} + +// This message configures the settings for publishing [Google Cloud Client +// libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) +// generated from the service config. +message Publishing { + // A list of API method settings, e.g. the behavior for methods that use the + // long-running operation pattern. + repeated MethodSettings method_settings = 2; + + // Link to a *public* URI where users can report issues. Example: + // https://issuetracker.google.com/issues/new?component=190865&template=1161103 + string new_issue_uri = 101; + + // Link to product home page. Example: + // https://cloud.google.com/asset-inventory/docs/overview + string documentation_uri = 102; + + // Used as a tracking tag when collecting data about the APIs developer + // relations artifacts like docs, packages delivered to package managers, + // etc. Example: "speech". + string api_short_name = 103; + + // GitHub label to apply to issues and pull requests opened for this API. + string github_label = 104; + + // GitHub teams to be added to CODEOWNERS in the directory in GitHub + // containing source code for the client libraries for this API. + repeated string codeowner_github_teams = 105; + + // A prefix used in sample code when demarking regions to be included in + // documentation. + string doc_tag_prefix = 106; + + // For whom the client library is being published. + ClientLibraryOrganization organization = 107; + + // Client library settings. If the same version string appears multiple + // times in this list, then the last one wins. Settings from earlier + // settings with the same version string are discarded. + repeated ClientLibrarySettings library_settings = 109; + + // Optional link to proto reference documentation. Example: + // https://cloud.google.com/pubsub/lite/docs/reference/rpc + string proto_reference_documentation_uri = 110; +} + +// Settings for Java client libraries. +message JavaSettings { + // The package name to use in Java. Clobbers the java_package option + // set in the protobuf. This should be used **only** by APIs + // who have already set the language_settings.java.package_name" field + // in gapic.yaml. API teams should use the protobuf java_package option + // where possible. + // + // Example of a YAML configuration:: + // + // publishing: + // java_settings: + // library_package: com.google.cloud.pubsub.v1 + string library_package = 1; + + // Configure the Java class name to use instead of the service's for its + // corresponding generated GAPIC client. Keys are fully-qualified + // service names as they appear in the protobuf (including the full + // the language_settings.java.interface_names" field in gapic.yaml. API + // teams should otherwise use the service name as it appears in the + // protobuf. + // + // Example of a YAML configuration:: + // + // publishing: + // java_settings: + // service_class_names: + // - google.pubsub.v1.Publisher: TopicAdmin + // - google.pubsub.v1.Subscriber: SubscriptionAdmin + map service_class_names = 2; + + // Some settings. + CommonLanguageSettings common = 3; +} + +// Settings for C++ client libraries. +message CppSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Php client libraries. +message PhpSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Python client libraries. +message PythonSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Node client libraries. +message NodeSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Dotnet client libraries. +message DotnetSettings { + // Some settings. + CommonLanguageSettings common = 1; + + // Map from original service names to renamed versions. + // This is used when the default generated types + // would cause a naming conflict. (Neither name is + // fully-qualified.) + // Example: Subscriber to SubscriberServiceApi. + map renamed_services = 2; + + // Map from full resource types to the effective short name + // for the resource. This is used when otherwise resource + // named from different services would cause naming collisions. + // Example entry: + // "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + map renamed_resources = 3; + + // List of full resource types to ignore during generation. + // This is typically used for API-specific Location resources, + // which should be handled by the generator as if they were actually + // the common Location resources. + // Example entry: "documentai.googleapis.com/Location" + repeated string ignored_resources = 4; + + // Namespaces which must be aliased in snippets due to + // a known (but non-generator-predictable) naming collision + repeated string forced_namespace_aliases = 5; + + // Method signatures (in the form "service.method(signature)") + // which are provided separately, so shouldn't be generated. + // Snippets *calling* these methods are still generated, however. + repeated string handwritten_signatures = 6; +} + +// Settings for Ruby client libraries. +message RubySettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Settings for Go client libraries. +message GoSettings { + // Some settings. + CommonLanguageSettings common = 1; +} + +// Describes the generator configuration for a method. +message MethodSettings { + // Describes settings to use when generating API methods that use the + // long-running operation pattern. + // All default values below are from those used in the client library + // generators (e.g. + // [Java](https://github.com/googleapis/gapic-generator-java/blob/04c2faa191a9b5a10b92392fe8482279c4404803/src/main/java/com/google/api/generator/gapic/composer/common/RetrySettingsComposer.java)). + message LongRunning { + // Initial delay after which the first poll request will be made. + // Default value: 5 seconds. + google.protobuf.Duration initial_poll_delay = 1; + + // Multiplier to gradually increase delay between subsequent polls until it + // reaches max_poll_delay. + // Default value: 1.5. + float poll_delay_multiplier = 2; + + // Maximum time between two subsequent poll requests. + // Default value: 45 seconds. + google.protobuf.Duration max_poll_delay = 3; + + // Total polling timeout. + // Default value: 5 minutes. + google.protobuf.Duration total_poll_timeout = 4; + } + + // The fully qualified name of the method, for which the options below apply. + // This is used to find the method to apply the options. + string selector = 1; + + // Describes settings to use for long-running operations when generating + // API methods for RPCs. Complements RPCs that use the annotations in + // google/longrunning/operations.proto. + // + // Example of a YAML configuration:: + // + // publishing: + // method_settings: + // - selector: google.cloud.speech.v2.Speech.BatchRecognize + // long_running: + // initial_poll_delay: + // seconds: 60 # 1 minute + // poll_delay_multiplier: 1.5 + // max_poll_delay: + // seconds: 360 # 6 minutes + // total_poll_timeout: + // seconds: 54000 # 90 minutes + LongRunning long_running = 2; + + // List of top-level fields of the request message, that should be + // automatically populated by the client libraries based on their + // (google.api.field_info).format. Currently supported format: UUID4. + // + // Example of a YAML configuration: + // + // publishing: + // method_settings: + // - selector: google.example.v1.ExampleService.CreateExample + // auto_populated_fields: + // - request_id + repeated string auto_populated_fields = 3; +} + +// The organization for which the client libraries are being published. +// Affects the url where generated docs are published, etc. +enum ClientLibraryOrganization { + // Not useful. + CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0; + + // Google Cloud Platform Org. + CLOUD = 1; + + // Ads (Advertising) Org. + ADS = 2; + + // Photos Org. + PHOTOS = 3; + + // Street View Org. + STREET_VIEW = 4; + + // Shopping Org. + SHOPPING = 5; + + // Geo Org. + GEO = 6; + + // Generative AI - https://developers.generativeai.google + GENERATIVE_AI = 7; +} + +// To where should client libraries be published? +enum ClientLibraryDestination { + // Client libraries will neither be generated nor published to package + // managers. + CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0; + + // Generate the client library in a repo under github.com/googleapis, + // but don't publish it to package managers. + GITHUB = 10; + + // Publish the library to package managers like nuget.org and npmjs.com. + PACKAGE_MANAGER = 20; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/config_change.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/config_change.proto new file mode 100644 index 00000000..1dc8044b --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/config_change.proto @@ -0,0 +1,84 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/configchange;configchange"; +option java_multiple_files = true; +option java_outer_classname = "ConfigChangeProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Output generated from semantically comparing two versions of a service +// configuration. +// +// Includes detailed information about a field that have changed with +// applicable advice about potential consequences for the change, such as +// backwards-incompatibility. +message ConfigChange { + // Object hierarchy path to the change, with levels separated by a '.' + // character. For repeated fields, an applicable unique identifier field is + // used for the index (usually selector, name, or id). For maps, the term + // 'key' is used. If the field has no unique identifier, the numeric index + // is used. + // Examples: + // - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction + // - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value + // - logging.producer_destinations[0] + string element = 1; + + // Value of the changed object in the old Service configuration, + // in JSON format. This field will not be populated if ChangeType == ADDED. + string old_value = 2; + + // Value of the changed object in the new Service configuration, + // in JSON format. This field will not be populated if ChangeType == REMOVED. + string new_value = 3; + + // The type for this change, either ADDED, REMOVED, or MODIFIED. + ChangeType change_type = 4; + + // Collection of advice provided for this change, useful for determining the + // possible impact of this change. + repeated Advice advices = 5; +} + +// Generated advice about this change, used for providing more +// information about how a change will affect the existing service. +message Advice { + // Useful description for why this advice was applied and what actions should + // be taken to mitigate any implied risks. + string description = 2; +} + +// Classifies set of possible modifications to an object in the service +// configuration. +enum ChangeType { + // No value was provided. + CHANGE_TYPE_UNSPECIFIED = 0; + + // The changed object exists in the 'new' service configuration, but not + // in the 'old' service configuration. + ADDED = 1; + + // The changed object exists in the 'old' service configuration, but not + // in the 'new' service configuration. + REMOVED = 2; + + // The changed object exists in both service configurations, but its value + // is different. + MODIFIED = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/consumer.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/consumer.proto new file mode 100644 index 00000000..b7e5df1c --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/consumer.proto @@ -0,0 +1,82 @@ +// Copyright 2016 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "ConsumerProto"; +option java_package = "com.google.api"; + +// A descriptor for defining project properties for a service. One service may +// have many consumer projects, and the service may want to behave differently +// depending on some properties on the project. For example, a project may be +// associated with a school, or a business, or a government agency, a business +// type property on the project may affect how a service responds to the client. +// This descriptor defines which properties are allowed to be set on a project. +// +// Example: +// +// project_properties: +// properties: +// - name: NO_WATERMARK +// type: BOOL +// description: Allows usage of the API without watermarks. +// - name: EXTENDED_TILE_CACHE_PERIOD +// type: INT64 +message ProjectProperties { + // List of per consumer project-specific properties. + repeated Property properties = 1; +} + +// Defines project properties. +// +// API services can define properties that can be assigned to consumer projects +// so that backends can perform response customization without having to make +// additional calls or maintain additional storage. For example, Maps API +// defines properties that controls map tile cache period, or whether to embed a +// watermark in a result. +// +// These values can be set via API producer console. Only API providers can +// define and set these properties. +message Property { + // Supported data type of the property values + enum PropertyType { + // The type is unspecified, and will result in an error. + UNSPECIFIED = 0; + + // The type is `int64`. + INT64 = 1; + + // The type is `bool`. + BOOL = 2; + + // The type is `string`. + STRING = 3; + + // The type is 'double'. + DOUBLE = 4; + } + + // The name of the property (a.k.a key). + string name = 1; + + // The type of this property. + PropertyType type = 2; + + // The description of the property + string description = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/context.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/context.proto new file mode 100644 index 00000000..1b165178 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/context.proto @@ -0,0 +1,90 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "ContextProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Context` defines which contexts an API requests. +// +// Example: +// +// context: +// rules: +// - selector: "*" +// requested: +// - google.rpc.context.ProjectContext +// - google.rpc.context.OriginContext +// +// The above specifies that all methods in the API request +// `google.rpc.context.ProjectContext` and +// `google.rpc.context.OriginContext`. +// +// Available context types are defined in package +// `google.rpc.context`. +// +// This also provides mechanism to allowlist any protobuf message extension that +// can be sent in grpc metadata using “x-goog-ext--bin” and +// “x-goog-ext--jspb” format. For example, list any service +// specific protobuf types that can appear in grpc metadata as follows in your +// yaml file: +// +// Example: +// +// context: +// rules: +// - selector: "google.example.library.v1.LibraryService.CreateBook" +// allowed_request_extensions: +// - google.foo.v1.NewExtension +// allowed_response_extensions: +// - google.foo.v1.NewExtension +// +// You can also specify extension ID instead of fully qualified extension name +// here. +message Context { + // A list of RPC context rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated ContextRule rules = 1; +} + +// A context rule provides information about the context for an individual API +// element. +message ContextRule { + // Selects the methods to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // A list of full type names of requested contexts. + repeated string requested = 2; + + // A list of full type names of provided contexts. + repeated string provided = 3; + + // A list of full type names or extension IDs of extensions allowed in grpc + // side channel from client to backend. + repeated string allowed_request_extensions = 4; + + // A list of full type names or extension IDs of extensions allowed in grpc + // side channel from backend to client. + repeated string allowed_response_extensions = 5; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/control.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/control.proto new file mode 100644 index 00000000..cbbce6f6 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/control.proto @@ -0,0 +1,41 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/policy.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "ControlProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Selects and configures the service controller used by the service. +// +// Example: +// +// control: +// environment: servicecontrol.googleapis.com +message Control { + // The service controller environment to use. If empty, no control plane + // feature (like quota and billing) will be enabled. The recommended value for + // most services is servicecontrol.googleapis.com + string environment = 1; + + // Defines policies applying to the API methods of the service. + repeated MethodPolicy method_policies = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/distribution.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/distribution.proto new file mode 100644 index 00000000..b0bc4930 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/distribution.proto @@ -0,0 +1,213 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/distribution;distribution"; +option java_multiple_files = true; +option java_outer_classname = "DistributionProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Distribution` contains summary statistics for a population of values. It +// optionally contains a histogram representing the distribution of those values +// across a set of buckets. +// +// The summary statistics are the count, mean, sum of the squared deviation from +// the mean, the minimum, and the maximum of the set of population of values. +// The histogram is based on a sequence of buckets and gives a count of values +// that fall into each bucket. The boundaries of the buckets are given either +// explicitly or by formulas for buckets of fixed or exponentially increasing +// widths. +// +// Although it is not forbidden, it is generally a bad idea to include +// non-finite values (infinities or NaNs) in the population of values, as this +// will render the `mean` and `sum_of_squared_deviation` fields meaningless. +message Distribution { + // The range of the population values. + message Range { + // The minimum of the population values. + double min = 1; + + // The maximum of the population values. + double max = 2; + } + + // `BucketOptions` describes the bucket boundaries used to create a histogram + // for the distribution. The buckets can be in a linear sequence, an + // exponential sequence, or each bucket can be specified explicitly. + // `BucketOptions` does not include the number of values in each bucket. + // + // A bucket has an inclusive lower bound and exclusive upper bound for the + // values that are counted for that bucket. The upper bound of a bucket must + // be strictly greater than the lower bound. The sequence of N buckets for a + // distribution consists of an underflow bucket (number 0), zero or more + // finite buckets (number 1 through N - 2) and an overflow bucket (number N - + // 1). The buckets are contiguous: the lower bound of bucket i (i > 0) is the + // same as the upper bound of bucket i - 1. The buckets span the whole range + // of finite values: lower bound of the underflow bucket is -infinity and the + // upper bound of the overflow bucket is +infinity. The finite buckets are + // so-called because both bounds are finite. + message BucketOptions { + // Specifies a linear sequence of buckets that all have the same width + // (except overflow and underflow). Each bucket represents a constant + // absolute uncertainty on the specific value in the bucket. + // + // There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the + // following boundaries: + // + // Upper bound (0 <= i < N-1): offset + (width * i). + // + // Lower bound (1 <= i < N): offset + (width * (i - 1)). + message Linear { + // Must be greater than 0. + int32 num_finite_buckets = 1; + + // Must be greater than 0. + double width = 2; + + // Lower bound of the first bucket. + double offset = 3; + } + + // Specifies an exponential sequence of buckets that have a width that is + // proportional to the value of the lower bound. Each bucket represents a + // constant relative uncertainty on a specific value in the bucket. + // + // There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the + // following boundaries: + // + // Upper bound (0 <= i < N-1): scale * (growth_factor ^ i). + // + // Lower bound (1 <= i < N): scale * (growth_factor ^ (i - 1)). + message Exponential { + // Must be greater than 0. + int32 num_finite_buckets = 1; + + // Must be greater than 1. + double growth_factor = 2; + + // Must be greater than 0. + double scale = 3; + } + + // Specifies a set of buckets with arbitrary widths. + // + // There are `size(bounds) + 1` (= N) buckets. Bucket `i` has the following + // boundaries: + // + // Upper bound (0 <= i < N-1): bounds[i] + // Lower bound (1 <= i < N); bounds[i - 1] + // + // The `bounds` field must contain at least one element. If `bounds` has + // only one element, then there are no finite buckets, and that single + // element is the common boundary of the overflow and underflow buckets. + message Explicit { + // The values must be monotonically increasing. + repeated double bounds = 1; + } + + // Exactly one of these three fields must be set. + oneof options { + // The linear bucket. + Linear linear_buckets = 1; + + // The exponential buckets. + Exponential exponential_buckets = 2; + + // The explicit buckets. + Explicit explicit_buckets = 3; + } + } + + // Exemplars are example points that may be used to annotate aggregated + // distribution values. They are metadata that gives information about a + // particular value added to a Distribution bucket, such as a trace ID that + // was active when a value was added. They may contain further information, + // such as a example values and timestamps, origin, etc. + message Exemplar { + // Value of the exemplar point. This value determines to which bucket the + // exemplar belongs. + double value = 1; + + // The observation (sampling) time of the above value. + google.protobuf.Timestamp timestamp = 2; + + // Contextual information about the example value. Examples are: + // + // Trace: type.googleapis.com/google.monitoring.v3.SpanContext + // + // Literal string: type.googleapis.com/google.protobuf.StringValue + // + // Labels dropped during aggregation: + // type.googleapis.com/google.monitoring.v3.DroppedLabels + // + // There may be only a single attachment of any given message type in a + // single exemplar, and this is enforced by the system. + repeated google.protobuf.Any attachments = 3; + } + + // The number of values in the population. Must be non-negative. This value + // must equal the sum of the values in `bucket_counts` if a histogram is + // provided. + int64 count = 1; + + // The arithmetic mean of the values in the population. If `count` is zero + // then this field must be zero. + double mean = 2; + + // The sum of squared deviations from the mean of the values in the + // population. For values x_i this is: + // + // Sum[i=1..n]((x_i - mean)^2) + // + // Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition + // describes Welford's method for accumulating this sum in one pass. + // + // If `count` is zero then this field must be zero. + double sum_of_squared_deviation = 3; + + // If specified, contains the range of the population values. The field + // must not be present if the `count` is zero. + Range range = 4; + + // Defines the histogram bucket boundaries. If the distribution does not + // contain a histogram, then omit this field. + BucketOptions bucket_options = 6; + + // The number of values in each bucket of the histogram, as described in + // `bucket_options`. If the distribution does not have a histogram, then omit + // this field. If there is a histogram, then the sum of the values in + // `bucket_counts` must equal the value in the `count` field of the + // distribution. + // + // If present, `bucket_counts` should contain N values, where N is the number + // of buckets specified in `bucket_options`. If you supply fewer than N + // values, the remaining values are assumed to be 0. + // + // The order of the values in `bucket_counts` follows the bucket numbering + // schemes described for the three bucket types. The first value must be the + // count for the underflow bucket (number 0). The next N-2 values are the + // counts for the finite buckets (number 1 through N-2). The N'th value in + // `bucket_counts` is the count for the overflow bucket (number N-1). + repeated int64 bucket_counts = 7; + + // Must be in increasing order of `value` field. + repeated Exemplar exemplars = 10; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/documentation.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/documentation.proto new file mode 100644 index 00000000..0dabdfcf --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/documentation.proto @@ -0,0 +1,168 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "DocumentationProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Documentation` provides the information for describing a service. +// +// Example: +//
documentation:
+//   summary: >
+//     The Google Calendar API gives access
+//     to most calendar features.
+//   pages:
+//   - name: Overview
+//     content: (== include google/foo/overview.md ==)
+//   - name: Tutorial
+//     content: (== include google/foo/tutorial.md ==)
+//     subpages;
+//     - name: Java
+//       content: (== include google/foo/tutorial_java.md ==)
+//   rules:
+//   - selector: google.calendar.Calendar.Get
+//     description: >
+//       ...
+//   - selector: google.calendar.Calendar.Put
+//     description: >
+//       ...
+// 
+// Documentation is provided in markdown syntax. In addition to +// standard markdown features, definition lists, tables and fenced +// code blocks are supported. Section headers can be provided and are +// interpreted relative to the section nesting of the context where +// a documentation fragment is embedded. +// +// Documentation from the IDL is merged with documentation defined +// via the config at normalization time, where documentation provided +// by config rules overrides IDL provided. +// +// A number of constructs specific to the API platform are supported +// in documentation text. +// +// In order to reference a proto element, the following +// notation can be used: +//
[fully.qualified.proto.name][]
+// To override the display text used for the link, this can be used: +//
[display text][fully.qualified.proto.name]
+// Text can be excluded from doc using the following notation: +//
(-- internal comment --)
+// +// A few directives are available in documentation. Note that +// directives must appear on a single line to be properly +// identified. The `include` directive includes a markdown file from +// an external source: +//
(== include path/to/file ==)
+// The `resource_for` directive marks a message to be the resource of +// a collection in REST view. If it is not specified, tools attempt +// to infer the resource from the operations in a collection: +//
(== resource_for v1.shelves.books ==)
+// The directive `suppress_warning` does not directly affect documentation +// and is documented together with service config validation. +message Documentation { + // A short description of what the service does. The summary must be plain + // text. It becomes the overview of the service displayed in Google Cloud + // Console. + // NOTE: This field is equivalent to the standard field `description`. + string summary = 1; + + // The top level pages for the documentation set. + repeated Page pages = 5; + + // A list of documentation rules that apply to individual API elements. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated DocumentationRule rules = 3; + + // The URL to the root of documentation. + string documentation_root_url = 4; + + // Specifies the service root url if the default one (the service name + // from the yaml file) is not suitable. This can be seen in any fully + // specified service urls as well as sections that show a base that other + // urls are relative to. + string service_root_url = 6; + + // Declares a single overview page. For example: + //
documentation:
+  //   summary: ...
+  //   overview: (== include overview.md ==)
+  // 
+ // This is a shortcut for the following declaration (using pages style): + //
documentation:
+  //   summary: ...
+  //   pages:
+  //   - name: Overview
+  //     content: (== include overview.md ==)
+  // 
+ // Note: you cannot specify both `overview` field and `pages` field. + string overview = 2; +} + +// A documentation rule provides information about individual API elements. +message DocumentationRule { + // The selector is a comma-separated list of patterns for any element such as + // a method, a field, an enum value. Each pattern is a qualified name of the + // element which may end in "*", indicating a wildcard. Wildcards are only + // allowed at the end and for a whole component of the qualified name, + // i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A wildcard will match + // one or more components. To specify a default for all applicable elements, + // the whole pattern "*" is used. + string selector = 1; + + // Description of the selected proto element (e.g. a message, a method, a + // 'service' definition, or a field). Defaults to leading & trailing comments + // taken from the proto source definition of the proto element. + string description = 2; + + // Deprecation description of the selected element(s). It can be provided if + // an element is marked as `deprecated`. + string deprecation_description = 3; +} + +// Represents a documentation page. A page can contain subpages to represent +// nested documentation set structure. +message Page { + // The name of the page. It will be used as an identity of the page to + // generate URI of the page, text of the link to this page in navigation, + // etc. The full page name (start from the root page name to this page + // concatenated with `.`) can be used as reference to the page in your + // documentation. For example: + //
pages:
+  // - name: Tutorial
+  //   content: (== include tutorial.md ==)
+  //   subpages:
+  //   - name: Java
+  //     content: (== include tutorial_java.md ==)
+  // 
+ // You can reference `Java` page using Markdown reference link syntax: + // `[Java][Tutorial.Java]`. + string name = 1; + + // The Markdown content of the page. You can use (== include {path} + // ==) to include content from a Markdown file. The content can be + // used to produce the documentation page such as HTML format page. + string content = 2; + + // Subpages of this page. The order of subpages specified here will be + // honored in the generated docset. + repeated Page subpages = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/endpoint.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/endpoint.proto new file mode 100644 index 00000000..7f6dca7c --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/endpoint.proto @@ -0,0 +1,73 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "EndpointProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Endpoint` describes a network address of a service that serves a set of +// APIs. It is commonly known as a service endpoint. A service may expose +// any number of service endpoints, and all service endpoints share the same +// service definition, such as quota limits and monitoring metrics. +// +// Example: +// +// type: google.api.Service +// name: library-example.googleapis.com +// endpoints: +// # Declares network address `https://library-example.googleapis.com` +// # for service `library-example.googleapis.com`. The `https` scheme +// # is implicit for all service endpoints. Other schemes may be +// # supported in the future. +// - name: library-example.googleapis.com +// allow_cors: false +// - name: content-staging-library-example.googleapis.com +// # Allows HTTP OPTIONS calls to be passed to the API frontend, for it +// # to decide whether the subsequent cross-origin request is allowed +// # to proceed. +// allow_cors: true +message Endpoint { + // The canonical name of this endpoint. + string name = 1; + + // Unimplemented. Dot not use. + // + // DEPRECATED: This field is no longer supported. Instead of using aliases, + // please specify multiple [google.api.Endpoint][google.api.Endpoint] for each + // of the intended aliases. + // + // Additional names that this endpoint will be hosted on. + repeated string aliases = 2 [deprecated = true]; + + // The specification of an Internet routable address of API frontend that will + // handle requests to this [API + // Endpoint](https://cloud.google.com/apis/design/glossary). It should be + // either a valid IPv4 address or a fully-qualified domain name. For example, + // "8.8.8.8" or "myservice.appspot.com". + string target = 101; + + // Allowing + // [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka + // cross-domain traffic, would allow the backends served from this endpoint to + // receive and respond to HTTP OPTIONS requests. The response will be used by + // the browser to determine whether the subsequent cross-origin request is + // allowed to proceed. + bool allow_cors = 5; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/error_reason.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/error_reason.proto new file mode 100644 index 00000000..c0509be4 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/error_reason.proto @@ -0,0 +1,570 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/error_reason;error_reason"; +option java_multiple_files = true; +option java_outer_classname = "ErrorReasonProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines the supported values for `google.rpc.ErrorInfo.reason` for the +// `googleapis.com` error domain. This error domain is reserved for [Service +// Infrastructure](https://cloud.google.com/service-infrastructure/docs/overview). +// For each error info of this domain, the metadata key "service" refers to the +// logical identifier of an API service, such as "pubsub.googleapis.com". The +// "consumer" refers to the entity that consumes an API Service. It typically is +// a Google project that owns the client application or the server resource, +// such as "projects/123". Other metadata keys are specific to each error +// reason. For more information, see the definition of the specific error +// reason. +enum ErrorReason { + // Do not use this default value. + ERROR_REASON_UNSPECIFIED = 0; + + // The request is calling a disabled service for a consumer. + // + // Example of an ErrorInfo when the consumer "projects/123" contacting + // "pubsub.googleapis.com" service which is disabled: + // + // { "reason": "SERVICE_DISABLED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "pubsub.googleapis.com" + // } + // } + // + // This response indicates the "pubsub.googleapis.com" has been disabled in + // "projects/123". + SERVICE_DISABLED = 1; + + // The request whose associated billing account is disabled. + // + // Example of an ErrorInfo when the consumer "projects/123" fails to contact + // "pubsub.googleapis.com" service because the associated billing account is + // disabled: + // + // { "reason": "BILLING_DISABLED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "pubsub.googleapis.com" + // } + // } + // + // This response indicates the billing account associated has been disabled. + BILLING_DISABLED = 2; + + // The request is denied because the provided [API + // key](https://cloud.google.com/docs/authentication/api-keys) is invalid. It + // may be in a bad format, cannot be found, or has been expired). + // + // Example of an ErrorInfo when the request is contacting + // "storage.googleapis.com" service with an invalid API key: + // + // { "reason": "API_KEY_INVALID", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // } + // } + API_KEY_INVALID = 3; + + // The request is denied because it violates [API key API + // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_api_restrictions). + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call the + // "storage.googleapis.com" service because this service is restricted in the + // API key: + // + // { "reason": "API_KEY_SERVICE_BLOCKED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + API_KEY_SERVICE_BLOCKED = 4; + + // The request is denied because it violates [API key HTTP + // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_http_restrictions). + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call + // "storage.googleapis.com" service because the http referrer of the request + // violates API key HTTP restrictions: + // + // { "reason": "API_KEY_HTTP_REFERRER_BLOCKED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com", + // } + // } + API_KEY_HTTP_REFERRER_BLOCKED = 7; + + // The request is denied because it violates [API key IP address + // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call + // "storage.googleapis.com" service because the caller IP of the request + // violates API key IP address restrictions: + // + // { "reason": "API_KEY_IP_ADDRESS_BLOCKED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com", + // } + // } + API_KEY_IP_ADDRESS_BLOCKED = 8; + + // The request is denied because it violates [API key Android application + // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call + // "storage.googleapis.com" service because the request from the Android apps + // violates the API key Android application restrictions: + // + // { "reason": "API_KEY_ANDROID_APP_BLOCKED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + API_KEY_ANDROID_APP_BLOCKED = 9; + + // The request is denied because it violates [API key iOS application + // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call + // "storage.googleapis.com" service because the request from the iOS apps + // violates the API key iOS application restrictions: + // + // { "reason": "API_KEY_IOS_APP_BLOCKED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + API_KEY_IOS_APP_BLOCKED = 13; + + // The request is denied because there is not enough rate quota for the + // consumer. + // + // Example of an ErrorInfo when the consumer "projects/123" fails to contact + // "pubsub.googleapis.com" service because consumer's rate quota usage has + // reached the maximum value set for the quota limit + // "ReadsPerMinutePerProject" on the quota metric + // "pubsub.googleapis.com/read_requests": + // + // { "reason": "RATE_LIMIT_EXCEEDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "pubsub.googleapis.com", + // "quota_metric": "pubsub.googleapis.com/read_requests", + // "quota_limit": "ReadsPerMinutePerProject" + // } + // } + // + // Example of an ErrorInfo when the consumer "projects/123" checks quota on + // the service "dataflow.googleapis.com" and hits the organization quota + // limit "DefaultRequestsPerMinutePerOrganization" on the metric + // "dataflow.googleapis.com/default_requests". + // + // { "reason": "RATE_LIMIT_EXCEEDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "dataflow.googleapis.com", + // "quota_metric": "dataflow.googleapis.com/default_requests", + // "quota_limit": "DefaultRequestsPerMinutePerOrganization" + // } + // } + RATE_LIMIT_EXCEEDED = 5; + + // The request is denied because there is not enough resource quota for the + // consumer. + // + // Example of an ErrorInfo when the consumer "projects/123" fails to contact + // "compute.googleapis.com" service because consumer's resource quota usage + // has reached the maximum value set for the quota limit "VMsPerProject" + // on the quota metric "compute.googleapis.com/vms": + // + // { "reason": "RESOURCE_QUOTA_EXCEEDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "compute.googleapis.com", + // "quota_metric": "compute.googleapis.com/vms", + // "quota_limit": "VMsPerProject" + // } + // } + // + // Example of an ErrorInfo when the consumer "projects/123" checks resource + // quota on the service "dataflow.googleapis.com" and hits the organization + // quota limit "jobs-per-organization" on the metric + // "dataflow.googleapis.com/job_count". + // + // { "reason": "RESOURCE_QUOTA_EXCEEDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "dataflow.googleapis.com", + // "quota_metric": "dataflow.googleapis.com/job_count", + // "quota_limit": "jobs-per-organization" + // } + // } + RESOURCE_QUOTA_EXCEEDED = 6; + + // The request whose associated billing account address is in a tax restricted + // location, violates the local tax restrictions when creating resources in + // the restricted region. + // + // Example of an ErrorInfo when creating the Cloud Storage Bucket in the + // container "projects/123" under a tax restricted region + // "locations/asia-northeast3": + // + // { "reason": "LOCATION_TAX_POLICY_VIOLATED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com", + // "location": "locations/asia-northeast3" + // } + // } + // + // This response indicates creating the Cloud Storage Bucket in + // "locations/asia-northeast3" violates the location tax restriction. + LOCATION_TAX_POLICY_VIOLATED = 10; + + // The request is denied because the caller does not have required permission + // on the user project "projects/123" or the user project is invalid. For more + // information, check the [userProject System + // Parameters](https://cloud.google.com/apis/docs/system-parameters). + // + // Example of an ErrorInfo when the caller is calling Cloud Storage service + // with insufficient permissions on the user project: + // + // { "reason": "USER_PROJECT_DENIED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + USER_PROJECT_DENIED = 11; + + // The request is denied because the consumer "projects/123" is suspended due + // to Terms of Service(Tos) violations. Check [Project suspension + // guidelines](https://cloud.google.com/resource-manager/docs/project-suspension-guidelines) + // for more information. + // + // Example of an ErrorInfo when calling Cloud Storage service with the + // suspended consumer "projects/123": + // + // { "reason": "CONSUMER_SUSPENDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + CONSUMER_SUSPENDED = 12; + + // The request is denied because the associated consumer is invalid. It may be + // in a bad format, cannot be found, or have been deleted. + // + // Example of an ErrorInfo when calling Cloud Storage service with the + // invalid consumer "projects/123": + // + // { "reason": "CONSUMER_INVALID", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + CONSUMER_INVALID = 14; + + // The request is denied because it violates [VPC Service + // Controls](https://cloud.google.com/vpc-service-controls/docs/overview). + // The 'uid' field is a random generated identifier that customer can use it + // to search the audit log for a request rejected by VPC Service Controls. For + // more information, please refer [VPC Service Controls + // Troubleshooting](https://cloud.google.com/vpc-service-controls/docs/troubleshooting#unique-id) + // + // Example of an ErrorInfo when the consumer "projects/123" fails to call + // Cloud Storage service because the request is prohibited by the VPC Service + // Controls. + // + // { "reason": "SECURITY_POLICY_VIOLATED", + // "domain": "googleapis.com", + // "metadata": { + // "uid": "123456789abcde", + // "consumer": "projects/123", + // "service": "storage.googleapis.com" + // } + // } + SECURITY_POLICY_VIOLATED = 15; + + // The request is denied because the provided access token has expired. + // + // Example of an ErrorInfo when the request is calling Cloud Storage service + // with an expired access token: + // + // { "reason": "ACCESS_TOKEN_EXPIRED", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject" + // } + // } + ACCESS_TOKEN_EXPIRED = 16; + + // The request is denied because the provided access token doesn't have at + // least one of the acceptable scopes required for the API. Please check + // [OAuth 2.0 Scopes for Google + // APIs](https://developers.google.com/identity/protocols/oauth2/scopes) for + // the list of the OAuth 2.0 scopes that you might need to request to access + // the API. + // + // Example of an ErrorInfo when the request is calling Cloud Storage service + // with an access token that is missing required scopes: + // + // { "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject" + // } + // } + ACCESS_TOKEN_SCOPE_INSUFFICIENT = 17; + + // The request is denied because the account associated with the provided + // access token is in an invalid state, such as disabled or deleted. + // For more information, see https://cloud.google.com/docs/authentication. + // + // Warning: For privacy reasons, the server may not be able to disclose the + // email address for some accounts. The client MUST NOT depend on the + // availability of the `email` attribute. + // + // Example of an ErrorInfo when the request is to the Cloud Storage API with + // an access token that is associated with a disabled or deleted [service + // account](http://cloud/iam/docs/service-accounts): + // + // { "reason": "ACCOUNT_STATE_INVALID", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject", + // "email": "user@123.iam.gserviceaccount.com" + // } + // } + ACCOUNT_STATE_INVALID = 18; + + // The request is denied because the type of the provided access token is not + // supported by the API being called. + // + // Example of an ErrorInfo when the request is to the Cloud Storage API with + // an unsupported token type. + // + // { "reason": "ACCESS_TOKEN_TYPE_UNSUPPORTED", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject" + // } + // } + ACCESS_TOKEN_TYPE_UNSUPPORTED = 19; + + // The request is denied because the request doesn't have any authentication + // credentials. For more information regarding the supported authentication + // strategies for Google Cloud APIs, see + // https://cloud.google.com/docs/authentication. + // + // Example of an ErrorInfo when the request is to the Cloud Storage API + // without any authentication credentials. + // + // { "reason": "CREDENTIALS_MISSING", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject" + // } + // } + CREDENTIALS_MISSING = 20; + + // The request is denied because the provided project owning the resource + // which acts as the [API + // consumer](https://cloud.google.com/apis/design/glossary#api_consumer) is + // invalid. It may be in a bad format or empty. + // + // Example of an ErrorInfo when the request is to the Cloud Functions API, + // but the offered resource project in the request in a bad format which can't + // perform the ListFunctions method. + // + // { "reason": "RESOURCE_PROJECT_INVALID", + // "domain": "googleapis.com", + // "metadata": { + // "service": "cloudfunctions.googleapis.com", + // "method": + // "google.cloud.functions.v1.CloudFunctionsService.ListFunctions" + // } + // } + RESOURCE_PROJECT_INVALID = 21; + + // The request is denied because the provided session cookie is missing, + // invalid or failed to decode. + // + // Example of an ErrorInfo when the request is calling Cloud Storage service + // with a SID cookie which can't be decoded. + // + // { "reason": "SESSION_COOKIE_INVALID", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject", + // "cookie": "SID" + // } + // } + SESSION_COOKIE_INVALID = 23; + + // The request is denied because the user is from a Google Workspace customer + // that blocks their users from accessing a particular service. + // + // Example scenario: https://support.google.com/a/answer/9197205?hl=en + // + // Example of an ErrorInfo when access to Google Cloud Storage service is + // blocked by the Google Workspace administrator: + // + // { "reason": "USER_BLOCKED_BY_ADMIN", + // "domain": "googleapis.com", + // "metadata": { + // "service": "storage.googleapis.com", + // "method": "google.storage.v1.Storage.GetObject", + // } + // } + USER_BLOCKED_BY_ADMIN = 24; + + // The request is denied because the resource service usage is restricted + // by administrators according to the organization policy constraint. + // For more information see + // https://cloud.google.com/resource-manager/docs/organization-policy/restricting-services. + // + // Example of an ErrorInfo when access to Google Cloud Storage service is + // restricted by Resource Usage Restriction policy: + // + // { "reason": "RESOURCE_USAGE_RESTRICTION_VIOLATED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/project-123", + // "service": "storage.googleapis.com" + // } + // } + RESOURCE_USAGE_RESTRICTION_VIOLATED = 25; + + // Unimplemented. Do not use. + // + // The request is denied because it contains unsupported system parameters in + // URL query parameters or HTTP headers. For more information, + // see https://cloud.google.com/apis/docs/system-parameters + // + // Example of an ErrorInfo when access "pubsub.googleapis.com" service with + // a request header of "x-goog-user-ip": + // + // { "reason": "SYSTEM_PARAMETER_UNSUPPORTED", + // "domain": "googleapis.com", + // "metadata": { + // "service": "pubsub.googleapis.com" + // "parameter": "x-goog-user-ip" + // } + // } + SYSTEM_PARAMETER_UNSUPPORTED = 26; + + // The request is denied because it violates Org Restriction: the requested + // resource does not belong to allowed organizations specified in + // "X-Goog-Allowed-Resources" header. + // + // Example of an ErrorInfo when accessing a GCP resource that is restricted by + // Org Restriction for "pubsub.googleapis.com" service. + // + // { + // reason: "ORG_RESTRICTION_VIOLATION" + // domain: "googleapis.com" + // metadata { + // "consumer":"projects/123456" + // "service": "pubsub.googleapis.com" + // } + // } + ORG_RESTRICTION_VIOLATION = 27; + + // The request is denied because "X-Goog-Allowed-Resources" header is in a bad + // format. + // + // Example of an ErrorInfo when + // accessing "pubsub.googleapis.com" service with an invalid + // "X-Goog-Allowed-Resources" request header. + // + // { + // reason: "ORG_RESTRICTION_HEADER_INVALID" + // domain: "googleapis.com" + // metadata { + // "consumer":"projects/123456" + // "service": "pubsub.googleapis.com" + // } + // } + ORG_RESTRICTION_HEADER_INVALID = 28; + + // Unimplemented. Do not use. + // + // The request is calling a service that is not visible to the consumer. + // + // Example of an ErrorInfo when the consumer "projects/123" contacting + // "pubsub.googleapis.com" service which is not visible to the consumer. + // + // { "reason": "SERVICE_NOT_VISIBLE", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "pubsub.googleapis.com" + // } + // } + // + // This response indicates the "pubsub.googleapis.com" is not visible to + // "projects/123" (or it may not exist). + SERVICE_NOT_VISIBLE = 29; + + // The request is related to a project for which GCP access is suspended. + // + // Example of an ErrorInfo when the consumer "projects/123" fails to contact + // "pubsub.googleapis.com" service because GCP access is suspended: + // + // { "reason": "GCP_SUSPENDED", + // "domain": "googleapis.com", + // "metadata": { + // "consumer": "projects/123", + // "service": "pubsub.googleapis.com" + // } + // } + // + // This response indicates the associated GCP account has been suspended. + GCP_SUSPENDED = 30; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_behavior.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_behavior.proto new file mode 100644 index 00000000..21895bf5 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_behavior.proto @@ -0,0 +1,104 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "FieldBehaviorProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // A designation of a specific field behavior (required, output only, etc.) + // in protobuf messages. + // + // Examples: + // + // string name = 1 [(google.api.field_behavior) = REQUIRED]; + // State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // google.protobuf.Duration ttl = 1 + // [(google.api.field_behavior) = INPUT_ONLY]; + // google.protobuf.Timestamp expire_time = 1 + // [(google.api.field_behavior) = OUTPUT_ONLY, + // (google.api.field_behavior) = IMMUTABLE]; + repeated google.api.FieldBehavior field_behavior = 1052 [packed = false]; +} + +// An indicator of the behavior of a given field (for example, that a field +// is required in requests, or given as output but ignored as input). +// This **does not** change the behavior in protocol buffers itself; it only +// denotes the behavior and may affect how API tooling handles the field. +// +// Note: This enum **may** receive new values in the future. +enum FieldBehavior { + // Conventional default for enums. Do not use this. + FIELD_BEHAVIOR_UNSPECIFIED = 0; + + // Specifically denotes a field as optional. + // While all fields in protocol buffers are optional, this may be specified + // for emphasis if appropriate. + OPTIONAL = 1; + + // Denotes a field as required. + // This indicates that the field **must** be provided as part of the request, + // and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + REQUIRED = 2; + + // Denotes a field as output only. + // This indicates that the field is provided in responses, but including the + // field in a request does nothing (the server *must* ignore it and + // *must not* throw an error as a result of the field's presence). + OUTPUT_ONLY = 3; + + // Denotes a field as input only. + // This indicates that the field is provided in requests, and the + // corresponding field is not included in output. + INPUT_ONLY = 4; + + // Denotes a field as immutable. + // This indicates that the field may be set once in a request to create a + // resource, but may not be changed thereafter. + IMMUTABLE = 5; + + // Denotes that a (repeated) field is an unordered list. + // This indicates that the service may provide the elements of the list + // in any arbitrary order, rather than the order the user originally + // provided. Additionally, the list's order may or may not be stable. + UNORDERED_LIST = 6; + + // Denotes that this field returns a non-empty default value if not set. + // This indicates that if the user provides the empty value in a request, + // a non-empty value will be returned. The user will not be aware of what + // non-empty value to expect. + NON_EMPTY_DEFAULT = 7; + + // Denotes that the field in a resource (a message annotated with + // google.api.resource) is used in the resource name to uniquely identify the + // resource. For AIP-compliant APIs, this should only be applied to the + // `name` field on the resource. + // + // This behavior should not be applied to references to other resources within + // the message. + // + // The identifier field of resources often have different field behavior + // depending on the request it is embedded in (e.g. for Create methods name + // is optional and unused, while for Update methods it is required). Instead + // of method-specific annotations, only `IDENTIFIER` is required. + IDENTIFIER = 8; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_info.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_info.proto new file mode 100644 index 00000000..dd66340a --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/field_info.proto @@ -0,0 +1,79 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "FieldInfoProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // Rich semantic descriptor of an API field beyond the basic typing. + // + // Examples: + // + // string request_id = 1 [(google.api.field_info).format = UUID4]; + // string old_ip_address = 2 [(google.api.field_info).format = IPV4]; + // string new_ip_address = 3 [(google.api.field_info).format = IPV6]; + // string actual_ip_address = 4 [ + // (google.api.field_info).format = IPV4_OR_IPV6 + // ]; + google.api.FieldInfo field_info = 291403980; +} + +// Rich semantic information of an API field beyond basic typing. +message FieldInfo { + // The standard format of a field value. The supported formats are all backed + // by either an RFC defined by the IETF or a Google-defined AIP. + enum Format { + // Default, unspecified value. + FORMAT_UNSPECIFIED = 0; + + // Universally Unique Identifier, version 4, value as defined by + // https://datatracker.ietf.org/doc/html/rfc4122. The value may be + // normalized to entirely lowercase letters. For example, the value + // `F47AC10B-58CC-0372-8567-0E02B2C3D479` would be normalized to + // `f47ac10b-58cc-0372-8567-0e02b2c3d479`. + UUID4 = 1; + + // Internet Protocol v4 value as defined by [RFC + // 791](https://datatracker.ietf.org/doc/html/rfc791). The value may be + // condensed, with leading zeros in each octet stripped. For example, + // `001.022.233.040` would be condensed to `1.22.233.40`. + IPV4 = 2; + + // Internet Protocol v6 value as defined by [RFC + // 2460](https://datatracker.ietf.org/doc/html/rfc2460). The value may be + // normalized to entirely lowercase letters, and zero-padded partial and + // empty octets. For example, the value `2001:DB8::` would be normalized to + // `2001:0db8:0:0`. + IPV6 = 3; + + // An IP address in either v4 or v6 format as described by the individual + // values defined herein. See the comments on the IPV4 and IPV6 types for + // allowed normalizations of each. + IPV4_OR_IPV6 = 4; + } + + // The standard format of a field value. This does not explicitly configure + // any API consumer, just documents the API's format for the field it is + // applied to. + Format format = 1; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/http.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/http.proto new file mode 100644 index 00000000..31d867a2 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/http.proto @@ -0,0 +1,379 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +message Http { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated HttpRule rules = 1; + + // When set to true, URL path parameters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + bool fully_decode_reserved_expansion = 2; +} + +// # gRPC Transcoding +// +// gRPC Transcoding is a feature for mapping between a gRPC method and one or +// more HTTP REST endpoints. It allows developers to build a single API service +// that supports both gRPC APIs and REST APIs. Many systems, including [Google +// APIs](https://github.com/googleapis/googleapis), +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway), +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature +// and use it for large scale production services. +// +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies +// how different portions of the gRPC request message are mapped to the URL +// path, URL query parameters, and HTTP request body. It also controls how the +// gRPC response message is mapped to the HTTP response body. `HttpRule` is +// typically specified as an `google.api.http` annotation on the gRPC method. +// +// Each mapping specifies a URL path template and an HTTP method. The path +// template may refer to one or more fields in the gRPC request message, as long +// as each field is a non-repeated field with a primitive (non-message) type. +// The path template controls how fields of the request message are mapped to +// the URL path. +// +// Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/{name=messages/*}" +// }; +// } +// } +// message GetMessageRequest { +// string name = 1; // Mapped to URL path. +// } +// message Message { +// string text = 1; // The resource content. +// } +// +// This enables an HTTP REST to gRPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(name: "messages/123456")` +// +// Any fields in the request message which are not bound by the path template +// automatically become HTTP query parameters if there is no HTTP request body. +// For example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get:"/v1/messages/{message_id}" +// }; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // Mapped to URL path. +// int64 revision = 2; // Mapped to URL query parameter `revision`. +// SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. +// } +// +// This enables a HTTP JSON to RPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | +// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: +// "foo"))` +// +// Note that fields which are mapped to URL query parameters must have a +// primitive type or a repeated primitive type or a non-repeated message type. +// In the case of a repeated type, the parameter can be repeated in the URL +// as `...?param=A¶m=B`. In the case of a message type, each field of the +// message is mapped to a separate parameter, such as +// `...?foo.a=A&foo.b=B&foo.c=C`. +// +// For HTTP methods that allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice when +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// This enables the following two alternative HTTP JSON to RPC mappings: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: +// "123456")` +// +// ## Rules for HTTP mapping +// +// 1. Leaf request fields (recursive expansion nested messages in the request +// message) are classified into three categories: +// - Fields referred by the path template. They are passed via the URL path. +// - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They +// are passed via the HTTP +// request body. +// - All other fields are passed via the URL query parameters, and the +// parameter name is the field path in the request message. A repeated +// field can be represented as multiple query parameters under the same +// name. +// 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL +// query parameter, all fields +// are passed via URL path and HTTP request body. +// 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP +// request body, all +// fields are passed via URL path and URL query parameters. +// +// ### Path template syntax +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single URL path segment. The syntax `**` matches +// zero or more URL path segments, which must be the last part of the URL path +// except the `Verb`. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` +// contains any reserved character, such characters should be percent-encoded +// before the matching. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path on the client +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The +// server side does the reverse decoding. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{var}`. +// +// If a variable contains multiple path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path on the +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. +// The server side does the reverse decoding, except "%2F" and "%2f" are left +// unchanged. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{+var}`. +// +// ## Using gRPC API Service Configuration +// +// gRPC API Service Configuration (service config) is a configuration language +// for configuring a gRPC service to become a user-facing product. The +// service config is simply the YAML representation of the `google.api.Service` +// proto message. +// +// As an alternative to annotating your proto file, you can configure gRPC +// transcoding in your service config YAML files. You do this by specifying a +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same +// effect as the proto annotation. This can be particularly useful if you +// have a proto that is reused in multiple services. Note that any transcoding +// specified in the service config will override any matching transcoding +// configuration in the proto. +// +// Example: +// +// http: +// rules: +// # Selects a gRPC method and applies HttpRule to it. +// - selector: example.v1.Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// ## Special notes +// +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the +// proto to JSON conversion must follow the [proto3 +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json). +// +// While the single segment variable follows the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String +// Expansion, the multi segment variable **does not** follow RFC 6570 Section +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding +// for multi segment variables. +// +// The path variables **must not** refer to any repeated or mapped field, +// because client libraries are not capable of handling such variable expansion. +// +// The path variables **must not** capture the leading "/" character. The reason +// is that the most common use case "{var}" does not capture the leading "/" +// character. For consistency, all path variables must share the same behavior. +// +// Repeated message fields must not be mapped to URL query parameters, because +// no client library can support such complicated mapping. +// +// If an API needs to use a JSON array for request or response body, it can map +// the request or response body to a repeated field. However, some gRPC +// Transcoding implementations may not support this feature. +message HttpRule { + // Selects a method to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + oneof pattern { + // Maps to HTTP GET. Used for listing and getting information about + // resources. + string get = 2; + + // Maps to HTTP PUT. Used for replacing a resource. + string put = 3; + + // Maps to HTTP POST. Used for creating a resource or performing an action. + string post = 4; + + // Maps to HTTP DELETE. Used for deleting a resource. + string delete = 5; + + // Maps to HTTP PATCH. Used for updating a resource. + string patch = 6; + + // The custom pattern is used for specifying an HTTP method that is not + // included in the `pattern` field, such as HEAD, or "*" to leave the + // HTTP method unspecified for this rule. The wild-card rule is useful + // for services that provide content to Web (HTML) clients. + CustomHttpPattern custom = 8; + } + + // The name of the request field whose value is mapped to the HTTP request + // body, or `*` for mapping all request fields not captured by the path + // pattern to the HTTP body, or omitted for not having any HTTP request body. + // + // NOTE: the referred field must be present at the top-level of the request + // message type. + string body = 7; + + // Optional. The name of the response field whose value is mapped to the HTTP + // response body. When omitted, the entire response message will be used + // as the HTTP response body. + // + // NOTE: The referred field must be present at the top-level of the response + // message type. + string response_body = 12; + + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + repeated HttpRule additional_bindings = 11; +} + +// A custom pattern is used for defining custom HTTP verb. +message CustomHttpPattern { + // The name of this custom HTTP verb. + string kind = 1; + + // The path matched by this custom verb. + string path = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/httpbody.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/httpbody.proto new file mode 100644 index 00000000..7f1685e8 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/httpbody.proto @@ -0,0 +1,81 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody"; +option java_multiple_files = true; +option java_outer_classname = "HttpBodyProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Message that represents an arbitrary HTTP body. It should only be used for +// payload formats that can't be represented as JSON, such as raw binary or +// an HTML page. +// +// +// This message can be used both in streaming and non-streaming API methods in +// the request as well as the response. +// +// It can be used as a top-level request field, which is convenient if one +// wants to extract parameters from either the URL or HTTP template into the +// request fields and also want access to the raw HTTP body. +// +// Example: +// +// message GetResourceRequest { +// // A unique request id. +// string request_id = 1; +// +// // The raw HTTP body is bound to this field. +// google.api.HttpBody http_body = 2; +// +// } +// +// service ResourceService { +// rpc GetResource(GetResourceRequest) +// returns (google.api.HttpBody); +// rpc UpdateResource(google.api.HttpBody) +// returns (google.protobuf.Empty); +// +// } +// +// Example with streaming methods: +// +// service CaldavService { +// rpc GetCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); +// rpc UpdateCalendar(stream google.api.HttpBody) +// returns (stream google.api.HttpBody); +// +// } +// +// Use of this type only changes how the request and response bodies are +// handled, all other features will continue to work unchanged. +message HttpBody { + // The HTTP Content-Type header value specifying the content type of the body. + string content_type = 1; + + // The HTTP request/response body as raw binary. + bytes data = 2; + + // Application specific response metadata. Must be set in the first response + // for streaming APIs. + repeated google.protobuf.Any extensions = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/label.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/label.proto new file mode 100644 index 00000000..698f6bd4 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/label.proto @@ -0,0 +1,48 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/label;label"; +option java_multiple_files = true; +option java_outer_classname = "LabelProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// A description of a label. +message LabelDescriptor { + // Value types that can be used as label values. + enum ValueType { + // A variable-length string. This is the default. + STRING = 0; + + // Boolean; true or false. + BOOL = 1; + + // A 64-bit signed integer. + INT64 = 2; + } + + // The label key. + string key = 1; + + // The type of data that can be assigned to the label. + ValueType value_type = 2; + + // A human-readable description for the label. + string description = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/launch_stage.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/launch_stage.proto new file mode 100644 index 00000000..9802de79 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/launch_stage.proto @@ -0,0 +1,72 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api;api"; +option java_multiple_files = true; +option java_outer_classname = "LaunchStageProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// The launch stage as defined by [Google Cloud Platform +// Launch Stages](https://cloud.google.com/terms/launch-stages). +enum LaunchStage { + // Do not use this default value. + LAUNCH_STAGE_UNSPECIFIED = 0; + + // The feature is not yet implemented. Users can not use it. + UNIMPLEMENTED = 6; + + // Prelaunch features are hidden from users and are only visible internally. + PRELAUNCH = 7; + + // Early Access features are limited to a closed group of testers. To use + // these features, you must sign up in advance and sign a Trusted Tester + // agreement (which includes confidentiality provisions). These features may + // be unstable, changed in backward-incompatible ways, and are not + // guaranteed to be released. + EARLY_ACCESS = 1; + + // Alpha is a limited availability test for releases before they are cleared + // for widespread use. By Alpha, all significant design issues are resolved + // and we are in the process of verifying functionality. Alpha customers + // need to apply for access, agree to applicable terms, and have their + // projects allowlisted. Alpha releases don't have to be feature complete, + // no SLAs are provided, and there are no technical support obligations, but + // they will be far enough along that customers can actually use them in + // test environments or for limited-use tests -- just like they would in + // normal production cases. + ALPHA = 2; + + // Beta is the point at which we are ready to open a release for any + // customer to use. There are no SLA or technical support obligations in a + // Beta release. Products will be complete from a feature perspective, but + // may have some open outstanding issues. Beta releases are suitable for + // limited production use cases. + BETA = 3; + + // GA features are open to all developers and are considered stable and + // fully qualified for production use. + GA = 4; + + // Deprecated features are scheduled to be shut down and removed. For more + // information, see the "Deprecation Policy" section of our [Terms of + // Service](https://cloud.google.com/terms/) + // and the [Google Cloud Platform Subject to the Deprecation + // Policy](https://cloud.google.com/terms/deprecation) documentation. + DEPRECATED = 5; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/log.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/log.proto new file mode 100644 index 00000000..416c4f6c --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/log.proto @@ -0,0 +1,54 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/label.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "LogProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// A description of a log type. Example in YAML format: +// +// - name: library.googleapis.com/activity_history +// description: The history of borrowing and returning library items. +// display_name: Activity +// labels: +// - key: /customer_id +// description: Identifier of a library customer +message LogDescriptor { + // The name of the log. It must be less than 512 characters long and can + // include the following characters: upper- and lower-case alphanumeric + // characters [A-Za-z0-9], and punctuation characters including + // slash, underscore, hyphen, period [/_-.]. + string name = 1; + + // The set of labels that are available to describe a specific log entry. + // Runtime requests that contain labels not specified here are + // considered invalid. + repeated LabelDescriptor labels = 2; + + // A human-readable description of this log. This information appears in + // the documentation and can contain details. + string description = 3; + + // The human-readable name for this log. This information appears on + // the user interface and should be concise. + string display_name = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/logging.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/logging.proto new file mode 100644 index 00000000..650786fd --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/logging.proto @@ -0,0 +1,81 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "LoggingProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Logging configuration of the service. +// +// The following example shows how to configure logs to be sent to the +// producer and consumer projects. In the example, the `activity_history` +// log is sent to both the producer and consumer projects, whereas the +// `purchase_history` log is only sent to the producer project. +// +// monitored_resources: +// - type: library.googleapis.com/branch +// labels: +// - key: /city +// description: The city where the library branch is located in. +// - key: /name +// description: The name of the branch. +// logs: +// - name: activity_history +// labels: +// - key: /customer_id +// - name: purchase_history +// logging: +// producer_destinations: +// - monitored_resource: library.googleapis.com/branch +// logs: +// - activity_history +// - purchase_history +// consumer_destinations: +// - monitored_resource: library.googleapis.com/branch +// logs: +// - activity_history +message Logging { + // Configuration of a specific logging destination (the producer project + // or the consumer project). + message LoggingDestination { + // The monitored resource type. The type must be defined in the + // [Service.monitored_resources][google.api.Service.monitored_resources] + // section. + string monitored_resource = 3; + + // Names of the logs to be sent to this destination. Each name must + // be defined in the [Service.logs][google.api.Service.logs] section. If the + // log name is not a domain scoped name, it will be automatically prefixed + // with the service name followed by "/". + repeated string logs = 1; + } + + // Logging configurations for sending logs to the producer project. + // There can be multiple producer destinations, each one must have a + // different monitored resource type. A log can be used in at most + // one producer destination. + repeated LoggingDestination producer_destinations = 1; + + // Logging configurations for sending logs to the consumer project. + // There can be multiple consumer destinations, each one must have a + // different monitored resource type. A log can be used in at most + // one consumer destination. + repeated LoggingDestination consumer_destinations = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/metric.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/metric.proto new file mode 100644 index 00000000..9bf043c4 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/metric.proto @@ -0,0 +1,268 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/label.proto"; +import "google/api/launch_stage.proto"; +import "google/protobuf/duration.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/metric;metric"; +option java_multiple_files = true; +option java_outer_classname = "MetricProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines a metric type and its schema. Once a metric descriptor is created, +// deleting or altering it stops data collection and makes the metric type's +// existing data unusable. +// +message MetricDescriptor { + // The kind of measurement. It describes how the data is reported. + // For information on setting the start time and end time based on + // the MetricKind, see [TimeInterval][google.monitoring.v3.TimeInterval]. + enum MetricKind { + // Do not use this default value. + METRIC_KIND_UNSPECIFIED = 0; + + // An instantaneous measurement of a value. + GAUGE = 1; + + // The change in a value during a time interval. + DELTA = 2; + + // A value accumulated over a time interval. Cumulative + // measurements in a time series should have the same start time + // and increasing end times, until an event resets the cumulative + // value to zero and sets a new start time for the following + // points. + CUMULATIVE = 3; + } + + // The value type of a metric. + enum ValueType { + // Do not use this default value. + VALUE_TYPE_UNSPECIFIED = 0; + + // The value is a boolean. + // This value type can be used only if the metric kind is `GAUGE`. + BOOL = 1; + + // The value is a signed 64-bit integer. + INT64 = 2; + + // The value is a double precision floating point number. + DOUBLE = 3; + + // The value is a text string. + // This value type can be used only if the metric kind is `GAUGE`. + STRING = 4; + + // The value is a [`Distribution`][google.api.Distribution]. + DISTRIBUTION = 5; + + // The value is money. + MONEY = 6; + } + + // Additional annotations that can be used to guide the usage of a metric. + message MetricDescriptorMetadata { + // Deprecated. Must use the + // [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] + // instead. + LaunchStage launch_stage = 1 [deprecated = true]; + + // The sampling period of metric data points. For metrics which are written + // periodically, consecutive data points are stored at this time interval, + // excluding data loss due to errors. Metrics with a higher granularity have + // a smaller sampling period. + google.protobuf.Duration sample_period = 2; + + // The delay of data points caused by ingestion. Data points older than this + // age are guaranteed to be ingested and available to be read, excluding + // data loss due to errors. + google.protobuf.Duration ingest_delay = 3; + } + + // The resource name of the metric descriptor. + string name = 1; + + // The metric type, including its DNS name prefix. The type is not + // URL-encoded. All user-defined metric types have the DNS name + // `custom.googleapis.com` or `external.googleapis.com`. Metric types should + // use a natural hierarchical grouping. For example: + // + // "custom.googleapis.com/invoice/paid/amount" + // "external.googleapis.com/prometheus/up" + // "appengine.googleapis.com/http/server/response_latencies" + string type = 8; + + // The set of labels that can be used to describe a specific + // instance of this metric type. For example, the + // `appengine.googleapis.com/http/server/response_latencies` metric + // type has a label for the HTTP response code, `response_code`, so + // you can look at latencies for successful responses or just + // for responses that failed. + repeated LabelDescriptor labels = 2; + + // Whether the metric records instantaneous values, changes to a value, etc. + // Some combinations of `metric_kind` and `value_type` might not be supported. + MetricKind metric_kind = 3; + + // Whether the measurement is an integer, a floating-point number, etc. + // Some combinations of `metric_kind` and `value_type` might not be supported. + ValueType value_type = 4; + + // The units in which the metric value is reported. It is only applicable + // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` + // defines the representation of the stored metric values. + // + // Different systems might scale the values to be more easily displayed (so a + // value of `0.02kBy` _might_ be displayed as `20By`, and a value of + // `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is + // `kBy`, then the value of the metric is always in thousands of bytes, no + // matter how it might be displayed. + // + // If you want a custom metric to record the exact number of CPU-seconds used + // by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is + // `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 + // CPU-seconds, then the value is written as `12005`. + // + // Alternatively, if you want a custom metric to record data in a more + // granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is + // `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), + // or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). + // + // The supported units are a subset of [The Unified Code for Units of + // Measure](https://unitsofmeasure.org/ucum.html) standard: + // + // **Basic units (UNIT)** + // + // * `bit` bit + // * `By` byte + // * `s` second + // * `min` minute + // * `h` hour + // * `d` day + // * `1` dimensionless + // + // **Prefixes (PREFIX)** + // + // * `k` kilo (10^3) + // * `M` mega (10^6) + // * `G` giga (10^9) + // * `T` tera (10^12) + // * `P` peta (10^15) + // * `E` exa (10^18) + // * `Z` zetta (10^21) + // * `Y` yotta (10^24) + // + // * `m` milli (10^-3) + // * `u` micro (10^-6) + // * `n` nano (10^-9) + // * `p` pico (10^-12) + // * `f` femto (10^-15) + // * `a` atto (10^-18) + // * `z` zepto (10^-21) + // * `y` yocto (10^-24) + // + // * `Ki` kibi (2^10) + // * `Mi` mebi (2^20) + // * `Gi` gibi (2^30) + // * `Ti` tebi (2^40) + // * `Pi` pebi (2^50) + // + // **Grammar** + // + // The grammar also includes these connectors: + // + // * `/` division or ratio (as an infix operator). For examples, + // `kBy/{email}` or `MiBy/10ms` (although you should almost never + // have `/s` in a metric `unit`; rates should always be computed at + // query time from the underlying cumulative or delta value). + // * `.` multiplication or composition (as an infix operator). For + // examples, `GBy.d` or `k{watt}.h`. + // + // The grammar for a unit is as follows: + // + // Expression = Component { "." Component } { "/" Component } ; + // + // Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] + // | Annotation + // | "1" + // ; + // + // Annotation = "{" NAME "}" ; + // + // Notes: + // + // * `Annotation` is just a comment if it follows a `UNIT`. If the annotation + // is used alone, then the unit is equivalent to `1`. For examples, + // `{request}/s == 1/s`, `By{transmitted}/s == By/s`. + // * `NAME` is a sequence of non-blank printable ASCII characters not + // containing `{` or `}`. + // * `1` represents a unitary [dimensionless + // unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such + // as in `1/s`. It is typically used when none of the basic units are + // appropriate. For example, "new users per day" can be represented as + // `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new + // users). Alternatively, "thousands of page views per day" would be + // represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric + // value of `5.3` would mean "5300 page views per day"). + // * `%` represents dimensionless value of 1/100, and annotates values giving + // a percentage (so the metric values are typically in the range of 0..100, + // and a metric value `3` means "3 percent"). + // * `10^2.%` indicates a metric contains a ratio, typically in the range + // 0..1, that will be multiplied by 100 and displayed as a percentage + // (so a metric value `0.03` means "3 percent"). + string unit = 5; + + // A detailed description of the metric, which can be used in documentation. + string description = 6; + + // A concise name for the metric, which can be displayed in user interfaces. + // Use sentence case without an ending period, for example "Request count". + // This field is optional but it is recommended to be set for any metrics + // associated with user-visible concepts, such as Quota. + string display_name = 7; + + // Optional. Metadata which can be used to guide usage of the metric. + MetricDescriptorMetadata metadata = 10; + + // Optional. The launch stage of the metric definition. + LaunchStage launch_stage = 12; + + // Read-only. If present, then a [time + // series][google.monitoring.v3.TimeSeries], which is identified partially by + // a metric type and a + // [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that + // is associated with this metric type can only be associated with one of the + // monitored resource types listed here. + repeated string monitored_resource_types = 13; +} + +// A specific metric, identified by specifying values for all of the +// labels of a [`MetricDescriptor`][google.api.MetricDescriptor]. +message Metric { + // An existing metric type, see + // [google.api.MetricDescriptor][google.api.MetricDescriptor]. For example, + // `custom.googleapis.com/invoice/paid/amount`. + string type = 3; + + // The set of label values that uniquely identify this metric. All + // labels listed in the `MetricDescriptor` must be assigned values. + map labels = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitored_resource.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitored_resource.proto new file mode 100644 index 00000000..c6f97592 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitored_resource.proto @@ -0,0 +1,130 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/label.proto"; +import "google/api/launch_stage.proto"; +import "google/protobuf/struct.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/monitoredres;monitoredres"; +option java_multiple_files = true; +option java_outer_classname = "MonitoredResourceProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// An object that describes the schema of a +// [MonitoredResource][google.api.MonitoredResource] object using a type name +// and a set of labels. For example, the monitored resource descriptor for +// Google Compute Engine VM instances has a type of +// `"gce_instance"` and specifies the use of the labels `"instance_id"` and +// `"zone"` to identify particular VM instances. +// +// Different APIs can support different monitored resource types. APIs generally +// provide a `list` method that returns the monitored resource descriptors used +// by the API. +// +message MonitoredResourceDescriptor { + // Optional. The resource name of the monitored resource descriptor: + // `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where + // {type} is the value of the `type` field in this object and + // {project_id} is a project ID that provides API-specific context for + // accessing the type. APIs that do not use project information can use the + // resource name format `"monitoredResourceDescriptors/{type}"`. + string name = 5; + + // Required. The monitored resource type. For example, the type + // `"cloudsql_database"` represents databases in Google Cloud SQL. + // For a list of types, see [Monitoring resource + // types](https://cloud.google.com/monitoring/api/resources) + // and [Logging resource + // types](https://cloud.google.com/logging/docs/api/v2/resource-list). + string type = 1; + + // Optional. A concise name for the monitored resource type that might be + // displayed in user interfaces. It should be a Title Cased Noun Phrase, + // without any article or other determiners. For example, + // `"Google Cloud SQL Database"`. + string display_name = 2; + + // Optional. A detailed description of the monitored resource type that might + // be used in documentation. + string description = 3; + + // Required. A set of labels used to describe instances of this monitored + // resource type. For example, an individual Google Cloud SQL database is + // identified by values for the labels `"database_id"` and `"zone"`. + repeated LabelDescriptor labels = 4; + + // Optional. The launch stage of the monitored resource definition. + LaunchStage launch_stage = 7; +} + +// An object representing a resource that can be used for monitoring, logging, +// billing, or other purposes. Examples include virtual machine instances, +// databases, and storage devices such as disks. The `type` field identifies a +// [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] object +// that describes the resource's schema. Information in the `labels` field +// identifies the actual resource and its attributes according to the schema. +// For example, a particular Compute Engine VM instance could be represented by +// the following object, because the +// [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] for +// `"gce_instance"` has labels +// `"project_id"`, `"instance_id"` and `"zone"`: +// +// { "type": "gce_instance", +// "labels": { "project_id": "my-project", +// "instance_id": "12345678901234", +// "zone": "us-central1-a" }} +message MonitoredResource { + // Required. The monitored resource type. This field must match + // the `type` field of a + // [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] + // object. For example, the type of a Compute Engine VM instance is + // `gce_instance`. Some descriptors include the service name in the type; for + // example, the type of a Datastream stream is + // `datastream.googleapis.com/Stream`. + string type = 1; + + // Required. Values for all of the labels listed in the associated monitored + // resource descriptor. For example, Compute Engine VM instances use the + // labels `"project_id"`, `"instance_id"`, and `"zone"`. + map labels = 2; +} + +// Auxiliary metadata for a [MonitoredResource][google.api.MonitoredResource] +// object. [MonitoredResource][google.api.MonitoredResource] objects contain the +// minimum set of information to uniquely identify a monitored resource +// instance. There is some other useful auxiliary metadata. Monitoring and +// Logging use an ingestion pipeline to extract metadata for cloud resources of +// all types, and store the metadata in this message. +message MonitoredResourceMetadata { + // Output only. Values for predefined system metadata labels. + // System labels are a kind of metadata extracted by Google, including + // "machine_image", "vpc", "subnet_id", + // "security_group", "name", etc. + // System label values can be only strings, Boolean values, or a list of + // strings. For example: + // + // { "name": "my-test-instance", + // "security_group": ["a", "b", "c"], + // "spot_instance": false } + google.protobuf.Struct system_labels = 1; + + // Output only. A map of user-defined metadata labels. + map user_labels = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitoring.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitoring.proto new file mode 100644 index 00000000..753703e5 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/monitoring.proto @@ -0,0 +1,107 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "MonitoringProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Monitoring configuration of the service. +// +// The example below shows how to configure monitored resources and metrics +// for monitoring. In the example, a monitored resource and two metrics are +// defined. The `library.googleapis.com/book/returned_count` metric is sent +// to both producer and consumer projects, whereas the +// `library.googleapis.com/book/num_overdue` metric is only sent to the +// consumer project. +// +// monitored_resources: +// - type: library.googleapis.com/Branch +// display_name: "Library Branch" +// description: "A branch of a library." +// launch_stage: GA +// labels: +// - key: resource_container +// description: "The Cloud container (ie. project id) for the Branch." +// - key: location +// description: "The location of the library branch." +// - key: branch_id +// description: "The id of the branch." +// metrics: +// - name: library.googleapis.com/book/returned_count +// display_name: "Books Returned" +// description: "The count of books that have been returned." +// launch_stage: GA +// metric_kind: DELTA +// value_type: INT64 +// unit: "1" +// labels: +// - key: customer_id +// description: "The id of the customer." +// - name: library.googleapis.com/book/num_overdue +// display_name: "Books Overdue" +// description: "The current number of overdue books." +// launch_stage: GA +// metric_kind: GAUGE +// value_type: INT64 +// unit: "1" +// labels: +// - key: customer_id +// description: "The id of the customer." +// monitoring: +// producer_destinations: +// - monitored_resource: library.googleapis.com/Branch +// metrics: +// - library.googleapis.com/book/returned_count +// consumer_destinations: +// - monitored_resource: library.googleapis.com/Branch +// metrics: +// - library.googleapis.com/book/returned_count +// - library.googleapis.com/book/num_overdue +message Monitoring { + // Configuration of a specific monitoring destination (the producer project + // or the consumer project). + message MonitoringDestination { + // The monitored resource type. The type must be defined in + // [Service.monitored_resources][google.api.Service.monitored_resources] + // section. + string monitored_resource = 1; + + // Types of the metrics to report to this monitoring destination. + // Each type must be defined in + // [Service.metrics][google.api.Service.metrics] section. + repeated string metrics = 2; + } + + // Monitoring configurations for sending metrics to the producer project. + // There can be multiple producer destinations. A monitored resource type may + // appear in multiple monitoring destinations if different aggregations are + // needed for different sets of metrics associated with that monitored + // resource type. A monitored resource and metric pair may only be used once + // in the Monitoring configuration. + repeated MonitoringDestination producer_destinations = 1; + + // Monitoring configurations for sending metrics to the consumer project. + // There can be multiple consumer destinations. A monitored resource type may + // appear in multiple monitoring destinations if different aggregations are + // needed for different sets of metrics associated with that monitored + // resource type. A monitored resource and metric pair may only be used once + // in the Monitoring configuration. + repeated MonitoringDestination consumer_destinations = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/policy.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/policy.proto new file mode 100644 index 00000000..dd202bc8 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/policy.proto @@ -0,0 +1,85 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "PolicyProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Provides `google.api.field_policy` annotation at proto fields. +extend google.protobuf.FieldOptions { + // See [FieldPolicy][]. + FieldPolicy field_policy = 158361448; +} + +// Provides `google.api.method_policy` annotation at proto methods. +extend google.protobuf.MethodOptions { + // See [MethodPolicy][]. + MethodPolicy method_policy = 161893301; +} + +// Google API Policy Annotation +// +// This message defines a simple API policy annotation that can be used to +// annotate API request and response message fields with applicable policies. +// One field may have multiple applicable policies that must all be satisfied +// before a request can be processed. This policy annotation is used to +// generate the overall policy that will be used for automatic runtime +// policy enforcement and documentation generation. +message FieldPolicy { + // Selects one or more request or response message fields to apply this + // `FieldPolicy`. + // + // When a `FieldPolicy` is used in proto annotation, the selector must + // be left as empty. The service config generator will automatically fill + // the correct value. + // + // When a `FieldPolicy` is used in service config, the selector must be a + // comma-separated string with valid request or response field paths, + // such as "foo.bar" or "foo.bar,foo.baz". + string selector = 1; + + // Specifies the required permission(s) for the resource referred to by the + // field. It requires the field contains a valid resource reference, and + // the request must pass the permission checks to proceed. For example, + // "resourcemanager.projects.get". + string resource_permission = 2; + + // Specifies the resource type for the resource referred to by the field. + string resource_type = 3; +} + +// Defines policies applying to an RPC method. +message MethodPolicy { + // Selects a method to which these policies should be enforced, for example, + // "google.pubsub.v1.Subscriber.CreateSubscription". + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + // + // NOTE: This field must not be set in the proto annotation. It will be + // automatically filled by the service config compiler . + string selector = 9; + + // Policies that are applicable to the request message. + repeated FieldPolicy request_policies = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/quota.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/quota.proto new file mode 100644 index 00000000..7ccc102f --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/quota.proto @@ -0,0 +1,184 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "QuotaProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Quota configuration helps to achieve fairness and budgeting in service +// usage. +// +// The metric based quota configuration works this way: +// - The service configuration defines a set of metrics. +// - For API calls, the quota.metric_rules maps methods to metrics with +// corresponding costs. +// - The quota.limits defines limits on the metrics, which will be used for +// quota checks at runtime. +// +// An example quota configuration in yaml format: +// +// quota: +// limits: +// +// - name: apiWriteQpsPerProject +// metric: library.googleapis.com/write_calls +// unit: "1/min/{project}" # rate limit for consumer projects +// values: +// STANDARD: 10000 +// +// +// (The metric rules bind all methods to the read_calls metric, +// except for the UpdateBook and DeleteBook methods. These two methods +// are mapped to the write_calls metric, with the UpdateBook method +// consuming at twice rate as the DeleteBook method.) +// metric_rules: +// - selector: "*" +// metric_costs: +// library.googleapis.com/read_calls: 1 +// - selector: google.example.library.v1.LibraryService.UpdateBook +// metric_costs: +// library.googleapis.com/write_calls: 2 +// - selector: google.example.library.v1.LibraryService.DeleteBook +// metric_costs: +// library.googleapis.com/write_calls: 1 +// +// Corresponding Metric definition: +// +// metrics: +// - name: library.googleapis.com/read_calls +// display_name: Read requests +// metric_kind: DELTA +// value_type: INT64 +// +// - name: library.googleapis.com/write_calls +// display_name: Write requests +// metric_kind: DELTA +// value_type: INT64 +// +// +message Quota { + // List of QuotaLimit definitions for the service. + repeated QuotaLimit limits = 3; + + // List of MetricRule definitions, each one mapping a selected method to one + // or more metrics. + repeated MetricRule metric_rules = 4; +} + +// Bind API methods to metrics. Binding a method to a metric causes that +// metric's configured quota behaviors to apply to the method call. +message MetricRule { + // Selects the methods to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Metrics to update when the selected methods are called, and the associated + // cost applied to each metric. + // + // The key of the map is the metric name, and the values are the amount + // increased for the metric against which the quota limits are defined. + // The value must not be negative. + map metric_costs = 2; +} + +// `QuotaLimit` defines a specific limit that applies over a specified duration +// for a limit type. There can be at most one limit for a duration and limit +// type combination defined within a `QuotaGroup`. +message QuotaLimit { + // Name of the quota limit. + // + // The name must be provided, and it must be unique within the service. The + // name can only include alphanumeric characters as well as '-'. + // + // The maximum length of the limit name is 64 characters. + string name = 6; + + // Optional. User-visible, extended description for this quota limit. + // Should be used only when more context is needed to understand this limit + // than provided by the limit's display name (see: `display_name`). + string description = 2; + + // Default number of tokens that can be consumed during the specified + // duration. This is the number of tokens assigned when a client + // application developer activates the service for his/her project. + // + // Specifying a value of 0 will block all requests. This can be used if you + // are provisioning quota to selected consumers and blocking others. + // Similarly, a value of -1 will indicate an unlimited quota. No other + // negative values are allowed. + // + // Used by group-based quotas only. + int64 default_limit = 3; + + // Maximum number of tokens that can be consumed during the specified + // duration. Client application developers can override the default limit up + // to this maximum. If specified, this value cannot be set to a value less + // than the default limit. If not specified, it is set to the default limit. + // + // To allow clients to apply overrides with no upper bound, set this to -1, + // indicating unlimited maximum quota. + // + // Used by group-based quotas only. + int64 max_limit = 4; + + // Free tier value displayed in the Developers Console for this limit. + // The free tier is the number of tokens that will be subtracted from the + // billed amount when billing is enabled. + // This field can only be set on a limit with duration "1d", in a billable + // group; it is invalid on any other limit. If this field is not set, it + // defaults to 0, indicating that there is no free tier for this service. + // + // Used by group-based quotas only. + int64 free_tier = 7; + + // Duration of this limit in textual notation. Must be "100s" or "1d". + // + // Used by group-based quotas only. + string duration = 5; + + // The name of the metric this quota limit applies to. The quota limits with + // the same metric will be checked together during runtime. The metric must be + // defined within the service config. + string metric = 8; + + // Specify the unit of the quota limit. It uses the same syntax as + // [Metric.unit][]. The supported unit kinds are determined by the quota + // backend system. + // + // Here are some examples: + // * "1/min/{project}" for quota per minute per project. + // + // Note: the order of unit components is insignificant. + // The "1" at the beginning is required to follow the metric unit syntax. + string unit = 9; + + // Tiered limit values. You must specify this as a key:value pair, with an + // integer value that is the maximum number of requests allowed for the + // specified unit. Currently only STANDARD is supported. + map values = 10; + + // User-visible display name for this limit. + // Optional. If not set, the UI will provide a default display name based on + // the quota configuration. This field can be used to override the default + // display name generated from the configuration. + string display_name = 12; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/resource.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/resource.proto new file mode 100644 index 00000000..bf0cbec5 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/resource.proto @@ -0,0 +1,238 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "ResourceProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.FieldOptions { + // An annotation that describes a resource reference, see + // [ResourceReference][]. + google.api.ResourceReference resource_reference = 1055; +} + +extend google.protobuf.FileOptions { + // An annotation that describes a resource definition without a corresponding + // message; see [ResourceDescriptor][]. + repeated google.api.ResourceDescriptor resource_definition = 1053; +} + +extend google.protobuf.MessageOptions { + // An annotation that describes a resource definition, see + // [ResourceDescriptor][]. + google.api.ResourceDescriptor resource = 1053; +} + +// A simple descriptor of a resource type. +// +// ResourceDescriptor annotates a resource message (either by means of a +// protobuf annotation or use in the service config), and associates the +// resource's schema, the resource type, and the pattern of the resource name. +// +// Example: +// +// message Topic { +// // Indicates this message defines a resource schema. +// // Declares the resource type in the format of {service}/{kind}. +// // For Kubernetes resources, the format is {api group}/{kind}. +// option (google.api.resource) = { +// type: "pubsub.googleapis.com/Topic" +// pattern: "projects/{project}/topics/{topic}" +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: "pubsub.googleapis.com/Topic" +// pattern: "projects/{project}/topics/{topic}" +// +// Sometimes, resources have multiple patterns, typically because they can +// live under multiple parents. +// +// Example: +// +// message LogEntry { +// option (google.api.resource) = { +// type: "logging.googleapis.com/LogEntry" +// pattern: "projects/{project}/logs/{log}" +// pattern: "folders/{folder}/logs/{log}" +// pattern: "organizations/{organization}/logs/{log}" +// pattern: "billingAccounts/{billing_account}/logs/{log}" +// }; +// } +// +// The ResourceDescriptor Yaml config will look like: +// +// resources: +// - type: 'logging.googleapis.com/LogEntry' +// pattern: "projects/{project}/logs/{log}" +// pattern: "folders/{folder}/logs/{log}" +// pattern: "organizations/{organization}/logs/{log}" +// pattern: "billingAccounts/{billing_account}/logs/{log}" +message ResourceDescriptor { + // A description of the historical or future-looking state of the + // resource pattern. + enum History { + // The "unset" value. + HISTORY_UNSPECIFIED = 0; + + // The resource originally had one pattern and launched as such, and + // additional patterns were added later. + ORIGINALLY_SINGLE_PATTERN = 1; + + // The resource has one pattern, but the API owner expects to add more + // later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents + // that from being necessary once there are multiple patterns.) + FUTURE_MULTI_PATTERN = 2; + } + + // A flag representing a specific style that a resource claims to conform to. + enum Style { + // The unspecified value. Do not use. + STYLE_UNSPECIFIED = 0; + + // This resource is intended to be "declarative-friendly". + // + // Declarative-friendly resources must be more strictly consistent, and + // setting this to true communicates to tools that this resource should + // adhere to declarative-friendly expectations. + // + // Note: This is used by the API linter (linter.aip.dev) to enable + // additional checks. + DECLARATIVE_FRIENDLY = 1; + } + + // The resource type. It must be in the format of + // {service_name}/{resource_type_kind}. The `resource_type_kind` must be + // singular and must not include version numbers. + // + // Example: `storage.googleapis.com/Bucket` + // + // The value of the resource_type_kind must follow the regular expression + // /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + // should use PascalCase (UpperCamelCase). The maximum number of + // characters allowed for the `resource_type_kind` is 100. + string type = 1; + + // Optional. The relative resource name pattern associated with this resource + // type. The DNS prefix of the full resource name shouldn't be specified here. + // + // The path pattern must follow the syntax, which aligns with HTTP binding + // syntax: + // + // Template = Segment { "/" Segment } ; + // Segment = LITERAL | Variable ; + // Variable = "{" LITERAL "}" ; + // + // Examples: + // + // - "projects/{project}/topics/{topic}" + // - "projects/{project}/knowledgeBases/{knowledge_base}" + // + // The components in braces correspond to the IDs for each resource in the + // hierarchy. It is expected that, if multiple patterns are provided, + // the same component name (e.g. "project") refers to IDs of the same + // type of resource. + repeated string pattern = 2; + + // Optional. The field on the resource that designates the resource name + // field. If omitted, this is assumed to be "name". + string name_field = 3; + + // Optional. The historical or future-looking state of the resource pattern. + // + // Example: + // + // // The InspectTemplate message originally only supported resource + // // names with organization, and project was added later. + // message InspectTemplate { + // option (google.api.resource) = { + // type: "dlp.googleapis.com/InspectTemplate" + // pattern: + // "organizations/{organization}/inspectTemplates/{inspect_template}" + // pattern: "projects/{project}/inspectTemplates/{inspect_template}" + // history: ORIGINALLY_SINGLE_PATTERN + // }; + // } + History history = 4; + + // The plural name used in the resource name and permission names, such as + // 'projects' for the resource name of 'projects/{project}' and the permission + // name of 'cloudresourcemanager.googleapis.com/projects.get'. It is the same + // concept of the `plural` field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + // + // Note: The plural form is required even for singleton resources. See + // https://aip.dev/156 + string plural = 5; + + // The same concept of the `singular` field in k8s CRD spec + // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + // Such as "project" for the `resourcemanager.googleapis.com/Project` type. + string singular = 6; + + // Style flag(s) for this resource. + // These indicate that a resource is expected to conform to a given + // style. See the specific style flags for additional information. + repeated Style style = 10; +} + +// Defines a proto annotation that describes a string field that refers to +// an API resource. +message ResourceReference { + // The resource type that the annotated field references. + // + // Example: + // + // message Subscription { + // string topic = 2 [(google.api.resource_reference) = { + // type: "pubsub.googleapis.com/Topic" + // }]; + // } + // + // Occasionally, a field may reference an arbitrary resource. In this case, + // APIs use the special value * in their resource reference. + // + // Example: + // + // message GetIamPolicyRequest { + // string resource = 2 [(google.api.resource_reference) = { + // type: "*" + // }]; + // } + string type = 1; + + // The resource type of a child collection that the annotated field + // references. This is useful for annotating the `parent` field that + // doesn't have a fixed resource type. + // + // Example: + // + // message ListLogEntriesRequest { + // string parent = 1 [(google.api.resource_reference) = { + // child_type: "logging.googleapis.com/LogEntry" + // }; + // } + string child_type = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/routing.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/routing.proto new file mode 100644 index 00000000..b35289be --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/routing.proto @@ -0,0 +1,461 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "RoutingProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See RoutingRule. + google.api.RoutingRule routing = 72295729; +} + +// Specifies the routing information that should be sent along with the request +// in the form of routing header. +// **NOTE:** All service configuration rules follow the "last one wins" order. +// +// The examples below will apply to an RPC which has the following request type: +// +// Message Definition: +// +// message Request { +// // The name of the Table +// // Values can be of the following formats: +// // - `projects//tables/` +// // - `projects//instances//tables/
` +// // - `region//zones//tables/
` +// string table_name = 1; +// +// // This value specifies routing for replication. +// // It can be in the following formats: +// // - `profiles/` +// // - a legacy `profile_id` that can be any string +// string app_profile_id = 2; +// } +// +// Example message: +// +// { +// table_name: projects/proj_foo/instances/instance_bar/table/table_baz, +// app_profile_id: profiles/prof_qux +// } +// +// The routing header consists of one or multiple key-value pairs. Every key +// and value must be percent-encoded, and joined together in the format of +// `key1=value1&key2=value2`. +// In the examples below I am skipping the percent-encoding for readablity. +// +// Example 1 +// +// Extracting a field from the request to put into the routing header +// unchanged, with the key equal to the field name. +// +// annotation: +// +// option (google.api.routing) = { +// // Take the `app_profile_id`. +// routing_parameters { +// field: "app_profile_id" +// } +// }; +// +// result: +// +// x-goog-request-params: app_profile_id=profiles/prof_qux +// +// Example 2 +// +// Extracting a field from the request to put into the routing header +// unchanged, with the key different from the field name. +// +// annotation: +// +// option (google.api.routing) = { +// // Take the `app_profile_id`, but name it `routing_id` in the header. +// routing_parameters { +// field: "app_profile_id" +// path_template: "{routing_id=**}" +// } +// }; +// +// result: +// +// x-goog-request-params: routing_id=profiles/prof_qux +// +// Example 3 +// +// Extracting a field from the request to put into the routing +// header, while matching a path template syntax on the field's value. +// +// NB: it is more useful to send nothing than to send garbage for the purpose +// of dynamic routing, since garbage pollutes cache. Thus the matching. +// +// Sub-example 3a +// +// The field matches the template. +// +// annotation: +// +// option (google.api.routing) = { +// // Take the `table_name`, if it's well-formed (with project-based +// // syntax). +// routing_parameters { +// field: "table_name" +// path_template: "{table_name=projects/*/instances/*/**}" +// } +// }; +// +// result: +// +// x-goog-request-params: +// table_name=projects/proj_foo/instances/instance_bar/table/table_baz +// +// Sub-example 3b +// +// The field does not match the template. +// +// annotation: +// +// option (google.api.routing) = { +// // Take the `table_name`, if it's well-formed (with region-based +// // syntax). +// routing_parameters { +// field: "table_name" +// path_template: "{table_name=regions/*/zones/*/**}" +// } +// }; +// +// result: +// +// +// +// Sub-example 3c +// +// Multiple alternative conflictingly named path templates are +// specified. The one that matches is used to construct the header. +// +// annotation: +// +// option (google.api.routing) = { +// // Take the `table_name`, if it's well-formed, whether +// // using the region- or projects-based syntax. +// +// routing_parameters { +// field: "table_name" +// path_template: "{table_name=regions/*/zones/*/**}" +// } +// routing_parameters { +// field: "table_name" +// path_template: "{table_name=projects/*/instances/*/**}" +// } +// }; +// +// result: +// +// x-goog-request-params: +// table_name=projects/proj_foo/instances/instance_bar/table/table_baz +// +// Example 4 +// +// Extracting a single routing header key-value pair by matching a +// template syntax on (a part of) a single request field. +// +// annotation: +// +// option (google.api.routing) = { +// // Take just the project id from the `table_name` field. +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=projects/*}/**" +// } +// }; +// +// result: +// +// x-goog-request-params: routing_id=projects/proj_foo +// +// Example 5 +// +// Extracting a single routing header key-value pair by matching +// several conflictingly named path templates on (parts of) a single request +// field. The last template to match "wins" the conflict. +// +// annotation: +// +// option (google.api.routing) = { +// // If the `table_name` does not have instances information, +// // take just the project id for routing. +// // Otherwise take project + instance. +// +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=projects/*}/**" +// } +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=projects/*/instances/*}/**" +// } +// }; +// +// result: +// +// x-goog-request-params: +// routing_id=projects/proj_foo/instances/instance_bar +// +// Example 6 +// +// Extracting multiple routing header key-value pairs by matching +// several non-conflicting path templates on (parts of) a single request field. +// +// Sub-example 6a +// +// Make the templates strict, so that if the `table_name` does not +// have an instance information, nothing is sent. +// +// annotation: +// +// option (google.api.routing) = { +// // The routing code needs two keys instead of one composite +// // but works only for the tables with the "project-instance" name +// // syntax. +// +// routing_parameters { +// field: "table_name" +// path_template: "{project_id=projects/*}/instances/*/**" +// } +// routing_parameters { +// field: "table_name" +// path_template: "projects/*/{instance_id=instances/*}/**" +// } +// }; +// +// result: +// +// x-goog-request-params: +// project_id=projects/proj_foo&instance_id=instances/instance_bar +// +// Sub-example 6b +// +// Make the templates loose, so that if the `table_name` does not +// have an instance information, just the project id part is sent. +// +// annotation: +// +// option (google.api.routing) = { +// // The routing code wants two keys instead of one composite +// // but will work with just the `project_id` for tables without +// // an instance in the `table_name`. +// +// routing_parameters { +// field: "table_name" +// path_template: "{project_id=projects/*}/**" +// } +// routing_parameters { +// field: "table_name" +// path_template: "projects/*/{instance_id=instances/*}/**" +// } +// }; +// +// result (is the same as 6a for our example message because it has the instance +// information): +// +// x-goog-request-params: +// project_id=projects/proj_foo&instance_id=instances/instance_bar +// +// Example 7 +// +// Extracting multiple routing header key-value pairs by matching +// several path templates on multiple request fields. +// +// NB: note that here there is no way to specify sending nothing if one of the +// fields does not match its template. E.g. if the `table_name` is in the wrong +// format, the `project_id` will not be sent, but the `routing_id` will be. +// The backend routing code has to be aware of that and be prepared to not +// receive a full complement of keys if it expects multiple. +// +// annotation: +// +// option (google.api.routing) = { +// // The routing needs both `project_id` and `routing_id` +// // (from the `app_profile_id` field) for routing. +// +// routing_parameters { +// field: "table_name" +// path_template: "{project_id=projects/*}/**" +// } +// routing_parameters { +// field: "app_profile_id" +// path_template: "{routing_id=**}" +// } +// }; +// +// result: +// +// x-goog-request-params: +// project_id=projects/proj_foo&routing_id=profiles/prof_qux +// +// Example 8 +// +// Extracting a single routing header key-value pair by matching +// several conflictingly named path templates on several request fields. The +// last template to match "wins" the conflict. +// +// annotation: +// +// option (google.api.routing) = { +// // The `routing_id` can be a project id or a region id depending on +// // the table name format, but only if the `app_profile_id` is not set. +// // If `app_profile_id` is set it should be used instead. +// +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=projects/*}/**" +// } +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=regions/*}/**" +// } +// routing_parameters { +// field: "app_profile_id" +// path_template: "{routing_id=**}" +// } +// }; +// +// result: +// +// x-goog-request-params: routing_id=profiles/prof_qux +// +// Example 9 +// +// Bringing it all together. +// +// annotation: +// +// option (google.api.routing) = { +// // For routing both `table_location` and a `routing_id` are needed. +// // +// // table_location can be either an instance id or a region+zone id. +// // +// // For `routing_id`, take the value of `app_profile_id` +// // - If it's in the format `profiles/`, send +// // just the `` part. +// // - If it's any other literal, send it as is. +// // If the `app_profile_id` is empty, and the `table_name` starts with +// // the project_id, send that instead. +// +// routing_parameters { +// field: "table_name" +// path_template: "projects/*/{table_location=instances/*}/tables/*" +// } +// routing_parameters { +// field: "table_name" +// path_template: "{table_location=regions/*/zones/*}/tables/*" +// } +// routing_parameters { +// field: "table_name" +// path_template: "{routing_id=projects/*}/**" +// } +// routing_parameters { +// field: "app_profile_id" +// path_template: "{routing_id=**}" +// } +// routing_parameters { +// field: "app_profile_id" +// path_template: "profiles/{routing_id=*}" +// } +// }; +// +// result: +// +// x-goog-request-params: +// table_location=instances/instance_bar&routing_id=prof_qux +message RoutingRule { + // A collection of Routing Parameter specifications. + // **NOTE:** If multiple Routing Parameters describe the same key + // (via the `path_template` field or via the `field` field when + // `path_template` is not provided), "last one wins" rule + // determines which Parameter gets used. + // See the examples for more details. + repeated RoutingParameter routing_parameters = 2; +} + +// A projection from an input message to the GRPC or REST header. +message RoutingParameter { + // A request field to extract the header key-value pair from. + string field = 1; + + // A pattern matching the key-value field. Optional. + // If not specified, the whole field specified in the `field` field will be + // taken as value, and its name used as key. If specified, it MUST contain + // exactly one named segment (along with any number of unnamed segments) The + // pattern will be matched over the field specified in the `field` field, then + // if the match is successful: + // - the name of the single named segment will be used as a header name, + // - the match value of the segment will be used as a header value; + // if the match is NOT successful, nothing will be sent. + // + // Example: + // + // -- This is a field in the request message + // | that the header value will be extracted from. + // | + // | -- This is the key name in the + // | | routing header. + // V | + // field: "table_name" v + // path_template: "projects/*/{table_location=instances/*}/tables/*" + // ^ ^ + // | | + // In the {} brackets is the pattern that -- | + // specifies what to extract from the | + // field as a value to be sent. | + // | + // The string in the field must match the whole pattern -- + // before brackets, inside brackets, after brackets. + // + // When looking at this specific example, we can see that: + // - A key-value pair with the key `table_location` + // and the value matching `instances/*` should be added + // to the x-goog-request-params routing header. + // - The value is extracted from the request message's `table_name` field + // if it matches the full pattern specified: + // `projects/*/instances/*/tables/*`. + // + // **NB:** If the `path_template` field is not provided, the key name is + // equal to the field name, and the whole field should be sent as a value. + // This makes the pattern for the field and the value functionally equivalent + // to `**`, and the configuration + // + // { + // field: "table_name" + // } + // + // is a functionally equivalent shorthand to: + // + // { + // field: "table_name" + // path_template: "{table_name=**}" + // } + // + // See Example 1 for more details. + string path_template = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/service.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/service.proto new file mode 100644 index 00000000..3de5b667 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/service.proto @@ -0,0 +1,191 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/auth.proto"; +import "google/api/backend.proto"; +import "google/api/billing.proto"; +import "google/api/client.proto"; +import "google/api/context.proto"; +import "google/api/control.proto"; +import "google/api/documentation.proto"; +import "google/api/endpoint.proto"; +import "google/api/http.proto"; +import "google/api/log.proto"; +import "google/api/logging.proto"; +import "google/api/metric.proto"; +import "google/api/monitored_resource.proto"; +import "google/api/monitoring.proto"; +import "google/api/quota.proto"; +import "google/api/source_info.proto"; +import "google/api/system_parameter.proto"; +import "google/api/usage.proto"; +import "google/protobuf/api.proto"; +import "google/protobuf/type.proto"; +import "google/protobuf/wrappers.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "ServiceProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// `Service` is the root object of Google API service configuration (service +// config). It describes the basic information about a logical service, +// such as the service name and the user-facing title, and delegates other +// aspects to sub-sections. Each sub-section is either a proto message or a +// repeated proto message that configures a specific aspect, such as auth. +// For more information, see each proto message definition. +// +// Example: +// +// type: google.api.Service +// name: calendar.googleapis.com +// title: Google Calendar API +// apis: +// - name: google.calendar.v3.Calendar +// +// visibility: +// rules: +// - selector: "google.calendar.v3.*" +// restriction: PREVIEW +// backend: +// rules: +// - selector: "google.calendar.v3.*" +// address: calendar.example.com +// +// authentication: +// providers: +// - id: google_calendar_auth +// jwks_uri: https://www.googleapis.com/oauth2/v1/certs +// issuer: https://securetoken.google.com +// rules: +// - selector: "*" +// requirements: +// provider_id: google_calendar_auth +message Service { + // The service name, which is a DNS-like logical identifier for the + // service, such as `calendar.googleapis.com`. The service name + // typically goes through DNS verification to make sure the owner + // of the service also owns the DNS name. + string name = 1; + + // The product title for this service, it is the name displayed in Google + // Cloud Console. + string title = 2; + + // The Google project that owns this service. + string producer_project_id = 22; + + // A unique ID for a specific instance of this message, typically assigned + // by the client for tracking purpose. Must be no longer than 63 characters + // and only lower case letters, digits, '.', '_' and '-' are allowed. If + // empty, the server may choose to generate one instead. + string id = 33; + + // A list of API interfaces exported by this service. Only the `name` field + // of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by + // the configuration author, as the remaining fields will be derived from the + // IDL during the normalization process. It is an error to specify an API + // interface here which cannot be resolved against the associated IDL files. + repeated google.protobuf.Api apis = 3; + + // A list of all proto message types included in this API service. + // Types referenced directly or indirectly by the `apis` are automatically + // included. Messages which are not referenced but shall be included, such as + // types used by the `google.protobuf.Any` type, should be listed here by + // name by the configuration author. Example: + // + // types: + // - name: google.protobuf.Int32 + repeated google.protobuf.Type types = 4; + + // A list of all enum types included in this API service. Enums referenced + // directly or indirectly by the `apis` are automatically included. Enums + // which are not referenced but shall be included should be listed here by + // name by the configuration author. Example: + // + // enums: + // - name: google.someapi.v1.SomeEnum + repeated google.protobuf.Enum enums = 5; + + // Additional API documentation. + Documentation documentation = 6; + + // API backend configuration. + Backend backend = 8; + + // HTTP configuration. + Http http = 9; + + // Quota configuration. + Quota quota = 10; + + // Auth configuration. + Authentication authentication = 11; + + // Context configuration. + Context context = 12; + + // Configuration controlling usage of this service. + Usage usage = 15; + + // Configuration for network endpoints. If this is empty, then an endpoint + // with the same name as the service is automatically generated to service all + // defined APIs. + repeated Endpoint endpoints = 18; + + // Configuration for the service control plane. + Control control = 21; + + // Defines the logs used by this service. + repeated LogDescriptor logs = 23; + + // Defines the metrics used by this service. + repeated MetricDescriptor metrics = 24; + + // Defines the monitored resources used by this service. This is required + // by the [Service.monitoring][google.api.Service.monitoring] and + // [Service.logging][google.api.Service.logging] configurations. + repeated MonitoredResourceDescriptor monitored_resources = 25; + + // Billing configuration. + Billing billing = 26; + + // Logging configuration. + Logging logging = 27; + + // Monitoring configuration. + Monitoring monitoring = 28; + + // System parameter configuration. + SystemParameters system_parameters = 29; + + // Output only. The source information for this configuration if available. + SourceInfo source_info = 37; + + // Settings for [Google Cloud Client + // libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + // generated from APIs defined as protocol buffers. + Publishing publishing = 45; + + // Obsolete. Do not use. + // + // This field has no semantic meaning. The service config compiler always + // sets this field to `3`. + google.protobuf.UInt32Value config_version = 20; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/source_info.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/source_info.proto new file mode 100644 index 00000000..51fe2790 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/source_info.proto @@ -0,0 +1,31 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/any.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "SourceInfoProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Source information used to create a Service Config +message SourceInfo { + // All files used during config generation. + repeated google.protobuf.Any source_files = 1; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/system_parameter.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/system_parameter.proto new file mode 100644 index 00000000..8d29057f --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/system_parameter.proto @@ -0,0 +1,96 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "SystemParameterProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// ### System parameter configuration +// +// A system parameter is a special kind of parameter defined by the API +// system, not by an individual API. It is typically mapped to an HTTP header +// and/or a URL query parameter. This configuration specifies which methods +// change the names of the system parameters. +message SystemParameters { + // Define system parameters. + // + // The parameters defined here will override the default parameters + // implemented by the system. If this field is missing from the service + // config, default system parameters will be used. Default system parameters + // and names is implementation-dependent. + // + // Example: define api key for all methods + // + // system_parameters + // rules: + // - selector: "*" + // parameters: + // - name: api_key + // url_query_parameter: api_key + // + // + // Example: define 2 api key names for a specific method. + // + // system_parameters + // rules: + // - selector: "/ListShelves" + // parameters: + // - name: api_key + // http_header: Api-Key1 + // - name: api_key + // http_header: Api-Key2 + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated SystemParameterRule rules = 1; +} + +// Define a system parameter rule mapping system parameter definitions to +// methods. +message SystemParameterRule { + // Selects the methods to which this rule applies. Use '*' to indicate all + // methods in all APIs. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Define parameters. Multiple names may be defined for a parameter. + // For a given method call, only one of them should be used. If multiple + // names are used the behavior is implementation-dependent. + // If none of the specified names are present the behavior is + // parameter-dependent. + repeated SystemParameter parameters = 2; +} + +// Define a parameter's name and location. The parameter may be passed as either +// an HTTP header or a URL query parameter, and if both are passed the behavior +// is implementation-dependent. +message SystemParameter { + // Define the name of the parameter, such as "api_key" . It is case sensitive. + string name = 1; + + // Define the HTTP header name to use for the parameter. It is case + // insensitive. + string http_header = 2; + + // Define the URL query parameter name to use for the parameter. It is case + // sensitive. + string url_query_parameter = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/usage.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/usage.proto new file mode 100644 index 00000000..b9384b44 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/usage.proto @@ -0,0 +1,96 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; +option java_multiple_files = true; +option java_outer_classname = "UsageProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Configuration controlling usage of a service. +message Usage { + // Requirements that must be satisfied before a consumer project can use the + // service. Each requirement is of the form /; + // for example 'serviceusage.googleapis.com/billing-enabled'. + // + // For Google APIs, a Terms of Service requirement must be included here. + // Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud". + // Other Google APIs should include + // "serviceusage.googleapis.com/tos/universal". Additional ToS can be + // included based on the business needs. + repeated string requirements = 1; + + // A list of usage rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated UsageRule rules = 6; + + // The full resource name of a channel used for sending notifications to the + // service producer. + // + // Google Service Management currently only supports + // [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification + // channel. To use Google Cloud Pub/Sub as the channel, this must be the name + // of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format + // documented in https://cloud.google.com/pubsub/docs/overview. + string producer_notification_channel = 7; +} + +// Usage configuration rules for the service. +// +// NOTE: Under development. +// +// +// Use this rule to configure unregistered calls for the service. Unregistered +// calls are calls that do not contain consumer project identity. +// (Example: calls that do not contain an API key). +// By default, API methods do not allow unregistered calls, and each method call +// must be identified by a consumer project identity. Use this rule to +// allow/disallow unregistered calls. +// +// Example of an API that wants to allow unregistered calls for entire service. +// +// usage: +// rules: +// - selector: "*" +// allow_unregistered_calls: true +// +// Example of a method that wants to allow unregistered calls. +// +// usage: +// rules: +// - selector: "google.example.library.v1.LibraryService.CreateBook" +// allow_unregistered_calls: true +message UsageRule { + // Selects the methods to which this rule applies. Use '*' to indicate all + // methods in all APIs. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // If true, the selected method allows unregistered calls, e.g. calls + // that don't identify any user or application. + bool allow_unregistered_calls = 2; + + // If true, the selected method should skip service control and the control + // plane features, such as quota and billing, will not be available. + // This flag is used by Google Cloud Endpoints to bypass checks for internal + // methods, such as service health check methods. + bool skip_service_control = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/visibility.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/visibility.proto new file mode 100644 index 00000000..8b1f946f --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/api/visibility.proto @@ -0,0 +1,113 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/protobuf/descriptor.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/visibility;visibility"; +option java_multiple_files = true; +option java_outer_classname = "VisibilityProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.EnumOptions { + // See `VisibilityRule`. + google.api.VisibilityRule enum_visibility = 72295727; +} + +extend google.protobuf.EnumValueOptions { + // See `VisibilityRule`. + google.api.VisibilityRule value_visibility = 72295727; +} + +extend google.protobuf.FieldOptions { + // See `VisibilityRule`. + google.api.VisibilityRule field_visibility = 72295727; +} + +extend google.protobuf.MessageOptions { + // See `VisibilityRule`. + google.api.VisibilityRule message_visibility = 72295727; +} + +extend google.protobuf.MethodOptions { + // See `VisibilityRule`. + google.api.VisibilityRule method_visibility = 72295727; +} + +extend google.protobuf.ServiceOptions { + // See `VisibilityRule`. + google.api.VisibilityRule api_visibility = 72295727; +} + +// `Visibility` restricts service consumer's access to service elements, +// such as whether an application can call a visibility-restricted method. +// The restriction is expressed by applying visibility labels on service +// elements. The visibility labels are elsewhere linked to service consumers. +// +// A service can define multiple visibility labels, but a service consumer +// should be granted at most one visibility label. Multiple visibility +// labels for a single service consumer are not supported. +// +// If an element and all its parents have no visibility label, its visibility +// is unconditionally granted. +// +// Example: +// +// visibility: +// rules: +// - selector: google.calendar.Calendar.EnhancedSearch +// restriction: PREVIEW +// - selector: google.calendar.Calendar.Delegate +// restriction: INTERNAL +// +// Here, all methods are publicly visible except for the restricted methods +// EnhancedSearch and Delegate. +message Visibility { + // A list of visibility rules that apply to individual API elements. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated VisibilityRule rules = 1; +} + +// A visibility rule provides visibility configuration for an individual API +// element. +message VisibilityRule { + // Selects methods, messages, fields, enums, etc. to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // A comma-separated list of visibility labels that apply to the `selector`. + // Any of the listed labels can be used to grant the visibility. + // + // If a rule has multiple labels, removing one of the labels but not all of + // them can break clients. + // + // Example: + // + // visibility: + // rules: + // - selector: google.calendar.Calendar.EnhancedSearch + // restriction: INTERNAL, PREVIEW + // + // Removing INTERNAL from this restriction will break clients that rely on + // this method and only had access to it through INTERNAL. + string restriction = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/code.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/code.proto new file mode 100644 index 00000000..7c810af4 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/code.proto @@ -0,0 +1,186 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +option go_package = "google.golang.org/genproto/googleapis/rpc/code;code"; +option java_multiple_files = true; +option java_outer_classname = "CodeProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// The canonical error codes for gRPC APIs. +// +// +// Sometimes multiple error codes may apply. Services should return +// the most specific error code that applies. For example, prefer +// `OUT_OF_RANGE` over `FAILED_PRECONDITION` if both codes apply. +// Similarly prefer `NOT_FOUND` or `ALREADY_EXISTS` over `FAILED_PRECONDITION`. +enum Code { + // Not an error; returned on success. + // + // HTTP Mapping: 200 OK + OK = 0; + + // The operation was cancelled, typically by the caller. + // + // HTTP Mapping: 499 Client Closed Request + CANCELLED = 1; + + // Unknown error. For example, this error may be returned when + // a `Status` value received from another address space belongs to + // an error space that is not known in this address space. Also + // errors raised by APIs that do not return enough error information + // may be converted to this error. + // + // HTTP Mapping: 500 Internal Server Error + UNKNOWN = 2; + + // The client specified an invalid argument. Note that this differs + // from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments + // that are problematic regardless of the state of the system + // (e.g., a malformed file name). + // + // HTTP Mapping: 400 Bad Request + INVALID_ARGUMENT = 3; + + // The deadline expired before the operation could complete. For operations + // that change the state of the system, this error may be returned + // even if the operation has completed successfully. For example, a + // successful response from a server could have been delayed long + // enough for the deadline to expire. + // + // HTTP Mapping: 504 Gateway Timeout + DEADLINE_EXCEEDED = 4; + + // Some requested entity (e.g., file or directory) was not found. + // + // Note to server developers: if a request is denied for an entire class + // of users, such as gradual feature rollout or undocumented allowlist, + // `NOT_FOUND` may be used. If a request is denied for some users within + // a class of users, such as user-based access control, `PERMISSION_DENIED` + // must be used. + // + // HTTP Mapping: 404 Not Found + NOT_FOUND = 5; + + // The entity that a client attempted to create (e.g., file or directory) + // already exists. + // + // HTTP Mapping: 409 Conflict + ALREADY_EXISTS = 6; + + // The caller does not have permission to execute the specified + // operation. `PERMISSION_DENIED` must not be used for rejections + // caused by exhausting some resource (use `RESOURCE_EXHAUSTED` + // instead for those errors). `PERMISSION_DENIED` must not be + // used if the caller can not be identified (use `UNAUTHENTICATED` + // instead for those errors). This error code does not imply the + // request is valid or the requested entity exists or satisfies + // other pre-conditions. + // + // HTTP Mapping: 403 Forbidden + PERMISSION_DENIED = 7; + + // The request does not have valid authentication credentials for the + // operation. + // + // HTTP Mapping: 401 Unauthorized + UNAUTHENTICATED = 16; + + // Some resource has been exhausted, perhaps a per-user quota, or + // perhaps the entire file system is out of space. + // + // HTTP Mapping: 429 Too Many Requests + RESOURCE_EXHAUSTED = 8; + + // The operation was rejected because the system is not in a state + // required for the operation's execution. For example, the directory + // to be deleted is non-empty, an rmdir operation is applied to + // a non-directory, etc. + // + // Service implementors can use the following guidelines to decide + // between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: + // (a) Use `UNAVAILABLE` if the client can retry just the failing call. + // (b) Use `ABORTED` if the client should retry at a higher level. For + // example, when a client-specified test-and-set fails, indicating the + // client should restart a read-modify-write sequence. + // (c) Use `FAILED_PRECONDITION` if the client should not retry until + // the system state has been explicitly fixed. For example, if an "rmdir" + // fails because the directory is non-empty, `FAILED_PRECONDITION` + // should be returned since the client should not retry unless + // the files are deleted from the directory. + // + // HTTP Mapping: 400 Bad Request + FAILED_PRECONDITION = 9; + + // The operation was aborted, typically due to a concurrency issue such as + // a sequencer check failure or transaction abort. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 409 Conflict + ABORTED = 10; + + // The operation was attempted past the valid range. E.g., seeking or + // reading past end-of-file. + // + // Unlike `INVALID_ARGUMENT`, this error indicates a problem that may + // be fixed if the system state changes. For example, a 32-bit file + // system will generate `INVALID_ARGUMENT` if asked to read at an + // offset that is not in the range [0,2^32-1], but it will generate + // `OUT_OF_RANGE` if asked to read from an offset past the current + // file size. + // + // There is a fair bit of overlap between `FAILED_PRECONDITION` and + // `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific + // error) when it applies so that callers who are iterating through + // a space can easily look for an `OUT_OF_RANGE` error to detect when + // they are done. + // + // HTTP Mapping: 400 Bad Request + OUT_OF_RANGE = 11; + + // The operation is not implemented or is not supported/enabled in this + // service. + // + // HTTP Mapping: 501 Not Implemented + UNIMPLEMENTED = 12; + + // Internal errors. This means that some invariants expected by the + // underlying system have been broken. This error code is reserved + // for serious errors. + // + // HTTP Mapping: 500 Internal Server Error + INTERNAL = 13; + + // The service is currently unavailable. This is most likely a + // transient condition, which can be corrected by retrying with + // a backoff. Note that it is not always safe to retry + // non-idempotent operations. + // + // See the guidelines above for deciding between `FAILED_PRECONDITION`, + // `ABORTED`, and `UNAVAILABLE`. + // + // HTTP Mapping: 503 Service Unavailable + UNAVAILABLE = 14; + + // Unrecoverable data loss or corruption. + // + // HTTP Mapping: 500 Internal Server Error + DATA_LOSS = 15; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/attribute_context.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/attribute_context.proto new file mode 100644 index 00000000..ef9242e4 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/attribute_context.proto @@ -0,0 +1,344 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc.context; + +import "google/protobuf/any.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/rpc/context/attribute_context;attribute_context"; +option java_multiple_files = true; +option java_outer_classname = "AttributeContextProto"; +option java_package = "com.google.rpc.context"; + +// This message defines the standard attribute vocabulary for Google APIs. +// +// An attribute is a piece of metadata that describes an activity on a network +// service. For example, the size of an HTTP request, or the status code of +// an HTTP response. +// +// Each attribute has a type and a name, which is logically defined as +// a proto message field in `AttributeContext`. The field type becomes the +// attribute type, and the field path becomes the attribute name. For example, +// the attribute `source.ip` maps to field `AttributeContext.source.ip`. +// +// This message definition is guaranteed not to have any wire breaking change. +// So you can use it directly for passing attributes across different systems. +// +// NOTE: Different system may generate different subset of attributes. Please +// verify the system specification before relying on an attribute generated +// a system. +message AttributeContext { + // This message defines attributes for a node that handles a network request. + // The node can be either a service or an application that sends, forwards, + // or receives the request. Service peers should fill in + // `principal` and `labels` as appropriate. + message Peer { + // The IP address of the peer. + string ip = 1; + + // The network port of the peer. + int64 port = 2; + + // The labels associated with the peer. + map labels = 6; + + // The identity of this peer. Similar to `Request.auth.principal`, but + // relative to the peer instead of the request. For example, the + // identity associated with a load balancer that forwarded the request. + string principal = 7; + + // The CLDR country/region code associated with the above IP address. + // If the IP address is private, the `region_code` should reflect the + // physical location where this peer is running. + string region_code = 8; + } + + // This message defines attributes associated with API operations, such as + // a network API request. The terminology is based on the conventions used + // by Google APIs, Istio, and OpenAPI. + message Api { + // The API service name. It is a logical identifier for a networked API, + // such as "pubsub.googleapis.com". The naming syntax depends on the + // API management system being used for handling the request. + string service = 1; + + // The API operation name. For gRPC requests, it is the fully qualified API + // method name, such as "google.pubsub.v1.Publisher.Publish". For OpenAPI + // requests, it is the `operationId`, such as "getPet". + string operation = 2; + + // The API protocol used for sending the request, such as "http", "https", + // "grpc", or "internal". + string protocol = 3; + + // The API version associated with the API operation above, such as "v1" or + // "v1alpha1". + string version = 4; + } + + // This message defines request authentication attributes. Terminology is + // based on the JSON Web Token (JWT) standard, but the terms also + // correlate to concepts in other standards. + message Auth { + // The authenticated principal. Reflects the issuer (`iss`) and subject + // (`sub`) claims within a JWT. The issuer and subject should be `/` + // delimited, with `/` percent-encoded within the subject fragment. For + // Google accounts, the principal format is: + // "https://accounts.google.com/{id}" + string principal = 1; + + // The intended audience(s) for this authentication information. Reflects + // the audience (`aud`) claim within a JWT. The audience + // value(s) depends on the `issuer`, but typically include one or more of + // the following pieces of information: + // + // * The services intended to receive the credential. For example, + // ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"]. + // * A set of service-based scopes. For example, + // ["https://www.googleapis.com/auth/cloud-platform"]. + // * The client id of an app, such as the Firebase project id for JWTs + // from Firebase Auth. + // + // Consult the documentation for the credential issuer to determine the + // information provided. + repeated string audiences = 2; + + // The authorized presenter of the credential. Reflects the optional + // Authorized Presenter (`azp`) claim within a JWT or the + // OAuth client id. For example, a Google Cloud Platform client id looks + // as follows: "123456789012.apps.googleusercontent.com". + string presenter = 3; + + // Structured claims presented with the credential. JWTs include + // `{key: value}` pairs for standard and private claims. The following + // is a subset of the standard required and optional claims that would + // typically be presented for a Google-based JWT: + // + // {'iss': 'accounts.google.com', + // 'sub': '113289723416554971153', + // 'aud': ['123456789012', 'pubsub.googleapis.com'], + // 'azp': '123456789012.apps.googleusercontent.com', + // 'email': 'jsmith@example.com', + // 'iat': 1353601026, + // 'exp': 1353604926} + // + // SAML assertions are similarly specified, but with an identity provider + // dependent structure. + google.protobuf.Struct claims = 4; + + // A list of access level resource names that allow resources to be + // accessed by authenticated requester. It is part of Secure GCP processing + // for the incoming request. An access level string has the format: + // "//{api_service_name}/accessPolicies/{policy_id}/accessLevels/{short_name}" + // + // Example: + // "//accesscontextmanager.googleapis.com/accessPolicies/MY_POLICY_ID/accessLevels/MY_LEVEL" + repeated string access_levels = 5; + } + + // This message defines attributes for an HTTP request. If the actual + // request is not an HTTP request, the runtime system should try to map + // the actual request to an equivalent HTTP request. + message Request { + // The unique ID for a request, which can be propagated to downstream + // systems. The ID should have low probability of collision + // within a single day for a specific service. + string id = 1; + + // The HTTP request method, such as `GET`, `POST`. + string method = 2; + + // The HTTP request headers. If multiple headers share the same key, they + // must be merged according to the HTTP spec. All header keys must be + // lowercased, because HTTP header keys are case-insensitive. + map headers = 3; + + // The HTTP URL path, excluding the query parameters. + string path = 4; + + // The HTTP request `Host` header value. + string host = 5; + + // The HTTP URL scheme, such as `http` and `https`. + string scheme = 6; + + // The HTTP URL query in the format of `name1=value1&name2=value2`, as it + // appears in the first line of the HTTP request. No decoding is performed. + string query = 7; + + // The timestamp when the `destination` service receives the last byte of + // the request. + google.protobuf.Timestamp time = 9; + + // The HTTP request size in bytes. If unknown, it must be -1. + int64 size = 10; + + // The network protocol used with the request, such as "http/1.1", + // "spdy/3", "h2", "h2c", "webrtc", "tcp", "udp", "quic". See + // https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + // for details. + string protocol = 11; + + // A special parameter for request reason. It is used by security systems + // to associate auditing information with a request. + string reason = 12; + + // The request authentication. May be absent for unauthenticated requests. + // Derived from the HTTP request `Authorization` header or equivalent. + Auth auth = 13; + } + + // This message defines attributes for a typical network response. It + // generally models semantics of an HTTP response. + message Response { + // The HTTP response status code, such as `200` and `404`. + int64 code = 1; + + // The HTTP response size in bytes. If unknown, it must be -1. + int64 size = 2; + + // The HTTP response headers. If multiple headers share the same key, they + // must be merged according to HTTP spec. All header keys must be + // lowercased, because HTTP header keys are case-insensitive. + map headers = 3; + + // The timestamp when the `destination` service sends the last byte of + // the response. + google.protobuf.Timestamp time = 4; + + // The amount of time it takes the backend service to fully respond to a + // request. Measured from when the destination service starts to send the + // request to the backend until when the destination service receives the + // complete response from the backend. + google.protobuf.Duration backend_latency = 5; + } + + // This message defines core attributes for a resource. A resource is an + // addressable (named) entity provided by the destination service. For + // example, a file stored on a network storage service. + message Resource { + // The name of the service that this resource belongs to, such as + // `pubsub.googleapis.com`. The service may be different from the DNS + // hostname that actually serves the request. + string service = 1; + + // The stable identifier (name) of a resource on the `service`. A resource + // can be logically identified as "//{resource.service}/{resource.name}". + // The differences between a resource name and a URI are: + // + // * Resource name is a logical identifier, independent of network + // protocol and API version. For example, + // `//pubsub.googleapis.com/projects/123/topics/news-feed`. + // * URI often includes protocol and version information, so it can + // be used directly by applications. For example, + // `https://pubsub.googleapis.com/v1/projects/123/topics/news-feed`. + // + // See https://cloud.google.com/apis/design/resource_names for details. + string name = 2; + + // The type of the resource. The syntax is platform-specific because + // different platforms define their resources differently. + // + // For Google APIs, the type format must be "{service}/{kind}", such as + // "pubsub.googleapis.com/Topic". + string type = 3; + + // The labels or tags on the resource, such as AWS resource tags and + // Kubernetes resource labels. + map labels = 4; + + // The unique identifier of the resource. UID is unique in the time + // and space for this resource within the scope of the service. It is + // typically generated by the server on successful creation of a resource + // and must not be changed. UID is used to uniquely identify resources + // with resource name reuses. This should be a UUID4. + string uid = 5; + + // Annotations is an unstructured key-value map stored with a resource that + // may be set by external tools to store and retrieve arbitrary metadata. + // They are not queryable and should be preserved when modifying objects. + // + // More info: https://kubernetes.io/docs/user-guide/annotations + map annotations = 6; + + // Mutable. The display name set by clients. Must be <= 63 characters. + string display_name = 7; + + // Output only. The timestamp when the resource was created. This may + // be either the time creation was initiated or when it was completed. + google.protobuf.Timestamp create_time = 8; + + // Output only. The timestamp when the resource was last updated. Any + // change to the resource made by users must refresh this value. + // Changes to a resource made by the service should refresh this value. + google.protobuf.Timestamp update_time = 9; + + // Output only. The timestamp when the resource was deleted. + // If the resource is not deleted, this must be empty. + google.protobuf.Timestamp delete_time = 10; + + // Output only. An opaque value that uniquely identifies a version or + // generation of a resource. It can be used to confirm that the client + // and server agree on the ordering of a resource being written. + string etag = 11; + + // Immutable. The location of the resource. The location encoding is + // specific to the service provider, and new encoding may be introduced + // as the service evolves. + // + // For Google Cloud products, the encoding is what is used by Google Cloud + // APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The + // semantics of `location` is identical to the + // `cloud.googleapis.com/location` label used by some Google Cloud APIs. + string location = 12; + } + + // The origin of a network activity. In a multi hop network activity, + // the origin represents the sender of the first hop. For the first hop, + // the `source` and the `origin` must have the same content. + Peer origin = 7; + + // The source of a network activity, such as starting a TCP connection. + // In a multi hop network activity, the source represents the sender of the + // last hop. + Peer source = 1; + + // The destination of a network activity, such as accepting a TCP connection. + // In a multi hop network activity, the destination represents the receiver of + // the last hop. + Peer destination = 2; + + // Represents a network request, such as an HTTP request. + Request request = 3; + + // Represents a network response, such as an HTTP response. + Response response = 4; + + // Represents a target resource that is involved with a network activity. + // If multiple resources are involved with an activity, this must be the + // primary one. + Resource resource = 5; + + // Represents an API operation that is involved to a network activity. + Api api = 6; + + // Supports extensions for advanced use cases, such as logs and metrics. + repeated google.protobuf.Any extensions = 8; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/audit_context.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/audit_context.proto new file mode 100644 index 00000000..7b8b7051 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/context/audit_context.proto @@ -0,0 +1,49 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc.context; + +import "google/protobuf/struct.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/rpc/context;context"; +option java_multiple_files = true; +option java_outer_classname = "AuditContextProto"; +option java_package = "com.google.rpc.context"; + +// `AuditContext` provides information that is needed for audit logging. +message AuditContext { + // Serialized audit log. + bytes audit_log = 1; + + // An API request message that is scrubbed based on the method annotation. + // This field should only be filled if audit_log field is present. + // Service Control will use this to assemble a complete log for Cloud Audit + // Logs and Google internal audit logs. + google.protobuf.Struct scrubbed_request = 2; + + // An API response message that is scrubbed based on the method annotation. + // This field should only be filled if audit_log field is present. + // Service Control will use this to assemble a complete log for Cloud Audit + // Logs and Google internal audit logs. + google.protobuf.Struct scrubbed_response = 3; + + // Number of scrubbed response items. + int32 scrubbed_response_item_count = 4; + + // Audit resource name which is scrubbed. + string target_resource = 5; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/error_details.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/error_details.proto new file mode 100644 index 00000000..c489e831 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/error_details.proto @@ -0,0 +1,285 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/duration.proto"; + +option go_package = "google.golang.org/genproto/googleapis/rpc/errdetails;errdetails"; +option java_multiple_files = true; +option java_outer_classname = "ErrorDetailsProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// Describes the cause of the error with structured details. +// +// Example of an error when contacting the "pubsub.googleapis.com" API when it +// is not enabled: +// +// { "reason": "API_DISABLED" +// "domain": "googleapis.com" +// "metadata": { +// "resource": "projects/123", +// "service": "pubsub.googleapis.com" +// } +// } +// +// This response indicates that the pubsub.googleapis.com API is not enabled. +// +// Example of an error that is returned when attempting to create a Spanner +// instance in a region that is out of stock: +// +// { "reason": "STOCKOUT" +// "domain": "spanner.googleapis.com", +// "metadata": { +// "availableRegions": "us-central1,us-east2" +// } +// } +message ErrorInfo { + // The reason of the error. This is a constant value that identifies the + // proximate cause of the error. Error reasons are unique within a particular + // domain of errors. This should be at most 63 characters and match a + // regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + // UPPER_SNAKE_CASE. + string reason = 1; + + // The logical grouping to which the "reason" belongs. The error domain + // is typically the registered service name of the tool or product that + // generates the error. Example: "pubsub.googleapis.com". If the error is + // generated by some common infrastructure, the error domain must be a + // globally unique value that identifies the infrastructure. For Google API + // infrastructure, the error domain is "googleapis.com". + string domain = 2; + + // Additional structured details about this error. + // + // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + // length. When identifying the current value of an exceeded limit, the units + // should be contained in the key, not the value. For example, rather than + // {"instanceLimit": "100/request"}, should be returned as, + // {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + // instances that can be created in a single (batch) request. + map metadata = 3; +} + +// Describes when the clients can retry a failed request. Clients could ignore +// the recommendation here or retry when this information is missing from error +// responses. +// +// It's always recommended that clients should use exponential backoff when +// retrying. +// +// Clients should wait until `retry_delay` amount of time has passed since +// receiving the error response before retrying. If retrying requests also +// fail, clients should use an exponential backoff scheme to gradually increase +// the delay between retries based on `retry_delay`, until either a maximum +// number of retries have been reached or a maximum retry delay cap has been +// reached. +message RetryInfo { + // Clients should wait at least this long between retrying the same request. + google.protobuf.Duration retry_delay = 1; +} + +// Describes additional debugging info. +message DebugInfo { + // The stack trace entries indicating where the error occurred. + repeated string stack_entries = 1; + + // Additional debugging information provided by the server. + string detail = 2; +} + +// Describes how a quota check failed. +// +// For example if a daily limit was exceeded for the calling project, +// a service could respond with a QuotaFailure detail containing the project +// id and the description of the quota limit that was exceeded. If the +// calling project hasn't enabled the service in the developer console, then +// a service could respond with the project id and set `service_disabled` +// to true. +// +// Also see RetryInfo and Help types for other details about handling a +// quota failure. +message QuotaFailure { + // A message type used to describe a single quota violation. For example, a + // daily quota or a custom quota that was exceeded. + message Violation { + // The subject on which the quota check failed. + // For example, "clientip:" or "project:". + string subject = 1; + + // A description of how the quota check failed. Clients can use this + // description to find more about the quota configuration in the service's + // public documentation, or find the relevant quota limit to adjust through + // developer console. + // + // For example: "Service disabled" or "Daily Limit for read operations + // exceeded". + string description = 2; + } + + // Describes all quota violations. + repeated Violation violations = 1; +} + +// Describes what preconditions have failed. +// +// For example, if an RPC failed because it required the Terms of Service to be +// acknowledged, it could list the terms of service violation in the +// PreconditionFailure message. +message PreconditionFailure { + // A message type used to describe a single precondition failure. + message Violation { + // The type of PreconditionFailure. We recommend using a service-specific + // enum type to define the supported precondition violation subjects. For + // example, "TOS" for "Terms of Service violation". + string type = 1; + + // The subject, relative to the type, that failed. + // For example, "google.com/cloud" relative to the "TOS" type would indicate + // which terms of service is being referenced. + string subject = 2; + + // A description of how the precondition failed. Developers can use this + // description to understand how to fix the failure. + // + // For example: "Terms of service not accepted". + string description = 3; + } + + // Describes all precondition violations. + repeated Violation violations = 1; +} + +// Describes violations in a client request. This error type focuses on the +// syntactic aspects of the request. +message BadRequest { + // A message type used to describe a single bad request field. + message FieldViolation { + // A path that leads to a field in the request body. The value will be a + // sequence of dot-separated identifiers that identify a protocol buffer + // field. + // + // Consider the following: + // + // message CreateContactRequest { + // message EmailAddress { + // enum Type { + // TYPE_UNSPECIFIED = 0; + // HOME = 1; + // WORK = 2; + // } + // + // optional string email = 1; + // repeated EmailType type = 2; + // } + // + // string full_name = 1; + // repeated EmailAddress email_addresses = 2; + // } + // + // In this example, in proto `field` could take one of the following values: + // + // * `full_name` for a violation in the `full_name` value + // * `email_addresses[1].email` for a violation in the `email` field of the + // first `email_addresses` message + // * `email_addresses[3].type[2]` for a violation in the second `type` + // value in the third `email_addresses` message. + // + // In JSON, the same values are represented as: + // + // * `fullName` for a violation in the `fullName` value + // * `emailAddresses[1].email` for a violation in the `email` field of the + // first `emailAddresses` message + // * `emailAddresses[3].type[2]` for a violation in the second `type` + // value in the third `emailAddresses` message. + string field = 1; + + // A description of why the request element is bad. + string description = 2; + } + + // Describes all violations in a client request. + repeated FieldViolation field_violations = 1; +} + +// Contains metadata about the request that clients can attach when filing a bug +// or providing other forms of feedback. +message RequestInfo { + // An opaque string that should only be interpreted by the service generating + // it. For example, it can be used to identify requests in the service's logs. + string request_id = 1; + + // Any data that was used to serve this request. For example, an encrypted + // stack trace that can be sent back to the service provider for debugging. + string serving_data = 2; +} + +// Describes the resource that is being accessed. +message ResourceInfo { + // A name for the type of resource being accessed, e.g. "sql table", + // "cloud storage bucket", "file", "Google calendar"; or the type URL + // of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + string resource_type = 1; + + // The name of the resource being accessed. For example, a shared calendar + // name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + // error is + // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + string resource_name = 2; + + // The owner of the resource (optional). + // For example, "user:" or "project:". + string owner = 3; + + // Describes what error is encountered when accessing this resource. + // For example, updating a cloud project may require the `writer` permission + // on the developer console project. + string description = 4; +} + +// Provides links to documentation or for performing an out of band action. +// +// For example, if a quota check failed with an error indicating the calling +// project hasn't enabled the accessed service, this can contain a URL pointing +// directly to the right place in the developer console to flip the bit. +message Help { + // Describes a URL link. + message Link { + // Describes what the link offers. + string description = 1; + + // The URL of the link. + string url = 2; + } + + // URL(s) pointing to additional information on handling the current error. + repeated Link links = 1; +} + +// Provides a localized error message that is safe to return to the user +// which can be attached to an RPC error. +message LocalizedMessage { + // The locale used following the specification defined at + // https://www.rfc-editor.org/rfc/bcp/bcp47.txt. + // Examples are: "en-US", "fr-CH", "es-MX" + string locale = 1; + + // The localized error message in the above locale. + string message = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/http.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/http.proto new file mode 100644 index 00000000..299a71fd --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/http.proto @@ -0,0 +1,64 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +option go_package = "google.golang.org/genproto/googleapis/rpc/http;http"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// Represents an HTTP request. +message HttpRequest { + // The HTTP request method. + string method = 1; + + // The HTTP request URI. + string uri = 2; + + // The HTTP request headers. The ordering of the headers is significant. + // Multiple headers with the same key may present for the request. + repeated HttpHeader headers = 3; + + // The HTTP request body. If the body is not expected, it should be empty. + bytes body = 4; +} + +// Represents an HTTP response. +message HttpResponse { + // The HTTP status code, such as 200 or 404. + int32 status = 1; + + // The HTTP reason phrase, such as "OK" or "Not Found". + string reason = 2; + + // The HTTP response headers. The ordering of the headers is significant. + // Multiple headers with the same key may present for the response. + repeated HttpHeader headers = 3; + + // The HTTP response body. If the body is not expected, it should be empty. + bytes body = 4; +} + +// Represents an HTTP header. +message HttpHeader { + // The HTTP header key. It is case insensitive. + string key = 1; + + // The HTTP header value. + string value = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/status.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/status.proto new file mode 100644 index 00000000..923e1693 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/rpc/status.proto @@ -0,0 +1,49 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.rpc; + +import "google/protobuf/any.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/rpc/status;status"; +option java_multiple_files = true; +option java_outer_classname = "StatusProto"; +option java_package = "com.google.rpc"; +option objc_class_prefix = "RPC"; + +// The `Status` type defines a logical error model that is suitable for +// different programming environments, including REST APIs and RPC APIs. It is +// used by [gRPC](https://github.com/grpc). Each `Status` message contains +// three pieces of data: error code, error message, and error details. +// +// You can find out more about this error model and how to work with it in the +// [API Design Guide](https://cloud.google.com/apis/design/errors). +message Status { + // The status code, which should be an enum value of + // [google.rpc.Code][google.rpc.Code]. + int32 code = 1; + + // A developer-facing error message, which should be in English. Any + // user-facing error message should be localized and sent in the + // [google.rpc.Status.details][google.rpc.Status.details] field, or localized + // by the client. + string message = 2; + + // A list of messages that carry the error details. There is a common set of + // message types for APIs to use. + repeated google.protobuf.Any details = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/calendar_period.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/calendar_period.proto new file mode 100644 index 00000000..82f5690b --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/calendar_period.proto @@ -0,0 +1,56 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option go_package = "google.golang.org/genproto/googleapis/type/calendarperiod;calendarperiod"; +option java_multiple_files = true; +option java_outer_classname = "CalendarPeriodProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// A `CalendarPeriod` represents the abstract concept of a time period that has +// a canonical start. Grammatically, "the start of the current +// `CalendarPeriod`." All calendar times begin at midnight UTC. +enum CalendarPeriod { + // Undefined period, raises an error. + CALENDAR_PERIOD_UNSPECIFIED = 0; + + // A day. + DAY = 1; + + // A week. Weeks begin on Monday, following + // [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + WEEK = 2; + + // A fortnight. The first calendar fortnight of the year begins at the start + // of week 1 according to + // [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + FORTNIGHT = 3; + + // A month. + MONTH = 4; + + // A quarter. Quarters start on dates 1-Jan, 1-Apr, 1-Jul, and 1-Oct of each + // year. + QUARTER = 5; + + // A half-year. Half-years start on dates 1-Jan and 1-Jul. + HALF = 6; + + // A year. + YEAR = 7; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/color.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/color.proto new file mode 100644 index 00000000..5dc85a6a --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/color.proto @@ -0,0 +1,174 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +import "google/protobuf/wrappers.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/color;color"; +option java_multiple_files = true; +option java_outer_classname = "ColorProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a color in the RGBA color space. This representation is designed +// for simplicity of conversion to/from color representations in various +// languages over compactness. For example, the fields of this representation +// can be trivially provided to the constructor of `java.awt.Color` in Java; it +// can also be trivially provided to UIColor's `+colorWithRed:green:blue:alpha` +// method in iOS; and, with just a little work, it can be easily formatted into +// a CSS `rgba()` string in JavaScript. +// +// This reference page doesn't carry information about the absolute color +// space +// that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB, +// DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color +// space. +// +// When color equality needs to be decided, implementations, unless +// documented otherwise, treat two colors as equal if all their red, +// green, blue, and alpha values each differ by at most 1e-5. +// +// Example (Java): +// +// import com.google.type.Color; +// +// // ... +// public static java.awt.Color fromProto(Color protocolor) { +// float alpha = protocolor.hasAlpha() +// ? protocolor.getAlpha().getValue() +// : 1.0; +// +// return new java.awt.Color( +// protocolor.getRed(), +// protocolor.getGreen(), +// protocolor.getBlue(), +// alpha); +// } +// +// public static Color toProto(java.awt.Color color) { +// float red = (float) color.getRed(); +// float green = (float) color.getGreen(); +// float blue = (float) color.getBlue(); +// float denominator = 255.0; +// Color.Builder resultBuilder = +// Color +// .newBuilder() +// .setRed(red / denominator) +// .setGreen(green / denominator) +// .setBlue(blue / denominator); +// int alpha = color.getAlpha(); +// if (alpha != 255) { +// result.setAlpha( +// FloatValue +// .newBuilder() +// .setValue(((float) alpha) / denominator) +// .build()); +// } +// return resultBuilder.build(); +// } +// // ... +// +// Example (iOS / Obj-C): +// +// // ... +// static UIColor* fromProto(Color* protocolor) { +// float red = [protocolor red]; +// float green = [protocolor green]; +// float blue = [protocolor blue]; +// FloatValue* alpha_wrapper = [protocolor alpha]; +// float alpha = 1.0; +// if (alpha_wrapper != nil) { +// alpha = [alpha_wrapper value]; +// } +// return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; +// } +// +// static Color* toProto(UIColor* color) { +// CGFloat red, green, blue, alpha; +// if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) { +// return nil; +// } +// Color* result = [[Color alloc] init]; +// [result setRed:red]; +// [result setGreen:green]; +// [result setBlue:blue]; +// if (alpha <= 0.9999) { +// [result setAlpha:floatWrapperWithValue(alpha)]; +// } +// [result autorelease]; +// return result; +// } +// // ... +// +// Example (JavaScript): +// +// // ... +// +// var protoToCssColor = function(rgb_color) { +// var redFrac = rgb_color.red || 0.0; +// var greenFrac = rgb_color.green || 0.0; +// var blueFrac = rgb_color.blue || 0.0; +// var red = Math.floor(redFrac * 255); +// var green = Math.floor(greenFrac * 255); +// var blue = Math.floor(blueFrac * 255); +// +// if (!('alpha' in rgb_color)) { +// return rgbToCssColor(red, green, blue); +// } +// +// var alphaFrac = rgb_color.alpha.value || 0.0; +// var rgbParams = [red, green, blue].join(','); +// return ['rgba(', rgbParams, ',', alphaFrac, ')'].join(''); +// }; +// +// var rgbToCssColor = function(red, green, blue) { +// var rgbNumber = new Number((red << 16) | (green << 8) | blue); +// var hexString = rgbNumber.toString(16); +// var missingZeros = 6 - hexString.length; +// var resultBuilder = ['#']; +// for (var i = 0; i < missingZeros; i++) { +// resultBuilder.push('0'); +// } +// resultBuilder.push(hexString); +// return resultBuilder.join(''); +// }; +// +// // ... +message Color { + // The amount of red in the color as a value in the interval [0, 1]. + float red = 1; + + // The amount of green in the color as a value in the interval [0, 1]. + float green = 2; + + // The amount of blue in the color as a value in the interval [0, 1]. + float blue = 3; + + // The fraction of this color that should be applied to the pixel. That is, + // the final pixel color is defined by the equation: + // + // `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + // + // This means that a value of 1.0 corresponds to a solid color, whereas + // a value of 0.0 corresponds to a completely transparent color. This + // uses a wrapper message rather than a simple float scalar so that it is + // possible to distinguish between a default value and the value being unset. + // If omitted, this color object is rendered as a solid color + // (as if the alpha value had been explicitly given a value of 1.0). + google.protobuf.FloatValue alpha = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/date.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/date.proto new file mode 100644 index 00000000..e4e730e6 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/date.proto @@ -0,0 +1,52 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/date;date"; +option java_multiple_files = true; +option java_outer_classname = "DateProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a whole or partial calendar date, such as a birthday. The time of +// day and time zone are either specified elsewhere or are insignificant. The +// date is relative to the Gregorian Calendar. This can represent one of the +// following: +// +// * A full date, with non-zero year, month, and day values +// * A month and day value, with a zero year, such as an anniversary +// * A year on its own, with zero month and day values +// * A year and month value, with a zero day, such as a credit card expiration +// date +// +// Related types are [google.type.TimeOfDay][google.type.TimeOfDay] and +// `google.protobuf.Timestamp`. +message Date { + // Year of the date. Must be from 1 to 9999, or 0 to specify a date without + // a year. + int32 year = 1; + + // Month of a year. Must be from 1 to 12, or 0 to specify a year without a + // month and day. + int32 month = 2; + + // Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + // to specify a year by itself or a year and month where the day isn't + // significant. + int32 day = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/datetime.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/datetime.proto new file mode 100644 index 00000000..cfed85d7 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/datetime.proto @@ -0,0 +1,104 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +import "google/protobuf/duration.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/datetime;datetime"; +option java_multiple_files = true; +option java_outer_classname = "DateTimeProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents civil time (or occasionally physical time). +// +// This type can represent a civil time in one of a few possible ways: +// +// * When utc_offset is set and time_zone is unset: a civil time on a calendar +// day with a particular offset from UTC. +// * When time_zone is set and utc_offset is unset: a civil time on a calendar +// day in a particular time zone. +// * When neither time_zone nor utc_offset is set: a civil time on a calendar +// day in local time. +// +// The date is relative to the Proleptic Gregorian Calendar. +// +// If year is 0, the DateTime is considered not to have a specific year. month +// and day must have valid, non-zero values. +// +// This type may also be used to represent a physical time if all the date and +// time fields are set and either case of the `time_offset` oneof is set. +// Consider using `Timestamp` message for physical time instead. If your use +// case also would like to store the user's timezone, that can be done in +// another field. +// +// This type is more flexible than some applications may want. Make sure to +// document and validate your application's limitations. +message DateTime { + // Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + // datetime without a year. + int32 year = 1; + + // Required. Month of year. Must be from 1 to 12. + int32 month = 2; + + // Required. Day of month. Must be from 1 to 31 and valid for the year and + // month. + int32 day = 3; + + // Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + // may choose to allow the value "24:00:00" for scenarios like business + // closing time. + int32 hours = 4; + + // Required. Minutes of hour of day. Must be from 0 to 59. + int32 minutes = 5; + + // Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + // API may allow the value 60 if it allows leap-seconds. + int32 seconds = 6; + + // Required. Fractions of seconds in nanoseconds. Must be from 0 to + // 999,999,999. + int32 nanos = 7; + + // Optional. Specifies either the UTC offset or the time zone of the DateTime. + // Choose carefully between them, considering that time zone data may change + // in the future (for example, a country modifies their DST start/end dates, + // and future DateTimes in the affected range had already been stored). + // If omitted, the DateTime is considered to be in local time. + oneof time_offset { + // UTC offset. Must be whole seconds, between -18 hours and +18 hours. + // For example, a UTC offset of -4:00 would be represented as + // { seconds: -14400 }. + google.protobuf.Duration utc_offset = 8; + + // Time zone. + TimeZone time_zone = 9; + } +} + +// Represents a time zone from the +// [IANA Time Zone Database](https://www.iana.org/time-zones). +message TimeZone { + // IANA Time Zone Database time zone, e.g. "America/New_York". + string id = 1; + + // Optional. IANA Time Zone Database version number, e.g. "2019a". + string version = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/dayofweek.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/dayofweek.proto new file mode 100644 index 00000000..4c80c62e --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/dayofweek.proto @@ -0,0 +1,50 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option go_package = "google.golang.org/genproto/googleapis/type/dayofweek;dayofweek"; +option java_multiple_files = true; +option java_outer_classname = "DayOfWeekProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a day of the week. +enum DayOfWeek { + // The day of the week is unspecified. + DAY_OF_WEEK_UNSPECIFIED = 0; + + // Monday + MONDAY = 1; + + // Tuesday + TUESDAY = 2; + + // Wednesday + WEDNESDAY = 3; + + // Thursday + THURSDAY = 4; + + // Friday + FRIDAY = 5; + + // Saturday + SATURDAY = 6; + + // Sunday + SUNDAY = 7; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/decimal.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/decimal.proto new file mode 100644 index 00000000..beb18a5d --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/decimal.proto @@ -0,0 +1,95 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/decimal;decimal"; +option java_multiple_files = true; +option java_outer_classname = "DecimalProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// A representation of a decimal value, such as 2.5. Clients may convert values +// into language-native decimal formats, such as Java's [BigDecimal][] or +// Python's [decimal.Decimal][]. +// +// [BigDecimal]: +// https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html +// [decimal.Decimal]: https://docs.python.org/3/library/decimal.html +message Decimal { + // The decimal value, as a string. + // + // The string representation consists of an optional sign, `+` (`U+002B`) + // or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + // ("the integer"), optionally followed by a fraction, optionally followed + // by an exponent. + // + // The fraction consists of a decimal point followed by zero or more decimal + // digits. The string must contain at least one digit in either the integer + // or the fraction. The number formed by the sign, the integer and the + // fraction is referred to as the significand. + // + // The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + // followed by one or more decimal digits. + // + // Services **should** normalize decimal values before storing them by: + // + // - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + // - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + // - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + // - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + // + // Services **may** perform additional normalization based on its own needs + // and the internal decimal implementation selected, such as shifting the + // decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + // Additionally, services **may** preserve trailing zeroes in the fraction + // to indicate increased precision, but are not required to do so. + // + // Note that only the `.` character is supported to divide the integer + // and the fraction; `,` **should not** be supported regardless of locale. + // Additionally, thousand separators **should not** be supported. If a + // service does support them, values **must** be normalized. + // + // The ENBF grammar is: + // + // DecimalString = + // [Sign] Significand [Exponent]; + // + // Sign = '+' | '-'; + // + // Significand = + // Digits ['.'] [Digits] | [Digits] '.' Digits; + // + // Exponent = ('e' | 'E') [Sign] Digits; + // + // Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + // + // Services **should** clearly document the range of supported values, the + // maximum supported precision (total number of digits), and, if applicable, + // the scale (number of digits after the decimal point), as well as how it + // behaves when receiving out-of-bounds values. + // + // Services **may** choose to accept values passed as input even when the + // value has a higher precision or scale than the service supports, and + // **should** round the value to fit the supported scale. Alternatively, the + // service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + // if precision would be lost. + // + // Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + // gRPC) if the service receives a value outside of the supported range. + string value = 1; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/expr.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/expr.proto new file mode 100644 index 00000000..af0778cf --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/expr.proto @@ -0,0 +1,73 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option go_package = "google.golang.org/genproto/googleapis/type/expr;expr"; +option java_multiple_files = true; +option java_outer_classname = "ExprProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a textual expression in the Common Expression Language (CEL) +// syntax. CEL is a C-like expression language. The syntax and semantics of CEL +// are documented at https://github.com/google/cel-spec. +// +// Example (Comparison): +// +// title: "Summary size limit" +// description: "Determines if a summary is less than 100 chars" +// expression: "document.summary.size() < 100" +// +// Example (Equality): +// +// title: "Requestor is owner" +// description: "Determines if requestor is the document owner" +// expression: "document.owner == request.auth.claims.email" +// +// Example (Logic): +// +// title: "Public documents" +// description: "Determine whether the document should be publicly visible" +// expression: "document.type != 'private' && document.type != 'internal'" +// +// Example (Data Manipulation): +// +// title: "Notification string" +// description: "Create a notification string with a timestamp." +// expression: "'New message received at ' + string(document.create_time)" +// +// The exact variables and functions that may be referenced within an expression +// are determined by the service that evaluates it. See the service +// documentation for additional information. +message Expr { + // Textual representation of an expression in Common Expression Language + // syntax. + string expression = 1; + + // Optional. Title for the expression, i.e. a short string describing + // its purpose. This can be used e.g. in UIs which allow to enter the + // expression. + string title = 2; + + // Optional. Description of the expression. This is a longer text which + // describes the expression, e.g. when hovered over it in a UI. + string description = 3; + + // Optional. String indicating the location of the expression for error + // reporting, e.g. a file name and a position in the file. + string location = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/fraction.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/fraction.proto new file mode 100644 index 00000000..6c5ae6e2 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/fraction.proto @@ -0,0 +1,33 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option go_package = "google.golang.org/genproto/googleapis/type/fraction;fraction"; +option java_multiple_files = true; +option java_outer_classname = "FractionProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a fraction in terms of a numerator divided by a denominator. +message Fraction { + // The numerator in the fraction, e.g. 2 in 2/3. + int64 numerator = 1; + + // The value by which the numerator is divided, e.g. 3 in 2/3. Must be + // positive. + int64 denominator = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/interval.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/interval.proto new file mode 100644 index 00000000..9702324c --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/interval.proto @@ -0,0 +1,46 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +import "google/protobuf/timestamp.proto"; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/interval;interval"; +option java_multiple_files = true; +option java_outer_classname = "IntervalProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a time interval, encoded as a Timestamp start (inclusive) and a +// Timestamp end (exclusive). +// +// The start must be less than or equal to the end. +// When the start equals the end, the interval is empty (matches no time). +// When both start and end are unspecified, the interval matches any time. +message Interval { + // Optional. Inclusive start of the interval. + // + // If specified, a Timestamp matching this interval will have to be the same + // or after the start. + google.protobuf.Timestamp start_time = 1; + + // Optional. Exclusive end of the interval. + // + // If specified, a Timestamp matching this interval will have to be before the + // end. + google.protobuf.Timestamp end_time = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/latlng.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/latlng.proto new file mode 100644 index 00000000..9231456e --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/latlng.proto @@ -0,0 +1,37 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/latlng;latlng"; +option java_multiple_files = true; +option java_outer_classname = "LatLngProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// An object that represents a latitude/longitude pair. This is expressed as a +// pair of doubles to represent degrees latitude and degrees longitude. Unless +// specified otherwise, this must conform to the +// WGS84 +// standard. Values must be within normalized ranges. +message LatLng { + // The latitude in degrees. It must be in the range [-90.0, +90.0]. + double latitude = 1; + + // The longitude in degrees. It must be in the range [-180.0, +180.0]. + double longitude = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/localized_text.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/localized_text.proto new file mode 100644 index 00000000..5c6922b8 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/localized_text.proto @@ -0,0 +1,36 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/localized_text;localized_text"; +option java_multiple_files = true; +option java_outer_classname = "LocalizedTextProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Localized variant of a text in a particular language. +message LocalizedText { + // Localized string in the language corresponding to `language_code' below. + string text = 1; + + // The text's BCP-47 language code, such as "en-US" or "sr-Latn". + // + // For more information, see + // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + string language_code = 2; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/money.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/money.proto new file mode 100644 index 00000000..98d6494e --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/money.proto @@ -0,0 +1,42 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/money;money"; +option java_multiple_files = true; +option java_outer_classname = "MoneyProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents an amount of money with its currency type. +message Money { + // The three-letter currency code defined in ISO 4217. + string currency_code = 1; + + // The whole units of the amount. + // For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + int64 units = 2; + + // Number of nano (10^-9) units of the amount. + // The value must be between -999,999,999 and +999,999,999 inclusive. + // If `units` is positive, `nanos` must be positive or zero. + // If `units` is zero, `nanos` can be positive, zero, or negative. + // If `units` is negative, `nanos` must be negative or zero. + // For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + int32 nanos = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/month.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/month.proto new file mode 100644 index 00000000..99e7551b --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/month.proto @@ -0,0 +1,65 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option go_package = "google.golang.org/genproto/googleapis/type/month;month"; +option java_multiple_files = true; +option java_outer_classname = "MonthProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a month in the Gregorian calendar. +enum Month { + // The unspecified month. + MONTH_UNSPECIFIED = 0; + + // The month of January. + JANUARY = 1; + + // The month of February. + FEBRUARY = 2; + + // The month of March. + MARCH = 3; + + // The month of April. + APRIL = 4; + + // The month of May. + MAY = 5; + + // The month of June. + JUNE = 6; + + // The month of July. + JULY = 7; + + // The month of August. + AUGUST = 8; + + // The month of September. + SEPTEMBER = 9; + + // The month of October. + OCTOBER = 10; + + // The month of November. + NOVEMBER = 11; + + // The month of December. + DECEMBER = 12; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/phone_number.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/phone_number.proto new file mode 100644 index 00000000..7bbb7d87 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/phone_number.proto @@ -0,0 +1,113 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/phone_number;phone_number"; +option java_multiple_files = true; +option java_outer_classname = "PhoneNumberProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// An object representing a phone number, suitable as an API wire format. +// +// This representation: +// +// - should not be used for locale-specific formatting of a phone number, such +// as "+1 (650) 253-0000 ext. 123" +// +// - is not designed for efficient storage +// - may not be suitable for dialing - specialized libraries (see references) +// should be used to parse the number for that purpose +// +// To do something meaningful with this number, such as format it for various +// use-cases, convert it to an `i18n.phonenumbers.PhoneNumber` object first. +// +// For instance, in Java this would be: +// +// com.google.type.PhoneNumber wireProto = +// com.google.type.PhoneNumber.newBuilder().build(); +// com.google.i18n.phonenumbers.Phonenumber.PhoneNumber phoneNumber = +// PhoneNumberUtil.getInstance().parse(wireProto.getE164Number(), "ZZ"); +// if (!wireProto.getExtension().isEmpty()) { +// phoneNumber.setExtension(wireProto.getExtension()); +// } +// +// Reference(s): +// - https://github.com/google/libphonenumber +message PhoneNumber { + // An object representing a short code, which is a phone number that is + // typically much shorter than regular phone numbers and can be used to + // address messages in MMS and SMS systems, as well as for abbreviated dialing + // (e.g. "Text 611 to see how many minutes you have remaining on your plan."). + // + // Short codes are restricted to a region and are not internationally + // dialable, which means the same short code can exist in different regions, + // with different usage and pricing, even if those regions share the same + // country calling code (e.g. US and CA). + message ShortCode { + // Required. The BCP-47 region code of the location where calls to this + // short code can be made, such as "US" and "BB". + // + // Reference(s): + // - http://www.unicode.org/reports/tr35/#unicode_region_subtag + string region_code = 1; + + // Required. The short code digits, without a leading plus ('+') or country + // calling code, e.g. "611". + string number = 2; + } + + // Required. Either a regular number, or a short code. New fields may be + // added to the oneof below in the future, so clients should ignore phone + // numbers for which none of the fields they coded against are set. + oneof kind { + // The phone number, represented as a leading plus sign ('+'), followed by a + // phone number that uses a relaxed ITU E.164 format consisting of the + // country calling code (1 to 3 digits) and the subscriber number, with no + // additional spaces or formatting, e.g.: + // - correct: "+15552220123" + // - incorrect: "+1 (555) 222-01234 x123". + // + // The ITU E.164 format limits the latter to 12 digits, but in practice not + // all countries respect that, so we relax that restriction here. + // National-only numbers are not allowed. + // + // References: + // - https://www.itu.int/rec/T-REC-E.164-201011-I + // - https://en.wikipedia.org/wiki/E.164. + // - https://en.wikipedia.org/wiki/List_of_country_calling_codes + string e164_number = 1; + + // A short code. + // + // Reference(s): + // - https://en.wikipedia.org/wiki/Short_code + ShortCode short_code = 2; + } + + // The phone number's extension. The extension is not standardized in ITU + // recommendations, except for being defined as a series of numbers with a + // maximum length of 40 digits. Other than digits, some other dialing + // characters such as ',' (indicating a wait) or '#' may be stored here. + // + // Note that no regions currently use extensions with short codes, so this + // field is normally only set in conjunction with an E.164 number. It is held + // separately from the E.164 number to allow for short code extensions in the + // future. + string extension = 3; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/postal_address.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/postal_address.proto new file mode 100644 index 00000000..c57c7c31 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/postal_address.proto @@ -0,0 +1,134 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/postaladdress;postaladdress"; +option java_multiple_files = true; +option java_outer_classname = "PostalAddressProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a postal address, e.g. for postal delivery or payments addresses. +// Given a postal address, a postal service can deliver items to a premise, P.O. +// Box or similar. +// It is not intended to model geographical locations (roads, towns, +// mountains). +// +// In typical usage an address would be created via user input or from importing +// existing data, depending on the type of process. +// +// Advice on address input / editing: +// - Use an i18n-ready address widget such as +// https://github.com/google/libaddressinput) +// - Users should not be presented with UI elements for input or editing of +// fields outside countries where that field is used. +// +// For more guidance on how to use this schema, please see: +// https://support.google.com/business/answer/6397478 +message PostalAddress { + // The schema revision of the `PostalAddress`. This must be set to 0, which is + // the latest revision. + // + // All new revisions **must** be backward compatible with old revisions. + int32 revision = 1; + + // Required. CLDR region code of the country/region of the address. This + // is never inferred and it is up to the user to ensure the value is + // correct. See http://cldr.unicode.org/ and + // http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + // for details. Example: "CH" for Switzerland. + string region_code = 2; + + // Optional. BCP-47 language code of the contents of this address (if + // known). This is often the UI language of the input form or is expected + // to match one of the languages used in the address' country/region, or their + // transliterated equivalents. + // This can affect formatting in certain countries, but is not critical + // to the correctness of the data and will never affect any validation or + // other non-formatting related operations. + // + // If this value is not known, it should be omitted (rather than specifying a + // possibly incorrect default). + // + // Examples: "zh-Hant", "ja", "ja-Latn", "en". + string language_code = 3; + + // Optional. Postal code of the address. Not all countries use or require + // postal codes to be present, but where they are used, they may trigger + // additional validation with other parts of the address (e.g. state/zip + // validation in the U.S.A.). + string postal_code = 4; + + // Optional. Additional, country-specific, sorting code. This is not used + // in most regions. Where it is used, the value is either a string like + // "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + // alone, representing the "sector code" (Jamaica), "delivery area indicator" + // (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + string sorting_code = 5; + + // Optional. Highest administrative subdivision which is used for postal + // addresses of a country or region. + // For example, this can be a state, a province, an oblast, or a prefecture. + // Specifically, for Spain this is the province and not the autonomous + // community (e.g. "Barcelona" and not "Catalonia"). + // Many countries don't use an administrative area in postal addresses. E.g. + // in Switzerland this should be left unpopulated. + string administrative_area = 6; + + // Optional. Generally refers to the city/town portion of the address. + // Examples: US city, IT comune, UK post town. + // In regions of the world where localities are not well defined or do not fit + // into this structure well, leave locality empty and use address_lines. + string locality = 7; + + // Optional. Sublocality of the address. + // For example, this can be neighborhoods, boroughs, districts. + string sublocality = 8; + + // Unstructured address lines describing the lower levels of an address. + // + // Because values in address_lines do not have type information and may + // sometimes contain multiple values in a single field (e.g. + // "Austin, TX"), it is important that the line order is clear. The order of + // address lines should be "envelope order" for the country/region of the + // address. In places where this can vary (e.g. Japan), address_language is + // used to make it explicit (e.g. "ja" for large-to-small ordering and + // "ja-Latn" or "en" for small-to-large). This way, the most specific line of + // an address can be selected based on the language. + // + // The minimum permitted structural representation of an address consists + // of a region_code with all remaining information placed in the + // address_lines. It would be possible to format such an address very + // approximately without geocoding, but no semantic reasoning could be + // made about any of the address components until it was at least + // partially resolved. + // + // Creating an address only containing a region_code and address_lines, and + // then geocoding is the recommended way to handle completely unstructured + // addresses (as opposed to guessing which parts of the address should be + // localities or administrative areas). + repeated string address_lines = 9; + + // Optional. The recipient at the address. + // This field may, under certain circumstances, contain multiline information. + // For example, it might contain "care of" information. + repeated string recipients = 10; + + // Optional. The name of the organization at the address. + string organization = 11; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/quaternion.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/quaternion.proto new file mode 100644 index 00000000..dfb822de --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/quaternion.proto @@ -0,0 +1,94 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/quaternion;quaternion"; +option java_multiple_files = true; +option java_outer_classname = "QuaternionProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// A quaternion is defined as the quotient of two directed lines in a +// three-dimensional space or equivalently as the quotient of two Euclidean +// vectors (https://en.wikipedia.org/wiki/Quaternion). +// +// Quaternions are often used in calculations involving three-dimensional +// rotations (https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation), +// as they provide greater mathematical robustness by avoiding the gimbal lock +// problems that can be encountered when using Euler angles +// (https://en.wikipedia.org/wiki/Gimbal_lock). +// +// Quaternions are generally represented in this form: +// +// w + xi + yj + zk +// +// where x, y, z, and w are real numbers, and i, j, and k are three imaginary +// numbers. +// +// Our naming choice `(x, y, z, w)` comes from the desire to avoid confusion for +// those interested in the geometric properties of the quaternion in the 3D +// Cartesian space. Other texts often use alternative names or subscripts, such +// as `(a, b, c, d)`, `(1, i, j, k)`, or `(0, 1, 2, 3)`, which are perhaps +// better suited for mathematical interpretations. +// +// To avoid any confusion, as well as to maintain compatibility with a large +// number of software libraries, the quaternions represented using the protocol +// buffer below *must* follow the Hamilton convention, which defines `ij = k` +// (i.e. a right-handed algebra), and therefore: +// +// i^2 = j^2 = k^2 = ijk = −1 +// ij = −ji = k +// jk = −kj = i +// ki = −ik = j +// +// Please DO NOT use this to represent quaternions that follow the JPL +// convention, or any of the other quaternion flavors out there. +// +// Definitions: +// +// - Quaternion norm (or magnitude): `sqrt(x^2 + y^2 + z^2 + w^2)`. +// - Unit (or normalized) quaternion: a quaternion whose norm is 1. +// - Pure quaternion: a quaternion whose scalar component (`w`) is 0. +// - Rotation quaternion: a unit quaternion used to represent rotation. +// - Orientation quaternion: a unit quaternion used to represent orientation. +// +// A quaternion can be normalized by dividing it by its norm. The resulting +// quaternion maintains the same direction, but has a norm of 1, i.e. it moves +// on the unit sphere. This is generally necessary for rotation and orientation +// quaternions, to avoid rounding errors: +// https://en.wikipedia.org/wiki/Rotation_formalisms_in_three_dimensions +// +// Note that `(x, y, z, w)` and `(-x, -y, -z, -w)` represent the same rotation, +// but normalization would be even more useful, e.g. for comparison purposes, if +// it would produce a unique representation. It is thus recommended that `w` be +// kept positive, which can be achieved by changing all the signs when `w` is +// negative. +// +message Quaternion { + // The x component. + double x = 1; + + // The y component. + double y = 2; + + // The z component. + double z = 3; + + // The scalar component. + double w = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/timeofday.proto b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/timeofday.proto new file mode 100644 index 00000000..5cb48aa9 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiExe/protos/google/type/timeofday.proto @@ -0,0 +1,44 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.type; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/type/timeofday;timeofday"; +option java_multiple_files = true; +option java_outer_classname = "TimeOfDayProto"; +option java_package = "com.google.type"; +option objc_class_prefix = "GTP"; + +// Represents a time of day. The date and time zone are either not significant +// or are specified elsewhere. An API may choose to allow leap seconds. Related +// types are [google.type.Date][google.type.Date] and +// `google.protobuf.Timestamp`. +message TimeOfDay { + // Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + // to allow the value "24:00:00" for scenarios like business closing time. + int32 hours = 1; + + // Minutes of hour of day. Must be from 0 to 59. + int32 minutes = 2; + + // Seconds of minutes of the time. Must normally be from 0 to 59. An API may + // allow the value 60 if it allows leap-seconds. + int32 seconds = 3; + + // Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + int32 nanos = 4; +} diff --git a/src/EcTranslators/VertexAi/VertexAiPromptExeTranslatorCommandLineArgs.cs b/src/EcTranslators/VertexAi/VertexAiPromptExeTranslatorCommandLineArgs.cs new file mode 100644 index 00000000..95e18936 --- /dev/null +++ b/src/EcTranslators/VertexAi/VertexAiPromptExeTranslatorCommandLineArgs.cs @@ -0,0 +1,17 @@ +// #define encryptingNewCredentials + +namespace SilEncConverters40.EcTranslators.VertexAi +{ + public class VertexAiPromptExeTranslatorCommandLineArgs : PromptExeTranslatorCommandLineArgs + { + public string ProjectId { get; set; } + public string LocationId { get; set; } + public string Publisher { get; set; } + public string ModelId { get; set; } + public double? Temperature { get; set; } = 0.3; // the default from vertex example + public int? MaxDecodeSteps { get; set; } = 200; // default + public double? TopP { get; set; } = 0.8; // default + public int? TopK { get; set; } = 40; // default + } +} + diff --git a/src/EcTranslators/app.config b/src/EcTranslators/app.config index e8c13986..aa93e0d2 100644 --- a/src/EcTranslators/app.config +++ b/src/EcTranslators/app.config @@ -1,110 +1,188 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - QMuB0FScN6S0HBybzZkTbPjOTzxAwCwp0Lz3sKUVPDOa0nrUhgUcgQ== - - - global - - - https://api.cognitive.microsofttranslator.com/ - - - https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-translator - - - X1jOy3rXKfQl20lvyoj7LYlLtEuaRITqjY+oGo4BYCpE6/4MQ9kQFA== - - - - - - - - - ga2IjIXDPBcfeNWHbsrMyv2IYXHklD7fPFredwAbuGHx/qTOpfVDrHQ0Fd+u1ewDQE0n0X20/mT0uewkoTX32AC3HoT62QxOp3BGU7PNffnJJfoNvDQhpANF3zlFC5UV2aINNXX2BDulLtb0Ji7EVzx9j1S1zbmzrFmoSIxc9QkVv57z932s4LowX9qxEoQ1UO4mmmeYThUg4L8nFtfRPzXRkXT2yDH/FIev4FicOUc5FG7oKZwg5NjaopHZLeklZLPugPwGFZc6h3rjazScluDIBihsxmEmqqrf2BaNadf3/uIs3DCtMt9nOLLDarPHFtd1l7Ozon1tRaKZics+NODEFRUSlosMaEOmNRxXAn0wMpSPksFfQYr6VYFZtwGDZEnwOzp252e41uxkivy7u3VDQvFoQscYWknwn5Hp4OWuYOKj6ZfIyQ5Fj9PG3PdX2m87Fp6LGySiVftGmfbFQKpeOXMeqMjGdg1ZTr5dk/uPK3Ub2mNysLQCzzyPj42j74BZihFWrw0NBPXT8jX4ZSqWHIUuKIgyNplDDy/uXOQfu85XRWgEfih8uRU0eD405r4woYRkb/zzHN4IqHfofldZQkUe+cql9SZbQpL6I3EEgbBk/HzRz+tWsX6n59y83Zecxx9gu7zJNZBY277RMWfulka+m6qdwEet6kPquHO+95RdEAxO8ZTf+agwnnXRwh46ICneWLr3LBEnxLOTCLZPrcjtfSAS52uTKw32KP2PwZhFyTjJ3X6H6MU3d35rfAmTNCEzSFBQd/RXpfB7ALLVW/YPS0D+O/UsQHKpaL3jTjcsivgIntEze4bnBzY6uSSamSQjBMX6DAuMbUDe49sqO3veJSmvxNDiVXDSAePiV8pvR5arUdhulBeWpH7u3kOb3jXeZUpoVqgT5YOSe/CE2HkS8fL5F7fhx/wbq4JFEZgzEFxQCynd3VRd1qu9C8Q0FeSeqCBU8NNs6A3V9VxPeYwsRy1YicmSdj30SXNyjApFsxb1aX+FIUvSdMGb2uHzvXcE/oEMmkhB+hgxawd38aIj/lB6lG8DK49ERpj18Ldn6GvkJ0MpZsB7X/P4usqLu15JE1u/9KA18rQD304iIFSo8xm0Eiwl0SNIqU7rlTLCZR4aoKebGxJXLTEXUMMLTxp6+HsGTjOOfkJyCrkMPDJQ62J/8H4GKjfP0oQ/m7HLolmthcoUx65xFmVR4RFzdspHb+y4sbssA/BDMneZEa+rNrrgoXm8nFv4ufWY3RlxhbHNpOuCm+Bn91bhE3+538P+G67d+AvvFxtK9OXo4e94RVDRyYBrQr4vdi5T/LhQXAFI+aHdlibUB2+KukGZcKqR9u8Z4fm+E54wip5mNFG87vjQ606lqou9jgZ7+OnI3gGTSyIVSH+IsRS8Y4ZiO9SA7fYdRGA7RFM+LKsAt72A8ypJNIeumWg84USFsMxFBitB3ixkofe8Ol1sgo7AXg+7Nlvo2doMs0xZN+3UNHOW4UKAVYP8djqWdOomXskFdhedIk4o30fTrhNyjMja/kLv0dYAfbhLa6s+ezfo/dDU86x9CXm1XMga/kifhi2hVCwTSlc1hgWuLoS1x6/n4iUZjnU7OuUTlKPQy+PRBl7I2nES8TQtrWjltDH3x2EtAgd4mdydb6f69kTbgtKluTCUtvH2pxlcNFxS6kjpalzsutWbZXqgEb7gedSz47YSYtO3oIgmV7Z19d6+/rg5bcOUCx2x1fMM8aAcChhuvL75ht5qnYX6Ge+Im4oZKwwS1pSCwJwTnDKdD0WIjtiJks9NoXQhGd7lwAQ2R79fwEItPt0XHO2NqDLFPEbL8ANitqUtQ8UPyNut/QSQRzJ5/XmW4JUudy3+UwdZ/YY31bbHdm5dcnydMH2JoOcSUtK99S/ilE9TpKgjiBK4BzXIkXY+BkSyIRAdJc0lnyL/O8uwnc9u+4orUm0e+7oZdHpMa6OovpC/md6r0nOhMgsN04VYEynpimqirAai2yZliAlnl/+AXIshwqrJdDxekARvCkHYb2WRR0PDpSSpdVEHug/uC6xhEM7XBTrymz14fUS22y7T+XMue0PCzrBpdySw/EbjEWvgBR21XrDT03Gt7ZLiiFW4tWq4foAgeJAkPEGb+qKucblC+xydpONoCvzY0GiyzTdhPK110vSt0zT+cCYEy1L21gnRXiABuftJNi/+P9OqrmgvK9xIvOS/katiDGviXpD9jvVpyhIjOZLxOQtslzEAps5JpyRARISO0pttcY0hWT9znSTL2Oi/7GxRulx0OJnUjC1qg21HKxVVmXd4IObRbH6bSLDDObkmnyeyM5ZUUnQMgA7LnaZYJqxGI415hTjqmpX0vMn7wwo7R3+NkfccpVVmofGCRHjgumw3xriALsztBFNJf3DjFlvxMPTgxabjvj1Xy/HipTz+vEcAEr48Bfg7t+JTJEa2LGy/G3wAMDMbEyU7zFJL3vfC2mJUlgj7qdq/1quIpwkjnyIq6UVaEfPs/dSHzKYodrMoxFdTLBrbl86FhlXHyjlHcHImOddRALgBgjtRFzlfjG5B0DvmwJ7D8f0wanP8l/g0xzLf9RgKdU2evUBIlu0y1hYfT5wD0YLP2rqsMs/TcS4YLAvEwoP0Zmo4LBnCWajSyJmm0jxvkeulEnJ0hsyslqEY6XBfWgzS61mJKZNZes0JbjIptjiUXBW4RzAfYe+o91fpnjOqp+Nfv8cDno1vpWHkkEHT+HX/IVTBDqsMqmEsl2kFNgSIVwZpBT4E+wrFGciFjiiCU10A6On6kbfvn6FKbCK1CKvWIcuuufQXq6xyF67OVtvciTl22EslIHiDLjTMTYL4rg3Pk4fsovYBanwhf6dlhUxcZ+W6RkurPz/lEJ4ucPR2ifaLnVIubj9jGk6o63TuHrGThpXKomxBLgVcWBxhkY8XHF6+Z/qhYbYAuGW8OgblOT/8Pk/Y0NFCcv5Rmj52NzWHjFGxj0Znsg4OnaurMKfeNnU5PbwyCn2z1GFII0SnMbXAo3gWVxHxJzvq7UjlVfMFVC8yz+ZzoReS5HDZJxwSzmDQ - - - - - - projects/bright-coyote-381812 - - - + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QMuB0FScN6S0HBybzZkTbPjOTzxAwCwp0Lz3sKUVPDOa0nrUhgUcgQ== + + + global + + + https://api.cognitive.microsofttranslator.com/ + + + https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-translator + + + X1jOy3rXKfQl20lvyoj7LYlLtEuaRITqjY+oGo4BYCpE6/4MQ9kQFA== + + + + + + + + + ga2IjIXDPBcfeNWHbsrMyv2IYXHklD7fPFredwAbuGHx/qTOpfVDrHQ0Fd+u1ewDQE0n0X20/mT0uewkoTX32AC3HoT62QxOp3BGU7PNffnJJfoNvDQhpANF3zlFC5UV2aINNXX2BDulLtb0Ji7EVzx9j1S1zbmzrFmoSIxc9QkVv57z932s4LowX9qxEoQ1UO4mmmeYThUg4L8nFtfRPzXRkXT2yDH/FIev4FicOUc5FG7oKZwg5NjaopHZLeklZLPugPwGFZc6h3rjazScluDIBihsxmEmqqrf2BaNadf3/uIs3DCtMt9nOLLDarPHFtd1l7Ozon1tRaKZics+NODEFRUSlosMaEOmNRxXAn0wMpSPksFfQYr6VYFZtwGDZEnwOzp252e41uxkivy7u3VDQvFoQscYWknwn5Hp4OWuYOKj6ZfIyQ5Fj9PG3PdX2m87Fp6LGySiVftGmfbFQKpeOXMeqMjGdg1ZTr5dk/uPK3Ub2mNysLQCzzyPj42j74BZihFWrw0NBPXT8jX4ZSqWHIUuKIgyNplDDy/uXOQfu85XRWgEfih8uRU0eD405r4woYRkb/zzHN4IqHfofldZQkUe+cql9SZbQpL6I3EEgbBk/HzRz+tWsX6n59y83Zecxx9gu7zJNZBY277RMWfulka+m6qdwEet6kPquHO+95RdEAxO8ZTf+agwnnXRwh46ICneWLr3LBEnxLOTCLZPrcjtfSAS52uTKw32KP2PwZhFyTjJ3X6H6MU3d35rfAmTNCEzSFBQd/RXpfB7ALLVW/YPS0D+O/UsQHKpaL3jTjcsivgIntEze4bnBzY6uSSamSQjBMX6DAuMbUDe49sqO3veJSmvxNDiVXDSAePiV8pvR5arUdhulBeWpH7u3kOb3jXeZUpoVqgT5YOSe/CE2HkS8fL5F7fhx/wbq4JFEZgzEFxQCynd3VRd1qu9C8Q0FeSeqCBU8NNs6A3V9VxPeYwsRy1YicmSdj30SXNyjApFsxb1aX+FIUvSdMGb2uHzvXcE/oEMmkhB+hgxawd38aIj/lB6lG8DK49ERpj18Ldn6GvkJ0MpZsB7X/P4usqLu15JE1u/9KA18rQD304iIFSo8xm0Eiwl0SNIqU7rlTLCZR4aoKebGxJXLTEXUMMLTxp6+HsGTjOOfkJyCrkMPDJQ62J/8H4GKjfP0oQ/m7HLolmthcoUx65xFmVR4RFzdspHb+y4sbssA/BDMneZEa+rNrrgoXm8nFv4ufWY3RlxhbHNpOuCm+Bn91bhE3+538P+G67d+AvvFxtK9OXo4e94RVDRyYBrQr4vdi5T/LhQXAFI+aHdlibUB2+KukGZcKqR9u8Z4fm+E54wip5mNFG87vjQ606lqou9jgZ7+OnI3gGTSyIVSH+IsRS8Y4ZiO9SA7fYdRGA7RFM+LKsAt72A8ypJNIeumWg84USFsMxFBitB3ixkofe8Ol1sgo7AXg+7Nlvo2doMs0xZN+3UNHOW4UKAVYP8djqWdOomXskFdhedIk4o30fTrhNyjMja/kLv0dYAfbhLa6s+ezfo/dDU86x9CXm1XMga/kifhi2hVCwTSlc1hgWuLoS1x6/n4iUZjnU7OuUTlKPQy+PRBl7I2nES8TQtrWjltDH3x2EtAgd4mdydb6f69kTbgtKluTCUtvH2pxlcNFxS6kjpalzsutWbZXqgEb7gedSz47YSYtO3oIgmV7Z19d6+/rg5bcOUCx2x1fMM8aAcChhuvL75ht5qnYX6Ge+Im4oZKwwS1pSCwJwTnDKdD0WIjtiJks9NoXQhGd7lwAQ2R79fwEItPt0XHO2NqDLFPEbL8ANitqUtQ8UPyNut/QSQRzJ5/XmW4JUudy3+UwdZ/YY31bbHdm5dcnydMH2JoOcSUtK99S/ilE9TpKgjiBK4BzXIkXY+BkSyIRAdJc0lnyL/O8uwnc9u+4orUm0e+7oZdHpMa6OovpC/md6r0nOhMgsN04VYEynpimqirAai2yZliAlnl/+AXIshwqrJdDxekARvCkHYb2WRR0PDpSSpdVEHug/uC6xhEM7XBTrymz14fUS22y7T+XMue0PCzrBpdySw/EbjEWvgBR21XrDT03Gt7ZLiiFW4tWq4foAgeJAkPEGb+qKucblC+xydpONoCvzY0GiyzTdhPK110vSt0zT+cCYEy1L21gnRXiABuftJNi/+P9OqrmgvK9xIvOS/katiDGviXpD9jvVpyhIjOZLxOQtslzEAps5JpyRARISO0pttcY0hWT9znSTL2Oi/7GxRulx0OJnUjC1qg21HKxVVmXd4IObRbH6bSLDDObkmnyeyM5ZUUnQMgA7LnaZYJqxGI415hTjqmpX0vMn7wwo7R3+NkfccpVVmofGCRHjgumw3xriALsztBFNJf3DjFlvxMPTgxabjvj1Xy/HipTz+vEcAEr48Bfg7t+JTJEa2LGy/G3wAMDMbEyU7zFJL3vfC2mJUlgj7qdq/1quIpwkjnyIq6UVaEfPs/dSHzKYodrMoxFdTLBrbl86FhlXHyjlHcHImOddRALgBgjtRFzlfjG5B0DvmwJ7D8f0wanP8l/g0xzLf9RgKdU2evUBIlu0y1hYfT5wD0YLP2rqsMs/TcS4YLAvEwoP0Zmo4LBnCWajSyJmm0jxvkeulEnJ0hsyslqEY6XBfWgzS61mJKZNZes0JbjIptjiUXBW4RzAfYe+o91fpnjOqp+Nfv8cDno1vpWHkkEHT+HX/IVTBDqsMqmEsl2kFNgSIVwZpBT4E+wrFGciFjiiCU10A6On6kbfvn6FKbCK1CKvWIcuuufQXq6xyF67OVtvciTl22EslIHiDLjTMTYL4rg3Pk4fsovYBanwhf6dlhUxcZ+W6RkurPz/lEJ4ucPR2ifaLnVIubj9jGk6o63TuHrGThpXKomxBLgVcWBxhkY8XHF6+Z/qhYbYAuGW8OgblOT/8Pk/Y0NFCcv5Rmj52NzWHjFGxj0Znsg4OnaurMKfeNnU5PbwyCn2z1GFII0SnMbXAo3gWVxHxJzvq7UjlVfMFVC8yz+ZzoReS5HDZJxwSzmDQ + + + + + + projects/bright-coyote-381812 + + + + + + + + + + + + https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource + + + + + with a 'free translation' style + with a 'literal translation' style + with a 'free translation' style aimed at high school students + in the Devanagari script + using 'Yoda speak' + UseSystemPrompt: Translate from Hindi into English. + UseSystemPrompt: You will be given one or more sentences in Khmer script. Your job is to transliterate them into the Latin script and return only the transliterated Latin result. + UseSystemPrompt: You will be given one or more sentences in Tibetan script. Your job is to transliterate them into the International Phonetic Alphabet (IPA) and return only the transliterated IPA result. + + + + + N3RK/o+wYtvEFMVGtYsmROIyLr/+RWh1 + + + + + + + + + + + + + + + us-central1 + + + google + + + chat-bison + + + + + + + http://localhost:8000 + + + (.*?)([\p{Po}-[,]]) + + + False + + + \ No newline at end of file diff --git a/src/EncCnvtrs/AutoConfigDialog.Designer.cs b/src/EncCnvtrs/AutoConfigDialog.Designer.cs index 7f8ab867..9d29eaec 100755 --- a/src/EncCnvtrs/AutoConfigDialog.Designer.cs +++ b/src/EncCnvtrs/AutoConfigDialog.Designer.cs @@ -550,7 +550,7 @@ private void InitializeComponent(SilEncConverters40.WebBrowserAdaptor webBrowser this.checkBoxICURegularExpression.Name = "checkBoxICURegularExpression"; this.checkBoxICURegularExpression.Size = new System.Drawing.Size(138, 17); this.checkBoxICURegularExpression.TabIndex = 3; - this.checkBoxICURegularExpression.Text = "ICU Regular &Expression"; + this.checkBoxICURegularExpression.Text = "Regular &Expression"; this.checkBoxICURegularExpression.UseVisualStyleBackColor = true; this.checkBoxICURegularExpression.CheckedChanged += new System.EventHandler(this.SomethingChanged); // diff --git a/src/EncCnvtrs/AutoConfigDialog.cs b/src/EncCnvtrs/AutoConfigDialog.cs index 022203ab..16564ad9 100755 --- a/src/EncCnvtrs/AutoConfigDialog.cs +++ b/src/EncCnvtrs/AutoConfigDialog.cs @@ -7,6 +7,7 @@ using System.IO; // for Path.DirectorySeparatorChar using Microsoft.Win32; // for RegistryKey using ECInterfaces; // for IEncConverter +using System.Diagnostics; namespace SilEncConverters40 { @@ -131,9 +132,11 @@ bool bIsInRepository var strXmlFilePath = (string)keyRoot.GetValue("RootDir"); if (String.IsNullOrEmpty(strXmlFilePath)) throw new ApplicationException("The 'RootDir' registry key is not defined!? Perhaps the application needs to be re-installed. Ask the developer."); - strXmlFilePath = Path.Combine(strXmlFilePath, Path.Combine(@"Help", strHtmlFileName)); + if (strHtmlFileName.StartsWith("http")) + strXmlFilePath = strHtmlFileName; + else + strXmlFilePath = Path.Combine(strXmlFilePath, Path.Combine(@"Help", strHtmlFileName)); System.Diagnostics.Debug.WriteLine(strXmlFilePath); - System.Diagnostics.Debug.Assert(System.IO.File.Exists(strXmlFilePath), String.Format("Cannot find '{0}'. If this is a development machine, you need to add the following reg key to see the About help files: HLKM\\SOFTWARE\\SIL\\SilEncConverters40\\[RootDir] = '' along with a trailing slash (e.g. \"C:\\fw\\lib\\release\\\")", strHtmlFileName)); this.webBrowser.Navigate(strXmlFilePath); } #if DEBUG @@ -353,8 +356,17 @@ protected virtual bool OnApply() } else { - m_aEC = InitializeEncConverter; - IsModified = false; + try + { + m_aEC = InitializeEncConverter; + } + catch (Exception ex) + { + var error = EncConverters.LogExceptionMessage("AutoConfigure", ex); + MessageBox.Show($"OnApply failed: {error}", EncConverters.cstrCaption); + } + + IsModified = false; // finally, if we're in 'edit mode' and the converter is already in the repository // then re-add it to save changes to the repository (i.e. make the default behavior @@ -442,26 +454,46 @@ protected virtual void AddConverterMapping() { // remove any existing converter by the name we're about to give it (probably not necessary). System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(FriendlyName)); - if (ShouldRemoveBeforeAdd) - m_aECs.Remove(FriendlyName); - // if it was originally under a different name... - if (!String.IsNullOrEmpty(m_strOriginalFriendlyName) && (m_strOriginalFriendlyName != FriendlyName)) - { - // ... remove that too (this one probably *is* necessary to remove old stuff) - m_aECs.Remove(m_strOriginalFriendlyName); - } + try + { + // TODO: this is causing problems, bkz any converter can be a step in a compound converter, + // and if you call Remove here, it removes it from any compound converter that references it. + // But is it really necessary to remove it if only the data changes and not the name... + // UPDATE: It appears that if we do AddConverterMappingSub and it already exists with a given name + // the entry will be updated, so we don't need this anyway + // UPDATE2: but if this is a compound converter, then it will append the steps to those already existing + // rather than replacing them, so we do need to remove the existing steps. But we can't do that + // without calling m_aECs.Remove, and we can't change the behavior of Remove or add a new way to do that, + // bkz when this is running in, for example, Paratext, it's using a version of the EncConverters core that + // it loaded and can't use a possible newer one that has this change (this causes 'method doesn't exist' + // kind of errors). + if (ShouldRemoveBeforeAdd) + m_aECs.Remove(FriendlyName); + + // if it was originally under a different name... (YES, in this case, we have to remove it) + if (!String.IsNullOrEmpty(m_strOriginalFriendlyName) && (m_strOriginalFriendlyName != FriendlyName)) + { + // ... remove that too (this one probably *is* necessary to remove old stuff) + m_aECs.Remove(m_strOriginalFriendlyName); + } - // have the sub-classes do their thing to add it - AddConverterMappingSub(); + // have the sub-classes do their thing to add it + AddConverterMappingSub(); - // if it worked, then ... - // ... indicate that now this converter is in the repository - IsInRepository = true; + // if it worked, then ... + // ... indicate that now this converter is in the repository + IsInRepository = true; - // and save the name so we can clear it out if need be later - m_strOriginalFriendlyName = FriendlyName; - } + // and save the name so we can clear it out if need be later + m_strOriginalFriendlyName = FriendlyName; + } + catch (Exception ex) + { + MessageBox.Show(String.Format("Couldn't add converter to repository! Reason: {0}", ex.Message), + EncConverters.cstrCaption); + } + } // allow subclasses to define whether we should remove records before adding them // (e.g. SpellFixer is already added, so we don't want to remove it or we'll clobber the @@ -771,7 +803,8 @@ protected void TestTabInputChanged() private void buttonTest_Click(object sender, EventArgs e) { Util.DebugWriteLine(this, "BEGIN"); - IEncConverter aEC = InitializeEncConverter; + ecTextBoxOutput.Text = String.Empty; // clear out any previous contents + IEncConverter aEC = InitializeEncConverter; if (aEC != null) { try diff --git a/src/EncCnvtrs/CmpdAutoConfigDialog.cs b/src/EncCnvtrs/CmpdAutoConfigDialog.cs index 42b24b7c..622df0d2 100755 --- a/src/EncCnvtrs/CmpdAutoConfigDialog.cs +++ b/src/EncCnvtrs/CmpdAutoConfigDialog.cs @@ -99,7 +99,8 @@ bool bIsInRepository } IsModified = false; - m_bAllStepsAreBidirectional = !EncConverters.IsUnidirectional(m_aEC.ConversionType); + if (m_aEC != null) + m_bAllStepsAreBidirectional = !EncConverters.IsUnidirectional(m_aEC.ConversionType); } } diff --git a/src/EncCnvtrs/EcTextBox.cs b/src/EncCnvtrs/EcTextBox.cs index 1e46a348..05554c1b 100755 --- a/src/EncCnvtrs/EcTextBox.cs +++ b/src/EncCnvtrs/EcTextBox.cs @@ -11,7 +11,6 @@ public EcTextBox() { Util.DebugWriteLine(this, "Default Font " + this.Font.Name + ", Size " + this.Font.Size.ToString()); - //this.Font = new System.Drawing.Font("Arial", 11); } protected override void OnPreviewKeyDown(System.Windows.Forms.PreviewKeyDownEventArgs e) @@ -20,7 +19,12 @@ protected override void OnPreviewKeyDown(System.Windows.Forms.PreviewKeyDownEven e.KeyValue, e.KeyCode, e.KeyData)); if (e.Alt && (e.KeyCode == System.Windows.Forms.Keys.X)) ConvertNumberToChar(false); - base.OnPreviewKeyDown(e); + + // don't know why, but the base.OnPreviewKeyDown doesn't do 'select all' + if (e.KeyData == (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A)) + SelectAll(); + else + base.OnPreviewKeyDown(e); } protected void ConvertNumberToChar(bool bIsLegacy) diff --git a/src/EncCnvtrs/EncCnvtrs 2010.csproj b/src/EncCnvtrs/EncCnvtrs 2010.csproj index e40a64fe..348d715a 100644 --- a/src/EncCnvtrs/EncCnvtrs 2010.csproj +++ b/src/EncCnvtrs/EncCnvtrs 2010.csproj @@ -135,14 +135,14 @@ - - ..\..\packages\Microsoft.Web.WebView2.1.0.1938.49\lib\net45\Microsoft.Web.WebView2.Core.dll + + ..\..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.Core.dll - - ..\..\packages\Microsoft.Web.WebView2.1.0.1938.49\lib\net45\Microsoft.Web.WebView2.WinForms.dll + + ..\..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.WinForms.dll - - ..\..\packages\Microsoft.Web.WebView2.1.0.1938.49\lib\net45\Microsoft.Web.WebView2.Wpf.dll + + ..\..\packages\Microsoft.Web.WebView2.1.0.2365.46\lib\net45\Microsoft.Web.WebView2.Wpf.dll ..\..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -222,6 +222,14 @@ + + Form + + + + + NetRegexAutoConfigDialog.cs + Code @@ -299,6 +307,9 @@ Designer FallbackAutoConfigDialog.cs + + NetRegexAutoConfigDialog.cs + ImplTypeList.cs Designer @@ -512,12 +523,12 @@ - + - + \ No newline at end of file diff --git a/src/EncCnvtrs/EncCnvtrs.resx b/src/EncCnvtrs/EncCnvtrs.resx index 4a9bb567..968e8a65 100755 --- a/src/EncCnvtrs/EncCnvtrs.resx +++ b/src/EncCnvtrs/EncCnvtrs.resx @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 637, 17 + + + 17, 17 + + + 341, 17 + + + 450, 17 + + + 68 + + \ No newline at end of file diff --git a/src/EncCnvtrs/NetRegexEncConverter.cs b/src/EncCnvtrs/NetRegexEncConverter.cs new file mode 100644 index 00000000..b9d70853 --- /dev/null +++ b/src/EncCnvtrs/NetRegexEncConverter.cs @@ -0,0 +1,195 @@ +// Created by Jim Kornelsen on Dec 6 2011 +// 28-Nov-11 JDK Wrap Perl expression and write in temp file, rather than requiring input file. +// +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using ECInterfaces; // for IEncConverter +using SilEncConverters40.Properties; + +namespace SilEncConverters40 +{ + /// + /// Managed Net Regex EncConverter + /// + public class NetRegexEncConverter : EncConverter + { + #region Const Definitions + public const string DisplayName = ".Net Regular Expression"; + public const string strHtmlFilename = "Net_Regular_Expression_Plug-in_About_box.htm"; + + public const string RegexDelimiter = "->"; + + public bool TransliteratorInitialized { get; set; } + + // the regular express definining the Converter identifier: + // {}->{}; + // e.g. + // {[aeiou]}->{V};1 + // (meaing: for convert latin vowels to 'V' and make it case insensitive. That is, 1 = RegexOption.IgnoreCase) + private static readonly Regex _reParseConverterIdentifier = new("{(.+)}->{(.*)};?(.*)"); + private Regex _reConverter; + private string _replaceWith; + + #endregion Const Definitions + + #region Initialization + /// + /// The class constructor. + public NetRegexEncConverter() + : base (typeof(NetRegexEncConverter).FullName, EncConverters.strTypeSILNetRegex) + { + } + + public override void Initialize( + string converterName, + string converterSpec, + ref string lhsEncodingID, + ref string rhsEncodingID, + ref ConvType conversionType, + ref Int32 processTypeFlags, + Int32 codePageInput, + Int32 codePageOutput, + bool bAdding) + { + Util.DebugWriteLine(this, "BEGIN"); + // let the base class have first stab at it + base.Initialize(converterName, converterSpec, ref lhsEncodingID, ref rhsEncodingID, + ref conversionType, ref processTypeFlags, codePageInput, codePageOutput, bAdding ); + + // this is the only conversion type this converter supports + m_eConversionType = conversionType = ConvType.Unicode_to_Unicode; + + // both sides are (supposed to be) Unicode + if (String.IsNullOrEmpty(lhsEncodingID)) + lhsEncodingID = m_strLhsEncodingID = EncConverters.strDefUnicodeEncoding; + if (String.IsNullOrEmpty(rhsEncodingID)) + rhsEncodingID = m_strRhsEncodingID = EncConverters.strDefUnicodeEncoding; + + // not really an "ICU" regular expression, but the UI now just + // shows this as 'Regular Expression' and it applies to this and the ICU one. + processTypeFlags |= (int)ProcessTypeFlags.ICURegularExpression; + + TransliteratorInitialized = false; // so it has to be reinitialized (But only once) + + Util.DebugWriteLine(this, "END"); + } + #endregion Initialization + + #region Misc helpers + protected override EncodingForm DefaultUnicodeEncForm(bool bForward, bool bLHS) + { + return EncodingForm.UTF16; + } + + internal static bool ParseConverterIdentifier(string strConverterSpec, + out string strFindWhat, out string strReplaceWith, out RegexOptions options) + { + var match = _reParseConverterIdentifier.Match(strConverterSpec); + if (match.Success) + { + var strOptions = match.Groups[3].Value; + if (String.IsNullOrEmpty(strOptions)) + { + options = RegexOptions.None; + } + else + { + options = (RegexOptions)int.Parse(strOptions); + } + + strFindWhat = match.Groups[1].Value; + strReplaceWith = match.Groups[2].Value; + + return true; + } + else + { + options = RegexOptions.None; + strFindWhat = strReplaceWith = null; + return false; + } + } + + protected unsafe void Load(string converterIdentifier) + { + Util.DebugWriteLine(this, "BEGIN"); + + if (TransliteratorInitialized) + return; + + if (!ParseConverterIdentifier(converterIdentifier, out string findWhat, out string replaceWith, out RegexOptions options)) + { + throw new ApplicationException($"{DisplayName} not properly configured! converterName: {converterIdentifier} (should be in the format {{}}->{{}};)"); + } + + _replaceWith = replaceWith; + _reConverter = new Regex(findWhat, options | RegexOptions.Compiled); + + TransliteratorInitialized = true; // so we don't to do this with each call to Convert + + Util.DebugWriteLine(this, "END"); + } + + #endregion Misc helpers + + #region Abstract Base Class Overrides + protected override void PreConvert + ( + EncodingForm eInEncodingForm, + ref EncodingForm eInFormEngine, + EncodingForm eOutEncodingForm, + ref EncodingForm eOutFormEngine, + ref NormalizeFlags eNormalizeOutput, + bool bForward + ) + { + // let the base class do it's thing first + base.PreConvert( eInEncodingForm, ref eInFormEngine, + eOutEncodingForm, ref eOutFormEngine, + ref eNormalizeOutput, bForward); + + // do the load at this point. + Load(ConverterIdentifier); + } + + protected override unsafe void DoConvert + ( + byte* lpInBuffer, + int nInLen, + byte* lpOutBuffer, + ref int rnOutLen + ) + { + // we need to put it *back* into a string for the conversion + byte[] baIn = new byte[nInLen]; + ECNormalizeData.ByteStarToByteArr(lpInBuffer, nInLen, baIn); + char[] caIn = Encoding.Unicode.GetChars(baIn); + + // here's our input string + var strInput = new string(caIn); + + var strOutput = _reConverter.Replace(strInput, _replaceWith); + + StringToProperByteStar(strOutput, lpOutBuffer, ref rnOutLen); + } + + protected override string GetConfigTypeName + { + get { return typeof(NetRegexEncConverterConfig).AssemblyQualifiedName; } + } + + [CLSCompliant(false)] + private static unsafe void StringToProperByteStar(string strOutput, byte* lpOutBuffer, ref int rnOutLen) + { + int nLen = strOutput.Length * 2; + if (nLen > (int)rnOutLen) + EncConverters.ThrowError(ErrStatus.OutputBufferFull); + rnOutLen = nLen; + ECNormalizeData.StringToByteStar(strOutput, lpOutBuffer, rnOutLen, false); + } + #endregion Abstract Base Class Overrides + } +} diff --git a/src/EncCnvtrs/NetRegexEncConverterConfig.cs b/src/EncCnvtrs/NetRegexEncConverterConfig.cs new file mode 100644 index 00000000..2157b470 --- /dev/null +++ b/src/EncCnvtrs/NetRegexEncConverterConfig.cs @@ -0,0 +1,61 @@ +// Created by Jim Kornelsen on Dec 6 2011 +// +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; // for the class attributes +using ECInterfaces; // for IEncConverter + +namespace SilEncConverters40 +{ + public class NetRegexEncConverterConfig : EncConverterConfig + { + public NetRegexEncConverterConfig() + : base + ( + typeof(NetRegexEncConverter).FullName, + NetRegexEncConverter.DisplayName, + NetRegexEncConverter.strHtmlFilename, + ProcessTypeFlags.ICURegularExpression + ) + { + } + + public override bool Configure + ( + IEncConverters aECs, + string strFriendlyName, + ConvType eConversionType, + string strLhsEncodingID, + string strRhsEncodingID + ) + { + var form = new NetRegexAutoConfigDialog ( + aECs, m_strDisplayName, m_strFriendlyName, + m_strConverterID, m_eConversionType, + BestGuessEncoding(m_strLhsEncodingID, strLhsEncodingID, EncConverters.strDefUnicodeEncoding), + BestGuessEncoding(m_strRhsEncodingID, strRhsEncodingID, EncConverters.strDefUnicodeEncoding), + m_lProcessType, m_bIsInRepository); + + return Configure(form); + } + + public override void DisplayTestPage + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + InitializeFromThis(ref strFriendlyName, ref strConverterIdentifier, + ref eConversionType, ref strTestData); + + NetRegexAutoConfigDialog form = new NetRegexAutoConfigDialog(aECs, strFriendlyName, + strConverterIdentifier, eConversionType, strTestData); + + base.DisplayTestPage(form); + } + } +} diff --git a/src/EncCnvtrs/Properties/Resources.Designer.cs b/src/EncCnvtrs/Properties/Resources.Designer.cs index 7cc635f6..03b87d3f 100755 --- a/src/EncCnvtrs/Properties/Resources.Designer.cs +++ b/src/EncCnvtrs/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace SilEncConverters40.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -132,6 +132,15 @@ internal static string ConvTypeReturnsHelpString { } } + /// + /// Looks up a localized string similar to https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference. + /// + internal static string NetRegexQuickReferenceLink { + get { + return ResourceManager.GetString("NetRegexQuickReferenceLink", resourceCulture); + } + } + /// /// Looks up a localized string similar to ///This box displays the result of the conversion using the selected converter given some data diff --git a/src/EncCnvtrs/Properties/Resources.resx b/src/EncCnvtrs/Properties/Resources.resx index 9e7ed259..d5a4e0d6 100755 --- a/src/EncCnvtrs/Properties/Resources.resx +++ b/src/EncCnvtrs/Properties/Resources.resx @@ -164,6 +164,9 @@ Choose the encoding type for the output of the table/map: either Unicode or Lega For example, if this is an Unicode encoding converter, then the output will be Unicode encoding. + + https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference + This box displays the result of the conversion using the selected converter given some data diff --git a/src/EncCnvtrs/Properties/Settings.Designer.cs b/src/EncCnvtrs/Properties/Settings.Designer.cs index 37d98313..445aa4b4 100644 --- a/src/EncCnvtrs/Properties/Settings.Designer.cs +++ b/src/EncCnvtrs/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SilEncConverters40.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -22,5 +22,22 @@ public static Settings Default { return defaultInstance; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute(@" + + {[aeiou]}->{V};1 + {[^aeiou]}->{C};1 + {[\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]}->{}; +")] + public global::System.Collections.Specialized.StringCollection RecentRegExpressions { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["RecentRegExpressions"])); + } + set { + this["RecentRegExpressions"] = value; + } + } } } diff --git a/src/EncCnvtrs/Properties/Settings.settings b/src/EncCnvtrs/Properties/Settings.settings index 8e615f25..daec514a 100644 --- a/src/EncCnvtrs/Properties/Settings.settings +++ b/src/EncCnvtrs/Properties/Settings.settings @@ -1,5 +1,14 @@  - + - + + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string>{[aeiou]}-&gt;{V};1</string> + <string>{[^aeiou]}-&gt;{C};1</string> + <string>{[\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]}-&gt;{};</string> +</ArrayOfString> + + \ No newline at end of file diff --git a/src/EncCnvtrs/SelectConverter.cs b/src/EncCnvtrs/SelectConverter.cs index 9d7ccd18..ae7d7ba5 100755 --- a/src/EncCnvtrs/SelectConverter.cs +++ b/src/EncCnvtrs/SelectConverter.cs @@ -39,9 +39,9 @@ public class SelectConverter : System.Windows.Forms.Form static private string strInstallerPathKey = "InstallerPath"; private System.Windows.Forms.Button buttonCreateNew; private System.Windows.Forms.ContextMenuStrip contextMenu; - private System.Windows.Forms.ToolStripItem menuItemEdit; - private System.Windows.Forms.ToolStripItem menuItemDelete; - private System.Windows.Forms.ListBox listBoxExistingConverters; + private ToolStripMenuItem menuItemEdit; + private ToolStripMenuItem menuItemDelete; + private System.Windows.Forms.ListBox listBoxExistingConverters; private TableLayoutPanel tableLayoutPanel1; private CheckBox checkBoxShowTooltips; private HelpProvider helpProvider; @@ -54,8 +54,8 @@ public class SelectConverter : System.Windows.Forms.Form private TextBox textBoxDataPreview; protected byte[] m_byPreviewData = null; - private ToolStripItem menuItemTest; - protected internal ContextMenuStrip contextMenuStripPreview; + private ToolStripMenuItem menuItemTest; + protected internal ContextMenuStrip contextMenuStripPreview; private ToolStripMenuItem changeFontToolStripMenuItem; private ToolStripSeparator toolStripSeparator1; private ToolStripMenuItem copyToolStripMenuItem; @@ -66,7 +66,8 @@ public class SelectConverter : System.Windows.Forms.Form protected internal FontDialog fontDialog; protected string m_strPreviewData = null; private Timer timerTooltip; - protected string m_strFontName = null; + private ToolStripMenuItem menuItemRefresh; + protected string m_strFontName = null; public SelectConverter(EncConverters aECs, ConvType eConversionTypeFilter, string strChooseConverterDialogTitle, byte[] abyPreviewData, string strFontName) @@ -287,7 +288,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - Util.DebugWriteLine(this, "BEGIN"); this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SelectConverter)); this.labelInstruction = new System.Windows.Forms.Label(); @@ -310,7 +310,7 @@ private void InitializeComponent() this.flowLayoutPanelCodePage = new System.Windows.Forms.FlowLayoutPanel(); this.labelCodePageInput = new System.Windows.Forms.Label(); this.labelCodePageOutput = new System.Windows.Forms.Label(); - this.contextMenu = new System.Windows.Forms.ContextMenuStrip(); + this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuItemEdit = new System.Windows.Forms.ToolStripMenuItem(); this.menuItemTest = new System.Windows.Forms.ToolStripMenuItem(); this.menuItemDelete = new System.Windows.Forms.ToolStripMenuItem(); @@ -328,14 +328,16 @@ private void InitializeComponent() this.helpProvider = new System.Windows.Forms.HelpProvider(); this.fontDialog = new System.Windows.Forms.FontDialog(); this.timerTooltip = new System.Windows.Forms.Timer(this.components); + this.menuItemRefresh = new System.Windows.Forms.ToolStripMenuItem(); this.groupBoxOptions.SuspendLayout(); this.flowLayoutPanelCodePage.SuspendLayout(); + this.contextMenu.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); this.contextMenuStripPreview.SuspendLayout(); this.SuspendLayout(); - // + // // labelInstruction - // + // this.labelInstruction.Anchor = System.Windows.Forms.AnchorStyles.Left; this.tableLayoutPanel1.SetColumnSpan(this.labelInstruction, 4); this.labelInstruction.Location = new System.Drawing.Point(3, 0); @@ -343,14 +345,14 @@ private void InitializeComponent() this.labelInstruction.Size = new System.Drawing.Size(439, 23); this.labelInstruction.TabIndex = 0; this.labelInstruction.Text = "Choose an existing converter from the list below or click Add New to add a new on" + - "e:"; + "e:"; this.labelInstruction.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // + // // buttonCancel - // + // this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel the selection of a converter and return to the callin" + - "g program"); + "g program"); this.buttonCancel.Location = new System.Drawing.Point(448, 364); this.buttonCancel.Name = "buttonCancel"; this.helpProvider.SetShowHelp(this.buttonCancel, true); @@ -359,12 +361,12 @@ private void InitializeComponent() this.buttonCancel.Text = "&Cancel"; this.toolTips.SetToolTip(this.buttonCancel, "Cancel selection"); this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // + // // buttonOK - // + // this.buttonOK.Enabled = false; this.helpProvider.SetHelpString(this.buttonOK, "Click this button to choose the selected converter and return to the calling prog" + - "ram"); + "ram"); this.buttonOK.Location = new System.Drawing.Point(367, 364); this.buttonOK.Name = "buttonOK"; this.helpProvider.SetShowHelp(this.buttonOK, true); @@ -373,16 +375,16 @@ private void InitializeComponent() this.buttonOK.Text = "&OK"; this.toolTips.SetToolTip(this.buttonOK, "Click here to choose the selected converter"); this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click); - // + // // toolTips - // + // this.toolTips.AutomaticDelay = 50; this.toolTips.AutoPopDelay = 30000; this.toolTips.InitialDelay = 1000; this.toolTips.ReshowDelay = 500; - // + // // checkBoxReverse - // + // this.checkBoxReverse.Enabled = false; this.helpProvider.SetHelpString(this.checkBoxReverse, "Check this option if the reverse conversion is to be performed"); this.checkBoxReverse.Location = new System.Drawing.Point(26, 24); @@ -393,11 +395,11 @@ private void InitializeComponent() this.checkBoxReverse.Text = "&Reverse direction (for bidirectional converters)"; this.toolTips.SetToolTip(this.checkBoxReverse, "Convert in the reverse direction"); this.checkBoxReverse.CheckedChanged += new System.EventHandler(this.checkBoxReverse_CheckedChanged); - // + // // labelNormalizationType - // - this.labelNormalizationType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + // + this.labelNormalizationType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.labelNormalizationType.Enabled = false; this.labelNormalizationType.Location = new System.Drawing.Point(210, 24); this.labelNormalizationType.Name = "labelNormalizationType"; @@ -405,12 +407,12 @@ private void InitializeComponent() this.labelNormalizationType.TabIndex = 4; this.labelNormalizationType.Text = "Normalize Output:"; this.toolTips.SetToolTip(this.labelNormalizationType, "Controls the normalization of the converted data."); - // + // // checkBoxDebug - // + // this.checkBoxDebug.Enabled = false; this.helpProvider.SetHelpString(this.checkBoxDebug, "This option allows you to troubleshoot the selected converter with respect to the" + - " data being send to and received from the underlying conversion engine"); + " data being send to and received from the underlying conversion engine"); this.checkBoxDebug.Location = new System.Drawing.Point(26, 58); this.checkBoxDebug.Name = "checkBoxDebug"; this.helpProvider.SetShowHelp(this.checkBoxDebug, true); @@ -418,11 +420,11 @@ private void InitializeComponent() this.checkBoxDebug.TabIndex = 5; this.checkBoxDebug.Text = "&Debug"; this.toolTips.SetToolTip(this.checkBoxDebug, "Show debug information during conversion"); - // + // // buttonCreateNew - // + // this.helpProvider.SetHelpString(this.buttonCreateNew, "Click this button to add a new converter to the list (including existing map file" + - "s)"); + "s)"); this.buttonCreateNew.Location = new System.Drawing.Point(3, 364); this.buttonCreateNew.Name = "buttonCreateNew"; this.helpProvider.SetShowHelp(this.buttonCreateNew, true); @@ -431,14 +433,14 @@ private void InitializeComponent() this.buttonCreateNew.Text = "&Add New"; this.toolTips.SetToolTip(this.buttonCreateNew, "Add a new converter to the list (including existing map files)"); this.buttonCreateNew.Click += new System.EventHandler(this.buttonCreateNew_Click); - // + // // radioButtonFullyComposed - // - this.radioButtonFullyComposed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + // + this.radioButtonFullyComposed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.radioButtonFullyComposed.Enabled = false; this.helpProvider.SetHelpString(this.radioButtonFullyComposed, "The output of the conversion is returned to the client application in Unicode Nor" + - "malization Form \'Fully Composed\'"); + "malization Form \'Fully Composed\'"); this.radioButtonFullyComposed.Location = new System.Drawing.Point(226, 88); this.radioButtonFullyComposed.Name = "radioButtonFullyComposed"; this.helpProvider.SetShowHelp(this.radioButtonFullyComposed, true); @@ -446,15 +448,15 @@ private void InitializeComponent() this.radioButtonFullyComposed.TabIndex = 3; this.radioButtonFullyComposed.Text = "Fully Co&mposed"; this.toolTips.SetToolTip(this.radioButtonFullyComposed, "Output of the conversion is returned in Unicode Normalization Form \'Fully Compose" + - "d\'"); - // + "d\'"); + // // radioButtonFullyDecomposed - // - this.radioButtonFullyDecomposed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + // + this.radioButtonFullyDecomposed.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.radioButtonFullyDecomposed.Enabled = false; this.helpProvider.SetHelpString(this.radioButtonFullyDecomposed, "The output of the conversion is returned to the client application in Unicode Nor" + - "malization Form \'Fully Decomposed\'"); + "malization Form \'Fully Decomposed\'"); this.radioButtonFullyDecomposed.Location = new System.Drawing.Point(226, 64); this.radioButtonFullyDecomposed.Name = "radioButtonFullyDecomposed"; this.helpProvider.SetShowHelp(this.radioButtonFullyDecomposed, true); @@ -462,15 +464,15 @@ private void InitializeComponent() this.radioButtonFullyDecomposed.TabIndex = 2; this.radioButtonFullyDecomposed.Text = "&Fully Decomposed"; this.toolTips.SetToolTip(this.radioButtonFullyDecomposed, "Return data in Unicode Normalization Form \'Fully Decomposed\'"); - // + // // radioButtonNone - // - this.radioButtonNone.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + // + this.radioButtonNone.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.radioButtonNone.Checked = true; this.radioButtonNone.Enabled = false; this.helpProvider.SetHelpString(this.radioButtonNone, "The output of the conversion is returned to the client application without change" + - ""); + ""); this.radioButtonNone.Location = new System.Drawing.Point(226, 40); this.radioButtonNone.Name = "radioButtonNone"; this.helpProvider.SetShowHelp(this.radioButtonNone, true); @@ -479,9 +481,9 @@ private void InitializeComponent() this.radioButtonNone.TabStop = true; this.radioButtonNone.Text = "&None"; this.toolTips.SetToolTip(this.radioButtonNone, "Output of the conversion is returned without change"); - // + // // buttonLaunchOptionsInstaller - // + // this.helpProvider.SetHelpString(this.buttonLaunchOptionsInstaller, "Click this button to launch the Converter Options Installer"); this.buttonLaunchOptionsInstaller.Location = new System.Drawing.Point(165, 364); this.buttonLaunchOptionsInstaller.Name = "buttonLaunchOptionsInstaller"; @@ -492,9 +494,9 @@ private void InitializeComponent() this.toolTips.SetToolTip(this.buttonLaunchOptionsInstaller, "Launch the Converter Options Installer"); this.buttonLaunchOptionsInstaller.Visible = false; this.buttonLaunchOptionsInstaller.Click += new System.EventHandler(this.buttonLaunchOptionsInstaller_Click); - // + // // checkBoxShowTooltips - // + // this.checkBoxShowTooltips.AutoSize = true; this.checkBoxShowTooltips.Checked = true; this.checkBoxShowTooltips.CheckState = System.Windows.Forms.CheckState.Checked; @@ -508,36 +510,36 @@ private void InitializeComponent() this.toolTips.SetToolTip(this.checkBoxShowTooltips, "Show ToolTips when checked"); this.checkBoxShowTooltips.UseVisualStyleBackColor = true; this.checkBoxShowTooltips.CheckedChanged += new System.EventHandler(this.checkBoxShowTooltips_CheckedChanged); - // + // // textBoxCodePageInput - // + // this.textBoxCodePageInput.Location = new System.Drawing.Point(3, 16); this.textBoxCodePageInput.Name = "textBoxCodePageInput"; this.textBoxCodePageInput.Size = new System.Drawing.Size(80, 20); this.textBoxCodePageInput.TabIndex = 7; this.toolTips.SetToolTip(this.textBoxCodePageInput, "this field shows the code page used for the legacy data that is the input to the " + - "conversion. Typical values are \'0\' (default system code page), \'42\' (symbol font" + - "s), \'1252\' (English operating systems)"); + "conversion. Typical values are \'0\' (default system code page), \'42\' (symbol font" + + "s), \'1252\' (English operating systems)"); this.textBoxCodePageInput.Visible = false; this.textBoxCodePageInput.TextChanged += new System.EventHandler(this.textBoxCodePageInput_TextChanged); - // + // // textBoxCodePageOutput - // + // this.textBoxCodePageOutput.Location = new System.Drawing.Point(3, 55); this.textBoxCodePageOutput.Name = "textBoxCodePageOutput"; this.textBoxCodePageOutput.Size = new System.Drawing.Size(80, 20); this.textBoxCodePageOutput.TabIndex = 7; this.toolTips.SetToolTip(this.textBoxCodePageOutput, "this field shows the code page used for the legacy data that is the output of the" + - " conversion. Typical values are \'0\' (default system code page), \'42\' (symbol fon" + - "ts), \'1252\' (English operating systems)"); + " conversion. Typical values are \'0\' (default system code page), \'42\' (symbol fon" + + "ts), \'1252\' (English operating systems)"); this.textBoxCodePageOutput.Visible = false; this.textBoxCodePageOutput.TextChanged += new System.EventHandler(this.textBoxCodePageOutput_TextChanged); - // + // // buttonPreview - // + // this.buttonPreview.Enabled = false; this.helpProvider.SetHelpString(this.buttonPreview, "Click this button to open a preview window showing the result of the conversion w" + - "ith the selected converter."); + "ith the selected converter."); this.buttonPreview.Location = new System.Drawing.Point(84, 364); this.buttonPreview.Name = "buttonPreview"; this.helpProvider.SetShowHelp(this.buttonPreview, true); @@ -545,12 +547,12 @@ private void InitializeComponent() this.buttonPreview.TabIndex = 11; this.buttonPreview.Text = "&Preview >>"; this.toolTips.SetToolTip(this.buttonPreview, "Click this button to see a preview pane below (not supported by all client progra" + - "ms)"); + "ms)"); this.buttonPreview.UseVisualStyleBackColor = true; this.buttonPreview.Click += new System.EventHandler(this.buttonPreview_Click); - // + // // groupBoxOptions - // + // this.tableLayoutPanel1.SetColumnSpan(this.groupBoxOptions, 5); this.groupBoxOptions.Controls.Add(this.flowLayoutPanelCodePage); this.groupBoxOptions.Controls.Add(this.checkBoxDebug); @@ -566,9 +568,9 @@ private void InitializeComponent() this.groupBoxOptions.TabIndex = 6; this.groupBoxOptions.TabStop = false; this.groupBoxOptions.Text = "Conversion Options"; - // + // // flowLayoutPanelCodePage - // + // this.flowLayoutPanelCodePage.Controls.Add(this.labelCodePageInput); this.flowLayoutPanelCodePage.Controls.Add(this.textBoxCodePageInput); this.flowLayoutPanelCodePage.Controls.Add(this.labelCodePageOutput); @@ -578,9 +580,9 @@ private void InitializeComponent() this.flowLayoutPanelCodePage.Name = "flowLayoutPanelCodePage"; this.flowLayoutPanelCodePage.Size = new System.Drawing.Size(131, 100); this.flowLayoutPanelCodePage.TabIndex = 8; - // + // // labelCodePageInput - // + // this.labelCodePageInput.AutoSize = true; this.labelCodePageInput.Location = new System.Drawing.Point(3, 0); this.labelCodePageInput.Name = "labelCodePageInput"; @@ -588,9 +590,9 @@ private void InitializeComponent() this.labelCodePageInput.TabIndex = 6; this.labelCodePageInput.Text = "&Input Code Page"; this.labelCodePageInput.Visible = false; - // + // // labelCodePageOutput - // + // this.labelCodePageOutput.AutoSize = true; this.labelCodePageOutput.Location = new System.Drawing.Point(3, 39); this.labelCodePageOutput.Name = "labelCodePageOutput"; @@ -598,50 +600,59 @@ private void InitializeComponent() this.labelCodePageOutput.TabIndex = 6; this.labelCodePageOutput.Text = "Output Code Pa&ge"; this.labelCodePageOutput.Visible = false; - // + // // contextMenu - // + // this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuItemEdit, this.menuItemTest, - this.menuItemDelete}); - // + this.menuItemDelete, + this.menuItemRefresh}); + this.contextMenu.Name = "contextMenu"; + this.contextMenu.Size = new System.Drawing.Size(181, 114); + // // menuItemEdit - // + // + this.menuItemEdit.Name = "menuItemEdit"; + this.menuItemEdit.Size = new System.Drawing.Size(180, 22); this.menuItemEdit.Text = "&Edit"; this.menuItemEdit.Click += new System.EventHandler(this.menuItemEdit_Click); - // + // // menuItemTest - // + // + this.menuItemTest.Name = "menuItemTest"; + this.menuItemTest.Size = new System.Drawing.Size(180, 22); this.menuItemTest.Text = "&Test"; this.menuItemTest.Click += new System.EventHandler(this.menuItemTest_Click); - // + // // menuItemDelete - // + // + this.menuItemDelete.Name = "menuItemDelete"; + this.menuItemDelete.Size = new System.Drawing.Size(180, 22); this.menuItemDelete.Text = "&Delete"; this.menuItemDelete.Click += new System.EventHandler(this.menuItemDelete_Click); - // + // // listBoxExistingConverters - // + // this.tableLayoutPanel1.SetColumnSpan(this.listBoxExistingConverters, 5); this.listBoxExistingConverters.Dock = System.Windows.Forms.DockStyle.Fill; this.helpProvider.SetHelpString(this.listBoxExistingConverters, "This list shows all of the converters currently in the system repository"); this.listBoxExistingConverters.Location = new System.Drawing.Point(3, 26); this.listBoxExistingConverters.Name = "listBoxExistingConverters"; this.helpProvider.SetShowHelp(this.listBoxExistingConverters, true); - this.listBoxExistingConverters.Size = new System.Drawing.Size(542, 186); + this.listBoxExistingConverters.Size = new System.Drawing.Size(542, 198); this.listBoxExistingConverters.Sorted = true; this.listBoxExistingConverters.TabIndex = 9; - this.listBoxExistingConverters.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listBoxExistingConverters_MouseUp); this.listBoxExistingConverters.SelectedIndexChanged += new System.EventHandler(this.listBoxExistingConverters_SelectedIndexChanged); this.listBoxExistingConverters.DoubleClick += new System.EventHandler(this.listBoxExistingConverters_DoubleClick); this.listBoxExistingConverters.MouseMove += new System.Windows.Forms.MouseEventHandler(this.listBoxExistingConverters_MouseMove); - // + this.listBoxExistingConverters.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listBoxExistingConverters_MouseUp); + // // tableLayoutPanel1 - // - this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.tableLayoutPanel1.ColumnCount = 5; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 81F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); @@ -668,9 +679,9 @@ private void InitializeComponent() this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); this.tableLayoutPanel1.Size = new System.Drawing.Size(548, 478); this.tableLayoutPanel1.TabIndex = 10; - // + // // textBoxDataPreview - // + // this.tableLayoutPanel1.SetColumnSpan(this.textBoxDataPreview, 5); this.textBoxDataPreview.ContextMenuStrip = this.contextMenuStripPreview; this.textBoxDataPreview.Dock = System.Windows.Forms.DockStyle.Fill; @@ -682,9 +693,9 @@ private void InitializeComponent() this.textBoxDataPreview.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.textBoxDataPreview.Size = new System.Drawing.Size(542, 82); this.textBoxDataPreview.TabIndex = 12; - // + // // contextMenuStripPreview - // + // this.contextMenuStripPreview.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.changeFontToolStripMenuItem, this.toolStripSeparator1, @@ -694,65 +705,72 @@ private void InitializeComponent() this.toolStripSeparator3, this.right2LeftToolStripMenuItem}); this.contextMenuStripPreview.Name = "contextMenuStrip"; - this.contextMenuStripPreview.Size = new System.Drawing.Size(200, 110); - // + this.contextMenuStripPreview.Size = new System.Drawing.Size(211, 110); + // // changeFontToolStripMenuItem - // + // this.changeFontToolStripMenuItem.Name = "changeFontToolStripMenuItem"; - this.changeFontToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.changeFontToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.changeFontToolStripMenuItem.Text = "Change &Font"; this.changeFontToolStripMenuItem.ToolTipText = "Click here to change the display font for this text box"; this.changeFontToolStripMenuItem.Click += new System.EventHandler(this.changeFontToolStripMenuItem_Click); - // + // // toolStripSeparator1 - // + // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(196, 6); - // + this.toolStripSeparator1.Size = new System.Drawing.Size(207, 6); + // // copyToolStripMenuItem - // + // this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; - this.copyToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.copyToolStripMenuItem.Text = "Copy"; this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); - // + // // toolStripSeparator2 - // + // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(196, 6); - // + this.toolStripSeparator2.Size = new System.Drawing.Size(207, 6); + // // selectAllToolStripMenuItem - // + // this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; - this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.selectAllToolStripMenuItem.Text = "Select All"; this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); - // + // // toolStripSeparator3 - // + // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(196, 6); - // + this.toolStripSeparator3.Size = new System.Drawing.Size(207, 6); + // // right2LeftToolStripMenuItem - // + // this.right2LeftToolStripMenuItem.CheckOnClick = true; this.right2LeftToolStripMenuItem.Name = "right2LeftToolStripMenuItem"; - this.right2LeftToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.right2LeftToolStripMenuItem.Size = new System.Drawing.Size(210, 22); this.right2LeftToolStripMenuItem.Text = "&Right to left reading order"; this.right2LeftToolStripMenuItem.Click += new System.EventHandler(this.right2LeftToolStripMenuItem_Click); - // + // // fontDialog - // + // this.fontDialog.AllowScriptChange = false; this.fontDialog.ShowColor = true; - // + // // timerTooltip - // + // this.timerTooltip.Interval = 500; this.timerTooltip.Tick += new System.EventHandler(this.timerTooltip_Tick); - // + // + // menuItemRefresh + // + this.menuItemRefresh.Name = "menuItemRefresh"; + this.menuItemRefresh.Size = new System.Drawing.Size(180, 22); + this.menuItemRefresh.Text = "&Refresh List"; + this.menuItemRefresh.Click += new System.EventHandler(this.menuItemRefresh_Click); + // // SelectConverter - // + // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(572, 502); this.Controls.Add(this.tableLayoutPanel1); @@ -766,12 +784,12 @@ private void InitializeComponent() this.groupBoxOptions.ResumeLayout(false); this.flowLayoutPanelCodePage.ResumeLayout(false); this.flowLayoutPanelCodePage.PerformLayout(); + this.contextMenu.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.PerformLayout(); this.contextMenuStripPreview.ResumeLayout(false); this.ResumeLayout(false); - Util.DebugWriteLine(this, "END"); } #endregion @@ -1070,7 +1088,13 @@ private void menuItemDelete_Click(object sender, System.EventArgs e) } } - private void listBoxExistingConverters_SelectedIndexChanged(object sender, EventArgs e) + private void menuItemRefresh_Click(object sender, EventArgs e) + { + DirectableEncConverter.EncConverters.Reinitialize(); + InitializeConverterList(); + } + + private void listBoxExistingConverters_SelectedIndexChanged(object sender, EventArgs e) { RevaluateButtonState(); } @@ -1338,5 +1362,5 @@ private void right2LeftToolStripMenuItem_Click(object sender, EventArgs e) ToolStripMenuItem aMenuItem = (ToolStripMenuItem)sender; textBoxDataPreview.RightToLeft = (aMenuItem.Checked) ? RightToLeft.Yes : RightToLeft.No; } - } + } } diff --git a/src/EncCnvtrs/SelectConverter.resx b/src/EncCnvtrs/SelectConverter.resx index 90875326..f5d1cf33 100755 --- a/src/EncCnvtrs/SelectConverter.resx +++ b/src/EncCnvtrs/SelectConverter.resx @@ -112,30 +112,33 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 222, 17 - + 17, 17 - + + 107, 17 + + 335, 17 - - 107, 17 + + 222, 17 - + 473, 17 - + 575, 17 - + AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC diff --git a/src/EncCnvtrs/TecEncConverter.cs b/src/EncCnvtrs/TecEncConverter.cs index 60696342..030e1d9d 100755 --- a/src/EncCnvtrs/TecEncConverter.cs +++ b/src/EncCnvtrs/TecEncConverter.cs @@ -458,7 +458,7 @@ static unsafe void DisplayCompilerError(byte* pszName, byte* msg, byte* param, U strCaption += "' converter"; if( MessageBox.Show(str, strCaption, MessageBoxButtons.OKCancel,MessageBoxIcon.Exclamation) == DialogResult.Cancel ) - EncConverters.ThrowError(ErrStatus.CompilationFailed); + EncConverters.ThrowError(ErrStatus.CompilationFailed, str); } protected unsafe void CompileMap(string strFilename, ref string strCompiledFilename) diff --git a/src/EncCnvtrs/WebBrowserGecko.cs b/src/EncCnvtrs/WebBrowserGecko.cs index b3242206..da9b11ff 100644 --- a/src/EncCnvtrs/WebBrowserGecko.cs +++ b/src/EncCnvtrs/WebBrowserGecko.cs @@ -95,12 +95,11 @@ public async override Task ExecuteScriptFunctionAsync(string functionNam public override Task NavigateAsync(string filePath) { - if (!File.Exists(filePath)) + if (!filePath.StartsWith("http") && !File.Exists(filePath)) { const string cstrFileNameToEditSaveAsHtml = "CantReadMhtFiles.htm"; filePath = Path.Combine(Path.GetDirectoryName(filePath), cstrFileNameToEditSaveAsHtml); - System.Diagnostics.Debug.Assert(File.Exists(filePath)); } // GeckoWebBrowser.Navigate("file://" + filePath); diff --git a/src/EncCnvtrs/app.config b/src/EncCnvtrs/app.config index b7b7ec13..cc933720 100755 --- a/src/EncCnvtrs/app.config +++ b/src/EncCnvtrs/app.config @@ -1,7 +1,10 @@ - + +
+ + @@ -13,4 +16,17 @@ + + + + + + {[aeiou]}->{V};1 + {[^aeiou]}->{C};1 + {[\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]}->{}; + + + + + diff --git a/src/EncCnvtrs/packages.config b/src/EncCnvtrs/packages.config index 05f6c98c..f6181196 100644 --- a/src/EncCnvtrs/packages.config +++ b/src/EncCnvtrs/packages.config @@ -4,6 +4,6 @@ - + \ No newline at end of file diff --git a/src/IcuEC/IcuTranslitAutoConfigDialog.cs b/src/IcuEC/IcuTranslitAutoConfigDialog.cs index 43844f9f..52e58c59 100755 --- a/src/IcuEC/IcuTranslitAutoConfigDialog.cs +++ b/src/IcuEC/IcuTranslitAutoConfigDialog.cs @@ -11,6 +11,7 @@ using System.IO; using ECInterfaces; using IcuEC.Properties; +using System.Linq; // for IEncConverter @@ -71,7 +72,7 @@ static extern string CppGetDisplayName_Linux( private ComboBox comboBoxPreviousCustomTransliterators; private Label label1; private Button buttonDeletePreviousCustomTransliterators; // set at the end of Initialize (to block certain events until we're ready for them) - private List lstTranslitIDs; + private Dictionary mapTransliteratorIdsToFriendlyNames; public IcuTranslitAutoConfigDialog( IEncConverters aECs, @@ -86,7 +87,6 @@ public IcuTranslitAutoConfigDialog( { Util.DebugWriteLine(this, "BEGIN"); InitializeComponent(); - fillListBox(); Util.DebugWriteLine(this, "Initialized component."); base.Initialize( aECs, @@ -101,20 +101,29 @@ public IcuTranslitAutoConfigDialog( bIsInRepository); Util.DebugWriteLine(this, "Initialized base."); - // if we're editing, then set the Converter Spec and say it's unmodified - if (m_bEditMode) + mapTransliteratorIdsToFriendlyNames = GetSupportedTransliterators(); + FillListBox(mapTransliteratorIdsToFriendlyNames); + + // if we're editing, then set the Converter Spec and say it's unmodified + if (m_bEditMode) { Util.DebugWriteLine(this, "Edit mode"); System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(ConverterIdentifier)); - //listBoxTranslitName.SelectedValue = ConverterIdentifier; - for (int i = 0; i < lstTranslitIDs.Count; i++) - { - if (lstTranslitIDs[i] == ConverterIdentifier) - { - listBoxTranslitName.SelectedIndex = i; - break; - } - } + + // first see if the converter identifier is one of the values in the text box + var value = mapTransliteratorIdsToFriendlyNames.FirstOrDefault(kvp => kvp.Key == ConverterIdentifier || kvp.Value == ConverterIdentifier); + if (!value.Equals(default(KeyValuePair))) + { + listBoxTranslitName.SelectedItem = value.Value; + } + else + { + // it's a custom transliterator, so set the other radio box and load the text box as is + textBoxCustomTransliterator.Text = ConverterIdentifier; + radioButtonCustom.Checked = true; + radioButtonCustom.PerformClick(); + } + IsModified = false; } @@ -127,7 +136,21 @@ public IcuTranslitAutoConfigDialog( Util.DebugWriteLine(this, "END"); } - public IcuTranslitAutoConfigDialog( + private Dictionary GetSupportedTransliterators() + { + var count = CppConverterNameList_start(); + + var map = new Dictionary(); + for (int i = 0; i < count; i++) + { + var translitId = CppConverterNameList_next(); + var translitName = CppGetDisplayName(translitId); + map[translitId] = translitName; + } + return map; + } + + public IcuTranslitAutoConfigDialog( IEncConverters aECs, string strFriendlyName, string strConverterIdentifier, @@ -135,7 +158,6 @@ public IcuTranslitAutoConfigDialog( string strTestData) { InitializeComponent(); - fillListBox(); base.Initialize( aECs, strFriendlyName, @@ -143,11 +165,14 @@ public IcuTranslitAutoConfigDialog( eConversionType, strTestData); m_bInitialized = true; - } - // This code was NOT generated! - // So feel free to modify it as needed. - private void InitializeComponent() + mapTransliteratorIdsToFriendlyNames = GetSupportedTransliterators(); + FillListBox(mapTransliteratorIdsToFriendlyNames); + } + + // This code was NOT generated! + // So feel free to modify it as needed. + private void InitializeComponent() { this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.listBoxTranslitName = new System.Windows.Forms.ListBox(); @@ -219,6 +244,7 @@ private void InitializeComponent() this.listBoxTranslitName.Name = "listBoxTranslitName"; this.listBoxTranslitName.Size = new System.Drawing.Size(370, 212); this.listBoxTranslitName.TabIndex = 1; + this.listBoxTranslitName.Sorted = true; this.listBoxTranslitName.SelectedIndexChanged += new System.EventHandler(this.listBoxTranslitName_SelectedIndexChanged); // // radioButtonBuiltIn @@ -244,7 +270,7 @@ private void InitializeComponent() this.radioButtonCustom.TabStop = true; this.radioButtonCustom.Text = "&Custom transliterator"; this.radioButtonCustom.UseVisualStyleBackColor = true; - this.radioButtonCustom.Click += new System.EventHandler(this.radioButtonCustom_Click); + this.radioButtonCustom.CheckedChanged += new System.EventHandler(this.radioButtonCustom_CheckedChanged); // // textBoxCustomTransliterator // @@ -305,54 +331,13 @@ private void InitializeComponent() } - private void fillListBox() + private void FillListBox(Dictionary mapTransliteratorIdsToFriendlyNames) { - this.listBoxTranslitName.Items.Clear(); - int count = 0; - count = CppConverterNameList_start(); - - // Store the IDs in an array, and put the display names in the - // list box. - lstTranslitIDs = new List(count); - for (int i = 0; i < count; i++) - { - var translitId = CppConverterNameList_next(); - lstTranslitIDs.Add(translitId); - string translitName = CppGetDisplayName(translitId); - this.listBoxTranslitName.Items.Add(translitName); - } - - // Sort listbox and corresponding translitIDs by display name. - ListBox lb = this.listBoxTranslitName; // shorter nickname - if (lb.Items.Count > 1) - { - bool swapped; - do - { - int counter = lb.Items.Count - 1; - swapped = false; - - while (counter > 0) - { - // Compare the items - if (String.Compare(lb.Items[counter].ToString(), - lb.Items[counter - 1].ToString()) < 0) - { - // Swap the items. - object tempName = lb.Items[counter]; - lb.Items[counter] = lb.Items[counter - 1]; - lb.Items[counter - 1] = tempName; - string tempID = lstTranslitIDs[counter]; - lstTranslitIDs[counter] = lstTranslitIDs[counter - 1]; - lstTranslitIDs[counter - 1] = tempID; - swapped = true; - } - // Decrement the counter. - counter -= 1; - } - } - while ((swapped == true)); - } + // Put the display names in the list box. + foreach (var friendlyName in mapTransliteratorIdsToFriendlyNames.Values) + { + this.listBoxTranslitName.Items.Add(friendlyName); + } } protected override void SetConvTypeControls() @@ -370,7 +355,7 @@ protected override bool OnApply() // Get the converter identifier from the Setup tab controls. if (radioButtonBuiltIn.Checked && (listBoxTranslitName.SelectedIndex != -1)) - ConverterIdentifier = lstTranslitIDs[listBoxTranslitName.SelectedIndex]; + ConverterIdentifier = mapTransliteratorIdsToFriendlyNames.FirstOrDefault(kvp => kvp.Value == (string)listBoxTranslitName.SelectedItem).Key; else if (radioButtonCustom.Checked) ConverterIdentifier = textBoxCustomTransliterator.Text; @@ -399,23 +384,6 @@ protected override bool OnApply() return base.OnApply(); } -/* - protected override bool ShouldRemoveBeforeAdd - { - get { return true; } - } - - protected override bool ShouldFriendlyNameBeReadOnly - { - get { return false; } - } - - protected override bool GetFontMapping(string strFriendlyName, out string strLhsFont, out string strRhsFont) - { - return base.GetFontMapping(strFriendlyName, out strLhsFont, out strRhsFont); - } -*/ - protected override string ProgID { get { return typeof(IcuTranslitEncConverter).FullName; } @@ -457,17 +425,20 @@ private void radioButtonBuiltIn_Click(object sender, EventArgs e) textBoxCustomTransliterator.Enabled = comboBoxPreviousCustomTransliterators.Enabled = buttonDeletePreviousCustomTransliterators.Enabled = false; + IsModified = true; } - private void radioButtonCustom_Click(object sender, EventArgs e) + private void radioButtonCustom_CheckedChanged(object sender, EventArgs e) { - listBoxTranslitName.Enabled = false; + var value = radioButtonCustom.Checked; + listBoxTranslitName.Enabled = !value; textBoxCustomTransliterator.Enabled = comboBoxPreviousCustomTransliterators.Enabled = - buttonDeletePreviousCustomTransliterators.Enabled = true; - } + buttonDeletePreviousCustomTransliterators.Enabled = value; + IsModified = true; + } - private void comboBoxPreviousCustomTransliterators_SelectedIndexChanged(object sender, EventArgs e) + private void comboBoxPreviousCustomTransliterators_SelectedIndexChanged(object sender, EventArgs e) { if (!m_bInitialized) return; diff --git a/src/IcuEC/IcuTranslitEncConverter.cs b/src/IcuEC/IcuTranslitEncConverter.cs index d6cdce35..0f52b0bf 100755 --- a/src/IcuEC/IcuTranslitEncConverter.cs +++ b/src/IcuEC/IcuTranslitEncConverter.cs @@ -80,6 +80,9 @@ static extern string CppGetDisplayName_Linux( #region Member Variable Definitions public const string strDisplayName = "ICU Transliterator"; public const string strHtmlFilename = "ICU_Transliterators_Plug-in_About_box.htm"; + + public bool TransliteratorInitialized { get; set; } + #endregion Member Variable Definitions #region Initialization @@ -90,14 +93,6 @@ public IcuTranslitEncConverter() : base( { } - /// - /// The class destructor. - ~IcuTranslitEncConverter() - { - //if( IsFileLoaded() ) - // CCUnloadTable(m_hTable); - } - public override void Initialize( string converterName, string converterSpec, @@ -120,7 +115,9 @@ public override void Initialize( if (converterSpec.Contains("Any")) m_eConversionType = conversionType = MakeUniDirectional(conversionType); - Util.DebugWriteLine(this, "END"); + TransliteratorInitialized = false; // so it has to be reinitialized in the C++ side + + Util.DebugWriteLine(this, "END"); } #endregion Initialization @@ -128,18 +125,7 @@ public override void Initialize( #region Misc helpers protected bool IsFileLoaded() { - //return (m_hTable != 0); - return false; - } - - protected void Unload() - { - //Util.DebugWriteLine(this, "BEGIN"); - //if( IsFileLoaded() ) - //{ - // CCUnloadTable(m_hTable); - // m_hTable = 0; - //} + return TransliteratorInitialized; } protected override EncodingForm DefaultUnicodeEncForm(bool bForward, bool bLHS) @@ -154,18 +140,23 @@ protected unsafe void Load(string strTranslitID) { Util.DebugWriteLine(this, "BEGIN"); - if (IsFileLoaded()) - Unload(); + if (IsFileLoaded()) + return; Util.DebugWriteLine(this, "Calling CppInitialize"); int status = 0; status = CppInitialize(strTranslitID); - if (status != 0) - { - throw new Exception("CppInitialize failed."); - } - Util.DebugWriteLine(this, "END"); + if (status != 0) + { + throw new Exception("CppInitialize failed."); + } + else + { + TransliteratorInitialized = true; + } + + Util.DebugWriteLine(this, "END"); } #endregion Misc helpers diff --git a/src/IcuEC/Properties/Settings.Designer.cs b/src/IcuEC/Properties/Settings.Designer.cs index a68e0c36..fac30a0c 100644 --- a/src/IcuEC/Properties/Settings.Designer.cs +++ b/src/IcuEC/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace IcuEC.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -25,10 +25,12 @@ public static Settings Default { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n [aeiou]->V /i\r\n [^aeiou]->C /i\r\n")] + [global::System.Configuration.DefaultSettingValueAttribute(@" + + [aeiou]->V /i + [^aeiou]->C /i + [\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]-> +")] public global::System.Collections.Specialized.StringCollection RecentRegExpressions { get { return ((global::System.Collections.Specialized.StringCollection)(this["RecentRegExpressions"])); @@ -40,9 +42,11 @@ public static Settings Default { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n NFD; [:Nonspacing Mark:] Remove; NFC\r\n")] + [global::System.Configuration.DefaultSettingValueAttribute(@" + + NFD; [:Nonspacing Mark:] Remove; NFC + Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC +")] public global::System.Collections.Specialized.StringCollection RecentCustomTransliterators { get { return ((global::System.Collections.Specialized.StringCollection)(this["RecentCustomTransliterators"])); diff --git a/src/IcuEC/Properties/Settings.settings b/src/IcuEC/Properties/Settings.settings index f75a0e9e..2b030931 100644 --- a/src/IcuEC/Properties/Settings.settings +++ b/src/IcuEC/Properties/Settings.settings @@ -4,15 +4,17 @@ <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>[aeiou]-&gt;V /i</string> <string>[^aeiou]-&gt;C /i</string> + <string>[\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]-&gt;</string> </ArrayOfString> <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>NFD; [:Nonspacing Mark:] Remove; NFC</string> + <string>Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC</string> </ArrayOfString> diff --git a/src/IcuEC/app.config b/src/IcuEC/app.config index 588d5cc6..3401a124 100644 --- a/src/IcuEC/app.config +++ b/src/IcuEC/app.config @@ -7,22 +7,24 @@ - - - - [aeiou]->V /i - [^aeiou]->C /i - - - - - - - NFD; [:Nonspacing Mark:] Remove; NFC - - - - + + + + [aeiou]->V /i + [^aeiou]->C /i + [\u0027\u002a\u2018\u2019\u201c\u201d\u0303\u0304\u0310\u0314\u0325\u200c\u200d\uE03C\uFFFD]-> + + + + + + + NFD; [:Nonspacing Mark:] Remove; NFC + Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC + + + + diff --git a/src/PerlExpressionEC/PerlExpressionEC 2010.csproj b/src/PerlExpressionEC/PerlExpressionEC 2010.csproj index 5af08cfd..a8d8e956 100644 --- a/src/PerlExpressionEC/PerlExpressionEC 2010.csproj +++ b/src/PerlExpressionEC/PerlExpressionEC 2010.csproj @@ -1,4 +1,4 @@ - + Debug diff --git a/src/PyScriptEC/Py3ScriptAutoConfigDialog.Designer.cs b/src/PyScriptEC/Py3ScriptAutoConfigDialog.Designer.cs new file mode 100644 index 00000000..261a9ccf --- /dev/null +++ b/src/PyScriptEC/Py3ScriptAutoConfigDialog.Designer.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SilEncConverters40 +{ + partial class Py3ScriptAutoConfigDialog + { + #region Windows Form Designer generated code + // This code does not get generated by Designer, so modify it directly. + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.labelScriptFile = new System.Windows.Forms.Label(); + this.textBoxFileSpec = new System.Windows.Forms.TextBox(); + this.buttonBrowse = new System.Windows.Forms.Button(); + this.labelPython3Path = new System.Windows.Forms.Label(); + this.textBoxPython3Path = new System.Windows.Forms.TextBox(); + this.buttonPython3Browse = new System.Windows.Forms.Button(); + this.openFileDialogBrowse = new System.Windows.Forms.OpenFileDialog(); + this.tabControl.SuspendLayout(); + this.tabPageSetup.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tabPageSetup + // + this.tabPageSetup.Controls.Add(this.tableLayoutPanel1); + // + // buttonApply + // + this.helpProvider.SetHelpString(this.buttonApply, "Click this button to apply the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonApply, true); + // + // buttonCancel + // + this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel this dialog"); + this.helpProvider.SetShowHelp(this.buttonCancel, true); + // + // buttonOK + // + this.helpProvider.SetHelpString(this.buttonOK, "Click this button to accept the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonOK, true); + // + // buttonSaveInRepository + // + this.helpProvider.SetHelpString(this.buttonSaveInRepository, "Click to add this converter to the system repository permanently."); + this.helpProvider.SetShowHelp(this.buttonSaveInRepository, true); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 104F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.labelScriptFile, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.textBoxFileSpec, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.buttonBrowse, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.labelPython3Path, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.textBoxPython3Path, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.buttonPython3Browse, 2, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(596, 394); + this.tableLayoutPanel1.TabIndex = 1; + // + // labelScriptFile + // + this.labelScriptFile.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelScriptFile.AutoSize = true; + this.labelScriptFile.Location = new System.Drawing.Point(14, 18); + this.labelScriptFile.Name = "labelScriptFile"; + this.labelScriptFile.Size = new System.Drawing.Size(87, 13); + this.labelScriptFile.TabIndex = 0; + this.labelScriptFile.Text = "Python script file:"; + // + // textBoxFileSpec + // + this.textBoxFileSpec.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.textBoxFileSpec.Location = new System.Drawing.Point(104, 15); + this.textBoxFileSpec.Margin = new System.Windows.Forms.Padding(0); + this.textBoxFileSpec.Name = "textBoxFileSpec"; + this.textBoxFileSpec.Size = new System.Drawing.Size(390, 20); + this.textBoxFileSpec.TabIndex = 1; + this.textBoxFileSpec.TextChanged += new System.EventHandler(this.textBox_TextChanged); + // + // buttonBrowse + // + this.buttonBrowse.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.buttonBrowse.AutoSize = true; + this.buttonBrowse.Location = new System.Drawing.Point(494, 13); + this.buttonBrowse.Margin = new System.Windows.Forms.Padding(0); + this.buttonBrowse.Name = "buttonBrowse"; + this.buttonBrowse.Size = new System.Drawing.Size(75, 23); + this.buttonBrowse.TabIndex = 2; + this.buttonBrowse.Text = "Browse..."; + this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click); + // + // labelPython3Path + // + this.labelPython3Path.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelPython3Path.AutoSize = true; + this.labelPython3Path.Location = new System.Drawing.Point(5, 50); + this.labelPython3Path.Name = "labelPython3Path"; + this.labelPython3Path.Padding = new System.Windows.Forms.Padding(0, 5, 0, 0); + this.labelPython3Path.Size = new System.Drawing.Size(96, 18); + this.labelPython3Path.TabIndex = 5; + this.labelPython3Path.Text = "Python3 DLL path:"; + // + // textBoxPython3Path + // + this.textBoxPython3Path.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxPython3Path.Location = new System.Drawing.Point(107, 53); + this.textBoxPython3Path.Name = "textBoxPython3Path"; + this.textBoxPython3Path.Size = new System.Drawing.Size(384, 20); + this.textBoxPython3Path.TabIndex = 6; + this.textBoxPython3Path.TextChanged += new System.EventHandler(this.textBox_TextChanged); + // + // buttonPython3Browse + // + this.buttonPython3Browse.AutoSize = true; + this.buttonPython3Browse.Location = new System.Drawing.Point(494, 50); + this.buttonPython3Browse.Margin = new System.Windows.Forms.Padding(0); + this.buttonPython3Browse.Name = "buttonPython3Browse"; + this.buttonPython3Browse.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0); + this.buttonPython3Browse.Size = new System.Drawing.Size(75, 25); + this.buttonPython3Browse.TabIndex = 2; + this.buttonPython3Browse.Text = "Browse..."; + this.buttonPython3Browse.Click += new System.EventHandler(this.buttonBrowseForPythonDll_Click); + // + // openFileDialogBrowse + // + this.openFileDialogBrowse.DefaultExt = "py"; + this.openFileDialogBrowse.Filter = "Python scrips (*.py)|*.py"; + this.openFileDialogBrowse.Title = "Browse for Python script"; + // + // Py3ScriptAutoConfigDialog + // + this.ClientSize = new System.Drawing.Size(634, 479); + this.Name = "Py3ScriptAutoConfigDialog"; + this.Controls.SetChildIndex(this.tabControl, 0); + this.Controls.SetChildIndex(this.buttonApply, 0); + this.Controls.SetChildIndex(this.buttonCancel, 0); + this.Controls.SetChildIndex(this.buttonOK, 0); + this.Controls.SetChildIndex(this.buttonSaveInRepository, 0); + this.tabControl.ResumeLayout(false); + this.tabPageSetup.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label labelScriptFile; + private System.Windows.Forms.TextBox textBoxFileSpec; + private System.Windows.Forms.Button buttonBrowse; + private System.Windows.Forms.OpenFileDialog openFileDialogBrowse; + private Label labelPython3Path; + private TextBox textBoxPython3Path; + private Button buttonPython3Browse; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} diff --git a/src/PyScriptEC/Py3ScriptAutoConfigDialog.cs b/src/PyScriptEC/Py3ScriptAutoConfigDialog.cs new file mode 100644 index 00000000..4adef8af --- /dev/null +++ b/src/PyScriptEC/Py3ScriptAutoConfigDialog.cs @@ -0,0 +1,204 @@ +// Created by Bob Eaton on Oct 21 2023 +// +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; +using ECInterfaces; // for IEncConverter +using System.Linq; + +namespace SilEncConverters40 +{ + public partial class Py3ScriptAutoConfigDialog : PythonAutoConfigDialog + { + private const string OpenFileDialogTitleBrowseForDll = "Browse for Python 3 DLL"; + private const string OpenFileDialogTitleBrowseForScript = "Browse for Python Script"; + + private const string OpenFileDialogDefaultExtBrowseForDll = "dll"; + private const string OpenFileDialogDefaultExtBrowseForScript = "py"; + + private const string OpenFileDialogFilterBrowseForDll = "Python 3 DLL (Python3 DLL)|Python3*.dll"; + private const string OpenFileDialogFilterBrowseForScript = "Python scripts (*.py)|*.py"; + + public Py3ScriptAutoConfigDialog( + IEncConverters aECs, + string strDisplayName, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strLhsEncodingId, + string strRhsEncodingId, + int lProcessTypeFlags, + bool bIsInRepository) + { + Util.DebugWriteLine(this, "ctor1 BEGIN"); + InitializeComponent(); + Util.DebugWriteLine(this, "Initialized component."); + base.Initialize( + aECs, + Py3ScriptEncConverter.strHtmlFilename, + strDisplayName, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strLhsEncodingId, + strRhsEncodingId, + lProcessTypeFlags | (int)ProcessTypeFlags.PythonScript, + bIsInRepository); + Util.DebugWriteLine(this, "Initialized base."); + // if we're editing a CC table/spellfixer project, then set the + // Converter Spec and say it's unmodified + if (m_bEditMode) + { + Util.DebugWriteLine(this, "Edit mode"); + System.Diagnostics.Debug.Assert( + !String.IsNullOrEmpty(ConverterIdentifier)); + + textBoxFileSpec.Text = Py3ScriptEncConverter.ScriptPath(ConverterIdentifier); + textBoxPython3Path.Text = Py3ScriptEncConverter.DistroPath(ConverterIdentifier); + + IsModified = false; + } + m_bInitialized = true; + Util.DebugWriteLine(this, "END"); + } + + public Py3ScriptAutoConfigDialog( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData) + { + Util.DebugWriteLine(this, "ctor2 BEGIN"); + InitializeComponent(); + base.Initialize( + aECs, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strTestData); + Util.DebugWriteLine(this, "END"); + } + + // this method is called either when the user clicks the "Apply" or "OK" buttons *OR* if she + // tries to switch to the Test or Advanced tab. This is the dialog's one opportunity + // to make sure that the user has correctly configured a legitimate converter. + protected override bool OnApply() + { + Util.DebugWriteLine(this, "BEGIN"); + // Get the converter identifier from the Setup tab controls. + var scriptPath = textBoxFileSpec.Text; + var pythonDistroPath = textBoxPython3Path.Text; + + // if we're actually on the setup tab, then do some further checking as well. + if (tabControl.SelectedTab == tabPageSetup) + { + // only do these message boxes if we're on the Setup tab itself, because if this OnApply + // is being called as a result of the user switching to the Test tab, that code will + // already put up an error message and we don't need two error messages. + if (String.IsNullOrEmpty(scriptPath)) + { + MessageBox.Show(this, "Choose a Python script first!", EncConverters.cstrCaption); + return false; + } + else if (!File.Exists(scriptPath)) + { + MessageBox.Show(this, "File doesn't exist!", EncConverters.cstrCaption); + return false; + } + else if (String.IsNullOrEmpty(pythonDistroPath)) + { + MessageBox.Show(this, "You have to Browse to the path for the Python 3.* DLL file (e.g. Python312.dll)!", EncConverters.cstrCaption); + return false; + } + } + + ConverterIdentifier = $"{scriptPath};{pythonDistroPath}"; + + Util.DebugWriteLine(this, "END"); + return base.OnApply(); + } + + protected override string ProgID + { + get { return typeof(Py3ScriptEncConverter).FullName; } + } + + protected override string ImplType + { + get { return EncConverters.strTypeSILPy3Script; } + } + + protected override string DefaultFriendlyName + { + // as the default, make it the same as the table name (w/o extension) + get { return Path.GetFileNameWithoutExtension(Py3ScriptEncConverter.ScriptPath(ConverterIdentifier)); } + } + + private void buttonBrowse_Click(object sender, EventArgs e) + { + // since we use the same dialog for the python script and the python dll, don't keep the 'FileName' around, + // when searching for the latter + InitializeOpenFileDialog(openFileDialogBrowse.FileName, OpenFileDialogDefaultExtBrowseForScript, OpenFileDialogFilterBrowseForScript, OpenFileDialogTitleBrowseForScript); + var scriptPath = Py3ScriptEncConverter.ScriptPath(ConverterIdentifier); + if (!String.IsNullOrEmpty(scriptPath)) + openFileDialogBrowse.InitialDirectory = Path.GetDirectoryName(scriptPath); + else + openFileDialogBrowse.InitialDirectory = Util.CommonAppDataPath() + EncConverters.strDefMapsTablesPath; + + if (openFileDialogBrowse.ShowDialog() == DialogResult.OK) + { + ResetFields(); + textBoxFileSpec.Text = openFileDialogBrowse.FileName; + } + } + + private void buttonBrowseForPythonDll_Click(object sender, EventArgs e) + { + // since we use the same dialog for the python script and the python dll, don't keep the 'FileName' around, + // when searching for the latter + InitializeOpenFileDialog(openFileDialogBrowse.FileName, OpenFileDialogDefaultExtBrowseForDll, OpenFileDialogFilterBrowseForDll, OpenFileDialogTitleBrowseForDll); + + var distroPath = Py3ScriptEncConverter.DistroPath(ConverterIdentifier); + if (!String.IsNullOrEmpty(distroPath)) + openFileDialogBrowse.InitialDirectory = Path.GetDirectoryName(distroPath); + else + openFileDialogBrowse.InitialDirectory = @"C:\"; + + if (openFileDialogBrowse.ShowDialog() == DialogResult.OK) + { + ResetFields(); + textBoxPython3Path.Text = openFileDialogBrowse.FileName; + } + } + + private void InitializeOpenFileDialog(string fileName, string defaultExt, string filter, string title) + { + if (!string.IsNullOrEmpty(fileName) && fileName.Substring(fileName.Length - defaultExt.Length + 1).ToLower() != $".{defaultExt}") + fileName = ""; + openFileDialogBrowse.Title = title; + openFileDialogBrowse.DefaultExt = defaultExt; + openFileDialogBrowse.Filter = filter; + openFileDialogBrowse.FileName = fileName; + } + + private void textBox_TextChanged(object sender, EventArgs e) + { + if (m_bInitialized) // but only do this after we're already initialized + { + IsModified = (((TextBox)sender).Text.Length > 0); + } + } + + private void radioButton_CheckedChanged(object sender, EventArgs e) + { + IsModified = true; + } + } +} + diff --git a/src/PyScriptEC/Py3ScriptAutoConfigDialog.resx b/src/PyScriptEC/Py3ScriptAutoConfigDialog.resx new file mode 100644 index 00000000..4cbbd5fe --- /dev/null +++ b/src/PyScriptEC/Py3ScriptAutoConfigDialog.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 341, 17 + + + 450, 17 + + \ No newline at end of file diff --git a/src/PyScriptEC/Py3ScriptEncConverter.cs b/src/PyScriptEC/Py3ScriptEncConverter.cs new file mode 100644 index 00000000..30889a62 --- /dev/null +++ b/src/PyScriptEC/Py3ScriptEncConverter.cs @@ -0,0 +1,321 @@ +// Created by Jim Kornelsen on Nov 14 2011 +// +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Win32; // for RegistryKey +using ECInterfaces; // for IEncConverter +using Python.Runtime; +using System.Windows.Forms; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace SilEncConverters40 +{ + /// + /// Managed Python script EncConverter for Python 3 + /// + //[GuidAttribute("54E0185D-3603-4113-B323-E0222FAD4CCE")] + // normally these subclasses are treated as the base class (i.e. the + // client can use them orthogonally as IEncConverter interface pointers + // so normally these individual subclasses would be invisible), but if + // we add 'ComVisible = false', then it doesn't get the registry + // 'HKEY_CLASSES_ROOT\SilEncConverters40.TecEncConverter' which is the basis of + // how it is started (see EncConverters.AddEx). + // [ComVisible(false)] + public class Py3ScriptEncConverter : EncConverter + { + #region Member Variable Definitions + private DateTime m_timeModified = DateTime.MinValue; + protected bool m_bLegacy; + + public const string strDisplayName = "Python 3 Script"; + public const string strHtmlFilename = "Python_3_Script_Plug-in_About_box.htm"; + #endregion Member Variable Definitions + + #region Initialization + /// + /// The class constructor. + public Py3ScriptEncConverter() : base( + typeof(Py3ScriptEncConverter).FullName, EncConverters.strTypeSILPy3Script) + { + } + + ~Py3ScriptEncConverter() + { + moduleImported?.Dispose(); + //if (PythonEngine.IsInitialized) + // PythonEngine.Shutdown(); + } + + public override void Initialize( + string converterName, + string converterSpec, + ref string lhsEncodingID, + ref string rhsEncodingID, + ref ConvType conversionType, + ref Int32 processTypeFlags, + Int32 codePageInput, + Int32 codePageOutput, + bool bAdding) + { + Util.DebugWriteLine(this, "BEGIN"); + // let the base class have first stab at it + base.Initialize(converterName, converterSpec, ref lhsEncodingID, ref rhsEncodingID, + ref conversionType, ref processTypeFlags, codePageInput, codePageOutput, bAdding); + + // the only thing we want to add (now that the convType can be less than accurate) + // is to make sure it's unidirectional + m_eConversionType = conversionType = MakeUniDirectional(conversionType); + m_bLegacy = (EncConverter.NormalizeLhsConversionType(conversionType) == NormConversionType.eLegacy); + + // if we're supposedly adding this one, then clobber our copy of its last modified + // (there was a problem with us instantiating lots of these things in a row and + // not detecting the change because the modified date was within a second of each + // other) + if (bAdding) + { + Util.DebugWriteLine(this, "Adding"); + m_timeModified = DateTime.MinValue; + + // do the load at this point; not that we need it, but for checking that everything's okay. + Load(); + } + Util.DebugWriteLine(this, "END"); + } + + #endregion Initialization + + #region Abstract Base Class Overrides + protected override void PreConvert + ( + EncodingForm eInEncodingForm, + ref EncodingForm eInFormEngine, + EncodingForm eOutEncodingForm, + ref EncodingForm eOutFormEngine, + ref NormalizeFlags eNormalizeOutput, + bool bForward + ) + { + // let the base class do its thing first + base.PreConvert(eInEncodingForm, ref eInFormEngine, + eOutEncodingForm, ref eOutFormEngine, + ref eNormalizeOutput, bForward); + + if (NormalizeLhsConversionType(ConversionType) == NormConversionType.eUnicode) + { + // We could use UTF-8 here, but wide data works just fine. + // the Windows version definitely needs UTF16. + if (Util.IsUnix) + { + Util.DebugWriteLine(this, "eInFormEngine UTF32"); + eInFormEngine = EncodingForm.UTF32; + } + else + { + Util.DebugWriteLine(this, "eInFormEngine UTF16"); + eInFormEngine = EncodingForm.UTF16; + } + } + else + { + // legacy + Util.DebugWriteLine(this, "eInFormEngine LegacyBytes"); + eInFormEngine = EncodingForm.LegacyBytes; + } + + if (NormalizeRhsConversionType(ConversionType) == NormConversionType.eUnicode) + { + if (Util.IsUnix) + { + Util.DebugWriteLine(this, "eOutFormEngine UTF32"); + eOutFormEngine = EncodingForm.UTF32; + } + else + { + Util.DebugWriteLine(this, "eOutFormEngine UTF16"); + eOutFormEngine = EncodingForm.UTF16; + } + } + else + { + Util.DebugWriteLine(this, "eOutFormEngine LegacyBytes"); + eOutFormEngine = EncodingForm.LegacyBytes; + } + + // do the load at this point + Load(); + } + + public static string ScriptPath(string converterIdentifier) + { + return converterIdentifier?.Split(';')?[0]; + } + + public static string DistroPath(string converterIdentifier) + { + return (converterIdentifier?.Contains(";") ?? false) ? converterIdentifier?.Split(';')?[1] : null; + } + + protected unsafe void Load() + { + Util.DebugWriteLine(this, "BEGIN"); + string strScriptPath = ScriptPath(ConverterIdentifier); + + // first make sure it's there and get the last time it was modified + DateTime timeModified = DateTime.Now; // don't care really, but have to initialize it. + if (!DoesFileExist(strScriptPath, ref timeModified)) + EncConverters.ThrowError(ErrStatus.CantOpenReadMap, strScriptPath); + + // if it has been modified or it's not already loaded... + if (timeModified > m_timeModified) + { + // keep track of the modified date, so we can detect a new version to reload + m_timeModified = timeModified; + + Util.DebugWriteLine(this, "Calling CppInitialize"); + string strScriptName = Path.GetFileNameWithoutExtension(strScriptPath); + string strScriptDir = Path.GetDirectoryName(strScriptPath); + var strErrorExtraValue = strScriptPath; + try + { + var distroPath = DistroPath(ConverterIdentifier); + try + { + if (Runtime.PythonDLL != distroPath) + Runtime.PythonDLL = distroPath; + + if (!PythonEngine.IsInitialized) + { + PythonEngine.Initialize(); + } + } + catch (Exception e) + { + if (e.Message.Contains("This property must be set before runtime is initialized") && (Runtime.PythonDLL != distroPath)) + { + EncConverters.ThrowError(ErrStatus.CantOpenReadMap, $"You have to restart the {strDisplayName} Setup dialog to reset the Python interface"); + } + + // see if this helps (it doesn't seem to, but it also doesn't die... + PythonEngine.Shutdown(); + throw; + } + + // causes access violation and may not be needed (since this isn't async): + // PythonEngine.BeginAllowThreads(); + dynamic sysModule = Py.Import("sys"); + strScriptDir = strScriptDir.Replace(@"\", "/"); + sysModule.path.insert(0, strScriptDir); + + using (Py.GIL()) + { + moduleImported = Py.Import(strScriptName); + } + } + catch (Exception ex) + { + strErrorExtraValue = LogExceptionMessage("Py3ScriptEncConverter.Load", ex); + } + finally + { + if (moduleImported == null) + { + EncConverters.ThrowError(ErrStatus.CompilationFailed, strErrorExtraValue); + } + } + Util.DebugWriteLine(this, "Finished calling CppInitialize"); + } + Util.DebugWriteLine(this, "END"); + } + + protected dynamic moduleImported; + + protected override unsafe void DoConvert + ( + byte* lpInBuffer, + int nInLen, + byte* lpOutBuffer, + ref int rnOutLen + ) + { + int status = 0; + fixed (int* pnOut = &rnOutLen) + { + byte[] baIn = new byte[nInLen]; + ECNormalizeData.ByteStarToByteArr(lpInBuffer, nInLen, baIn); +#if DEBUG + if (Util.IsUnix) + { + Util.DebugWriteLine(this, Util.getDisplayBytes("Sending bytes to CppDoConvert", baIn)); + } +#endif + + Encoding enc; + if (m_bLegacy) + { + try + { + enc = Encoding.GetEncoding(this.CodePageInput); + } + catch + { + enc = Encoding.GetEncoding(EncConverters.cnIso8859_1CodePage); + } + } + else + { + enc = Encoding.Unicode; + } + + char[] caIn = Encoding.Unicode.GetChars(baIn); + + // here's our input string + var strInput = new string(caIn); + + // status = CppDoConvert(lpInBuffer, nInLen, lpOutBuffer, pnOut); + using (Py.GIL()) + { + string strOutput = moduleImported?.Convert(strInput); + StringToProperByteStar(strOutput, lpOutBuffer, ref rnOutLen); + Util.DebugWriteLine(this, "Result len " + rnOutLen.ToString()); + Util.DebugWriteLine(this, "END"); + } + } + + if (status != 0) + { + EncConverters.ThrowError(status); + } + } + + protected override string GetConfigTypeName + { + get { return typeof(Py3ScriptEncConverterConfig).AssemblyQualifiedName; } + } + + internal static unsafe void StringToProperByteStar(string strOutput, byte* lpOutBuffer, ref int rnOutLen) + { + int nLen = strOutput.Length * 2; + if (nLen > (int)rnOutLen) + EncConverters.ThrowError(ErrStatus.OutputBufferFull); + rnOutLen = nLen; + ECNormalizeData.StringToByteStar(strOutput, lpOutBuffer, rnOutLen, false); + } + + internal static string LogExceptionMessage(string className, Exception ex) + { + string msg = "Error occurred: " + ex.Message; + while (ex.InnerException != null) + { + ex = ex.InnerException; + msg += $"{Environment.NewLine}because: (InnerException): {ex.Message}"; + } + + Util.DebugWriteLine(className, msg); + return msg; + } + + #endregion Abstract Base Class Overrides + } +} diff --git a/src/PyScriptEC/Py3ScriptEncConverterConfig.cs b/src/PyScriptEC/Py3ScriptEncConverterConfig.cs new file mode 100644 index 00000000..08b2b3fe --- /dev/null +++ b/src/PyScriptEC/Py3ScriptEncConverterConfig.cs @@ -0,0 +1,61 @@ +// Created by Jim Kornelsen on Nov 14 2011 +// +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; // for the class attributes +using ECInterfaces; // for IEncConverter + +namespace SilEncConverters40 +{ + public class Py3ScriptEncConverterConfig : EncConverterConfig + { + public Py3ScriptEncConverterConfig() + : base + ( + typeof(Py3ScriptEncConverter).FullName, + Py3ScriptEncConverter.strDisplayName, + Py3ScriptEncConverter.strHtmlFilename, + ProcessTypeFlags.DontKnow + ) + { + } + + public override bool Configure + ( + IEncConverters aECs, + string strFriendlyName, + ConvType eConversionType, + string strLhsEncodingID, + string strRhsEncodingID + ) + { + var form = new Py3ScriptAutoConfigDialog ( + aECs, m_strDisplayName, m_strFriendlyName, + m_strConverterID, m_eConversionType, + BestGuessEncoding(m_strLhsEncodingID, strLhsEncodingID, EncConverters.strDefUnicodeEncoding), + BestGuessEncoding(m_strRhsEncodingID, strRhsEncodingID, EncConverters.strDefUnicodeEncoding), + m_lProcessType, m_bIsInRepository); + + return Configure(form); + } + + public override void DisplayTestPage + ( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData + ) + { + InitializeFromThis(ref strFriendlyName, ref strConverterIdentifier, + ref eConversionType, ref strTestData); + + Py3ScriptAutoConfigDialog form = new Py3ScriptAutoConfigDialog(aECs, strFriendlyName, + strConverterIdentifier, eConversionType, strTestData); + + base.DisplayTestPage(form); + } + } +} diff --git a/src/PyScriptEC/PyScriptAutoConfigDialog.Designer.cs b/src/PyScriptEC/PyScriptAutoConfigDialog.Designer.cs new file mode 100644 index 00000000..6fa74efc --- /dev/null +++ b/src/PyScriptEC/PyScriptAutoConfigDialog.Designer.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SilEncConverters40 +{ + partial class PyScriptAutoConfigDialog + { + #region Windows Form Designer generated code + // This code does not get generated by Designer, so modify it directly. + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.labelScriptFile = new System.Windows.Forms.Label(); + this.textBoxFileSpec = new System.Windows.Forms.TextBox(); + this.buttonBrowse = new System.Windows.Forms.Button(); + this.groupBoxExpects = new System.Windows.Forms.GroupBox(); + this.radioButtonExpectsUnicode = new System.Windows.Forms.RadioButton(); + this.radioButtonExpectsLegacy = new System.Windows.Forms.RadioButton(); + this.groupBoxReturns = new System.Windows.Forms.GroupBox(); + this.radioButtonReturnsUnicode = new System.Windows.Forms.RadioButton(); + this.radioButtonReturnsLegacy = new System.Windows.Forms.RadioButton(); + this.openFileDialogBrowse = new System.Windows.Forms.OpenFileDialog(); + this.tabControl.SuspendLayout(); + this.tabPageSetup.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.groupBoxExpects.SuspendLayout(); + this.groupBoxReturns.SuspendLayout(); + this.SuspendLayout(); + // + // tabPageSetup + // + this.tabPageSetup.Controls.Add(this.tableLayoutPanel1); + // + // buttonApply + // + this.helpProvider.SetHelpString(this.buttonApply, "Click this button to apply the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonApply, true); + // + // buttonCancel + // + this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel this dialog"); + this.helpProvider.SetShowHelp(this.buttonCancel, true); + // + // buttonOK + // + this.helpProvider.SetHelpString(this.buttonOK, "Click this button to accept the configured values for this converter"); + this.helpProvider.SetShowHelp(this.buttonOK, true); + // + // buttonSaveInRepository + // + this.helpProvider.SetHelpString(this.buttonSaveInRepository, "Click to add this converter to the system repository permanently."); + this.helpProvider.SetShowHelp(this.buttonSaveInRepository, true); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 104F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Controls.Add(this.labelScriptFile, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.textBoxFileSpec, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.buttonBrowse, 2, 0); + this.tableLayoutPanel1.Controls.Add(this.groupBoxExpects, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.groupBoxReturns, 1, 3); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 5; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(596, 394); + this.tableLayoutPanel1.TabIndex = 1; + // + // labelScriptFile + // + this.labelScriptFile.Anchor = System.Windows.Forms.AnchorStyles.Right; + this.labelScriptFile.AutoSize = true; + this.labelScriptFile.Location = new System.Drawing.Point(14, 18); + this.labelScriptFile.Name = "labelScriptFile"; + this.labelScriptFile.Size = new System.Drawing.Size(87, 13); + this.labelScriptFile.TabIndex = 0; + this.labelScriptFile.Text = "Python script file:"; + // + // textBoxFileSpec + // + this.textBoxFileSpec.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.textBoxFileSpec.Location = new System.Drawing.Point(104, 15); + this.textBoxFileSpec.Margin = new System.Windows.Forms.Padding(0); + this.textBoxFileSpec.Name = "textBoxFileSpec"; + this.textBoxFileSpec.Size = new System.Drawing.Size(390, 20); + this.textBoxFileSpec.TabIndex = 1; + this.textBoxFileSpec.TextChanged += new System.EventHandler(this.textBoxFileSpec_TextChanged); + // + // buttonBrowse + // + this.buttonBrowse.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.buttonBrowse.AutoSize = true; + this.buttonBrowse.Location = new System.Drawing.Point(494, 13); + this.buttonBrowse.Margin = new System.Windows.Forms.Padding(0); + this.buttonBrowse.Name = "buttonBrowse"; + this.buttonBrowse.Size = new System.Drawing.Size(75, 23); + this.buttonBrowse.TabIndex = 2; + this.buttonBrowse.Text = "Browse..."; + this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click); + // + // groupBoxExpects + // + this.groupBoxExpects.Controls.Add(this.radioButtonExpectsUnicode); + this.groupBoxExpects.Controls.Add(this.radioButtonExpectsLegacy); + this.groupBoxExpects.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxExpects.Location = new System.Drawing.Point(107, 53); + this.groupBoxExpects.Name = "groupBoxExpects"; + this.groupBoxExpects.Size = new System.Drawing.Size(384, 77); + this.groupBoxExpects.TabIndex = 3; + this.groupBoxExpects.TabStop = false; + this.groupBoxExpects.Text = "Python function expects"; + // + // radioButtonExpectsUnicode + // + this.radioButtonExpectsUnicode.Anchor = System.Windows.Forms.AnchorStyles.None; + this.radioButtonExpectsUnicode.AutoSize = true; + this.radioButtonExpectsUnicode.Location = new System.Drawing.Point(50, 30); + this.radioButtonExpectsUnicode.Name = "radioButtonExpectsUnicode"; + this.radioButtonExpectsUnicode.Size = new System.Drawing.Size(95, 17); + this.radioButtonExpectsUnicode.TabIndex = 0; + this.radioButtonExpectsUnicode.TabStop = true; + this.radioButtonExpectsUnicode.Text = "Unicode String"; + this.radioButtonExpectsUnicode.UseVisualStyleBackColor = true; + this.radioButtonExpectsUnicode.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // radioButtonExpectsLegacy + // + this.radioButtonExpectsLegacy.Anchor = System.Windows.Forms.AnchorStyles.None; + this.radioButtonExpectsLegacy.AutoSize = true; + this.radioButtonExpectsLegacy.Location = new System.Drawing.Point(200, 30); + this.radioButtonExpectsLegacy.Name = "radioButtonExpectsLegacy"; + this.radioButtonExpectsLegacy.Size = new System.Drawing.Size(117, 17); + this.radioButtonExpectsLegacy.TabIndex = 0; + this.radioButtonExpectsLegacy.TabStop = true; + this.radioButtonExpectsLegacy.Text = "Non-Unicode Bytes"; + this.radioButtonExpectsLegacy.UseVisualStyleBackColor = true; + this.radioButtonExpectsLegacy.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // groupBoxReturns + // + this.groupBoxReturns.Controls.Add(this.radioButtonReturnsUnicode); + this.groupBoxReturns.Controls.Add(this.radioButtonReturnsLegacy); + this.groupBoxReturns.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupBoxReturns.Location = new System.Drawing.Point(107, 136); + this.groupBoxReturns.Name = "groupBoxReturns"; + this.groupBoxReturns.Size = new System.Drawing.Size(384, 77); + this.groupBoxReturns.TabIndex = 4; + this.groupBoxReturns.TabStop = false; + this.groupBoxReturns.Text = "Python function returns"; + // + // radioButtonReturnsUnicode + // + this.radioButtonReturnsUnicode.Anchor = System.Windows.Forms.AnchorStyles.None; + this.radioButtonReturnsUnicode.AutoSize = true; + this.radioButtonReturnsUnicode.Location = new System.Drawing.Point(50, 30); + this.radioButtonReturnsUnicode.Name = "radioButtonReturnsUnicode"; + this.radioButtonReturnsUnicode.Size = new System.Drawing.Size(95, 17); + this.radioButtonReturnsUnicode.TabIndex = 0; + this.radioButtonReturnsUnicode.TabStop = true; + this.radioButtonReturnsUnicode.Text = "Unicode String"; + this.radioButtonReturnsUnicode.UseVisualStyleBackColor = true; + this.radioButtonReturnsUnicode.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // radioButtonReturnsLegacy + // + this.radioButtonReturnsLegacy.Anchor = System.Windows.Forms.AnchorStyles.None; + this.radioButtonReturnsLegacy.AutoSize = true; + this.radioButtonReturnsLegacy.Location = new System.Drawing.Point(200, 30); + this.radioButtonReturnsLegacy.Name = "radioButtonReturnsLegacy"; + this.radioButtonReturnsLegacy.Size = new System.Drawing.Size(118, 17); + this.radioButtonReturnsLegacy.TabIndex = 0; + this.radioButtonReturnsLegacy.TabStop = true; + this.radioButtonReturnsLegacy.Text = "Non-Unicode String"; + this.radioButtonReturnsLegacy.UseVisualStyleBackColor = true; + this.radioButtonReturnsLegacy.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); + // + // openFileDialogBrowse + // + this.openFileDialogBrowse.DefaultExt = "py"; + this.openFileDialogBrowse.Filter = "Python scrips (*.py)|*.py"; + this.openFileDialogBrowse.Title = "Browse for Python script"; + // + // PyScriptAutoConfigDialog + // + this.ClientSize = new System.Drawing.Size(634, 479); + this.Name = "PyScriptAutoConfigDialog"; + this.Controls.SetChildIndex(this.tabControl, 0); + this.Controls.SetChildIndex(this.buttonApply, 0); + this.Controls.SetChildIndex(this.buttonCancel, 0); + this.Controls.SetChildIndex(this.buttonOK, 0); + this.Controls.SetChildIndex(this.buttonSaveInRepository, 0); + this.tabControl.ResumeLayout(false); + this.tabPageSetup.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.groupBoxExpects.ResumeLayout(false); + this.groupBoxExpects.PerformLayout(); + this.groupBoxReturns.ResumeLayout(false); + this.groupBoxReturns.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label labelScriptFile; + private System.Windows.Forms.TextBox textBoxFileSpec; + private System.Windows.Forms.Button buttonBrowse; + private System.Windows.Forms.OpenFileDialog openFileDialogBrowse; + private System.Windows.Forms.GroupBox groupBoxExpects; + private System.Windows.Forms.RadioButton radioButtonExpectsUnicode; + private System.Windows.Forms.RadioButton radioButtonExpectsLegacy; + private System.Windows.Forms.GroupBox groupBoxReturns; + private System.Windows.Forms.RadioButton radioButtonReturnsLegacy; + private System.Windows.Forms.RadioButton radioButtonReturnsUnicode; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} diff --git a/src/PyScriptEC/PyScriptAutoConfigDialog.cs b/src/PyScriptEC/PyScriptAutoConfigDialog.cs index 0bf64a81..48e9badb 100755 --- a/src/PyScriptEC/PyScriptAutoConfigDialog.cs +++ b/src/PyScriptEC/PyScriptAutoConfigDialog.cs @@ -12,412 +12,174 @@ namespace SilEncConverters40 { - public class PyScriptAutoConfigDialog : SilEncConverters40.AutoConfigDialog - { - public PyScriptAutoConfigDialog ( - IEncConverters aECs, - string strDisplayName, - string strFriendlyName, - string strConverterIdentifier, - ConvType eConversionType, - string strLhsEncodingId, - string strRhsEncodingId, - int lProcessTypeFlags, - bool bIsInRepository) - { - Util.DebugWriteLine(this, "ctor1 BEGIN"); + public partial class PyScriptAutoConfigDialog : PythonAutoConfigDialog + { + public PyScriptAutoConfigDialog( + IEncConverters aECs, + string strDisplayName, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strLhsEncodingId, + string strRhsEncodingId, + int lProcessTypeFlags, + bool bIsInRepository) + { + Util.DebugWriteLine(this, "ctor1 BEGIN"); InitializeComponent(); - Util.DebugWriteLine(this, "Initialized component."); - base.Initialize ( - aECs, - PyScriptEncConverter.strHtmlFilename, - strDisplayName, - strFriendlyName, - strConverterIdentifier, - eConversionType, - strLhsEncodingId, - strRhsEncodingId, - lProcessTypeFlags | (int)ProcessTypeFlags.PythonScript, - bIsInRepository); - Util.DebugWriteLine(this, "Initialized base."); - // if we're editing a CC table/spellfixer project, then set the - // Converter Spec and say it's unmodified - if (m_bEditMode) - { - Util.DebugWriteLine(this, "Edit mode"); + Util.DebugWriteLine(this, "Initialized component."); + base.Initialize( + aECs, + PyScriptEncConverter.strHtmlFilename, + strDisplayName, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strLhsEncodingId, + strRhsEncodingId, + lProcessTypeFlags | (int)ProcessTypeFlags.PythonScript, + bIsInRepository); + Util.DebugWriteLine(this, "Initialized base."); + // if we're editing a CC table/spellfixer project, then set the + // Converter Spec and say it's unmodified + if (m_bEditMode) + { + Util.DebugWriteLine(this, "Edit mode"); System.Diagnostics.Debug.Assert( - !String.IsNullOrEmpty(ConverterIdentifier)); + !String.IsNullOrEmpty(ConverterIdentifier)); textBoxFileSpec.Text = ConverterIdentifier; - IsModified = false; - } - m_bInitialized = true; - Util.DebugWriteLine(this, "END"); + IsModified = false; + } + m_bInitialized = true; + Util.DebugWriteLine(this, "END"); } - public PyScriptAutoConfigDialog ( - IEncConverters aECs, - string strFriendlyName, - string strConverterIdentifier, - ConvType eConversionType, - string strTestData) - { - Util.DebugWriteLine(this, "ctor2 BEGIN"); - InitializeComponent(); - base.Initialize ( - aECs, - strFriendlyName, - strConverterIdentifier, - eConversionType, - strTestData); - Util.DebugWriteLine(this, "END"); - } - - private System.Windows.Forms.Label labelScriptFile; - private System.Windows.Forms.TextBox textBoxFileSpec; - private System.Windows.Forms.Button buttonBrowse; - private System.Windows.Forms.OpenFileDialog openFileDialogBrowse; - - private System.Windows.Forms.GroupBox groupBoxExpects; - private System.Windows.Forms.RadioButton radioButtonExpectsUnicode; - private System.Windows.Forms.RadioButton radioButtonExpectsLegacy; - private System.Windows.Forms.GroupBox groupBoxReturns; - private System.Windows.Forms.RadioButton radioButtonReturnsLegacy; - private System.Windows.Forms.RadioButton radioButtonReturnsUnicode; - - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - - // This code does not get generated by Designer, so modify it directly. - private void InitializeComponent() - { - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.labelScriptFile = new System.Windows.Forms.Label(); - this.textBoxFileSpec = new System.Windows.Forms.TextBox(); - this.buttonBrowse = new System.Windows.Forms.Button(); - this.openFileDialogBrowse = new System.Windows.Forms.OpenFileDialog(); - - this.groupBoxExpects = new System.Windows.Forms.GroupBox(); - this.radioButtonExpectsLegacy = new System.Windows.Forms.RadioButton(); - this.radioButtonExpectsUnicode = new System.Windows.Forms.RadioButton(); - this.groupBoxReturns = new System.Windows.Forms.GroupBox(); - this.radioButtonReturnsLegacy = new System.Windows.Forms.RadioButton(); - this.radioButtonReturnsUnicode = new System.Windows.Forms.RadioButton(); - - this.tabControl.SuspendLayout(); - this.tabPageSetup.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); - this.groupBoxExpects.SuspendLayout(); - this.groupBoxReturns.SuspendLayout(); - this.SuspendLayout(); - - // - // tableLayoutPanel1 - // - this.tabPageSetup.Controls.Add(this.tableLayoutPanel1); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.ColumnCount = 3; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.RowCount = 4; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 70F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(596, 394); - this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.TabIndex = 1; - - this.tableLayoutPanel1.Controls.Add(this.labelScriptFile, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.textBoxFileSpec, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.buttonBrowse, 2, 0); - this.tableLayoutPanel1.Controls.Add(this.groupBoxExpects, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.groupBoxReturns, 1, 2); - - // - // labelScriptFile - // - this.labelScriptFile.Name = "labelScriptFile"; - this.labelScriptFile.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.labelScriptFile.AutoSize = true; - this.labelScriptFile.Text = "Python script file:"; - this.labelScriptFile.TabIndex = 0; - // - // textBoxFileSpec - // - this.textBoxFileSpec.Name = "textBoxFileSpec"; - this.textBoxFileSpec.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.textBoxFileSpec.Size = new System.Drawing.Size(390, 30); - this.textBoxFileSpec.Margin = new Padding(0); - this.textBoxFileSpec.TabIndex = 1; - this.textBoxFileSpec.TextChanged += new System.EventHandler(this.textBoxFileSpec_TextChanged); - // - // buttonBrowse - // - this.buttonBrowse.Name = "buttonBrowse"; - this.buttonBrowse.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.buttonBrowse.AutoSize = true; - this.buttonBrowse.Margin = new Padding(0); - this.buttonBrowse.Text = "Browse..."; - this.buttonBrowse.TabIndex = 2; - this.buttonBrowse.Click += new System.EventHandler(this.buttonBrowse_Click); - // - // openFileDialogBrowse - // - this.openFileDialogBrowse.DefaultExt = "py"; - this.openFileDialogBrowse.Filter = "Python scrips (*.py)|*.py"; - this.openFileDialogBrowse.Title = "Browse for Python script"; - - // - // groupBoxExpects - // - this.groupBoxExpects.Controls.Add(this.radioButtonExpectsUnicode); - this.groupBoxExpects.Controls.Add(this.radioButtonExpectsLegacy); - this.groupBoxExpects.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxExpects.Name = "groupBoxExpects"; - this.groupBoxExpects.Size = new System.Drawing.Size(384, 77); - this.groupBoxExpects.TabIndex = 3; - this.groupBoxExpects.TabStop = false; - this.groupBoxExpects.Text = "Python function expects"; - // - // radioButtonExpectsUnicode - // - this.radioButtonExpectsUnicode.Anchor = System.Windows.Forms.AnchorStyles.None; - this.radioButtonExpectsUnicode.AutoSize = true; - this.radioButtonExpectsUnicode.Location = new System.Drawing.Point(50, 30); - this.radioButtonExpectsUnicode.Name = "radioButtonExpectsUnicode"; - this.radioButtonExpectsUnicode.Size = new System.Drawing.Size(100, 17); - this.radioButtonExpectsUnicode.TabIndex = 0; - this.radioButtonExpectsUnicode.TabStop = true; - this.radioButtonExpectsUnicode.Text = "Unicode String"; - this.radioButtonExpectsUnicode.UseVisualStyleBackColor = true; - this.radioButtonExpectsUnicode.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // radioButtonExpectsLegacy - // - this.radioButtonExpectsLegacy.Anchor = System.Windows.Forms.AnchorStyles.None; - this.radioButtonExpectsLegacy.AutoSize = true; - this.radioButtonExpectsLegacy.Location = new System.Drawing.Point(200, 30); - this.radioButtonExpectsLegacy.Name = "radioButtonExpectsLegacy"; - this.radioButtonExpectsLegacy.Size = new System.Drawing.Size(125, 17); - this.radioButtonExpectsLegacy.TabIndex = 0; - this.radioButtonExpectsLegacy.TabStop = true; - this.radioButtonExpectsLegacy.Text = "Non-Unicode Bytes"; - this.radioButtonExpectsLegacy.UseVisualStyleBackColor = true; - this.radioButtonExpectsLegacy.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // groupBoxReturns - // - this.groupBoxReturns.Controls.Add(this.radioButtonReturnsUnicode); - this.groupBoxReturns.Controls.Add(this.radioButtonReturnsLegacy); - this.groupBoxReturns.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBoxReturns.Name = "groupBoxReturns"; - this.groupBoxReturns.Size = new System.Drawing.Size(384, 77); - this.groupBoxReturns.TabIndex = 4; - this.groupBoxReturns.TabStop = false; - this.groupBoxReturns.Text = "Python function returns"; - // - // radioButtonReturnsUnicode - // - this.radioButtonReturnsUnicode.Anchor = System.Windows.Forms.AnchorStyles.None; - this.radioButtonReturnsUnicode.AutoSize = true; - this.radioButtonReturnsUnicode.Location = new System.Drawing.Point(50, 30); - this.radioButtonReturnsUnicode.Name = "radioButtonReturnsUnicode"; - this.radioButtonReturnsUnicode.Size = new System.Drawing.Size(100, 17); - this.radioButtonReturnsUnicode.TabIndex = 0; - this.radioButtonReturnsUnicode.TabStop = true; - this.radioButtonReturnsUnicode.Text = "Unicode String"; - this.radioButtonReturnsUnicode.UseVisualStyleBackColor = true; - this.radioButtonReturnsUnicode.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - // - // radioButtonReturnsLegacy - // - this.radioButtonReturnsLegacy.Anchor = System.Windows.Forms.AnchorStyles.None; - this.radioButtonReturnsLegacy.AutoSize = true; - this.radioButtonReturnsLegacy.Location = new System.Drawing.Point(200, 30); - this.radioButtonReturnsLegacy.Name = "radioButtonReturnsLegacy"; - this.radioButtonReturnsLegacy.Size = new System.Drawing.Size(125, 17); - this.radioButtonReturnsLegacy.TabIndex = 0; - this.radioButtonReturnsLegacy.TabStop = true; - this.radioButtonReturnsLegacy.Text = "Non-Unicode String"; - this.radioButtonReturnsLegacy.UseVisualStyleBackColor = true; - this.radioButtonReturnsLegacy.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged); - - // - // Button Help - // - this.helpProvider.SetHelpString(this.buttonApply, "Click this button to apply the configured values for this converter"); - this.helpProvider.SetShowHelp( this.buttonApply, true); - this.helpProvider.SetHelpString(this.buttonCancel, "Click this button to cancel this dialog"); - this.helpProvider.SetShowHelp( this.buttonCancel, true); - this.helpProvider.SetHelpString(this.buttonOK, "Click this button to accept the configured values for this converter"); - this.helpProvider.SetShowHelp( this.buttonOK, true); - this.helpProvider.SetHelpString(this.buttonSaveInRepository, "Click to add this converter to the system repository permanently."); - this.helpProvider.SetShowHelp( this.buttonSaveInRepository, true); - - // - // PyScriptAutoConfigDialog - // - this.ClientSize = new System.Drawing.Size(634, 479); - this.Name = "PyScriptAutoConfigDialog"; - this.Controls.SetChildIndex(this.tabControl, 0); - this.Controls.SetChildIndex(this.buttonApply, 0); - this.Controls.SetChildIndex(this.buttonCancel, 0); - this.Controls.SetChildIndex(this.buttonOK, 0); - this.Controls.SetChildIndex(this.buttonSaveInRepository, 0); - this.tabControl.ResumeLayout(false); - this.tabPageSetup.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.groupBoxExpects.ResumeLayout(false); - this.groupBoxExpects.PerformLayout(); - this.groupBoxReturns.ResumeLayout(false); - this.groupBoxReturns.PerformLayout(); - this.ResumeLayout(false); - } - - protected void UpdateUI(bool bVisible) - { - Util.DebugWriteLine(this, "BEGIN"); - buttonSaveInRepository.Visible = - groupBoxExpects.Visible = - groupBoxReturns.Visible = bVisible; - Util.DebugWriteLine(this, "END"); + public PyScriptAutoConfigDialog( + IEncConverters aECs, + string strFriendlyName, + string strConverterIdentifier, + ConvType eConversionType, + string strTestData) + { + Util.DebugWriteLine(this, "ctor2 BEGIN"); + InitializeComponent(); + base.Initialize( + aECs, + strFriendlyName, + strConverterIdentifier, + eConversionType, + strTestData); + Util.DebugWriteLine(this, "END"); } - protected override void SetConvTypeControls() - { - SetRbValuesFromConvType(radioButtonExpectsUnicode, radioButtonExpectsLegacy, radioButtonReturnsUnicode, - radioButtonReturnsLegacy); - } - - // this method is called either when the user clicks the "Apply" or "OK" buttons *OR* if she - // tries to switch to the Test or Advanced tab. This is the dialog's one opportunity - // to make sure that the user has correctly configured a legitimate converter. - protected override bool OnApply() - { - Util.DebugWriteLine(this, "BEGIN"); - // Get the converter identifier from the Setup tab controls. - ConverterIdentifier = textBoxFileSpec.Text; - SetConvTypeFromRbControls(radioButtonExpectsUnicode, radioButtonExpectsLegacy, - radioButtonReturnsUnicode, radioButtonReturnsLegacy); - - // if we're actually on the setup tab, then do some further checking as well. - if (tabControl.SelectedTab == tabPageSetup) - { - // only do these message boxes if we're on the Setup tab itself, because if this OnApply - // is being called as a result of the user switching to the Test tab, that code will - // already put up an error message and we don't need two error messages. - if (String.IsNullOrEmpty(ConverterIdentifier)) - { - MessageBox.Show(this, "Choose a Python script first!", EncConverters.cstrCaption); - return false; - } - else if (!File.Exists(ConverterIdentifier)) - { - MessageBox.Show(this, "File doesn't exist!", EncConverters.cstrCaption); - return false; - } - } - Util.DebugWriteLine(this, "END"); - return base.OnApply(); - } - -/* - protected override bool ShouldRemoveBeforeAdd - { - get { return true; } - } - - protected override bool ShouldFriendlyNameBeReadOnly - { - get { return false; } - } - - protected override bool GetFontMapping(string strFriendlyName, out string strLhsFont, out string strRhsFont) - { - return base.GetFontMapping(strFriendlyName, out strLhsFont, out strRhsFont); - } -*/ - - protected override string ProgID - { - get { return typeof(PyScriptEncConverter).FullName; } - } + protected void UpdateUI(bool bVisible) + { + Util.DebugWriteLine(this, "BEGIN"); + buttonSaveInRepository.Visible = + groupBoxExpects.Visible = + groupBoxReturns.Visible = bVisible; + Util.DebugWriteLine(this, "END"); + } - protected override string ImplType - { - get { return EncConverters.strTypeSILPyScript; } - } + protected override void SetConvTypeControls() + { + SetRbValuesFromConvType(radioButtonExpectsUnicode, radioButtonExpectsLegacy, radioButtonReturnsUnicode, + radioButtonReturnsLegacy); + } - protected override string DefaultFriendlyName - { - // as the default, make it the same as the table name (w/o extension) - get { return Path.GetFileNameWithoutExtension(ConverterIdentifier); } - } + // this method is called either when the user clicks the "Apply" or "OK" buttons *OR* if she + // tries to switch to the Test or Advanced tab. This is the dialog's one opportunity + // to make sure that the user has correctly configured a legitimate converter. + protected override bool OnApply() + { + Util.DebugWriteLine(this, "BEGIN"); + // Get the converter identifier from the Setup tab controls. + ConverterIdentifier = textBoxFileSpec.Text; + SetConvTypeFromRbControls(radioButtonExpectsUnicode, radioButtonExpectsLegacy, + radioButtonReturnsUnicode, radioButtonReturnsLegacy); + + // if we're actually on the setup tab, then do some further checking as well. + if (tabControl.SelectedTab == tabPageSetup) + { + // only do these message boxes if we're on the Setup tab itself, because if this OnApply + // is being called as a result of the user switching to the Test tab, that code will + // already put up an error message and we don't need two error messages. + if (String.IsNullOrEmpty(ConverterIdentifier)) + { + MessageBox.Show(this, "Choose a Python script first!", EncConverters.cstrCaption); + return false; + } + else if (!File.Exists(ConverterIdentifier)) + { + MessageBox.Show(this, "File doesn't exist!", EncConverters.cstrCaption); + return false; + } + } + Util.DebugWriteLine(this, "END"); + return base.OnApply(); + } - private void buttonBrowse_Click(object sender, EventArgs e) - { - if (!String.IsNullOrEmpty(ConverterIdentifier)) - openFileDialogBrowse.InitialDirectory = Path.GetDirectoryName(ConverterIdentifier); - else - openFileDialogBrowse.InitialDirectory = Util.CommonAppDataPath() + EncConverters.strDefMapsTablesPath; + /* + protected override bool ShouldRemoveBeforeAdd + { + get { return true; } + } + + protected override bool ShouldFriendlyNameBeReadOnly + { + get { return false; } + } + + protected override bool GetFontMapping(string strFriendlyName, out string strLhsFont, out string strRhsFont) + { + return base.GetFontMapping(strFriendlyName, out strLhsFont, out strRhsFont); + } + */ + + protected override string ProgID + { + get { return typeof(PyScriptEncConverter).FullName; } + } - if (openFileDialogBrowse.ShowDialog() == DialogResult.OK) - { - ResetFields(); - textBoxFileSpec.Text = openFileDialogBrowse.FileName; - } - } + protected override string ImplType + { + get { return EncConverters.strTypeSILPyScript; } + } - private void textBoxFileSpec_TextChanged(object sender, EventArgs e) - { - if (m_bInitialized) // but only do this after we're already initialized - { - IsModified = (((TextBox)sender).Text.Length > 0); - //ProcessType &= ~(int)ProcessTypeFlags.SpellingFixerProject; - UpdateUI(IsModified); - } - } + protected override string DefaultFriendlyName + { + // as the default, make it the same as the table name (w/o extension) + get { return Path.GetFileNameWithoutExtension(ConverterIdentifier); } + } -/* - protected override bool SetupTabSelected_MakeSaveInRepositoryVisible - { - get { return !IsSpellFixerProject; } - } + private void buttonBrowse_Click(object sender, EventArgs e) + { + if (!String.IsNullOrEmpty(ConverterIdentifier)) + openFileDialogBrowse.InitialDirectory = Path.GetDirectoryName(ConverterIdentifier); + else + openFileDialogBrowse.InitialDirectory = Util.CommonAppDataPath() + EncConverters.strDefMapsTablesPath; + + if (openFileDialogBrowse.ShowDialog() == DialogResult.OK) + { + ResetFields(); + textBoxFileSpec.Text = openFileDialogBrowse.FileName; + } + } - private void buttonAddSpellFixer_Click(object sender, EventArgs e) - { - try - { - SpellFixerByReflection aSF = new SpellFixerByReflection(); - aSF.LoginProject(); - ((EncConverters)m_aECs).Reinitialize(); - FriendlyName = aSF.SpellFixerEncConverterName; - m_aEC = m_aECs[FriendlyName]; - if (m_aEC != null) - { - textBoxFileSpec.Text = ConverterIdentifier = m_aEC.ConverterIdentifier; - ConversionType = m_aEC.ConversionType; - ProcessType = m_aEC.ProcessType; - UpdateUI(false); - aSF.QueryForSpellingCorrectionIfTableEmpty("incorect"); - aSF.EditSpellingFixes(); - IsInRepository = true; - } - } - catch (Exception) - { - // usually just a "no project selected message, so .... ignoring it - // MessageBox.Show(ex.Message, EncConverters.cstrCaption); - } - } -*/ + private void textBoxFileSpec_TextChanged(object sender, EventArgs e) + { + if (m_bInitialized) // but only do this after we're already initialized + { + IsModified = (((TextBox)sender).Text.Length > 0); + //ProcessType &= ~(int)ProcessTypeFlags.SpellingFixerProject; + UpdateUI(IsModified); + } + } - private void radioButton_CheckedChanged(object sender, EventArgs e) - { - IsModified = true; - } - } + private void radioButton_CheckedChanged(object sender, EventArgs e) + { + IsModified = true; + } + } } diff --git a/src/PyScriptEC/PyScriptEC 2010.csproj b/src/PyScriptEC/PyScriptEC 2010.csproj index dd2a99d2..6aa8740d 100644 --- a/src/PyScriptEC/PyScriptEC 2010.csproj +++ b/src/PyScriptEC/PyScriptEC 2010.csproj @@ -1,4 +1,4 @@ - + Debug @@ -83,6 +83,10 @@ AllRules.ruleset + + + ..\..\packages\pythonnet.3.0.3\lib\netstandard2.0\Python.Runtime.dll + 3.5 @@ -100,11 +104,25 @@ + + Form + + + Py3ScriptAutoConfigDialog.cs + Form + + + PyScriptAutoConfigDialog.cs + + + + Form + @@ -134,12 +152,17 @@ + + Py3ScriptAutoConfigDialog.cs + PyScriptAutoConfigDialog.cs + Designer +